Forum: Offtopic Fehler bei Tutorial "7-Segment-Anzeige" ?


von Stevko R. (stevko)


Lesenswert?

Liebe Gemeinde und Moderatoren,

ich habe mir einmal das Tutorial für die 7-Segment-Anzeige(7SA) 
angesehen.
Dort sollen die Zahlen 0..9 auf der 7SA angezeigt werden.
Die aktuelle Ziffer ist in "count" hinterlegt.

Für das Anzeigen der Zahlen von 0..9 ist folgende Schleife zuständig:
>====================
loop:
 ldi ZL, LOW(Codes*2)  ; die Startadresse der Tabelle in den
 ldi ZH, HIGH(Codes*2) ; Z-Pointer laden

 mov temp1, count      ; die wortweise Adressierung der Tabelle
 add temp1, count      ; berücksichtigen

 add ZL, temp1         ; und ausgehend vom Tabellenanfang
 adc ZH, zero          ; die Adresse des Code Bytes berechnen

 lpm                   ; dieses Code Byte in das Register r0 laden

 out PORTD, r0         ; und an die Anzeige ausgeben

 inc count             ; den Zähler erhöhen, wobei der Zähler
 cpi count, 10         ; immer nur von 0 bis 9 zählen soll
 brne wait
 ldi count, 0
;
wait:
 ldi r17, 10           ; und etwas warten, damit die Ziffer auf
 laber, laber, ...
>=====================

Wenn ich nicht total daneben liege, sieht man die Ziffer "9" gar nicht.
Sie wird wohl geladen und angezeigt, aber nur im µs Bereich -> fürs 
menschliche Auge nicht sichbar.

Gehen wir den Quellcode einmal durch:
-------------------------------------
Count ist "9" und die Ziffer die dargestellt werden soll.
* zuerst wird das Bitmuster für die "9" geladen "lpm" -> ok
* dann wird es ausgegeben "out PORTD, r0" -> ok
* jetzt wird Count um 1´s erhöht "inc count" -> Count = "10" -> ok
* nun wir der Vergleich gestartet:
   Wenn Count nicht "10" dann springe zu "wait", damit die Ziffer eine 
Zeit angezeigt wird
   Sonst lade Count mit "0" und fange von vorn an

==> bei Count="9" und INC -> Count="10" wird die Warteschleife gar nicht 
angesprungen!
==> der richtige Befehl wäre: "cpi count, 11"

Ich hoffe das ich in meiner theoretischen Betrachtung keinen Fehler 
habe.

Gruß
  stevko

von Sam .. (sam1994)


Lesenswert?

Wenn kein Sprungbefehl abgearbeitet wird, führt der µC einfach den 
nächsten Befehl aus: Nach ldi count, 0 wird die der Code nach wait: 
ausgeführt.

von Karl H. (kbuchegg)


Lesenswert?

Stevko R. schrieb:

>    Sonst lade Count mit "0" und fange von vorn an
                                    *****************

Der ********** Teil steht aber nicht dort.
Du darfst nicht einfach Dinge erfinden. Jeder Befehl hat eine genau 
definierte Aktion zur Folge. Assembler ist keine Hochsprache. Wenn dort 
kein Jump steht, wird auch keiner gemacht.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.