Servus,
also irgendwie ist der Bereich der PIC schwach frequentiert. Ich habe nach wie vor das Problem mit dem EEPROM.
Ich habe mich jetzt noch mal im Detail mit I2C Programmierung auseinander gesetzt und bin bei sprut fündig geworden und versuche das Beispiel mit dem EEPROM umzusetzen, doch auch das mag nicht so recht klappen!
Code:
EPPROM_INIT
; einstellen von RC3 & RC4 auf input
bsf STATUS, RP0 ; Bank 1
movlw B'00011000' ; RC3,4 inputs
iorwf TRISC, f ; + RC2=CCP1 output
bcf STATUS, RP0 ; Bank 0
;bcf PORTC,3
;bcf PORTC,4
; einstellen des I2C-Taktes auf knapp 400 kHz
bsf STATUS, RP0 ; Bank 1
movlw d'9' ; clock = 4MHz/(4*(9+1)) = 100kHz
movwf SSPADD ; für I2C
bcf STATUS, RP0 ; Bank 0
movlw B'00001000' ; master mode, clock=Fosc/(4*(SSPADD+1))
movwf SSPCON ;
bsf SSPCON, SSPEN ; MSSP-Modul enable
EEPROM_SCHREIBEN
;**Schreibe Wert 5 auf Speicher-Adresse 3 in 24C04*************
call i2c_on ; Bus aktiv
movlw H'A0' ; 1010 0000
call i2c_tx ; 24C04 zum Schreiben adressieren
movlw 0x00 ; high Teil der Adresse (Page)
call i2c_tx
movlw 0x03 ; low Teil der Adresse
call i2c_tx
movlw 0x05 ; Wert der auf Adresse 3 soll
call i2c_tx
call i2c_off ; Bus freigeben
; Fertig. Nun beginnt im EEPROM ein Lösch-Schreib-Zyklus
; mit dem der Wert 5 in die EEPROM-Zelle 3 geschrieben wird.
; Das wird etwa 10 ms dauern. Solange ist der 24C04 nicht ansprechbar.
;
; .... ; das Programm geht dann irgentwie weiter
EEPROM_LESEN
;**Stelle EEPROM auf Speicher-Adresse 3 ein*************
call i2c_on ; Bus aktiv
movlw H'A0' ; 1010 0000
call i2c_tx ; 24C04 zum Schreiben adressieren
movlw 0x00 ; high Teil der Adresse
call i2c_tx
movlw 0x03 ; low Teil der Adresse
call i2c_tx
call i2c_off ; Bus freigeben
;Nun steht der Adress-Pointer im 24C04 auf dem Wert 3.
;Nun können wir den I2C-Bus erneut aktivieren, um ein Byte aus dem 24C04 zu lesen. Das ist unser Datenbyte.
;**Lesen des aktuellen Bytes aus 24C04*************
call i2c_on ; Bus aktiv
movlw H'A0' ; 1010 0001
call i2c_tx ; 24C04 zum lesen adressieren
call i2c_rx
movfw SSPBUF ; I2C Empfangsregister auslesen
movwf DATENPUFFER ; Byte in Speicherzelle Datenpuffer retten
call i2c_off ; Bus freigeben
;***I2C UNTERPROGRAMME************************************************************
;
; I2C-Bus im Master-Mode übernehmen
i2c_on bcf PIR1, SSPIF ; SSPIF Bit löschen
bsf STATUS, RP0
bsf SSPCON2, SEN ; Bus Übernahme anweisen
bcf STATUS, RP0
goto i2c_warte
; ein Byte aus W senden
i2c_tx
movwf SSPBUF ; -> zum I2C-Slave übertragen
goto i2c_warte
;ein Byte vom Slave empfangen (nach SSPBUF)
i2c_rx
bsf STATUS, RP0
bsf SSPCON2, RCEN ; Daten Empfang einschalten
bcf STATUS, RP0
goto i2c_warte
; I2C-Bus wieder freigeben
i2c_off
bsf STATUS, RP0
bsf SSPCON2, PEN ; Bus Freigabe anweisen
bcf STATUS, RP0
i2c_warte
btfss PIR1, SSPIF ; fertig?
goto i2c_warte ; nein, noch nicht
bcf PIR1, SSPIF ; ja, alles fertig, nun noch SSPIF zurücksetzen
return
;***ENDE UNTERPROGRAMME**********************************************************
; End of I2C routines
Das ist der Code von der Seite, den ich versuche zum laufen zu bekommen. Dort wird die Initialisierung genauso gemacht, wie ich das in meinem Code mache.
Mein Problem ist, dass ich gleich bei der Aktivierung des Busses im Unterprogramm (voriger durchlauf von i2c_on) i2c_warte hängen bleibe und sich der PIC dann totläuft, wenn er das setzen von SSPIF wartet.
Jemand ne Idee?
Gruß und Danke
Lesezeichen