Zkouska i2c s PIC
Martin Šaněk
sanek.martin@volny.cz
Úterý Březen 1 18:58:57 CET 2005
Dobry vecer,
je mi lito, ze Vas vsechny musim zase otravovat se svym fatalnim
problemem. Snad se najde nekdo, kdo mi poradi...
Snazim se rozjet komunikaci I2C s eepromkou 24C04 - proste klasika.
Pouzivam k tomu PIC16F737 (protoze jsem ho dostal gratis jako vzorek),
ale at delam co delam nezacne ten kus cerne hmoty vubec nic delat.
Mam tuseni, ze se nenastavuje SSPIF flag v registru PIR1.
Vypada to, jakoby cely modul nebyl ani zapnuty. Zkousel jsem tahat
veci z internetu, ruzne je prizpusobovat na tenhle PIC, ale porad nic.
Puvodne jsem si rikal, ze s takovou banalitou musim byt hotov za
vikend, ale uz se s tim trpim 4.den. Nechci tu komunikaci delat sw,
protoze si s tim vlastne jen hraju a jde mi proste o to, rozchodit
modul MSSP ro I2C, coz proste musi fungovat !!! (jen nemuzu prijit na
to jak :-(((
Osetreni Interruptu neni provedeno zamerne, aby se tan nedely nejake
nepristojnosti. Myslim, ze by to vadit nemelo.
Dekuji vsem, kteri se se mnou podeli o svuj cas
MartinS
Dovoluji si sem poslat vypis toho nestastneho programu:
;Program na zkouseni I2C sbernice s PIC16F737
LIST P=PIC16F737
#include <C:\Program Files\Microchip\MPASM Suite\P16F737.inc> ;uvodni inicializace
; Fosc=4Mhz
errorlevel -302
__CONFIG _CONFIG1, _CP_OFF & _CCP2_RC1 & _DEBUG_OFF & _VBOR_4_2 & _BOREN_0 & _MCLR_OFF & _PWRTE_OFF & _WDT_OFF & _XT_OSC
__CONFIG _CONFIG2, _BORSEN_0 & _IESO_OFF & _FCMEN_OFF
#define LED PORTC,2
cblock 0x20
TEMP0
TEMP1
endc
;----------------------------------------------------------------------
; ********************* RESET VECTOR LOCATION ********************
;----------------------------------------------------------------------
org 0x000 ; processor reset vector
goto start ; go to beginning of program
;----------------------------------------------------------------------
; ******************* INTERRUPT VECTOR LOCATION *******************
;----------------------------------------------------------------------
org 0x004 ; interrupt vector location
nop
retfie
;----------------------------------------------------------------------
; ******************* MAIN CODE START LOCATION ******************
;----------------------------------------------------------------------
start
;init_ports ; initialize Ports
banksel PORTA ; select SFR bank
clrf PORTA ; initialize PORTS
clrf PORTB ;
clrf PORTC ;
banksel TRISC
movlw b'00011000' ;SCL+SDA jako vystupy
movwf TRISC ;
;setup_i2c
clrf SSPSTAT
bsf SSPSTAT,SMP ;nastaveni na 100kHz
bcf SSPSTAT,CKE ;
clrf SSPCON2
movlw .9
movwf SSPADD
banksel SSPCON
clrf SSPCON
bsf SSPCON,3 ;nastaveni jako Master
bsf SSPCON,SSPEN ;povoluje i2c port
banksel PIE1
bsf PIE1,SSPIE
banksel TMR0
bsf INTCON,PEIE ; enable peripheral interrupt
bsf INTCON,GIE ; enable global interrupt
;**Schreibe Wert 5 auf Speicher-Adresse 3 in 24C04*************
test
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
call w10ms
goto test
;***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
bsf LED ;toto je pridano pro TEST...
call w10ms ;..zda program projde timto bodem
btfss PIR1,SSPIF ; fertig?
goto i2c_warte ; nein, noch nicht
bcf PIR1,SSPIF ; ja, alles fertig, nun noch SSPIF zurücksetzen
bcf LED
return
;***ENDE UNTERPROGRAMME**********************************************************
w10ms movlw .13 ;cekani 10 ms
movwf TEMP0
movlw .255
movwf TEMP1
decfsz TEMP1,f
goto $-1
decfsz TEMP0,f
goto $-5
retlw 0
END
Další informace o konferenci Hw-list