16f690 spi haberleşme yardım

Başlatan trilian, 23 Şubat 2016, 23:12:29

trilian

Arkadaşlar iki adet 19f690 arasında spi ile haberleşmeye ihtiyacım var. iki yönlü olacak butona basıldımı bir picten digerine "OK1""OK2""VERI GONDERILDI" gibi bilgiler gönderip almam gerekiyor,lcd kullanmadıgım için serout2 ile gelen giden verileri kontrol edeceğim. 16f877 ile microe sitesindeki master ve slave kodları çaıştırdım ama tam istediğim gibi olmadı vede elimde bol miktarda 16f690 var yardımcı olursanız çok sevineceğim şimdiden herkese teşekkürler.

trilian

 define osc 4
   include "modedefs.bas"

i VAR BYTE           ' loop counter
a VAR BYTE[6]        ' Holds 6 characters read from slave

    TRISA =%00000000              ' AN0,AN1,AN2 giriş   
    TRISB =%00000000             ' PortB çıkış
    TRISC =%00000000             ' PortC çıkış
    PORTA = 0               ' PORTA  temizle
    PORTB = 0               ' PORTB  temizle
    PORTC = 0               ' PORTc  temizle
                         
    PORTA = 0               ' PORTA  temizle
    PORTB = 0               ' PORTB  temizle
    PORTC = 0               ' PORTc  temizle
                         
   
    ANSEL= %00000000        'AN0,AN1,AN2 analog
    ANSELH=%00000000        'diğer girişler Digital
    OPTION_REG.7=0          '
    WPUA = 0                'portA pullup kapalı
    WPUB = 0                'portB   ''    ''
    ADCON0=%00000000         'ADC  acık
    ADCON1=%00000000         'A/D Conversion Clock Select bits ,FRC
    CM1CON0.7=0              '\
    CM2CON0.7=0              '/komparatörler kapalı
   
   
   
    'Symbol CS = PORTB.4            'çip seçme biti'
    Symbol WCOL  = SSPCON.7        ' Write Collision Detect bit
    Symbol SSPEN = SSPCON.5        ' SSP Enable bit
    Symbol CKP   = SSPCON.4        ' Clock Polarity Select
    Symbol SMP   = SSPSTAT.7       ' Data input sample bit
    Symbol CKE   = SSPSTAT.6       ' Clock Edge Select bit
    Symbol BF    = SSPSTAT.0       ' buffer full status bit 1 = buffer full
    Symbol SSPIF = PIR1.3          ' interrupt flag - last bit set   
    SSPCON =%00000001               ' configure SPI Master, FOSC/16 so SCL is 1MHz 

  ' SPI başlatılıyor
    SMP   = 1                       ' Data input sampled at middle of data output time
    CKE   = 0                      ' transmit of idle to active edge
    CKP   = 0                       ' idle state is low level
    SSPEN = 1                       ' SSP Enable  (Synchronous Serial Port)
    'High CS 
   'ADCON1 = $0e       ' PORTA.0 analog, rest PORTA and PORTE pins to digital
SEROUT2 PORTb.7,84,["basladi",10,13] 
mainloop:
   SEROUT2 PORTa.4,84,["mainloop",10,13]
   GoSub getdata     ' initiate conversion and receive data
'  LCDOut $fe, 1, STR a\5, DEC a[5] ' display received string
   SEROUT2 PORTa.4,84,[STR A\5,10,13]
   Pause 100
   GoTo mainloop     ' do it forever

getdata:   
   SEROUT2 PORTa.4,84,["getdata",10,13]                                     
   SSPBUF = "?"      ' send ? to start conversion
   GoSub letclear    ' wait for buffer to clear
   IF SSPBUF<>"!" Then getdata ' wait for reply (!)
   For i = 0 to 5    ' loop for 6 characters
   SSPBUF = 0      ' write to SSPBUF to start clock
   GoSub letclear  ' wait for receipt
   a[i] = SSPBUF   ' store received character in array
   Next i
             ' get next character
   Return

letclear:
   SEROUT2 PORTa.4,84,["letclear",10,13]
   IF SSPIF = 0 Then letclear ' wait for SPI interupt flag
   PauseUs 25         ' 25uS fudge factor
   SSPIF = 0          ' reset flag
   Return

   End

trilian

define osc 4
   include "modedefs.bas"
dataout VAR BYTE[8]   ' Data out array

