CCS C ile MCP 4921 Kullanımı?

Başlatan smyomekatronik, 30 Haziran 2019, 19:36:54

smyomekatronik

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);
  }
   

Murat Mert

S.A.
CCS C nin kendi kütüphanesinde yazılımsal spi ile kütüphanesi var onu kullanın.
mert07

smyomekatronik

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.

Murat Mert

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);
      
   }

}
mert07

smyomekatronik

#4
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.

x-nomek

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



 


Mucit23

Bir yerde parantez hatası yapıyorsun. Verdiği hata onu gösteriyor. Kodunu incele bakalım bir yerde muhtemelen parantez açıp kapamadın.