atmega8535 - 6-aus-8-zähler Programmierung

Severin Fl

Neues Mitglied
02. Okt. 2012
11
0
0
29
Forsbach, Nordrhein-Westfalen, Germany, Germany
Sprachen
Heyhey,
wir haben im Unterricht angefangen den atmega8535 mithilfe des AVR Studio 4 zu programmieren. Nun haben wir über den Feiertag eine Hausaufgabe aufbekommen, vor der ich nun 5 std vergeblich sitze. :bawling:
Wir sollen ein kleines Programm schreiben, welches erkennt wenn an 6 von 8 Pins von PORTA eine 1 anliegen und dann eine 1 an PB0 ausgeben soll.
Ich habe erst versucht über den kleinstmöglichen Wert eines Register, wenn an 6 Pins eine 1 anliegt, mithilfe eines brsh direkt zur Ausgabe zu springen, aber da hatte ich leider einen Denkfehler bezüglich der 2 links Bits im Register.
Ich wäre über eine Hilfe unendlich dankbar!

Leider dürfen wir auch nur diese Befehle verwenden: ADD; SUB; SUBI; AND; ANDI; OR; ORI; COM; INC; DEC; CLR; SER; LDI; RJMP; MOV; IN; OUT; LSL; LSR; ROL; ROR; CP; CPI; BREQ; BRNE; BRSH; BRCS; BRCC; BRLO

Ich verlange auch nicht das ihr mir hier direkt das fertige Programm hinhaut (wobei das auch super wäre), aber ein Denkanstoß wäre schon super :D

Ich hoffe ihr konntet verstehen was ich meinte :eek:

-LG-
Severin
 
Hi Severin,

Nun haben wir über den Feiertag eine Hausaufgabe aufbekommen, vor der ich nun 5 std vergeblich sitze. :bawling:
es geht wieder los mit den Studenten-/Schüler-Projekten ;)

Wir sollen ein kleines Programm schreiben, welches erkennt wenn an 6 von 8 Pins von PORTA eine 1 anliegen und dann eine 1 an PB0 ausgeben soll.
hört sich eigentlich recht einfach an ...

Ich habe erst versucht über den kleinstmöglichen Wert eines Register, wenn an 6 Pins eine 1 anliegt, mithilfe eines brsh direkt zur Ausgabe zu springen, aber da hatte ich leider einen Denkfehler bezüglich der 2 links Bits im Register.
Ich wäre über eine Hilfe unendlich dankbar!

Leider dürfen wir auch nur diese Befehle verwenden: ADD; SUB; SUBI; AND; ANDI; OR; ORI; COM; INC; DEC; CLR; SER; LDI; RJMP; MOV; IN; OUT; LSL; LSR; ROL; ROR; CP; CPI; BREQ; BRNE; BRSH; BRCS; BRCC; BRLO

Ich verlange auch nicht das ihr mir hier direkt das fertige Programm hinhaut (wobei das auch super wäre), aber ein Denkanstoß wäre schon super :D

Ich hoffe ihr konntet verstehen was ich meinte :eek:
ist eigentlich recht einfach zu lösen ...

Input-Register in ein normales Register holen.
dann mach ne Schleife mit 8 Durchläufen (für die 8 Bits des IO-Ports).
Dann laß den Inhalt des 8Bit-Registers links oder rechts verschieben.
Entscheide dich für EINE Richtung. Dann bleib bei der (also entweder NUR links oder NUR rechts)
Das Bit was aus dem Register "rausfällt" landet im Carry-Bit des Statusregisters
Auf Carry kannst du mit nem Branch reagieren.
Wenn Carry gesetzt (1 aus dem Register gefallen) dann ein anderes Register +1 (INC)

Nach deinen 8 Schleifendurchläufen sollte im anderen Register dann die Anzahl der Einsen aufaddiert sein,

Das soltle als Anschubs für deine Gedanken reichen ... Viel Spaß beim programmieren ;)

Gruß
Dino
 
Hab auch grad versucht, was eleganteres zu finden, aber...

Mit ADC wäre es noch besser, aber warum ihr das nicht dürft...
Warum eigentlich so'ne alte Version vom Studio?
 
Mit ADC wäre es noch besser, aber warum ihr das nicht dürft...
mußte ich mir erstmal durch das Hirn wandern lassen ...
... Idee ist gut ;) Man addiert einfach Null dazu und nimmt das Carry-Bit nebenher mit :cool:
Spart man sich das ganze Branch If Carry Set und INC und sowas.

Gruß
Dino
 
