Externes EEPROM am PIC16F877A Codeproblem
Servus,
also auf meinem Testboard ist ein externes EEPROM 24LC256 und dieses würde ich gerne absprechen(PIC16F877A). Also ich würde gerne Daten draufschreiben und diese dann auch wieder auslesen.
Ich habe im Democode auch folgenden Code in asm gefunden.
Code:
write_eeprom
banksel SSPCON2 ;write to EEPROM
bsf SSPCON2,SEN ;start bit
btfsc SSPCON2,SEN
goto $-1
movlw B'10100000' ;send control byte (write)
banksel SSPBUF
movwf SSPBUF
call ssprw
banksel SSPCON2
btfsc SSPCON2,ACKSTAT ;ack?
goto $-1
movlw 0x00 ;send slave address HIGH byte
banksel SSPBUF
movwf SSPBUF
call ssprw
banksel SSPCON2
btfsc SSPCON2,ACKSTAT ;ack?
goto $-1
movlw 0x05 ;send slave address LOW byte(0x0005)
banksel SSPBUF
movwf SSPBUF
call ssprw
banksel SSPCON2
btfsc SSPCON2,ACKSTAT ;ack?
goto $-1
banksel temperature
movf temperature,w ;send slave DATA = temperature
movwf SSPBUF
call ssprw
banksel SSPCON2
btfsc SSPCON2,ACKSTAT ;ack?
goto $-1
bsf SSPCON2,PEN ;stop bit
btfsc SSPCON2,PEN
goto $-1
banksel TMR1L
bcf PIR1,TMR1IF ;clear TIMER1 overflow flag
clrf TMR1L ;clear registers for next overflow
clrf TMR1H
return
;------------------------ IDLE MODULE -------------------------------------
ssprw ;check for idle SSP module
movlw 0x00
banksel SSPCON2
andwf SSPCON2,w
sublw 0x00
btfss STATUS,Z
goto $-4
btfsc SSPSTAT,R_W
goto $-1
return
Aber leider funktioniert die ganze Geschichte nicht. Und da ich davon nicht all zu viel Ahnung habe, brauche ich nun Hilfe.
Hat irgendwer einen Beispielcode, der funzt?
Danke
Gruß
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
ich habe mir jetzt mal den Code (von Sprut) im Detail angesehen. Das Einzige was mir auffällt ist ein Fehelr in der Zeile
movlw H'A0' ; 1010 0001
beim Lesen des aktuellen Bytes. Im Kommentar steht der Wert richtig drin, vorne aber nicht (H'A1' statt H'A0').
Wenn der PIC den Bus garnicht erst übernehmen kann stimmt normalerweise was mit den Pegeln an den Busleitungen nicht. Mess also bitte mal mit einem Multimeter die 5V nach. Wenn man den Bus nämlich abschießt kann es vorkommen dass eine oder beide Leitungen dauerhaft auf LOW liegen.
Ich habe soeben das Programm in einen 16F877 geladen, es läuft einwandfrei. Ich habe nur zwei Wartezeiten und ein paar nops zum Debuggen eingefügt. Die Adresse des EEPROMS (24C512) ist bei mir 0A4h.
Gruß,
Michael