Forum: Mikrocontroller und Digitale Elektronik Problem mit LPM


von No N. (assi)


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

von Sven P. (Gast)


Lesenswert?

Kennst du diese 'adc'-Instruktion?

von No N. (assi)


Lesenswert?

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

von Sven P. (Gast)


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

von Michael U. (amiga)


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

von No N. (assi)


Lesenswert?

Vielen Dank für die Antworten hat geklappt.

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
Noch kein Account? Hier anmelden.