logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[pic16f887 16f818] SPI między PIC16F887 a PIC16F818 - brak komunikacji, co sprawdzić?

AnnaWesolaLat23 29 Kwi 2009 15:41 2492 4
REKLAMA
  • #1 6470599
    AnnaWesolaLat23
    Poziom 15  
    Posty: 176
    Pomógł: 1
    Ocena: 12
    Witam.
    Nie udaje mi sie uruchomic SPI miedzy dwoma mikrokontrolerami PIC.
    Master:16f887
    Slave:16f818

    Polaczenie: SDI/rc4(master) - SDO/rb2
    SDO/rc5 - sdi/rb1
    sck/rc3 - sck/rb4
    rd6 - rb5 (to jest slave select)

    Master:8MHz, Slave 8MHz, do slave'a sa podlaczone tylko diody ktore wyswietlaja stan Mastera.

    Porty sa dobrze ustawione, adc wylaczone.

    Kod mastera:

    ;--------------------------------
    ;DATA TO LEDS THRU SPI - Leds: laser, engine, turbo, dc motor, phase 1,p2,p3, overtemp 
    ;--------------------------------
    
    SPI_LED	MOVLW		B'00110010'		;WCOL - NO COLLISION, OVERFLOW - 0, SPI ON, CKP = 1 = IDLE HIGH, CLK = F/64 AND MASTER
    		MOVLW		SSPCON		
    		BSF			STATUS,RP0		;GOTO BANK1
    		MOVLW		B'01000000'		;SMP - SAMPLE DATA in middle, CLOSK EDGE 0, BUFFER FULL = 1
    		MOVWF		SSPSTAT
    		MOVLW		B'00000000'		;I2C - SECURITY-na wszelki wypadek
    		MOVWF		SSPCON1
    
    
    SND_LED BCF 		SPI_E_LED		;ENABLE CS OUTPUT - LOW - SLAVE IS 2ND PIC NOW
    		MOVF		22H,W 			;LEDS REGISTER INTO W REGISTER
    		MOVWF		25H,W			;DATA FOR ERROR CHECKING FOR DURING NEXT CYCLE OF SPI - LED
    		MOVWF		SSPBUF 			;LEDS REGISTER INTO SPI BUFFER
    
    		BCF			SETUP,RP1		;GOTO BANK 1
    		BSF			SETUP,RP0
    
    LED_COM	BTFSS 		SSPSTAT,BF 		;IS DATA TRANSFER COMPLETE? BUFFER IS FULL?
    		GOTO		LED_COM			;IF NOT COMPLETE - WAIT MORE FO LED COMPLETE!
    
    		BCF			SETUP,RP0		;GOTO BANK0
    		MOVF 		SSPBUF,W 		;DATA FROM SPI BUFFER INTO W
    		MOVWF		26H				;DATA FROM SPI-LED FROM 2ND UC
    		BSF			SPI_E_LED
    
    		GOTO		SLEC			;GOTO SPI_LED_ERROR_CHECK
    
    ;--------------------------------
    ;CHECK RECEIVED DATA FROM SPI-LED - IF IT IS EQUAL TO PREVIOUS STATE
    ;--------------------------------
    ;25H - this location holds previous data send to 2nd uC, this data is not encrypted
    ;26h - this location holds data just received from 2nd uC as feedback about LEDs which are on or off, this data is encrypted
    ;
    ;what to do - data from 26h should be encrypted (all bit negative, and swapped nibbles) and compared with 25H
    ;effect of comparison is data the same - all ok
    ;effect of comparison is data is different - wrong - in this case put signal on tp1
    
    SLEC	SWAPF		26H				;SWAP NIBBLES
    		MOVFW		26H				;TO W REGISTER
    		XORLW		B'11111111'		;CHANGE ALL BITS, W HOLDS NOW NOT ENCRYPTED DATA
    		SUBWF		25H,1			;SUBSTRACT BOTH REGISTERS
    		BTFSS		STATUS,Z		;CHECK IS BOTH REGISTERS ARE EQUAL
    		GOTO		LED_ERR			;THERE IS ERROR ABOUT PIC TO PIC COMMUNICATION
    		GOTO		LOOP			;ERROR CHECKING IS OK, LOOP COULD BE REPEATED ONCE AGAIN
    		
    		END
  • REKLAMA
  • #2 6473209
    elektryk
    Poziom 42  
    Posty: 11029
    Pomógł: 439
    Ocena: 241
    A próbowałaś patrzeć oscyloskopem czy coś wychodzi z mastera?
  • REKLAMA
  • #3 6477232
    adamwesola
    Poziom 24  
    Posty: 499
    Pomógł: 71
    Ocena: 22
    SPI nie znam wcale, kombinowałem i udało się (nawet nie wiem dlaczego) przesłać dane z mastera do slave'a przy pomocy tych kilkunastu linijek kodu.
    Procesory do symulacji użyłem inne , najprostsze z interf. SPI - 16F87, ale jako przykład , może będzie pomocny.

        processor 16F87
        #include <P16F87.INC>
        __config _CONFIG1, 0x3F1C
        __config _CONFIG2, 0x3FFC
    
        org 0   	;program mastera
        clrw
        tris   	PORTA
        movlw   02h		;ss-wyj,sck-wyj,sdi-wej,sdo-wyj
        tris   	PORTB
    ;------------------------------
        movlw   0C0h		;SMP=1,CKE=1
       	bsf     STATUS,RP0
        movwf   SSPSTAT
       	bcf     STATUS,RP0
    ;---------------------------   	   
        movlw   20h			;SSPEN=1,CKP=0,SSPM=0
        movwf   SSPCON
    ;--------------------------- 
       movlw   87h      ;przykladowa dana do wyslania
       movwf   SSPBUF
       sleep
       ;goto    $-2
        end 

        processor 16F87
        #include <P16F87.INC>
        __config _CONFIG1, 0x3F1C
        __config _CONFIG2, 0x3FFC
         
        org 0		;program slave'a
        clrw
        tris   	PORTA
        movlw   32h		;ss-wej,sck-wej,sdi-wej,sdo-wyj
        tris   	PORTB
    ;--------------------
        movlw   40h			;SMP=0,CKE=1
       	bsf     STATUS,RP0
        movwf   SSPSTAT
       	bcf     STATUS,RP0
    ;----------------------------      
        movlw   25h    		;SSPEN=1,CKP=0,SSPM=5
        movwf   SSPCON		
    ;-----------------------------    
       bsf      STATUS,RP0
       btfss   	SSPSTAT,BF  ;bajt odebrany ?
       goto    	$-1         ;nie 
       bcf      STATUS,RP0   
    ;--------------------------- 
       movfw   SSPBUF
       movwf   PORTA
       sleep
       ;goto    $-2
        end
  • REKLAMA
  • #4 6477741
    AnnaWesolaLat23
    Poziom 15  
    Posty: 176
    Pomógł: 1
    Ocena: 12
    Jest sygnal na SCK, SDO mastera.
    Niewolnik nic nie nadaje, nie wyswietla tez nic na diodach.

    Podaje jeszcze sygnal niewolnika:
         LIST      P=16f818              ; list directive to define processor
         #INCLUDE <P16F818.INC>          ; processor specific variable definitions
    
    
        __CONFIG   _CP_OFF & _CPD_OFF & _WDT_OFF & _PWRTE_ON
    
    
    
    ;**********************************************************************
    	ORG     0x000             ; processor reset vector
    	NOP
    	GOTO    MAIN              ; go to beginning of program
    	
    
    ;SET UP MICROCONTROLLER
    MAIN	MOVLW		B'00000000'
    		MOVWF		TRISA		
    		MOVLW		B'00110010'
    		MOVWF		TRISB
    		MOVLW		B'00000110'		;ALL PORTS ARE DIGITAL
    		MOVWF		ADCON1
    
    SPI_LED	BCF			STATUS,RP0
    		BCF			STATUS,RP1
    		MOVLW		B'00110100'		;WCOL - NO COLLISION, OVERFLOW - 0, SPI ON, CKP = 1 = IDLE HIGH, CLK = F/64 AND MASTER
    		MOVLW		SSPCON		
    		BSF			STATUS,RP0		;GOTO BANK1
    		MOVLW		B'01000000'		;SMP - SAMPLE DATA AT END, CLOSK EDGE 0, BUFFER FULL = 1
    		MOVWF		SSPSTAT
    		
    		BCF			STATUS,RP1
    		BSF			STATUS,RP0		;BANK1
    
    DATA?	BTFSS		SSPSTAT,BF
    		GOTO		DATA?
    		BCF			STATUS,RP0		;BANK0
    		MOVF		SSPBUF,W
    		MOVWF		0X20
    	
    		
    ;ENERGIZE LEDS PROPERLY ACCORDINGLY TO REGISTER 0X20 WHICH IS DATA RECEIVED
    ;0X20 - DATA FROM SPI
    ;0X21 - MAP OF PORT A
    		CLRF	0X21		;CLEAR MAP OF PORT A
    		BTFSC	0X20,7		;D1
    		BSF		0X21,1
    
    		BTFSC	0X20,6		;D2
    		BSF		0X21,0
    
    		BTFSC	0X20,5		;D3
    		BSF		0X21,2
    
    		BTFSC	0X20,4		;D4
    		BSF		0X21,3
    
    		BTFSC	0X20,3		;D5 ON
    		BSF		PORTB,0
    		BTFSS	0X20,3		;D5 OFF
    		BCF		PORTB,0
    
    		BTFSC	0X20,2		;D6
    		BSF		0X21,7
    
    		BTFSC	0X20,1		;D7
    		BSF		0X21,6
    
    		BTFSC	0X20,0		;D8
    		BSF		0X21,4
    
    		MOVF	0X21,0
    		MOVWF	PORTA
    
    ;PREPARE ERROR CHECKING DATA FOR SPI
    		SWAPF	0X20,0			;SWAP NIBBLES IN DATA
    		MOVF	0X20,W			;MOVE INTO W REGISTER
    		XORLW	B'11111111'		;REVERSE ALL BITS - NOW IT IS FULLY ENCRYPTED
    		MOVWF	SSPBUF			;MOVE TO SSPBUF BUFFER SO SLAVE IS READY FOR SPI COMMUNICATION
    
    		GOTO	DATA?
    
    		end




    adamwesola napisał:
    SPI nie znam wcale, kombinowałem i udało się (nawet nie wiem dlaczego) przesłać dane z mastera do slave'a przy pomocy tych kilkunastu linijek kodu.
    Procesory do symulacji użyłem inne , najprostsze z interf. SPI - 16F87, ale jako przykład , może będzie pomocny.


    Nasze kody sa prawie takie same, poza ustawianiem spi.
    W czym symulowales uklad?
    Proteusem?

    W realu Twoj kod zadzialal?
  • #5 6479487
    adamwesola
    Poziom 24  
    Posty: 499
    Pomógł: 71
    Ocena: 22
    Na poczatku Twojego "niewolnika", brak jest instrukcji
    bsf STATUS,RP0 i dlatego nie wpisujesz do TRISA i TRISB, lecz do PORTA i PORTB.
    Robiłem tylko symulację, w proteusie.
    ----------------------
    ----------------------
    Dzisiaj, 2 maja, mogę powiedzieć ,że już wiem dlaczego to w ogóle działa, "dopracowałem" swój kod, i przesyłam Ci.
    Co do Proteusa - niejednokrotnie przekonałem się ze dokładnie imituje real.
    Załączniki:
    • spi_anny.zip (10.91 KB) Musisz być zalogowany, aby pobrać ten załącznik.
REKLAMA