Forum: Mikrocontroller und Digitale Elektronik nochmal PIC 16F628 EEprom


von Sven (Gast)


Angehängte Dateien:

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

von Till (Gast)


Lesenswert?

muss man nach dem schreiben ins eeprom nicht warten bis fertig ist?

von Björn (Gast)


Lesenswert?

hab mir dein code jetzt nicht genau angeschaut, aber das mit dem warten
is glaube ich ein heisser tip.
schau mal hier:
http://www.sprut.de/electronic/pic/grund/eeprom.htm

von buzzwang (Gast)


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

von Sven (Gast)


Lesenswert?

Ich habe jetzt nach den Schreibvorgängen jeweils noch Zeitschleifen bis
hoch zu 250ms eigefügt, aber leider ohne Erfolg. Es muß also (noch) wo
anders hängen...

Sven

von Sven (Gast)


Lesenswert?

@ buzzwang:  Der 16F628 hat zwar auch 4 Bänke, aber EEDATA, EEADR und
EECON1 liegen in der Bank 1. Die Programmierroutine ist so auch fast
original aus dem Datenblatt entnommen..

Sven

von Sven (Gast)


Lesenswert?

Noch ne Info... ich hab beim Brennen mal die ersten EEPromZellen
geändert. Beim Programmstart werden die geänderten Werte angezeit. Also
liegt der Fehler definitiv in der Schreibroutine...

von Harald G. (Gast)


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

von Till (Gast)


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.

von Sven (Gast)


Lesenswert?

Ich habe den bcf eecon1,wren noch eingefügt, leider auch ohne Erfolg

von Sven (Gast)


Lesenswert?

@ till: Danke für den Code... ich seh mir den nach dem Mittag gleich mal
genauer an!

von Sven (Gast)


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

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.