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