mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik nochmal PIC 16F628 EEprom


Autor: Sven (Gast)
Datum:
Angehängte Dateien:

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

Autor: Till (Gast)
Datum:

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

Autor: Björn (Gast)
Datum:

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

Autor: buzzwang (Gast)
Datum:

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

Autor: Sven (Gast)
Datum:

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

Autor: Sven (Gast)
Datum:

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

Autor: Sven (Gast)
Datum:

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

Autor: Harald G. (Gast)
Datum:

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

Autor: Till (Gast)
Datum:

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

Autor: Sven (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe den bcf eecon1,wren noch eingefügt, leider auch ohne Erfolg

Autor: Sven (Gast)
Datum:

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

Autor: Sven (Gast)
Datum:

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

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.