mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Problem mit SRAM


Autor: Hallo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
dcf77_start:  

ldi  YL,LOW(DCF77CT)    ;alle 10 mSek. aufzurufen
    ldi  YH,HIGH(DCF77CT)
    ldd  r20,Y+0
    ldd  r21,Y+1
    sbic  PINB,0      ;Input-Pin(sbis)
    rjmp  dcf77_5      ;Aktiv = "Low"
    inc  r20
    brne  dcf77_3
dcf77_1:  sbr  r21,$80      ;Fehler-Flag setzen
    std  Y+1,r21
dcf77_2:  clr  r20
dcf77_3:  std  Y+0,r20
dcf77_4:  ret

dcf77_5:  tst  r20      ;Auswertung fertig?
    breq  dcf77_4      ;Ja!
    ldd  r22,Y+2      ;Nein!
    ldd  r23,Y+9
    ldd  ZL,Y+10
    ldd  ZH,Y+11

    cpi  r20,196      ;LastBit 0 Obere Zeitgrenze+1 x
    brsh  dcf77_1      ;überschritten -> Fehler
    cpi  r20,187      ;LastBit-Scheide x
    brsh  dcf77_11    ;187-195 = LastBit0
    cpi  r20,178      ;LastBit 1 Untere Zeitgrenze x
    brsh  dcf77_10    ;178-186 = Lastbit1
        
    sbrc  r21,7      ;Wenn inzwischen Fehler...
    rjmp  dcf77_2      ;dann Abbruch  

    cpi  r22,$15      ;STATE < 21:
    brlo  dcf77_8      ;Inc STATE
        
    cpi  r20,6      ;Störspikegrenze x
    brlo  dcf77_2      ;Störspike wird ignoriert
    cpi  r20,96      ;Datenbit obere Zeitgrenze+1 x
    brsh  dcf77_1      ;überschritten -> Fehler
    cpi  r20,78      ;Datenbit untere Zeitgrenze x
    brlo  dcf77_1      ;unterschritten -> Fehler
    cpi  r20,87      ;Bitscheide x
    brsh  dcf77_6      ;87-95 = Bit0        
    inc  r21      ;78-86 = Bit1
    std  Y+1,r21
    cpi  r22,$1c
    breq  dcf77_6      ;Prüfbit Minute!
    cpi  r22,$23
    breq  dcf77_6      ;Prüfbit Stunde!
    ld  r20,Z      ;R20 = (aktuelle NEWTIME) Zelle
    add  r20,r23      ;addiere SHIFTER
    st  Z,r20      ;zurückspeichern

dcf77_6:  lsl  r23      ;Bit0/1: SHIFTER um 1 nach links
    std  Y+9,r23
    cpi  r22,$1c
    brlo  dcf77_8      ;Minuten-Zyklus 
    breq  dcf77_9      ;Minute Prüfbit
    cpi  r22,$23
    brlo  dcf77_8      ;Stunden-Zyklus
    breq  dcf77_9      ;Stunden-Prüfbit
    cpi  r22,$29
    brlo  dcf77_8
    breq  dcf77_7      ;LastBit TAG
    cpi  r22,$2c
    brlo  dcf77_8
    breq  dcf77_7      ;LastBit WOCHENTAG
    cpi  r22,$31
    brne  dcf77_8
dcf77_7:  ldi  r23,1      ;LastBit MONAT
    adiw  ZH:ZL,1
    std  Y+9,r23
    std  Y+10,ZL
    std  Y+11,ZH    

dcf77_8:  inc  r22      ;Inc STATE
    std  Y+2,r22
    rjmp  dcf77_2                          

dcf77_9:  sbrc  r21,0      ;Prüfbit MIN/STU Auswertung
    rjmp  dcf77_1      ;Prüfbit Fehler
    rjmp  dcf77_7      ;Prüfbit OK

dcf77_10:  inc  r21      ;LastBit = 1: Inc CHECK
dcf77_11:  cpi  r22,$3a      ;58 DCF77-Bits erfasst?
    brne  dcf77_init    ;unvollständig -> dcf77_init
    andi  r21,$81
    brne  dcf77_init    ;Fehlerstatus -> dcf77_init
    
    ldi  r20,6      ;Erfolgreicher Empfang:
    ld  r21,Z      ;BCD-Zeitinformation
dcf77_12:  
    std  Z+11,r21    ;nach MIN...JHR sichern
    ld  r21,-Z
    dec  r20
    brne  dcf77_12
    std  Z+11,r20    ;Sek. = 0 setzen
    std  Z+10,r20    ;1/100 Sek. = 0 setzen  
  
dcf77_init:  ldi  ZL,LOW(DCF77CT)    ;DCF77-VARIABLEN RESET
    ldi  ZH,HIGH(DCF77CT)
    ldi  r21,LOW(NEWTIME)
    ldi  r22,HIGH(NEWTIME)
    ldi  r20,$09
    clr  r23
dcf77_14:  st  Z+,r23
    dec  r20
    brne  dcf77_14
    inc  r20
    st  Z+,r20
    st  Z+,r21
    st  Z,r22

    ret
  .DSEG

DCF77CT:  .BYTE 1    ;0    DCF77 Impuls-Pausenzeit-Zähler
DCF77CHECK:  .BYTE 1    ;0    DCF77 Fehler-Flag + 1-Zähler
DCF77STATE:  .BYTE 1    ;0    DCF77 Aktuelle Bitnummer
NEWTIME:  .BYTE 6    ;0,0,0,0,0,0  DCF77 Zeit-Zwischenspeicher
DCF77SHIFT:  .BYTE 1    ;1    DCF77 Shifter
DCF77TAL:  .BYTE 1    ;LOW(NEWTIME)  DCF77 Pointer auf NEWTIME Low
DCF77TAH:  .BYTE 1    ;HIGH(NEWTIME)  DCF77 Pointer auf NEWTIME High
HSEK:    .BYTE 1    ;RTC verwaltet  BCD 1/100 Sekunde
SEK:    .BYTE 1    ;RTC verwaltet  BCD Sekunde
MIN:    .BYTE 1    ;RTC verwaltet  BCD Minute
STU:    .BYTE 1    ;RTC verwaltet  BCD Stunde
TAG:    .BYTE 1    ;RTC verwaltet  BCD Tag
WTAG:    .BYTE 1    ;RTC verwaltet  BCD Wochentag
MON:    .BYTE 1    ;RTC verwaltet  BCD Monat
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

Autor: Hallo (Gast)
Datum:

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

Autor: Sascha Weber (sascha-w)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Hallo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
dcf77_11:  cpi  r22,$3a      ;58 DCF77-Bits erfasst?
    brne  dcf77_init    ;unvollständig -> dcf77_init
    andi  r21,$81
>>> ;brne  dcf77_init    ;Fehlerstatus -> dcf77_init
    
    ldi  r20,6      ;Erfolgreicher Empfang:
    ld  r21,Z      ;BCD-Zeitinformation
dcf77_12:  
    std  Z+11,r21    ;nach MIN...JHR sichern
    ld  r21,-Z
    dec  r20
    brne  dcf77_12
    std  Z+11,r20    ;Sek. = 0 setzen
    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?

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.