Enrock
11.03.2008, 11:33
Servus und Hallo,
ich habe mal wieder ein Problem, mit dem ich allein nicht mehr zu Rande komme...
Ich versuche einen Drucksensor MS5534 mit dem PIC16F877A via SPI zu verbinden. Das Ganze habe ich auf dem PICDEM2 PLUS Board aufgebaut
Hier das Datenblatt des MS5534B
http://www.amsys.de/sheets/amsys.de.ms5534b(e).pdf
Nun ja der Sensor macht das "Verbinden" nicht gerade einfach. Der MS5534 verträgt maximal 3,6 Volt als VDD, sowie an den Pins. Also bin ich her gegangen und habe mir die 5 Volt die ich vom Board bekomme via Widerstand und Z-Diode auf 3,3 Volt runtergeregelt. Bei den Pins, die als Eingänge für den Drucksensor dienen habe ich Spannungsteiler eingesetzt, um von 5 Volt auf 3,3 zu kommen und bei dem Ausgang des Sensors habe ich keine Beschaltung gewählt, da der PIC die 3,3 Volt als HIGH interpretieren sollte.
Was soll ich sagen, die Kommunikation funktioniert nicht und ich weiß nicht woran es liegt.
Hier noch mein Code: Ich versuche mittlerweile lediglich ein Calibration Word zu empfangen....
list p=16f877a ; list directive to define processor
#include <p16f877a.inc> ; processor specific variable definitions
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _HS_OSC & _WRT_OFF & _LVP_OFF & _CPD_OFF
D_LCD_DATA UDATA 0x20 ;start of general purpose registers
COUNTER res 1 ; Counter in Init
RXDATA_1 res 1
RXDATA_2 res 1
TXDATA res 1
;endc
;#define LCD_D4 PORTD, 0
;PROG1 Code ; START
ORG 0x000
goto START_PRESSURE_INIT
org 0x0004 ; Interrupt
retfie
;***********************Zeile 1***************************************
START_PRESSURE_INIT
clrf RXDATA_1
clrf RXDATA_2
clrf TXDATA
banksel TRISC
movlw b'00010000'
movwf TRISC
banksel SSPSTAT
movlw b'11000000' ; SMP=1, CKE=1, BF=0
movwf SSPSTAT
banksel SSPCON
movlw b'00100010' ; WCOL=0, SSPOV=0, SSPEN=1, CKP=0, SSPM[3..0]= 0010 (FOSC/64)
movwf SSPCON
;LOOP BTFSS SSPSTAT, BF ;Has data been received(transmit complete)?
;goto LOOP ;No
;MOVF SSPBUF, W ;WREG reg = contents of SSPBUF
;MOVWF RXDATA ;Save in user RAM, if data is meaningful
movlw 0x1d
movwf TXDATA
MOVF TXDATA, W ;W reg = contents of TXDATA
MOVWF SSPBUF ;New data to xmit
movlw 0x50
movwf TXDATA
MOVF TXDATA, W ;W reg = contents of TXDATA
MOVWF SSPBUF ;New data to xmit
LOOP BTFSS SSPSTAT, BF ;Has data been received(transmit complete)?
goto LOOP ;No
MOVF SSPBUF, W ;WREG reg = contents of SSPBUF
MOVWF RXDATA_1 ;Save in user RAM, if data is meaningful
LOOP2 BTFSS SSPSTAT, BF ;Has data been received(transmit complete)?
goto LOOP2 ;No
MOVF SSPBUF, W ;WREG reg = contents of SSPBUF
MOVWF RXDATA_2 ;Save in user RAM, if data is meaningful
banksel TRISB
movlw b'00000000'
movwf TRISB
banksel PORTB
movlw b'01010101'
movwf PORTB
ABE
goto ABE
end
Und noch zur Beschaltung:
Ich verbinde
PIC_PIN_RC3_SCL mit SENSOR_PIN_SCLK
PIC_PIN_RC4_SDI mit SENSOR_PIN_DOUT
PIC_PIN_RC5_SDO mit SENSOR_PIN_DIN
So und jetzt kommt’s. Der Drucksensor braucht noch eine zusätzliche Clock von 30 bis 35 kHz (MCLK). Ich habe einen Uhrenquarz auf dem Board der mit RC0 und RC1 verbunden ist. Ich greife mir wahlweise an RCO bzw. RC1 die Clock ab, da ich mir nicht sicher bin an welchen Pin diese muss und ob das überhaupt funktioniert.
VDD_BOARD über "Widerstands-Z-Dioden-Teiler" an VDD_Sensor.
GND_BOARD an GND_SENSOR
Ich beschäftige mich das erste Mal mit dem SPI Modus... I2C habe ich schneller zum laufen gebracht.
Vielen Dank für die Hilfe
Gruß Daniel
ich habe mal wieder ein Problem, mit dem ich allein nicht mehr zu Rande komme...
Ich versuche einen Drucksensor MS5534 mit dem PIC16F877A via SPI zu verbinden. Das Ganze habe ich auf dem PICDEM2 PLUS Board aufgebaut
Hier das Datenblatt des MS5534B
http://www.amsys.de/sheets/amsys.de.ms5534b(e).pdf
Nun ja der Sensor macht das "Verbinden" nicht gerade einfach. Der MS5534 verträgt maximal 3,6 Volt als VDD, sowie an den Pins. Also bin ich her gegangen und habe mir die 5 Volt die ich vom Board bekomme via Widerstand und Z-Diode auf 3,3 Volt runtergeregelt. Bei den Pins, die als Eingänge für den Drucksensor dienen habe ich Spannungsteiler eingesetzt, um von 5 Volt auf 3,3 zu kommen und bei dem Ausgang des Sensors habe ich keine Beschaltung gewählt, da der PIC die 3,3 Volt als HIGH interpretieren sollte.
Was soll ich sagen, die Kommunikation funktioniert nicht und ich weiß nicht woran es liegt.
Hier noch mein Code: Ich versuche mittlerweile lediglich ein Calibration Word zu empfangen....
list p=16f877a ; list directive to define processor
#include <p16f877a.inc> ; processor specific variable definitions
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _HS_OSC & _WRT_OFF & _LVP_OFF & _CPD_OFF
D_LCD_DATA UDATA 0x20 ;start of general purpose registers
COUNTER res 1 ; Counter in Init
RXDATA_1 res 1
RXDATA_2 res 1
TXDATA res 1
;endc
;#define LCD_D4 PORTD, 0
;PROG1 Code ; START
ORG 0x000
goto START_PRESSURE_INIT
org 0x0004 ; Interrupt
retfie
;***********************Zeile 1***************************************
START_PRESSURE_INIT
clrf RXDATA_1
clrf RXDATA_2
clrf TXDATA
banksel TRISC
movlw b'00010000'
movwf TRISC
banksel SSPSTAT
movlw b'11000000' ; SMP=1, CKE=1, BF=0
movwf SSPSTAT
banksel SSPCON
movlw b'00100010' ; WCOL=0, SSPOV=0, SSPEN=1, CKP=0, SSPM[3..0]= 0010 (FOSC/64)
movwf SSPCON
;LOOP BTFSS SSPSTAT, BF ;Has data been received(transmit complete)?
;goto LOOP ;No
;MOVF SSPBUF, W ;WREG reg = contents of SSPBUF
;MOVWF RXDATA ;Save in user RAM, if data is meaningful
movlw 0x1d
movwf TXDATA
MOVF TXDATA, W ;W reg = contents of TXDATA
MOVWF SSPBUF ;New data to xmit
movlw 0x50
movwf TXDATA
MOVF TXDATA, W ;W reg = contents of TXDATA
MOVWF SSPBUF ;New data to xmit
LOOP BTFSS SSPSTAT, BF ;Has data been received(transmit complete)?
goto LOOP ;No
MOVF SSPBUF, W ;WREG reg = contents of SSPBUF
MOVWF RXDATA_1 ;Save in user RAM, if data is meaningful
LOOP2 BTFSS SSPSTAT, BF ;Has data been received(transmit complete)?
goto LOOP2 ;No
MOVF SSPBUF, W ;WREG reg = contents of SSPBUF
MOVWF RXDATA_2 ;Save in user RAM, if data is meaningful
banksel TRISB
movlw b'00000000'
movwf TRISB
banksel PORTB
movlw b'01010101'
movwf PORTB
ABE
goto ABE
end
Und noch zur Beschaltung:
Ich verbinde
PIC_PIN_RC3_SCL mit SENSOR_PIN_SCLK
PIC_PIN_RC4_SDI mit SENSOR_PIN_DOUT
PIC_PIN_RC5_SDO mit SENSOR_PIN_DIN
So und jetzt kommt’s. Der Drucksensor braucht noch eine zusätzliche Clock von 30 bis 35 kHz (MCLK). Ich habe einen Uhrenquarz auf dem Board der mit RC0 und RC1 verbunden ist. Ich greife mir wahlweise an RCO bzw. RC1 die Clock ab, da ich mir nicht sicher bin an welchen Pin diese muss und ob das überhaupt funktioniert.
VDD_BOARD über "Widerstands-Z-Dioden-Teiler" an VDD_Sensor.
GND_BOARD an GND_SENSOR
Ich beschäftige mich das erste Mal mit dem SPI Modus... I2C habe ich schneller zum laufen gebracht.
Vielen Dank für die Hilfe
Gruß Daniel