i       VAR BYTE      ' loop counter
a       VAR BYTE[6]   ' Holds 6 characters of data

    TRISA =%00000000              ' AN0,AN1,AN2 giriş   
    TRISB =%00000000             ' PortB çıkış
    TRISC =%00000000             ' PortC çıkış
    PORTA = 0               ' PORTA  temizle
    PORTB = 0               ' PORTB  temizle
    PORTC = 0               ' PORTc  temizle
                         
    PORTA = 0               ' PORTA  temizle
    PORTB = 0               ' PORTB  temizle
    PORTC = 0               ' PORTc  temizle
                         
   
    ANSEL= %00000000        'AN0,AN1,AN2 analog
    ANSELH=%00000000        'diğer girişler Digital
    OPTION_REG.7=0          '
    WPUA = 0                'portA pullup kapalı
    WPUB = 0                'portB   ''    ''
    ADCON0=%00000000         'ADC  acık
    ADCON1=%00000000         'A/D Conversion Clock Select bits ,FRC
    CM1CON0.7=0              '\
    CM2CON0.7=0              '/komparatörler kapalı
   
   
   
    'Symbol CS = PORTB.4            'çip seçme biti'
    Symbol WCOL  = SSPCON.7        ' Write Collision Detect bit
    Symbol SSPEN = SSPCON.5        ' SSP Enable bit
    Symbol CKP   = SSPCON.4        ' Clock Polarity Select
    Symbol SMP   = SSPSTAT.7       ' Data input sample bit
    Symbol CKE   = SSPSTAT.6       ' Clock Edge Select bit
    Symbol BF    = SSPSTAT.0       ' buffer full status bit 1 = buffer full
    Symbol SSPIF = PIR1.3          ' interrupt flag - last bit set   
    SSPCON =%00000101               ' configure SPI Master, FOSC/16 so SCL is 1MHz 

  ' SPI başlatılıyor
    SMP   = 1                       ' Data input sampled at middle of data output time
    CKE   = 0                       ' transmit of idle to active edge
    CKP   = 0                       ' idle state is low level
    SSPEN = 1                       ' SSP Enable  (Synchronous Serial Port)
    'High CS 
   'ADCON1 = $0e       ' PORTA.0 analog, rest PORTA and PORTE pins to digital
SEROUT2 PORTb.7,84,["basladi",10,13] 
ana:
   dataout[0] = "V"   ' Preset output data to "ADC= "
   dataout[1] = "E"
   dataout[2] = "R"
   dataout[3] = "I"
   dataout[4] = "1"
   SEROUT2 PORTb.7,84,["veri1",10,13]
   gosub mainloop
   pause 3000
   
   goto ana1
'end

   ana1:
   dataout[0] = "V"   ' Preset output data to "ADC= "
   dataout[1] = "E"
   dataout[2] = "R"
   dataout[3] = "I"
   dataout[4] = "2"
   SEROUT2 PORTb.7,84,["veri2",10,13]
   gosub mainloop
   pause 3000
   goto ana2
   end
      ana2:
   dataout[0] = "V"   ' Preset output data to "ADC= "
   dataout[1] = "E"
   dataout[2] = "R"
   dataout[3] = "I"
   dataout[4] = "3"
   SEROUT2 PORTb.7,84,["veri3",10,13]
   gosub mainloop
   pause 3000
   goto ana
   end
  ' goto ana
  ' end

mainloop:
   SEROUT2 PORTb.7,84,["mainloop",10,13]
   SSPEN = 0          ' disable/enable SSP to reset port
   SSPEN = 1
   GoSub letclear     ' wait for byte received
   IF (SSPBUF <> "?") Then mainloop ' wait for ? to start conversion

  ' ADCIN 0, dataout[5]' Read ADC channel 0, store in 6th position of string
   GoSub senddata     ' send "!" and string of data
   SEROUT2 PORTb.7,84,["mainloop1",10,13] 
   return     ' do it forever
               
senddata:
   SEROUT2 PORTb.7,84,["senddata",10,13]
   GoSub letclear     ' wait until buffer ready
   SSPBUF = "!"       ' send reply

   For i = 0 to 5     ' loop for 6 array locations
   GoSub letclear ' wait until buffer ready
   SSPBUF = dataout[i] ' send array variable
   Next i             ' next location
   SEROUT2 PORTb.7,84,["senddata1",10,13]
   Return
               
letclear:
   SEROUT2 PORTb.7,84,["letclear",10,13]
   IF SSPIF = 0 Then letclear ' wait for interrupt flag
   SSPIF = 0                  ' reset flag
   Return

   End

Powered by EzPortal