Hallo zusammen Das schreiben ins und lesen vom Eeprom funktioniert mittlerweile grundsätzlich, jedoch beim schreiben oder lesen von DWord-Variablen gibt es Probleme. Diese bestehen darin, dass ich nicht die Werte wieder auslese, die ich dachte vorher geschrieben zu haben. Ich schreibe diese so Byte für Byte ins EEprom asm ; write byte0 bsf status,RP1 bsf status,RP0 ; Bank3 btfsc eecon1,WR ; Wait for write goto $-1 ; to complete bcf status,RP0 ; gehe auf Bank2 movlw 0x00 ; movwf eeadr ; schreibe Adresse in EEADR movlw freq2 ; movwf eedata ; schreibe Daten in EEDATA bsf status,RP0 ; gehe auf Bank3 bcf eecon1,EEPGD ; Point to DATA memory bsf eecon1,WREN ; setze dort Bit WREN enable write bcf intcon,GIE ; Disable INTs movlw 055h ; movwf eecon2 ; schreibe 55h in eecon2 movlw 0AAh ; movwf eecon2 ; schreibe AAh in eecon2 bsf eecon1,WR ; Bank3 bcf status,RP1 ; gehe wieder auf Bank1 bsf intcon,GIE ; setze dort GIE wieder bcf eecon1,WREN ; setze dort Bit WREN disable write ; write byte1 bsf status,RP1 bsf status,RP0 ; Bank3 btfsc eecon1,WR ; Wait for write goto $-1 ; to complete bcf status,RP0 ; gehe auf Bank2 movlw 0x01 ; movwf eeadr ; schreibe Adresse in EEADR movlw freq2h ; movwf eedata ; schreibe Daten in EEDATA bsf status,RP0 ; gehe auf Bank3 bcf eecon1,EEPGD ; Point to DATA memory bsf eecon1,WREN ; setze dort Bit WREN enable write bcf intcon,GIE ; Disable INTs movlw 055h ; movwf eecon2 ; schreibe 55h in eecon2 movlw 0AAh ; movwf eecon2 ; schreibe AAh in eecon2 bsf eecon1,WR ; Bank3 bcf status,RP1 ; gehe wieder auf Bank1 bsf intcon,GIE ; setze dort GIE wieder bcf eecon1,WREN ; setze dort Bit WREN disable write ; write byte2 bsf status,RP1 bsf status,RP0 ; Bank3 btfsc eecon1,WR ; Wait for write goto $-1 ; to complete bcf status,RP0 ; gehe auf Bank2 movlw 0x02 ; movwf eeadr ; schreibe Adresse in EEADR movlw freq2hh ; movwf eedata ; schreibe Daten in EEDATA bsf status,RP0 ; gehe auf Bank3 bcf eecon1,EEPGD ; Point to DATA memory bsf eecon1,WREN ; setze dort Bit WREN enable write bcf intcon,GIE ; Disable INTs movlw 055h ; movwf eecon2 ; schreibe 55h in eecon2 movlw 0AAh ; movwf eecon2 ; schreibe AAh in eecon2 bsf eecon1,WR ; Bank3 bcf status,RP1 ; gehe wieder auf Bank1 bsf intcon,GIE ; setze dort GIE wieder bcf eecon1,WREN ; setze dort Bit WREN disable write ; write byte3 bsf status,RP1 bsf status,RP0 ; Bank3 btfsc eecon1,WR ; Wait for write goto $-1 ; to complete bcf status,RP0 ; gehe auf Bank2 movlw 0x03 ; movwf eeadr ; schreibe Adresse in EEADR movlw freq2hhh ; movwf eedata ; schreibe Daten in EEDATA bsf status,RP0 ; gehe auf Bank3 bcf eecon1,EEPGD ; Point to DATA memory bsf eecon1,WREN ; setze dort Bit WREN enable write bcf intcon,GIE ; Disable INTs movlw 055h ; movwf eecon2 ; schreibe 55h in eecon2 movlw 0AAh ; movwf eecon2 ; schreibe AAh in eecon2 bsf eecon1,WR ; Bank3 bcf status,RP1 ; gehe wieder auf Bank1 bsf intcon,GIE ; setze dort GIE wieder bcf eecon1,WREN ; setze dort Bit WREN disable write endasm Und lese diese so wieder aus: asm bsf status,RP1 bcf status,RP0 ; Bank2 movlw 0x00 ; Read address 0 in EEPROM space Movwf eeadr ; Address to read bsf status,RP0 ; Bank3 bcf eecon1,EEPGD ; Point to data memory bsf eecon1,RD ; EE Read bcf status,RP0 ; Bank2 movf eedata,FREQ2 ; freq2 = EEDATA movlw 0x01 ; Read address 1 in EEPROM space Movwf eeadr ; Address to read bsf status,RP0 ; Bank3 bcf eecon1,EEPGD ; Point to data memory bsf eecon1,RD ; EE Read bcf status,RP0 ; Bank2 movf eedata,FREQ2H ; freq2h = EEDATA movlw 0x02 ; Read address 2 in EEPROM space Movwf eeadr ; Address to read bsf status,RP0 ; Bank3 bcf eecon1,EEPGD ; Point to data memory bsf eecon1,RD ; EE Read bcf status,RP0 ; Bank2 movf eedata,FREQ2HH ; freq2hh = EEDATA movlw 0x03 ; Read address 3 in EEPROM space Movwf eeadr ; Address to read bsf status,RP0 ; Bank3 bcf eecon1,EEPGD ; Point to data memory bsf eecon1,RD ; EE Read bcf status,RP0 ; Bank2 movf eedata,FREQ2HHH; freq2hhh = EEDATA endasm Kann mir jemand, der sich mit Assembler besser auskennt als ich, sagen, ob dieser Code so funktionieren sollte und der Fehler evtl. doch sonstwo zu suchen ist? Danke und Gruss Martin
Ohne deinen Code genauer analysiert zu haben (ich habe die Register-Bänke beim 17f877 nicht im Kopf): 1) Ich würde die INT's nur einmal am Anfang disablen, und ganz am Ende wieder enablen, nicht vor/nach jedem Byte. 2) Das btfsc eecon1,WR ; Wait for write goto $-1 ; to complete gehört nach dem Schreiben eines Bytes, nicht vor den Anfang des nächsten Bytes. In deiner Version kann es passieren, dass ein Byte noch nicht geschrieben ist, du aber die INT's schon wieder enablest. So könnte ein Interrupt dazwischenfunken.
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.