Interessant wäre noch die Frage ob 6 oder mindestens 6...
Dann könnte man die gesetzten Bit hochzuzählen von 5 runterzählen, und bei Überlauf PORTB0 setzt. Aber die SKIPs sind ja auch verboten...
Dämliche Bechneidung...:stupid:
 
Heyhey da bin ich wieder.
Vielen Dank erstmal für die schnelle Hilfe! Also ich habe jetzt mal was Programmiert, was eigentlich auch funktionieren sollte:

Code:
.include "8535def.inc"
.def temp = R16
.def temp2 = R17

ser temp
out DDRB, temp
clr temp

Loop1:
	in temp, PINA
	lsl temp
	brcs Loop2
	rjmp Loop1

Loop2:
	inc temp2
	cpi temp2, 6
	brsh Ausgabe
	rjmp Loop1

Ausgabe:
	ldi temp, 1
	out PORTB, temp
	clr temp
	rjmp Loop1

Es wäre super wenn nochmal jemand drüber gucken könnte und Bescheid geben könnte, falls ich doch einen Denkfehler hatte!

Interessant wäre noch die Frage ob 6 oder mindestens 6...
Das Programm soll eine 1 Ausgeben sobald 6 oder mehr Eingänge eine 1 haben.

Warum eigentlich so'ne alte Version vom Studio?
Leider müssen wir die alte Version benutzen, weil die Schule es nicht auf die Reihe bekommt die Rechner mit der neuen Version zu bestücken -.-

-LG-
Severin
 
Leider müssen wir die alte Version benutzen, weil die Schule es nicht auf die Reihe bekommt die Rechner mit der neuen Version zu bestücken -.-
naja ... die alte Version funktioniert und ist gegenüber den neuen Versionen etwas übersichtlicher. Die Atmels die für den Unterricht interessant sind kann die Version auf alle Fälle. Ich hab sie hier auch noch laufen. Ist nicht so ein riesen Monstrum wie die 5er Version mit dem ganzen dotNET und was weiß ich noch drum rum. Läuft flott und gut. Also warum tauschen?

Gruß
Dino
 
...was Programmiert, was eigentlich auch funktionieren sollte:

Code:
.include "8535def.inc"
.def temp = R16
.def temp2 = R17

ser temp
out DDRB, temp
clr temp

Loop1:
	in temp, PINA
	lsl temp
	brcs Loop2
	rjmp Loop1

Loop2:
	inc temp2
	cpi temp2, 6
	brsh Ausgabe
	rjmp Loop1

Ausgabe:
	ldi temp, 1
	out PORTB, temp
	clr temp
	rjmp Loop1

Es wäre super wenn nochmal jemand drüber gucken könnte und Bescheid geben könnte, falls ich doch einen Denkfehler hatte!...

haste das selbst mal getestet? (Im Simulator zB)
Du machst da folgendes:
Du liest sooft das PIN-Register-A ein, bis das MSB gesetzt war (lesen, linksschieben, zurück bei Carry=0)
Wenn das MSB 1 war (also das Carry gesetzt), zählst Du R17 eins weiter, und vergleichst dort mit 6.
Solange das noch weniger als 6 sind, kehrst Du wieder in die erste Schleife zurück, ansonsten erfolgt einmal eine Ausgabe, danach kehrst Du wieder in die erste Schleife zurück.

Man könnte jetzt also denken, Du hast einen Zähler programmiert, der ein sechsmaliges Drücken des Tasters am MSB auswertet (die anderen Bits von PortA werden nie ausgewertet), aber durch die schnelle Ausführungsgeschwindigkeit der ersten beiden Schleifen reicht dann bereits eine kurze Betätigung des Tasters, um das 6mal zu zählen (Du kannst den Finger gar nicht so schnell wieder vom Taster nehmen, wie die beiden Schleifen zich-mal durch sind...)

Soll B0 eigentlich wieder lo gehen, sobald wieder weniger als 6 A-Pins Hi sind?

Fazit: Nein, das wars noch nicht (ganz).

NOCHMAL;)

(btw kann man das entsprechende Bit in PortB (PORTB-Register Bit 0) mit SBI direkt setzen, aber das dürft Ihr ja auch wieder nicht).

Edit:
Code:
	...
	brcs Loop2
	rjmp Loop1

Loop2:
	...
wäre von der Logik her dasselbe wie:
Code:
	...
	brcc Loop1

Loop2:
	...
,
mal abgesehen davon, daß das nicht Deine Lösung ist. Bei der 2ten Schleife ists ähnlich...

