Picproje Elektronik Sitesi

DERLEYİCİLER => CCS C => Konuyu başlatan: smyomekatronik - 30 Haziran 2019, 19:36:54

Başlık: CCS C ile MCP 4921 Kullanımı?
Gönderen: smyomekatronik - 30 Haziran 2019, 19:36:54
Arkadaşlar merhaba; CCS C ile MCP 4921'i çalıştıramadım. Kopyala yapıştır programcı olduğum için işin içinden çıkamadım.

dacmcp.c

#include "dac.h"


void init_dac()
{
   output_high(CS);
   output_high(LDAC);
   output_high(CLK);
   output_high(SDI);
}                                                                   


void DAC_write(unsigned char cmd, unsigned long data)
{
    unsigned char s = 16;                                       
   
    unsigned long value = 0;
   
    value = cmd;
    value <<= 8;
    value |= (data & 0xFFF);
   
    output_low(CS);
                     
    while(s > 0)
    {
        if((value & 0x8000) != 0)
        {
            output_high(SDI);
        }
        else
        {
            output_low(SDI);
        }
        output_low(CLK);
        output_high(CLK);
        value <<= 1;
        s -= 1;
    }                           
   
    output_low(LDAC);
    output_high(CS);
    delay_us(10);
    output_high(LDAC);
}         

dac.h

#define CLK PIN_b0
#define CS PIN_b1
#define SDI PIN_b2
#define LDAC PIN_b4
                                       
#define ignore_cmd 0x80
#define DAC_write_cmd 0x3000
#define Buffer_on 0x40
#define Buffer_off 0x00
#define Gain_1X 0x20
#define Gain_2X 0x00
#define Run_cmd 0x10
#define Shutdown 0x00                                 


void init_dac();
void DAC_write(unsigned char cmd, unsigned long data);

main.c
#include <16f877.h>                     
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD

#use delay (clock=4000000)

#include <dacmcp.c>



void main ()
{
   setup_psp(PSP_DISABLED);        // PSP birimi devre dışı
   setup_spi(SPI_SS_DISABLED);     // SPI birimi devre dışı
   setup_timer_1(T1_DISABLED);     // T1 zamanlayıcısı devre dışı
   setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayıcısı devre dışı
   setup_adc_ports(NO_ANALOGS);    // ANALOG giriş yok
   setup_adc(ADC_OFF);             // ADC birimi devre dışı
   setup_CCP1(CCP_OFF);            // CCP1 birimi devre dışı
   setup_CCP2(CCP_OFF);            // CCP2 birimi devre dışı

   init_dac();
delay_ms(2000);
   DAC_write(DAC_write_cmd,2500);
  }
   
Başlık: Ynt: CCS C ile MCP 4921 Kullanımı?
Gönderen: Murat Mert - 30 Haziran 2019, 22:28:18
S.A.
CCS C nin kendi kütüphanesinde yazılımsal spi ile kütüphanesi var onu kullanın.
Başlık: Ynt: CCS C ile MCP 4921 Kullanımı?
Gönderen: smyomekatronik - 30 Haziran 2019, 22:47:31
Alıntı yapılan: Murat Mert - 30 Haziran 2019, 22:28:18S.A.
CCS C nin kendi kütüphanesinde yazılımsal spi ile kütüphanesi var onu kullanın.

Ve aleyküm selam

öneriniz için teşekkür ederim. Sorunu buldum, son dört bit ayarları datashetten bakıp yazmıştım ben değeri sağa iteliyor diye hesap yapmıştım, meğersem sola iteliyormuş
#define DAC_write_cmd 0x3000 komutu #define DAC_write_cmd 0x30 ile değiştirince çıkış alabildim.
Başlık: Ynt: CCS C ile MCP 4921 Kullanımı?
Gönderen: Murat Mert - 30 Haziran 2019, 22:51:23
3 yıl önce mcp4922 için yaptığım deneme yazılımı **çalışıyor**
belki bir arkadaşımıza lazım olur...



#include <18F45K22.h>
#device ADC=10
#use delay(crystal=20000000)
//#use spi (MASTER, SPI1, MODE=3, BITS=8, STREAM=SPI_1)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8,stream=PORT1)

int CS1=pin_D0, CS2=pin_D1, CS3=pin_D2;
#define LDAC pin_D3

#define DAC0  112           // dacA
#define DAC1  240          // dacB

#define SPI_MODE_0 (SPI_L_TO_H | SPI_XMIT_L_TO_H)
#define SPI_MODE_1 (SPI_L_TO_H)
#define SPI_MODE_2 (SPI_H_TO_L)
#define SPI_MODE_3 (SPI_H_TO_L | SPI_XMIT_L_TO_H)

int16 veri1=0,veri2=0;

         

 void dac_out(int CS, int dac_kanal, long data)
    {
       int byte1, byte0;
       byte1 = dac_kanal | (make8(data,1)); 
       byte0=make8(data,0);
       
       output_low(CS);
       delay_us(100);
       spi_write(byte1);
       spi_write(byte0);
       output_high(CS);
       delay_us(100);
       output_low(LDAC);
       delay_us(100);
       output_high(LDAC);

    }


