Forum: Mikrocontroller und Digitale Elektronik Problem mit SRAM


von Hallo (Gast)


Lesenswert?

Hallo,
ich bin gerade dabei meine erste Funkuhr zu bauen, dabei habe ich nun 
ein ein Problem mit dem DCF Code von Pit hier aus dem Forum. Ich hoffe 
ihr könnt mir weiterhelfen.

Hier erstmal der Code, also der DCF teil der rest dürfte uninteressant 
sein.
1
dcf77_start:  
2
3
ldi  YL,LOW(DCF77CT)    ;alle 10 mSek. aufzurufen
4
    ldi  YH,HIGH(DCF77CT)
5
    ldd  r20,Y+0
6
    ldd  r21,Y+1
7
    sbic  PINB,0      ;Input-Pin(sbis)
8
    rjmp  dcf77_5      ;Aktiv = "Low"
9
    inc  r20
10
    brne  dcf77_3
11
dcf77_1:  sbr  r21,$80      ;Fehler-Flag setzen
12
    std  Y+1,r21
13
dcf77_2:  clr  r20
14
dcf77_3:  std  Y+0,r20
15
dcf77_4:  ret
16
17
dcf77_5:  tst  r20      ;Auswertung fertig?
18
    breq  dcf77_4      ;Ja!
19
    ldd  r22,Y+2      ;Nein!
20
    ldd  r23,Y+9
21
    ldd  ZL,Y+10
22
    ldd  ZH,Y+11
23
24
    cpi  r20,196      ;LastBit 0 Obere Zeitgrenze+1 x
25
    brsh  dcf77_1      ;überschritten -> Fehler
26
    cpi  r20,187      ;LastBit-Scheide x
27
    brsh  dcf77_11    ;187-195 = LastBit0
28
    cpi  r20,178      ;LastBit 1 Untere Zeitgrenze x
29
    brsh  dcf77_10    ;178-186 = Lastbit1
30
        
31
    sbrc  r21,7      ;Wenn inzwischen Fehler...
32
    rjmp  dcf77_2      ;dann Abbruch  
33
34
    cpi  r22,$15      ;STATE < 21:
35
    brlo  dcf77_8      ;Inc STATE
36
        
37
    cpi  r20,6      ;Störspikegrenze x
38
    brlo  dcf77_2      ;Störspike wird ignoriert
39
    cpi  r20,96      ;Datenbit obere Zeitgrenze+1 x
40
    brsh  dcf77_1      ;überschritten -> Fehler
41
    cpi  r20,78      ;Datenbit untere Zeitgrenze x
42
    brlo  dcf77_1      ;unterschritten -> Fehler
43
    cpi  r20,87      ;Bitscheide x
44
    brsh  dcf77_6      ;87-95 = Bit0        
45
    inc  r21      ;78-86 = Bit1
46
    std  Y+1,r21
47
    cpi  r22,$1c
48
    breq  dcf77_6      ;Prüfbit Minute!
49
    cpi  r22,$23
50
    breq  dcf77_6      ;Prüfbit Stunde!
51
    ld  r20,Z      ;R20 = (aktuelle NEWTIME) Zelle
52
    add  r20,r23      ;addiere SHIFTER
53
    st  Z,r20      ;zurückspeichern
54
55
dcf77_6:  lsl  r23      ;Bit0/1: SHIFTER um 1 nach links
56
    std  Y+9,r23
57
    cpi  r22,$1c
58
    brlo  dcf77_8      ;Minuten-Zyklus 
59
    breq  dcf77_9      ;Minute Prüfbit
60
    cpi  r22,$23
61
    brlo  dcf77_8      ;Stunden-Zyklus
62
    breq  dcf77_9      ;Stunden-Prüfbit
63
    cpi  r22,$29
64
    brlo  dcf77_8
65
    breq  dcf77_7      ;LastBit TAG
66
    cpi  r22,$2c
67
    brlo  dcf77_8
68
    breq  dcf77_7      ;LastBit WOCHENTAG
69
    cpi  r22,$31
70
    brne  dcf77_8
71
dcf77_7:  ldi  r23,1      ;LastBit MONAT
72
    adiw  ZH:ZL,1
73
    std  Y+9,r23
74
    std  Y+10,ZL
75
    std  Y+11,ZH    
76
77
dcf77_8:  inc  r22      ;Inc STATE
78
    std  Y+2,r22
79
    rjmp  dcf77_2                          
80
81
dcf77_9:  sbrc  r21,0      ;Prüfbit MIN/STU Auswertung
82
    rjmp  dcf77_1      ;Prüfbit Fehler
83
    rjmp  dcf77_7      ;Prüfbit OK
84
85
dcf77_10:  inc  r21      ;LastBit = 1: Inc CHECK
86
dcf77_11:  cpi  r22,$3a      ;58 DCF77-Bits erfasst?
87
    brne  dcf77_init    ;unvollständig -> dcf77_init
88
    andi  r21,$81
89
    brne  dcf77_init    ;Fehlerstatus -> dcf77_init
90
    
91
    ldi  r20,6      ;Erfolgreicher Empfang:
92
    ld  r21,Z      ;BCD-Zeitinformation
93
dcf77_12:  
94
    std  Z+11,r21    ;nach MIN...JHR sichern
95
    ld  r21,-Z
96
    dec  r20
97
    brne  dcf77_12
98
    std  Z+11,r20    ;Sek. = 0 setzen
