PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Durcksensor MS5534 via SPI an PIC16F877A



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

wassermann
12.03.2008, 05:45
Hallo Enrock,

es gibt von Intersema (Hersteller des Sensors) eine application note (AN510). Einfach downloaden. Den Quarz benötigt der Sensor nur für die ADC-Wandlung. Ansonsten sind nur die Leitungen MISO, MOSI und SCL notwendig.
Mein MS5541 kommt im April. Vielleicht steh ich dann vor dem gleichen Problem. Aber vielleicht ist's mit ATMega's einfacher.

gruss,
wassermann

Enrock
12.03.2008, 09:32
Servus,

die Application note habe ich schon... Die hat auch einige Fragen klären können. Dennoch bin ich nicht weiter.

Ich habe mal meinen Code nachgebessert. Aber Emfangen tue ich immer noch nichts


TART_PRESSURE_INIT

call LCD_INIT

bcf STATUS, RP0 ; auf Bank 1 umschalten
movlw B'00111111' ; internen Takt zählen, Vorteiler zum Timer0, 32:1
movwf T1CON
bsf STATUS,RP0
movlw b'00000000'
movwf TRISB
movlw 0x00 ; 256-125=131 ((1MHz : 32 ): 125 = 250 Hz)
bcf STATUS, RP0 ; auf Bank 0 zurückschalten

clrf RXDATA_HIGH
clrf RXDATA_LOW
clrf TXDATA

banksel TRISC
movlw b'00010000'
movwf TRISC

banksel SSPSTAT
movlw b'10000000' ; 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


bcf SSPCON, SSPOV ; kein Überlauf
bcf SSPCON, WCOL
bsf SSPCON, SSPEN ; SPI=on

movwf 0x1d
movwf SSPBUF ;

call BF_BIT

movwf 0x60
movwf SSPBUF

call BF_BIT

banksel SSPSTAT
bsf SSPSTAT,CKE
banksel PORTA

movwf 0x10
movwf SSPBUF ;

call BF_BIT

movwf RXDATA_HIGH

movwf 0x01
movwf SSPBUF

call BF_BIT

movwf RXDATA_LOW


call LCD_LINE_1
; movf LOW_BYTE,w
movf RXDATA_HIGH,w
movwf FOR_HEX
call HEX_AN_LCD

call LCD_LINE_2
; movf LOW_BYTE,w
movf RXDATA_LOW,w
movwf FOR_HEX
call HEX_AN_LCD

banksel TRISB
movlw b'00000000'
movwf TRISB
banksel PORTB
movlw b'01010101'
movwf PORTB
ABE
goto ABE

BF_BIT

Banksel SSPSTAT
btfss SSPSTAT, BF
goto BF_BIT
banksel PORTA
movf SSPBUF,0

return

Wenn ich den Quarz nur für den ADC brauch müsste ich ja zumindest die Calb. Words lesen können... Oder etwa nicht?

Hat vielleicht irgendwer ein Prog für mich, in dem mit SPI gearbeitet wird?
Sollte ich mit dem Oszi den Quarz schwingen sehen? Und wenn wie?

gruß

Enrock
17.03.2008, 09:40
Servus,

würde mir jemand seinen Code zur SPI Initialisierung zur Verfügung stellen?

Wäre super Danke

Gruß

theborg
17.03.2008, 11:27
jo hier allerdings musste es anpassen unten ist noch nen Beispiel zum senden.



; PORTC
banksel TRISC ; auf Bank 1 umschalten
movlw B'00010000' ; PortC I/O setzen (1=In, 0=Out) (Reinfolge RC7,RC6...)
movwf TRISC ; PortC I/O setzen
clrf PORTC ; PortC auf 0 setzen
; SPI
movlw B'01000000' ; Mitlere Geschwindigkeit Output Time
movwf SSPSTAT
banksel SSPCON
movlw B'00110010' ; MODE 1,1, SPI MASTER, 1/16 Tosc SSP ON
movwf SSPCON
banksel PORTC
bsf SPI_CS ; SPI Slave Select aus (high)



SPI_Send
banksel SSPBUF
bcf SPI_CS ; Chip Select an (Low)
movf SPI_DATA_WRITE, W
movwf SSPBUF
banksel SSPSTAT
SPI_Wait
btfss SSPSTAT, BF ; Ist das Senden Komplet ?
goto SPI_Wait ; Wen nicht gehe zu SPIWait
bsf SPI_CS ; Chip Select aus (High)
return
SPI_Read
bcf SPI_CS
banksel SSPBUF
movf SSPBUF, W
movwf SPI_DATA_READ
bsf SPI_CS
return

Enrock
19.03.2008, 07:40
Schon mal Danke...

das schaut aus wie bei mir... Und gesendet wird auch wunderbar, das hab ich mit dem Oszi überprüft...
Aber Antwort bekomme ich von dem Sensor immer noch nicht. Immerhin setzt er mittlerweile ab und an den Ausfang auf High.

Für SPI brauche ich keine Pullup Widerstände oder?
Kann jemand bestätigen, dass ich keine MCLK brauche um die Calib Words zu lesen?

Gruß

theborg
19.03.2008, 11:29
haste
sdi -> sdo
und
sdo -> sdi verbunden ?

oder der spi takt ist zu schnell.

Enrock
19.03.2008, 12:04
Servus,

es geht endlich... Also von einem Druckmessen bin ich noch entfernt aber ich kann die CalibWords lesen und die geben auch sinn.
Leider kommen die Worte noch nicht richtig im PIC an... Eigentlich soll auf die fallende Flanke gesampled werden, wenn ich das aber tue, simmen die Words nicht mit dem Bild des Oszis überein...
Sample ich auch die Steigende Flanke dann sind die Werte richtig... Ich verstehe das aber nicht...
Ich kann auch nicht recht erklären, warumd as jetzt geht und die ganze Zeit vorhher nicht.
gruß

Enrock
02.04.2008, 12:36
Servus,

also ich hänge nach wie vor an meinem Drucksensorproblem.

Ich kann mittlerweile die Calib-Words lesen und die Ergebnisse passen auch zur Applikation Note.
Wenn ich nun aber die Temperatur berechne bekomme ich einen wilden Wert raus, der nicht stimmt.
Ich brauchte da mal Hilfe. Mir erscheint der gemessene Wert für die Temperatur also das WORD D2 mit rund 13000 zu gering. Im Datenblatt kann ich lesen, dass ein Typischer Wert von 22500 gemessen wird. Hmpf und jetzt?
Ich habe langsam keinen Plan mehr!

Gruß