mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Problem mit LPM


Autor: No Name (assi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe ein Programm für ne Uhr geschrieben. Funktiomiert soweit auch, 
nun wollte ich eine Led im Sekundentakt blinken lassen. Also hab ich 
noch ein Codestück eingefügt, sobald dieses Stück mit eingefügt ist 
werden nur die Ziffern bis einschlieslich 7 angezeigt also für acht und 
neun wird nur mist angezeigt.

Hier mal die Codestücke:
ausgabe:
  ;Ziffern umwandeln und schieben
  mov temp, stu
  rcall number

  mov temp, min
  rcall number


  ;Strobe
  rcall strobe_
  reti

  ;Daten umwandeln
  ausgabe2:
  push temp

  ldi ZH, HIGH(Daten*2)
  ldi ZL, LOW(Daten*2)
  add ZL, shift    
  lpm shift, Z

shift_:

  ldi temp, 0x00
  out Port, temp

  ;Bits eingeben
  sbrc shift, 0
  sbi Port, Serial
  sbi Port, Clock
  out Port, temp

          ...

;Und noch die Tabelle

Daten:
.db 0xBE, 0x22, 0x5E, 0x76, 0xE2, 0xF4, 0xFC, 0x26, 0xFE, 0xF6

.db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00


Die Hardware ist in Ordnung also der Fehler liegt im Programm.

Schonmal danke für die Antworten

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kennst du diese 'adc'-Instruktion?

Autor: No Name (assi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein ich kenne sie nicht wie kann mir die weiterhelfen?
Ich bin in sachen Assembler noch nicht sehr erfahren.

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
   ldi ZH, HIGH(Daten*2)
   ldi ZL, LOW(Daten*2)
   add ZL, shift

Überleg mal, was denn passiert, wenn 'LOW(Daten*2)' z.B. 254 ist und 
'shift' 8 ist.

'adc' addiert mit Übertrag (c = carray = Übertrag).

Autor: Michael U. (amiga)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

er will damit folgendes sagen:

  ldi ZH, HIGH(Daten*2)
  ldi ZL, LOW(Daten*2)
  add ZL, shift
  lpm shift, Z

Du lädst hier richtig Z mit dem Zeiger auf die Tabelle.
Dann addierst Du den Offset zu Deinem passenden Byte.
Z ist aber ein 16Bit Wert. Wenn Du zu den unteren 8 Bit in ZL was 
addierst, kann es natürlich auch einen Übertrag geben wenn Z z.B. 0x00FF 
enthält und Du da 1 addierst muß richig 0x0100 rauskommen. Bei Dir kommt 
aber dann 0x0000 raus.
Also mit adc (Add with Carry) den Übertrag dazurechnen.
Leider hat Atmel keine immediate-Version von adc eingebaut, Du mußt also 
z.B. ein freies Register mit Inhalt 0 bemühen.

  clr freies_regeister

  ldi ZH, HIGH(Daten*2)
  ldi ZL, LOW(Daten*2)
  add ZL, shift
  adc ZH, freies_register  ; hier einen eventuellen Übertrag dazu
  lpm shift, Z

dann sollte es wieder klappen.

Gruß aus Berlin
Michael

Autor: No Name (assi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank für die Antworten hat geklappt.

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.