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);
}
S.A.
CCS C nin kendi kütüphanesinde yazılımsal spi ile kütüphanesi var onu kullanın.
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.
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);
}
}
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.
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
Bir yerde parantez hatası yapıyorsun. Verdiği hata onu gösteriyor. Kodunu incele bakalım bir yerde muhtemelen parantez açıp kapamadın.