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.
Schon mal Danke im voraus...Code:__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
Lesezeichen