-
        

Ergebnis 1 bis 9 von 9

Thema: Durcksensor MS5534 via SPI an PIC16F877A

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    19.11.2007
    Alter
    33
    Beiträge
    140

    Durcksensor MS5534 via SPI an PIC16F877A

    Anzeige

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

  2. #2
    Benutzer Stammmitglied
    Registriert seit
    24.01.2006
    Ort
    Kirchdorf a. Inn
    Alter
    46
    Beiträge
    81
    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

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    19.11.2007
    Alter
    33
    Beiträge
    140
    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

    Code:
    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ß

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    19.11.2007
    Alter
    33
    Beiträge
    140
    Servus,

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

    Wäre super Danke

    Gruß

  5. #5
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    30.09.2006
    Ort
    Hamburg
    Alter
    35
    Beiträge
    987
    jo hier allerdings musste es anpassen unten ist noch nen Beispiel zum senden.

    Code:
    							; 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)
    Code:
    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
    Legastheniker on Bord !

    http://www.Grautier.com - Projektseite
    http://www.grautier.com/wiki/doku.php?id=bt-index - BT-BUS

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    19.11.2007
    Alter
    33
    Beiträge
    140
    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ß

  7. #7
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    30.09.2006
    Ort
    Hamburg
    Alter
    35
    Beiträge
    987
    haste
    sdi -> sdo
    und
    sdo -> sdi verbunden ?

    oder der spi takt ist zu schnell.
    Legastheniker on Bord !

    http://www.Grautier.com - Projektseite
    http://www.grautier.com/wiki/doku.php?id=bt-index - BT-BUS

  8. #8
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    19.11.2007
    Alter
    33
    Beiträge
    140
    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ß

  9. #9
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    19.11.2007
    Alter
    33
    Beiträge
    140
    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ß

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •