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!
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.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
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







Zitieren

Lesezeichen