Edit2: cave! Du verwendest R17 (temp2), ohne es mit einem festen Wert initialisiert zu haben. da kann nach dem Reset alles mögliche drinstehen...
 
Soo ich habe es nun ein bisschen verändert:
Code:
.include "8535def.inc"
.def temp = R16
.def temp2 = R17

ser temp
out DDRB, temp
clr temp



Einlesen:
	in temp, PINA
        ldi temp2, 0

Loop1:
	lsl temp
	brcs Loop2
	cpi temp, 0
	breq Einlesen
	rjmp Loop1

Loop2:
	inc temp2
	cpi temp2, 6
	brsh Ausgabe
	rjmp Loop1

Ausgabe:
	ldi temp, 1
	out PORTB, temp
	clr temp
	rjmp Einlesen

Ich habe jetzt auch noch nen automatischen Reset eingebaut (hoffentlich mal etwas richtiges :p)

Code:
Loop1:
        ....
	cpi temp, 0
	breq Einlesen
        ....

Stimmt es denn jetzt?
Wenn nicht muss ich zu meiner Verteidigung sagen, dass ich das ich ja grade erst in der Lernphase bin! :D

-LG-
Severin
 
Hi,

also für eine mögliche Lösung (wie ich sie mir vorstelle) vermisse ich eine umhüllende Endlosschleife und eine Schleife mit 8 Durchläufen ;)

Die Länge des Programms ist aber (von der Anzahl der Zeilen) schon in der Größe wie meine Lösungsmöglichkeit.

Gruß
Dino
 
Huhu,
ich stehe jetzt wirklich auf dem Schlauch..
Ich verstehe die Schleife mit dem 8 Durchläufen nicht wirklich, wahrscheinlich stelle ich mich einfach nur zu doof an :(
Ich weiß, es ist nicht gerne gesehen wenn jemand nach dem Code bettelt aber ich bin grade etwas gestresst weil ich das Programm bis morgen brauche.
Es wäre unendlich Nett wenn mir jemand den Code für dieses Programm schreiben würde :)
Natürlich fehlt dabei der Lerneffekt, ich weiß :rolleyes:


-LG-
Severin
 
Jetzt vergiß erstmal deinen Code, und schreibe uns hier mal Deinen geplanten Ablauf (wie Dino es eigentlich bereits im ersten Beitrag geschrieben hatte).
Dein letztes Programm liest das PIN-Register ein, und setzt Temp2 auf 0.
Dann schiebst Du dieses eingelesene Byte einmal nach Links; war vorher das MSB =1 (also Carry gesetzt), springst Du die Zählschleife an. Wenn der Rest des geschobenen Bytes (von rechts kommen ja nur Nullen rein) =0, kehrst Du zum einlesen zurück.
...
Moment mal...
...
Es ist zwar ziemlich "von hinten durch die Brust ins Auge", aber es könnte(!) so sogar klappen.

Was sagt der Simulator dazu?

Edit: bin mir jetzt nahezu sicher, daß es so auch klappt.

In Dinos Beitrag habe ich mal das wesentliche hervorgehoben, um Dich mal mit der Nase reinzustoßen:
...
Input-Register in ein normales Register holen.
dann mach ne Schleife mit 8 Durchläufen (für die 8 Bits des IO-Ports).
[ Dann laß den Inhalt des 8Bit-Registers links oder rechts verschieben.
Entscheide dich für EINE Richtung. Dann bleib bei der (also entweder NUR links oder NUR rechts)
Das Bit was aus dem Register "rausfällt" landet im Carry-Bit des Statusregisters
Auf Carry kannst du mit nem Branch reagieren.
Wenn Carry gesetzt (1 aus dem Register gefallen) dann ein anderes Register +1 (INC) ]

Nach deinen 8 Schleifendurchläufen sollte im anderen Register dann die Anzahl der Einsen aufaddiert sein,

Das soltle als Anschubs für deine Gedanken reichen ... Viel Spaß beim programmieren ;)

Gruß
Dino
 
Guten Morgen,
ich sitze grade in der Schule und probiere das Programm nochmal. Also laut dem Simulator klappt es :cool:.
Jetzt ist nur die Frage was mein Lehrer dazu sagt. Ich werde später nochmal diesen Post editieren und euch bescheid geben wie sein Feedback war.
Aber erstmal geht ein großes Danke an euch, ihr habt mir wirklich sehr geholfen!!! ;)

-LG-
Severin
 
