Dan89
15.03.2007, 19:33
Hallo,
bin schon den ganzen Nachmittag am verzweifeln. Ich versuche mit einem 16F676 einen srf02 über i2c abzufragen. Eine Verbindung kann ich aufbauen und der srf02 sendet auch sein Ultraschallsignal auf Befehl, aber ich kann die Entfernung nicht auslesen. Leider hab ich nirgens ein Beispiel gefunden für eine Ansteuerung in Assembler und selber ist es mein erstes Projekt mit i2c.
Wär schön wenn hier mal jemand einen Blick drüber werfen könnte und schauen wo mein Fehler liegt. Das Register, dass ich auslesen möchte lasse ich zum Test auf PortB legen. Ansonsten ist der ganze Quellcode größtenteils von sprut übernommen, aus dem Beispiel zum ansteuern eines Eeproms.
__CONFIG _BODEN_ON & _CP_OFF & _PWRTE_ON & _WDT_OFF & _LVP_OFF & _XT_OSC
;================================================= =========================
TIMER1 EQU H'20' ;Used in delay routine
TIMER2 EQU H'21' ; " " "
;================================================= =========================
RESET BSF STATUS,RP0 ;
MOVLW B'11010111' ;
MOVWF OPTION_REG ;
;
CLRF INTCON ;
movlw B'00011100' ; RC3,4,2 inputs
iorwf TRISC, f ; + RC2=CCP1 output
movlw d'2' ;
movwf SSPADD ; für I2C
MOVLW B'00000000'
MOVWF TRISB
BCF STATUS,RP0 ;
MOVLW B'11111111'
MOVWF PORTB
movlw B'00001000' ; master mode, clock=Fosc/(4*(SSPADD+1))
movwf SSPCON ;
CALL DELAY_ROUTINE
MOVLW B'0000000'
MOVWF PORTB
CALL DELAY_ROUTINE
bsf SSPCON, SSPEN ; MSSP-Modul enable
GOTO START
;***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
DELAY_ROUTINE MOVLW D'255' ;
MOVWF TIMER2
DEL_LOOP1 MOVLW D'255' ;
MOVWF TIMER1
DEL_LOOP2 nop
nop
nop
nop
nop
nop
DECFSZ TIMER1,F
GOTO DEL_LOOP2
DECFSZ TIMER2,F
GOTO DEL_LOOP1
RETLW 0
;***ENDE UNTERPROGRAMME************************************ **********************
Start BTFSS PORTC,02 ;Start der Messung durch Tastendruck
GOTO START
CALL DELAY_ROUTINE
call i2c_on ; Bus aktiv
movlw D'224'
call i2c_tx ; SRF02 zum Schreiben adressieren
movlw D'0' ; Befehlsregister
call i2c_tx
movlw D'81' ; Messung in cm
call i2c_tx
call i2c_off ; Bus freigeben
;=========== Bis hierhin funktionierts
CALL DELAY_ROUTINE ; Wartezeit zur Messung
;**Stelle SRF02 auf REGISTER 2 ein*************
call i2c_on ; Bus aktiv
movlw D'224'
call i2c_tx ; SRF02 zum Lesen adressieren
movlw H'02'
call i2c_tx
call i2c_off ; Bus freigeben
;**Lesen des Empfangsregisters*************
call i2c_on ; Bus aktiv
movlw D'224'
call i2c_tx ; SRF02 zum lesen adressieren
call i2c_rx
movfw SSPBUF ; I2C Empfangsregister auslesen
movwf PORTB ; Byte auf Ausgang legen
call i2c_off ; Bus freigeben
;===========Jetzt hat PortB leider immer den Wert 255
GOTO Start
END
Schon mal Danke im voraus...
bin schon den ganzen Nachmittag am verzweifeln. Ich versuche mit einem 16F676 einen srf02 über i2c abzufragen. Eine Verbindung kann ich aufbauen und der srf02 sendet auch sein Ultraschallsignal auf Befehl, aber ich kann die Entfernung nicht auslesen. Leider hab ich nirgens ein Beispiel gefunden für eine Ansteuerung in Assembler und selber ist es mein erstes Projekt mit i2c.
Wär schön wenn hier mal jemand einen Blick drüber werfen könnte und schauen wo mein Fehler liegt. Das Register, dass ich auslesen möchte lasse ich zum Test auf PortB legen. Ansonsten ist der ganze Quellcode größtenteils von sprut übernommen, aus dem Beispiel zum ansteuern eines Eeproms.
__CONFIG _BODEN_ON & _CP_OFF & _PWRTE_ON & _WDT_OFF & _LVP_OFF & _XT_OSC
;================================================= =========================
TIMER1 EQU H'20' ;Used in delay routine
TIMER2 EQU H'21' ; " " "
;================================================= =========================
RESET BSF STATUS,RP0 ;
MOVLW B'11010111' ;
MOVWF OPTION_REG ;
;
CLRF INTCON ;
movlw B'00011100' ; RC3,4,2 inputs
iorwf TRISC, f ; + RC2=CCP1 output
movlw d'2' ;
movwf SSPADD ; für I2C
MOVLW B'00000000'
MOVWF TRISB
BCF STATUS,RP0 ;
MOVLW B'11111111'
MOVWF PORTB
movlw B'00001000' ; master mode, clock=Fosc/(4*(SSPADD+1))
movwf SSPCON ;
CALL DELAY_ROUTINE
MOVLW B'0000000'
MOVWF PORTB
CALL DELAY_ROUTINE
bsf SSPCON, SSPEN ; MSSP-Modul enable
GOTO START
;***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
DELAY_ROUTINE MOVLW D'255' ;
MOVWF TIMER2
DEL_LOOP1 MOVLW D'255' ;
MOVWF TIMER1
DEL_LOOP2 nop
nop
nop
nop
nop
nop
DECFSZ TIMER1,F
GOTO DEL_LOOP2
DECFSZ TIMER2,F
GOTO DEL_LOOP1
RETLW 0
;***ENDE UNTERPROGRAMME************************************ **********************
Start BTFSS PORTC,02 ;Start der Messung durch Tastendruck
GOTO START
CALL DELAY_ROUTINE
call i2c_on ; Bus aktiv
movlw D'224'
call i2c_tx ; SRF02 zum Schreiben adressieren
movlw D'0' ; Befehlsregister
call i2c_tx
movlw D'81' ; Messung in cm
call i2c_tx
call i2c_off ; Bus freigeben
;=========== Bis hierhin funktionierts
CALL DELAY_ROUTINE ; Wartezeit zur Messung
;**Stelle SRF02 auf REGISTER 2 ein*************
call i2c_on ; Bus aktiv
movlw D'224'
call i2c_tx ; SRF02 zum Lesen adressieren
movlw H'02'
call i2c_tx
call i2c_off ; Bus freigeben
;**Lesen des Empfangsregisters*************
call i2c_on ; Bus aktiv
movlw D'224'
call i2c_tx ; SRF02 zum lesen adressieren
call i2c_rx
movfw SSPBUF ; I2C Empfangsregister auslesen
movwf PORTB ; Byte auf Ausgang legen
call i2c_off ; Bus freigeben
;===========Jetzt hat PortB leider immer den Wert 255
GOTO Start
END
Schon mal Danke im voraus...