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
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
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
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
@ 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
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...
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
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.
@ till: Danke für den Code... ich seh mir den nach dem Mittag gleich mal genauer an!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.