Hardware SPI ile 8 Kanal DAC kontrolu(örnek çalışma)

Başlatan er-da, 06 Şubat 2015, 15:38:59

er-da

merhaba arkadaşlar.
önceleri spi  çalışmam olmamıştı  öğrenmek amacıyla önce software spi denemeleri yaptım sonra HWspi nin daha hızlı olduğunu okudum ve yeni çiplerde  bu modülün olması beni araştırmaya yönlendirdi .nette biraz araştırdım bulduklarımla ,okuduklarımla çalıştırdım .benimkisi sadece öğrenmek amçlıydı HWspi ile bir örnek çıkarttım eksikler fazlalar olabilir katkıda bulunabilirsiniz.
selamlar.


    Device = 16F690
    Declare Xtal = 4           
    Declare Reminders Off 
   
    Config FOSC_INTOSCIO, WDTE_OFF, PWRTE_OFF, MCLRE_ON, BOREN_ON, CPD_OFF, CP_OFF
   
    Declare Adin_Res = 10        '10bit  Çözünürlük
    Declare Adin_Tad = FRC       'The FRCsource has a typical TADtime of 4 µs for VDD> 3.0V
    Declare Adin_Delay =5        ' min TACQ=4,67us 16F690 için
   
    TRISA =%00000111              ' AN0,AN1,AN2 giriş   
    TRISB =%00000000              ' PortB çıkış
    TRISC =%00000000              ' PortC çıkış
    PORTA = 0               ' PORTA  temizle
    PORTB = 0               ' PORTB  temizle
    PORTC = 0               ' PORTc  temizle
                         
   
    ANSEL= %00000111        'AN0,AN1,AN2 analog
    ANSELH=%00000000        'diğer girişler Digital
    OPTION_REG.7=0          '
    WPUA = 0                'portA pullup kapalı
    WPUB = 0                'portB   ''    ''
    ADCON0=%10000000         'ADC  acık
    ADCON1=%00110000         'A/D Conversion Clock Select bits ,FRC
    CM1CON0.7=0              '\
    CM2CON0.7=0              '/komparatörler kapalı
   
    Dim ADCa As Word
    Dim ADCb As Word
    Dim ADCc As Word
    Dim ADCd As Word
   
   
    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   = 1                       ' transmit of idle to active edge
    CKP   = 0                       ' idle state is low level
    SSPEN = 1                       ' SSP Enable  (Synchronous Serial Port)
    High CS     
                                    'Stabilize için bekle...
    DelayMS 100                                 
                           
Main:
           
        While 1 = 1                   'MAX5258e 16 Bitlik bilgi göndereceğiz ilk 8 Bİt Adres ,son 8Bit adc data
          ADCa= ADIn 0                'tek seferde 16 Bit yollayamadığımız için önce 8 Bit  sonra 8 Bit
          ADCa= ADCa >>2              '--------------------------------------
                                      '                  adres         -   8-Bit DAC data
                                      'DAC kanal A =   x x 0 0 0 1 1 0 - 0 0 0 0 0 0 0 0       ilk iki bit 0 önemsiz "don't care."
                                      'DAC kanal B =   x x 0 0 1 1 1 0 - 0 0 0 0 0 0 0 0
          Low CS                      'DAC kanal C =   x x 0 1 1 1 1 0 - 0 0 0 0 0 0 0 0       ilk 3 kanal için yazdık ,böylece DAC kanal H ye kadar devam edilebilir
          SSPBUF=6          'kanal A için adress 0 0 0 0 0 1 1 0= desimal 6  buffere yükle
          GoSub Yolla       ' ilk 8 Bit gönder
          SSPBUF= ADCa      ' ADin 0 dan alınan  8Bit DAC data  buffere yükle
          GoSub Yolla       ' ikinci 8 Bit gönder
          High CS
          DelayUS 5
       
          ADCb= ADIn 1
          ADCb= ADCb >>2
          Low CS
          SSPBUF=14
          GoSub Yolla
          SSPBUF= ADCb
          GoSub Yolla
          High CS
          DelayUS 5
         
          ADCc= ADIn 2
          ADCc= ADCc >>2
          Low CS
          SSPBUF=22
          GoSub Yolla
          SSPBUF= ADCc
          GoSub Yolla
          High CS
          DelayUS 5
        Wend
           
         
        Yolla:
         While SSPIF = 0 : Wend  ' işlemin bitmesini bekle
         SSPIF = 0               ' işlem tamamlandıktan sonra bayrağı sıfırla
        Return

End


Burak

FIFO buffer'ı kaç seviye derinlikte (byte'lık) veri depolayabiliyor ? Mesela USART'ta 12F ve 16F serisinde 2 byte'ı aşamıyoruz.

Burak
Ω Gens Una Sumus Ω

er-da

hocam buradaki  SSPBUF registeri 8 bit depoluyor gözüküyor .
"
The SSP consists of a transmit/receive shift register
(SSPSR) and a buffer register (SSPBUF). The SSPSR
shifts the data in and out of the device, MSb first. The
SSPBUF holds the data that was written to the SSPSR
until the received data is ready. Once the eight bits of
data have been received, that byte is moved to the
SSPBUF register "

er-da

rail to rail çıkış bufferi olduğu halde çıkışta neden 5v alamıyorum ? DAC  çipin formülü bu   VOUT= (NB ✕VREF) / 256,where NB is the numerical value of the DAC's binary
input code.

not: hwspi kullanılacaksa  pic in donanımsal ayrılmış SDO VE SCK pinleri kullanılmak zorunda  CS heshangi I/O pin olabilir

Burak

Kullandığın işlemci için 8 bitlik veri alımından sonra  ;

Alıntı YapThen, the Buffer Full Status bit, BF
(SSPSTAT<0>), and the interrupt flag bit, SSPIF, are
set.

gibi bir ifade kullanılmış demek ki SPI buffer'ı 8 bitlik  "1 byte'lık" , USART'a göre avantajı SPI ile haberleşen entegrelerle donanımsal olarak kullanılabilmesi bence sadece ... ki illa ki donanımsal SPI ile kullanılmak zorunlulukları yok tabii ki shiftout - shiftin komutları ile de yapılabilecek bir iletişim bu ...
DSpic32'lerde çok daha geniş buffer seviyeleri mevcut birde yüksek frekansın getirmiş olduğu avantajla standart 10 mhz SPI iletişim avantajı donanımsal olarak kullanılırsa tam 10 MHZ'de haberleşme şansı var ...

Ayrıca DAC'nin SPI ile olan bağlantısını anlamış değilim .

Burak
Ω Gens Una Sumus Ω

er-da

Alıntı yapılan: er-da - 06 Şubat 2015, 16:26:26
rail to rail çıkış bufferi olduğu halde çıkışta neden 5v alamıyorum ? DAC  çipin formülü bu   VOUT= (NB ✕VREF) / 256,where NB is the numerical value of the DAC's binary
input code.



sorum yersiz olmuş   :)  VOUT=255x5/256=4,98v ..tabiiki 5v olmaz :)

burak hocam
şaka yapıyorsunuz herhalde..:)
Alıntı YapAyrıca DAC'nin SPI ile olan bağlantısını anlamış değilim .

Burak

Başlıkta MAX5258e ile çalıştığınızı belirtmediğiniz için ben PIC MCU'ların dahili DAC modülünü kullandığınızı düşündüm o yüzden dahili kayıtçılara neden SPI ile ulaşılsın diye bir soru geldi aklıma ...

Burak
Ω Gens Una Sumus Ω

er-da

haklısın  hocam... sizin gibi GURU larla aynı forumda olmak  bir zevk..:)

Burak

Alıntı yapılan: er-da - 08 Şubat 2015, 02:14:11
haklısın  hocam... sizin gibi GURU larla aynı forumda olmak  bir zevk..:)

Bilmukabele .. Sizlerle bilgiyi paylaşmanın vermiş olduğu keyif bir başka ...

Burak
Ω Gens Una Sumus Ω

Powered by EzPortal