PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : i2c bus - Steuerung für srf02



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