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
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.
> 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.
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
sorry jetzt stehe auf dem Schlauch. Wie muss ich denn meine Digit 2 Routine abändern? Frank
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.
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
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.
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;-)
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
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?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.