nochmal PIC 16F628 EEprom

Gast #74135
Lesenswert?

Hi,
ich muß nochmal nachfragen.. sorry.
Ich will eine Zeitsteuerung für mein Leiterplattenbelichtungsgerät
bauen. (Ich weiß, gibt es schon, aber ich will selber was machen, als
Lernobjekt). Ich kann die Zeit mittels Tastern verringern und erhöhen
und beim gleichzeitigen drücken dieser Taster soll die Zeit im EEprom
gespeichert werden. Beim Programmstart soll diese dann wieder
ausgelesen und in die entsprechenden Register tmin und tsek geschrieben
werden. Beim Programmstart kommt aber jedesmal die gleiche falsche Zeit
(55min 55sek, da eine leere Zelle sicher FFh (255dez) als Inhalt hat
und ich die hunderter Stellen nicht auswerte). Trotz Vergleich mit
Beispielen und dutzenden Malen durchsehen des Datenblattes kann ich in
meinen Lese -und Schreibroutinen eigentlich keinen Fehler erkennen.
Vielleicht sieht jemand von euch den entscheidenden Fehler?
Danke schon im Voraus für die Tips,

Tschöö Sven
Angehängte Dateien:
Gast #74138
Lesenswert?

Das gleiche habe ich vor einer woche gemacht. Jedoch mit C.
Der C-Compiler hat die Bankbits falsch gesetzt. Deswegen hat sich
mein PIC immer "aufgehängt" weil ins PIR geschrieben wurde.

In deinem Code wird immer nur RP0 geändert EECON1/2 liegt auf Bank 3
d.h. RP0=1 RP1=1

=>das galt für meinen 16F872. weis nicht ob der 16F628 auch vier Bänke
hat.

Mfg
  Buzzwang
Gast #74142
Lesenswert?

Hallo Sven

fehlt eventuel am Ende der Write-routine der Befehl

     BCF    EECON1,WREN

zum beenden des Schreibvorganges ?
Der 16F870 braucht sie jedenfalls.

Ich würde "tmin" und "tsec" auch einzeln ins EEprom schreiben,
also die Writ-routine ändern und 2mal aufrufen mit der wartezeit
dazwischen.

tschüs
harald
Gast #74143
Lesenswert?

Also diese funktioniert bei mir problemlos  im 16F628:


EEWrite            ; speichern des aktuellen
  BSF      STATUS, RP0      ; EEADR liegt in der Bank 1
     MOVLW    0x00      ; Adresse #00
      MOVWF    EEADR
   BCF  STATUS, RP0        ; Bank 0
        MOVFW    volume                  ; Wert von volume ins EEPROM
    BSF      STATUS, RP0      ; EEADR liegt in der Bank 1
       MOVWF    EEDATA
         BSF      EECON1, WREN          ; nun ist Schreiben erlaubt
    MOVLW    0x55
      MOVWF    EECON2               ; schreibe 55h nach EECON2
      MOVLW    0xaa
      MOVWF    EECON2               ; schreibe AAh nach EECON2
      BSF      EECON1, WR           ; starte den Schreibzyklus
  NOP
    NOP
    call     _wrcompl
  BCF   STATUS, RP0     ; Bank 0
  BSF  PORTA,7      ; entmuten
jump1
  return

_wrcompl
  bsf     STATUS,RP0            ; Bank 1
        btfsc   EECON1,WR             ; warte bis Schreibvorgang b
        goto    _wrcompl
        bcf     STATUS,RP0            ; Bank 0
        return                          ; zurueck zur aufrufenden
Routine


Deinen code genau anschauen und ausprobieren bräuchte ich mehr zeit.

Ich schreibe allerdings auch immer nur ein byte und habe für
verschiedene variablen einzelne schreibroutinen. Bist du dir absolut
sicher das das aufrufen der routine klappt? ich teste sowas immer sehr
konservativ indem ich an irgendeinem pin eine led habe und in den code
solange als "breakpoint" ein BSF LED einsetzte bis ich  sicher weiß
was wirklich passiert.
Gast #74146
Lesenswert?

Jubel .. es geht...

Wieder so ein dummer Faselfehler. Man kontrolliert die komplizierten
Sachen und übersieht, daß man das EEADR und EEDATA beschreiben will,
ohne vorher in Bank 1 umzuschalten, sorry ;-)

Vielen Dank an alle für die Mühen und Tips!

Sven

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