Ich hab' mal noch 2 ganz allgemeine Hinweise für Dich:
-Wenn Du hier so ein Problem diskutieren lassen willst, ist es für uns hilfreich, wenn Du uns in kurzen Stichpunkten und/oder einem Programmablaufplan (ggf Skizze) auch Deinen Lösungsansatz präsentierst. Dann muß man nicht aus einem (ggf fehlerhaften Code) schlussfolgern, auf welchem Wege Du zum Ziel gelangen willst.
-In dem Zusammenhang solltest Du in Deinem Programm auch entsprechende Kommentare einfügen. Das erleichtert es auch Dir selbst, wenn Du später mal wieder einen Blick in das programm werfen mußt/willst.

Nur mal interessehalber gefragt: Welche Hardware steht Euch eigentlich in der Schule zur Verfügung? Der verwendete Prozessor, und die AVRStudio-Version läßt das STK500 vermuten...

Wassetzt Du "zu Hause" ein?
 
Hi,

Ich hab' mal noch 2 ganz allgemeine Hinweise für Dich:
ich hätte da auch noch einen Hinweis:
Die meißten Schüler/Studenten/Azubis/... kommen erst wenn es zeitlich schon (fast) zu spät ist. Also so früh wie möglich Hilfe holen. Das schützt vor unnötigem Streß. Bei dir scheint es ja eine Hausaufgabe vom Dienstag gewesen zu sein.

Wie du siehst wird hier kein fertiger Code rübergeschoben sondern Gedanken angeschoben. Wenn die Tips allerdings nicht so recht zünden weil die Gedankengänge unterschiedlich sind, dann kann es zeitlich schnell eng werden. Für künftige Hausaufgaben bringt es aber wesentlich mehr wenn man selber auf die Lösung gekommen ist :cool:

Als denn wünsch ich dir mal viel Glück mit deiner Lösung ;)

Gruß
Dino
 
Huhu,
der Lehrer war richtig erstaunt als ich als einziger(!) aus der Klasse das Programm hatte! Im Moment stehe ich jetzt 1 in dem Fach :cool: Beim nächsten mal werde ich auch dinos und LotadaCs Tipps berücksichtigen ;)

Nur mal interessehalber gefragt: Welche Hardware steht Euch eigentlich in der Schule zur Verfügung? Der verwendete Prozessor, und die AVRStudio-Version läßt das STK500 vermuten...

Wassetzt Du "zu Hause" ein?

In der Schule arbeiten wir im Moment nur per Simulation, haben also noch nie einen IC unsere Programme ausführen lassen. Ich denke nach den Ferien wird es dann losgehen mit der "Praxis" :D
Zuhause benutze ich auch das AVR-Studio 4..

-LG-
Severin
 
Und, wie gehts jetzt (hier) weiter?
Bist Du an der Materie interessiert, oder ist das nur ein "Pflichtfach" für Dich?
Ansonsten kannste Dich ja hier mal kurz vorstellen, und mit anreissen, was ihr bei den Controllern so bereits behandelt habt, oder was Dich selbst daran vielleicht interessiert - dann können wir auch besser einschätzen, wie tiefgehend Hinweise und Ratschläge anzusiedeln sind.
An was für einer Schule sind Mikrocontroller eigentlich Unterrichtsbestandteil?
(Uns hat damals die Patenbrigade einen(!) KC87 (II oder III?) organisiert - das war der einzige Computer in der Schule, damals... Ich durfte den dann mit einem Mitschüler jeden Mittwoch eine Stunde lang benutzen (wir mußten uns den im Sekretariat aushändigen lassen, und durften den im Bioraum aufbauen (weil's da'n Fernseher gab)... lang ists her...)

'Ne neue Aufgabe aufbekommen?
 
Hi Severin,

aber jetzt nicht übermütig werden :D

Nicht gleich mit Wolkenkratzern anfangen. Erst mal ne Hundehütte bauen :p ;)
Wenn man sich zu viel auf einmal vornimmt, dann folgt ganz schnell der Frust weil es nicht klappt.

Gruß
Dino
 
Heyhey,

im Moment ist die Programmierung mit AVR-Studio sowohl ein Pflichtfach, interessiert mich aber auch außerhalb der Schule. Ich besuche zurzeit ein Berufskolleg und mache dort eine Ausbildung als Elektrotechnischer Assistent mit Fachabitur.
aber jetzt nicht übermütig werden
Keine Sorge das werde ich nicht :D

Ich bin mich dann mal vorstellen ;)
(Hier bin ich)

Und wir haben schon eine neue Aufgabe:
Wir sollen eine schleife Programmieren, die genau 1 Sekunde lang brauchen soll um bearbeitet zu werden. Leider nur mit den Befehlen die schon im ersten Post genannt wurden.

-LG-
Severin
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)