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.