99
    std  Z+10,r20    ;1/100 Sek. = 0 setzen  
100
  
101
dcf77_init:  ldi  ZL,LOW(DCF77CT)    ;DCF77-VARIABLEN RESET
102
    ldi  ZH,HIGH(DCF77CT)
103
    ldi  r21,LOW(NEWTIME)
104
    ldi  r22,HIGH(NEWTIME)
105
    ldi  r20,$09
106
    clr  r23
107
dcf77_14:  st  Z+,r23
108
    dec  r20
109
    brne  dcf77_14
110
    inc  r20
111
    st  Z+,r20
112
    st  Z+,r21
113
    st  Z,r22
114
115
    ret
116
  .DSEG
117
118
DCF77CT:  .BYTE 1    ;0    DCF77 Impuls-Pausenzeit-Zähler
119
DCF77CHECK:  .BYTE 1    ;0    DCF77 Fehler-Flag + 1-Zähler
120
DCF77STATE:  .BYTE 1    ;0    DCF77 Aktuelle Bitnummer
121
NEWTIME:  .BYTE 6    ;0,0,0,0,0,0  DCF77 Zeit-Zwischenspeicher
122
DCF77SHIFT:  .BYTE 1    ;1    DCF77 Shifter
123
DCF77TAL:  .BYTE 1    ;LOW(NEWTIME)  DCF77 Pointer auf NEWTIME Low
124
DCF77TAH:  .BYTE 1    ;HIGH(NEWTIME)  DCF77 Pointer auf NEWTIME High
125
HSEK:    .BYTE 1    ;RTC verwaltet  BCD 1/100 Sekunde
126
SEK:    .BYTE 1    ;RTC verwaltet  BCD Sekunde
127
MIN:    .BYTE 1    ;RTC verwaltet  BCD Minute
128
STU:    .BYTE 1    ;RTC verwaltet  BCD Stunde
129
TAG:    .BYTE 1    ;RTC verwaltet  BCD Tag
130
WTAG:    .BYTE 1    ;RTC verwaltet  BCD Wochentag
131
MON:    .BYTE 1    ;RTC verwaltet  BCD Monat
132
JHR:    .BYTE 1    ;RTC verwaltet  BCD Jahr

So dieser Code wird per Interrupt alle 10 mSek aufgerufe. Empfangen habe 
ich auch schon was indem ich mal NEWTIME auf das LCD ausgegeben habe , 
also sollte Harwaremäßig alles OK sein. Nun müsste doch sobald die Zeit 
richtig erkannt wurde diese auf die Adresssen Min bis JHR gespeichert 
werden. Wenn ich diese auslese bekomme ich jedoch nur müll.
Was ist falsch oder wie bekomme ich die Zeitdaten in den Speicher??


Auslesen tue ich eine Speicherstelle so:
    LDI ZL, LOW(STU)
    LDI ZH, HIGH(STU)
    ld temp1, Z
Und die Init wird auch am Anfange aufgerufen.


MfG
Hallo

von Hallo (Gast)


Lesenswert?

Was ich noch vergessen habe es handelt sich um einen ATmeg8 und ein 
Pollin DCF modul.

von Sascha W. (sascha-w)


Lesenswert?

hast du daran gedacht, das die Werte BCD-kodiert sind ?
Du must den Wert als HEX ausgeben, um die richtige Anzeige zu bekommen.

>Auslesen tue ich eine Speicherstelle so:
>    LDI ZL, LOW(STU)
>    LDI ZH, HIGH(STU)
>    ld temp1, Z
was für ein Aufwand!
     lds templ,STU

es sei denn du willst nacheinander mehrere Werte lesen
    LDI ZL, LOW(SEK)
    LDI ZH, HIGH(SEK)
    ld temp1, Z+       ;Sekunde
    ...
    ld temp1, Z+       ;Minute
    ...
    ld temp1, Z+       ;Stunde
    ...
dann würde man wieder Zeit und Speicher sparen

Sascha

von Hallo (Gast)


Lesenswert?

Hallo,
ich habe nun den Fehler gefunden kann ihn mir aber leider noch nicht 
erklären.

Wenn ich die Zeile für die Fehlererkennug auskommentiere bekomme ich die 
richtigen Zeitdaten:
1
dcf77_11:  cpi  r22,$3a      ;58 DCF77-Bits erfasst?
2
    brne  dcf77_init    ;unvollständig -> dcf77_init
3
    andi  r21,$81
4
>>> ;brne  dcf77_init    ;Fehlerstatus -> dcf77_init
5
    
6
    ldi  r20,6      ;Erfolgreicher Empfang:
7
    ld  r21,Z      ;BCD-Zeitinformation
8
dcf77_12:  
9
    std  Z+11,r21    ;nach MIN...JHR sichern
10
    ld  r21,-Z
11
    dec  r20
12
    brne  dcf77_12
13
    std  Z+11,r20    ;Sek. = 0 setzen
14
    std  Z+10,r20    ;1/100 Sek. = 0 setzen

Kan mir das ganze bloß noch nicht erklären wo ein Fehler erkannt wird wo 
keiner ist da die Zeit richtig angezeigt wird.

Wäre toll wenn mal jemnd drüber schauen könnte weil ich bin langsam am 
verzweifeln!!!

Ach ja ich habe den ATmega8 mit 8MHz getaktet das sollte doch aber 
ncihts ausmachen solange der Interrupt stimmt?? Oder?

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.