www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Zaehler


Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Versuch es mal als Anhang. So ist das unlesbar.

Autor: Frank (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ok ist aber noch ein bischen chaotisch!
Danke Frank

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Frank (Gast)
Datum:

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

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;-)

Autor: Frank (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was bzw. wie lang ist eigentlich "pause"?

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
vier mal 0xFF inc!
Frank

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.