Zaehler

Gast #161026
Lesenswert?

Hallo
Ich möchte in einer schleife contl inc und es auf dem LCD ausgeben.
Der Code funktioniert aber nur das er bis 10 auf dem LCD zählt und dann
wieder auf eins springt????
Ist nur ein code auszug!!!
(ASM ATmega8 inc ist eingebunden)
za:

ldi temp, 48
ldi comp, 0
inc countl
inc  counth
clt                         ;T-Flag löschen
ldi temp1, -1 + '0'          ;temp1 für ASCII Ausgabe initialisiern;

DIGIT5:
inc temp1                    ;temp1 Register
subi countl, low (10000)     ;Subtrahiere 10000 vom 16bit Wert >> Digit
5 des ASCII Zeichens
sbci counth, high(10000)
brcc DIGIT5                  ;Schleife solange bis Wert negativ
cp temp1,temp               ;beide Register vergleichen wenn ungleich
wird Zero Flag gelöscht
in temp2,sreg                ;Statusregister Laden
sbrs temp2,1                 ;Überspring nächsten Befehl wenn Z-Flag
gesetzt
set                          ;Setze T-Flag
in temp2,sreg                ;Staturegister nachladen
sbrc temp2,6               ;Überspringe nächsten Befehl wenn T-Flag
gelöscht
rcall lcd_data               ;Seriell ausgeben
rcall pause
ldi temp1,1 +'0'
DIGIT4:
dec temp1
subi countl, low (-1000)    ;
sbci counth, high(-1000)
brcs DIGIT4
cp temp1,temp
in temp2,sreg
sbrs temp2,1
set
in temp2,sreg
sbrc temp2,6
rcall lcd_data ;
rcall pause

ldi temp1, -10 +'0'           ;zweite stelle hinterm Komma
DIGIT3:
inc temp1
subi countl, low(100)
sbci counth, high(100)
brcc DIGIT3
cp temp1,comp
in temp2,sreg
sbrs temp2,1
set
in temp2,sreg
sbrc temp2,6
rcall lcd_data
rcall pause

ldi temp1, 10 +'0'     ; dritte stelle hinterm Komma
DIGIT2:
dec temp1
subi countl, -10
brcs DIGIT2
cp temp1,comp
in temp2,sreg
sbrs temp2,1
set
in temp2,sreg
sbrc temp2,6
rcall lcd_data
rcall pause

DIGIT1:
mov temp1, countl    ;vierte stelle hinterm Komma
subi temp1,-48
cp temp1,comp
in temp2,sreg
sbrs temp2,1
set
in temp2,sreg
sbrc temp2,6
rcall lcd_data
rcall pause
rjmp za
Gast #161029
Lesenswert?

Aber Du blickst noch durch? Herrje, Assembler-Code ist zwar generell
weniger lesbar als C-Code, aber ein bischen Formatierung ist trotzdem
erlaubt. Beispielsweise Labels linksbündig an den Anfang der Zeile,
Befehle jedoch z.B. in die 9. Spalte per TAB und Operanden wiederum ein
TAB dahinter. Dann findet man wenigstens die Labels ohne stundenlange
Suche.
Gast #161030
Lesenswert?

> in temp2,sreg      ;Statusregister Laden
> sbrs temp2,1       ;Überspring nächsten Befehl wenn Z-Flag gesetzt
> set                ;Setze T-Flag
> in temp2,sreg      ;Staturegister nachladen
> sbrc temp2,6       ;Überspringe nächsten Befehl wenn T-Flag gelöscht
> rcall lcd_data     ;Seriell ausgeben

Aua, das tut weh! Guck mal in der Befehlsliste unter BREQ nach. Damit
löst sich auch das Problem ganz von selber, dass T ab dem 2. Digit
nicht gelöscht, nur gesetzt wird.
Gast #161031
Lesenswert?

Ok, jetzt hab ich kapiert was dieses bizarre Konstrukt mit dem
Flag-Geschiebe soll. Manchmal dauert's bei mir halt. Aber irgendwie
finde ich
      cpse temp1,temp
      set
      brtc l1
      rcall lcd_data
l1:
trotzdem übersichtlicher
Gast #161033
Lesenswert?

ldi temp1, -1 + '0'initialisiern;
   inc temp1
liefert '0'..'9', ok.

Aber was liefert
   ldi temp1,1 +'0'
   dec temp1
denn? Würde sagen das liefert ab '0' abwärts. Soll wohl 10+'0'
sein.

Und
   ldi temp1, -10 +'0'           ;zweite stelle hinterm Komma
   inc temp1
zählt von '0'-9 bis '0'. Auch nicht besser. Hier ist nun -1+'0'
wieder richtig.
Gast #161035
Lesenswert?

Ersetze
  cp temp1,temp               ;beide Register vergleichen wenn
                              ;ungleich wird Zero Flag gelöscht
  in temp2,sreg               ;Statusregister Laden
  sbrs temp2,1                ;Überspring nächsten Befehl wenn Z-Flag
                              ;gesetzt
  set                         ;Setze T-Flag
  in temp2,sreg               ;Staturegister nachladen
  sbrc temp2,6                ;Überspringe nächsten Befehl wenn T-Flag
                              ;gelöscht
  rcall lcd_data              ;Seriell ausgeben
durch
  cpse temp1,temp
  set
  brtc <label>
  rcall lcd_data
<label>

Und zwar überall. Löst aber nicht das Problem.

Weiteres Problem:
  cp temp1,comp
comp ist 0. temp1 wird nie 0 (ausser in DIGIT1). Soll wohl temp statt
comp heissen. Und in DIGIT1 wirst Du wohl immer eine Ziffer ausgeben
wollen, weil bei 0 ja sonst bloss heisse Luft angezeigt wird.

Was die LCD Routinen mit den Registern anstellen weisst Du hoffentlich.
Wäre schlecht wenn die diversen temps, counts etc dort verändert würden.
Gast #161037
Lesenswert?

Hallo
Ich habe jetzt die  Routine so abgeändert wie A.K.mir graten hat.
Aber der Effekt ist der gleiche. Auf dem LCD wird nur bis zehn gezählt
und dann wieder von null. Es sieht so aus als wenn der Bereich in dem
er zählt zu klein ist????
In meinen LCD Routinen werden die diversen Temps nicht verändert!
Frank
Angehängte Dateien:
Gast #161041
Lesenswert?

nur ist ja komisch das man das zählen von 0 bis 10 ja sieht und er im
nächsten durchgang einfach wieder auf eins springt. D.H das die vierte
Stelle wo die eins war wieder auf 0 springt. Als wenn der übertrag
einfach gelöscht wird???

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren