Problem mit LPM

OP #1320083
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:
1
ausgabe:
2
  ;Ziffern umwandeln und schieben
3
  mov temp, stu
4
  rcall number
5

6
  mov temp, min
7
  rcall number
8

9

10
  ;Strobe
11
  rcall strobe_
12
  reti
13

14
  ;Daten umwandeln
15
  ausgabe2:
16
  push temp
17

18
  ldi ZH, HIGH(Daten*2)
19
  ldi ZL, LOW(Daten*2)
20
  add ZL, shift    
21
  lpm shift, Z
22

23
shift_:
24

25
  ldi temp, 0x00
26
  out Port, temp
27

28
  ;Bits eingeben
29
  sbrc shift, 0
30
  sbi Port, Serial
31
  sbi Port, Clock
32
  out Port, temp
33

34
          ...
35

36
;Und noch die Tabelle
37

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

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

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

Schonmal danke für die Antworten
Gast #1320094
1
   ldi ZH, HIGH(Daten*2)
2
   ldi ZL, LOW(Daten*2)
3
   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).
#1320101
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.