void main()
{
setup_spi(SPI_MASTER | SPI_CLK_DIV_16 | SPI_L_TO_H | SPI_SAMPLE_AT_END);
  // setup_spi(SPI_MASTER | SPI_MODE_0 | SPI_CLK_DIV_4 );
   //setup_spi(SPI_MASTER | SPI_L_TO_H | SPI_CLK_DIV_16);
   output_high(CS1);
   output_high(CS2);
   output_high(CS3);
   output_low(LDAC);
   veri1=100;
   veri2=200;
   while(TRUE)
   {
      printf("veri1= %lu    veri2= %lu\n\r",veri1,veri2);
     
      dac_out(CS1,DAC0,veri1);
      delay_ms(2);
      dac_out(CS1,DAC1,veri1);
      delay_ms(2);
      dac_out(CS2,DAC0,veri2);
      delay_ms(2);
      dac_out(CS2,DAC1,veri2);
      delay_ms(2);
     

      veri1+=10;
       veri2+=10;
     
      if(veri1>4095){veri1=200;}
      delay_ms(2);
     
      if(veri2>4095){veri2=100;}
      delay_ms(2);
     
   }

}

Başlık: Ynt: CCS C ile MCP 4921 Kullanımı?
Gönderen: smyomekatronik - 03 Temmuz 2019, 22:15:18
Alıntı yapılan: Murat Mert - 30 Haziran 2019, 22:51:233 yıl önce mcp4922 için yaptığım deneme yazılımı **çalışıyor**
belki bir arkadaşımıza lazım olur...



#include <18F45K22.h>
#device ADC=10
#use delay(crystal=20000000)
//#use spi (MASTER, SPI1, MODE=3, BITS=8, STREAM=SPI_1)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8,stream=PORT1)

int CS1=pin_D0, CS2=pin_D1, CS3=pin_D2;
#define LDAC pin_D3

#define DAC0  112          // dacA
#define DAC1  240          // dacB

#define SPI_MODE_0 (SPI_L_TO_H | SPI_XMIT_L_TO_H)
#define SPI_MODE_1 (SPI_L_TO_H)
#define SPI_MODE_2 (SPI_H_TO_L)
#define SPI_MODE_3 (SPI_H_TO_L | SPI_XMIT_L_TO_H)

int16 veri1=0,veri2=0;

         

 void dac_out(int CS, int dac_kanal, long data)
    {
      int byte1, byte0;
      byte1 = dac_kanal | (make8(data,1)); 
      byte0=make8(data,0);
     
      output_low(CS);
      delay_us(100);
      spi_write(byte1);
      spi_write(byte0);
      output_high(CS);
      delay_us(100);
      output_low(LDAC);
      delay_us(100);
      output_high(LDAC);

    }


void main()
{
setup_spi(SPI_MASTER | SPI_CLK_DIV_16 | SPI_L_TO_H | SPI_SAMPLE_AT_END);
  // setup_spi(SPI_MASTER | SPI_MODE_0 | SPI_CLK_DIV_4 );
  //setup_spi(SPI_MASTER | SPI_L_TO_H | SPI_CLK_DIV_16);
  output_high(CS1);
  output_high(CS2);
  output_high(CS3);
  output_low(LDAC);
  veri1=100;
  veri2=200;
  while(TRUE)
  {
      printf("veri1= %lu    veri2= %lu\n\r",veri1,veri2);
   
      dac_out(CS1,DAC0,veri1);
      delay_ms(2);
      dac_out(CS1,DAC1,veri1);
      delay_ms(2);
      dac_out(CS2,DAC0,veri2);
      delay_ms(2);
      dac_out(CS2,DAC1,veri2);
      delay_ms(2);
     

      veri1+=10;
      veri2+=10;
     
      if(veri1>4095){veri1=200;}
      delay_ms(2);
     
      if(veri2>4095){veri2=100;}
      delay_ms(2);
     
  }

}


Kod için teşekkür ederim. Şöyle bir sorunla karşılaştım, mcp4921 ile  proteusta 0-5 V arasında çalışıyor fakat gerçek devrede 2,5-5V arasında çıkış alıyorum. Yazılımsal spi denediğimde sıkıntı yok fakat programı çok yavaşlatıyor, nerede yanlış yapıyor olabilirim.

#include <18F45K22.h> //Burayı 18f452 yaptım gerisine dokunmadım.
Başlık: Ynt: CCS C ile MCP 4921 Kullanımı?
Gönderen: x-nomek - 09 Kasım 2020, 20:53:55
Bende bunu kullanmaya çalışıyorum fakat bir yerde sıkıntı yaşadım yukarıda arkadaşların yaptığı gibi yaptım

DAC_write(DAC_write_cmd,2500); bu kısımda yazdığım 2500 değerinde  derleyici hata veriyor

hata Expecting a close paren ?

acaba sıkıntı nedir ne hata yapıyorum



 

Başlık: Ynt: CCS C ile MCP 4921 Kullanımı?
Gönderen: Mucit23 - 09 Kasım 2020, 21:14:41
Bir yerde parantez hatası yapıyorsun. Verdiği hata onu gösteriyor. Kodunu incele bakalım bir yerde muhtemelen parantez açıp kapamadın.