Problem mit LPM

OP #1320083
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:
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
Lesenswert?

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren