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        ReturnEnd

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