Forum: Mikrocontroller und Digitale Elektronik Zaehler


von Frank (Gast)


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

von A.K. (Gast)


Lesenswert?

Versuch es mal als Anhang. So ist das unlesbar.

von Frank (Gast)


Angehängte Dateien:

Lesenswert?

Ok ist aber noch ein bischen chaotisch!
Danke Frank

von A.K. (Gast)


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.

von A.K. (Gast)


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.

von A.K. (Gast)


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

von Frank (Gast)


Lesenswert?

sorry jetzt stehe auf dem Schlauch. Wie muss ich denn meine Digit 2
Routine abändern?
Frank

von A.K. (Gast)


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.

von Frank (Gast)


Lesenswert?

es funzt ja soweit. Er zählt bis zehn, die eins schreibt er auf die
nächste Stelle(00010) nur dann kommt wieder 00001??????
Frank

von A.K. (Gast)


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.

von Frank (Gast)


Lesenswert?

Danke werde es mal probieren!
Bin noch Anfänger.Ich bewundere Euch wie Ihr son Code einfach aus dem
Ärmel schüttelt!! Ich programmiere immer noch von hinten durch die
Brust ins Auge;-)

von Frank (Gast)


Angehängte Dateien:

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

von A.K. (Gast)


Lesenswert?

Was bzw. wie lang ist eigentlich "pause"?

von Frank (Gast)


Lesenswert?

vier mal 0xFF inc!
Frank

von A.K. (Gast)


Lesenswert?

M.a.W: ziemlich kurz. Kann es sein, dass das LCD garnicht dazu kommt,
alle Daten anzuzeigen, weil es einige zig µsec danach wieder gelöscht
wird?

von Frank (Gast)


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???

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.