33F SERİSİ DAC VE RS232 problemi ccs c

Başlatan skara1214, 13 Eylül 2011, 16:57:03

skara1214

elimde 33fj128gp802 var.16 bit dac sini kullanmak istiyorum fakat ccs nin hazır kütüphanleri bunu çalıştırmıyor.Sizce ne yapmalıyım?registerlerinde ne gibi değişiklikler yapmalıyım?
#include "33FJ128GP802.h" 
#device ADC=12
#Fuses  NOWDT,NOPUT,HS,PR_PLL
#use delay(clock=160M,oscilator=10M)
void main()
{
setup_dac(DAC_RIGHT_ON,5);
while(1)
{
}

}
Ayrıca elimde ftdi nın kablosu mevcut bu 5 volt ile çalışıyor bunun rx tx ni direk pic bağlıyımmı problem yasarmıyım?
Herkes ölür ama herkes gerçekten yaşamaz

iyildirim

DAC için direkt register atamalarını yapıp çalıştırmak mümkün.
Öncelikle datasheetin ilgili bölümünü bir okuyun. DAC'ın kullanılmasıyla ilgili örnekler var. 
Sıkıntı olursa burada paylaşırsınız.

gp802'yi hiç kullanmadım, ama aynı tip uart'a sahip mc710 da uart pinleri 5V toleranslı. Direkt bağlanabiliyor. Yine de Datasheet den bir kontrol edin. Pin bağlantılarını gösteren şemada açıklanıyor.

skara1214

1. sorum dac için aşagıdaki kodları yazdım fakat hiçbir sey alamadım sizce problem nerdedir?
#include "33FJ128GP802.h" 
#device ADC=12
#word DAC1CON= 0x03F0
#word DAC1STAT=0x03F2
#word DAC1DFLT=0x03F4
#word DAC1RDAT=0x03F6
#Fuses  NOWDT,NOPUT,HS,PR
#use delay(clock=10M)
int16 i=50000;
void main()
{
DAC1CON=0b1001000000001000;
DAC1STAT=0b0000000010000000;
DAC1DFLT=0x0000;
DAC1RDAT=i;
while(1);
}

2. sorum datasheete göre 2 tane uart modülü oldugunu söylüyor fakat ben hiç pin özelliklerinde uax ur x v.s gibi bir şeye rastlayamadım acaba bu pinler hangi pinler siz biliyormusunuz?bir ilginç nokta aşagıya yazdımı kod 3 harfe kadar göndermek için çalışıyor fakat üstü için çalışmıyor.edaboardda aynı problemle karşılaşmışlar fakat çözüm bulunmamıs tam anladıgım kadarıyla.
#include "33FJ128GP802.h" 
#device ADC=12
#Fuses  NOWDT,NOPUT,HS,PR
#use delay(clock=10M)
#use rs232 (baud=115200,xmit=PIN_B6, rcv=PIN_B7, parity=N, stop=1,STREAM=il)
void main()
{
while(1)
{
fprintf(il,"hos");
delay_ms(500);
}
}

3.sorumda bu sistemi 160 Mhz de çalıştıramıyorum bunun için yazdığım kod aşagıda clocku 80M yapınca çalışıyor bunu nasıl hallederim?biliyorum çok fazla soru oldu ama bunları çözersek bence başkaları içinde faydalı olur
#include "33FJ128GP802.h" 
#Fuses  NOWDT,NOPUT,HS,PR_PLL
#use delay(clock=160M,oscilator=10M)
int16 x=0;
Herkes ölür ama herkes gerçekten yaşamaz

iyildirim

Öncelikle CCS kullanmadığım için verdiğm örneklerin c30 için olduğunu belirteyim. CCSde de çalışması gerekli.

DAC için,
Gördüğüm kadarıyla sadece sağ kanal enable edilmiş. Döngüye girmeden önce "DAC1RDAT=i;" satırı var. Ancak DAC aynı UART veya SPI modülleri gibi sürekli data ister.
Sürekli data vermediğinizde de DAC1DFLT registerinde verilmiş olan değeri varsayılan olarak kabul eder. Siz bu değeri 0 verdiğiniz için ilk başta küçük bir kıpırdanmanın dışında bir şey çıkışda görülmeyecek.

Döngü içerisinde DAC1RDAT 'ı sürekli güncellemeyecekseniz, DAC1DFLT registerine 50000 değerini verin. DAC1RDAT kullanarak değer verme sırasında da DAC modülünün aynı SPI, UART gibi bir bufferı var. Bu bufferın durumuna bakarak değer ataması yapmalısınız.
Detaylar ve örnek kod (sf. 11) için
http://ww1.microchip.com/downloads/en/DeviceDoc/70211B.pdf


Uart için
Kodlar bu kadar ise PSP (peripheral pin select) tanımları yapılmamış görünüyor.
Bu işlemcide bazı modülleri istenen pine atamak mümkün. UART modülü de PSP atamlası yapılarak kullanılabiliyor
Örnek kod başka bir işlemci için kullandığım kod. UART için sizin işlemcinizde de çalışacaktır. RP5 TX , RP6 da RX olarak atanıyor.
Detaylar için
http://ww1.microchip.com/downloads/en/DeviceDoc/70190D.pdf

Kodda da  belirtilen tablo 30-1 ve 30-2 ve bir bakın...
/******************PERIPHERAL PIN SELECT **************************************/

// Unlock Registers
//*************************************************************
    __builtin_write_OSCCONL(OSCCON & ~(1<<6));
//*************************************************************
// Configure Input Functions
// (See Table 30-1)

    RPINR18bits.U1RXR = 6;        // Assign U1Rx To Pin RP6
//    RPINR18bits.U1CTSR = 1;        // Assign U1CTS To Pin RP1

//*************************************************************
// Configure Output Functions
// (See Table 30-2)

    RPOR2bits.RP5R = 0b000011;            // Assign U1Tx To Pin RP5
//    RPOR1bits.RP3R = 4;            // Assign U1RTS To Pin RP3

//*************************************************************
    __builtin_write_OSCCONL(OSCCON | (1<<6));        // Lock Registers
/*******************************************************************************/



Clock frekansı için de aşagıdaki kod örnek olabilir.  Ekstra  kristal kullnıyormusunuz bilmiyorum. Eğer kullanmıyorsanız
#define FRC_OSC_USED
satırını da eklersiniz.
Hesap basitçe şöyle.
OsilatorFrekansı x (M+2) / (N1+2) /(N2+2)  /2 den işlemcinin çalışma frekansını buluyoruz. Bu değer max=40.000.000  olmalı. FRC kullanılıyorsa kristal frekansı 7.37MHz alınacak.
Atanan M, N1 ve N2 değerleri nin üzerine 2 ekleyerek hesap yapmalısınız.


    PLLFBD = PLL_M;                            // M = 40 
    CLKDIVbits.PLLPOST = PLL_POST_N1;    // N2 = 2
    CLKDIVbits.PLLPRE = PLL_PRE_N2;        // N1 = 2
    OSCTUN=0;                                    // Tune FRC oscillator, if FRC is used
    Nop();
    RCONbits.SWDTEN=0;                        // Disable Watch Dog Timer
    Nop();

#ifdef FRC_OSC_USED

// Initiate Clock Switch to Internal FRC with PLL (NOSC = 0b001)
    __builtin_write_OSCCONH(0x01);
    __builtin_write_OSCCONL(0x01);
    while (OSCCONbits.COSC != 0b001);    // Wait for Clock switch to occur

#else

// Initiate Clock Switch to Primary Oscillator with PLL (NOSC = 0b011)
    __builtin_write_OSCCONH(0x03);
    __builtin_write_OSCCONL(0x01);
    while (OSCCONbits.COSC != 0b011);    // Wait for Clock switch to occur

#endif

    while(OSCCONbits.LOCK!=1);            // Wait for PLL to lock



skara1214

hocam yardımınız için çok teşekkür ederim fakat bir kaç sorum daha olacak.osilator ayarlarını denemedim daha onu en sona bıraktım.
fakat bu dac konusu beni çok ugrastırdı.mplabda dac interruptı tanımlı fakat ccs de yok .onun yerinde bende fifo is not fullu kullanmaya çalıştım.defalt degeri midpoint yapınca 1.7 voltu görüyorum ama defaultu 0 yapınca 1.1 volt veriyor yani  oda düzgün çalışmıyor.acaba donanımsal olarak ek birşeymi yapmam gerekli?
#include "33FJ128GP802.h" 
#word DAC1CON =0x03F0
#word DAC1STAT =0x03F2
#word DAC1DFLT =0x03F4
#word DAC1RDAT =0x03F6
#bit CON8 = DAC1CON.8
#bit CON0 = DAC1CON.0
#bit CON1 = DAC1CON.1
#bit CON2 = DAC1CON.2
#bit CON3 = DAC1CON.3
#bit CON4 = DAC1CON.4
#bit CON5 = DAC1CON.5
#bit CON6 = DAC1CON.6
#bit CON12 = DAC1CON.12
#bit CON15 = DAC1CON.15
#bit STAT5 = DAC1STAT.5
#bit STAT7 = DAC1STAT.7
#bit STAT1 = DAC1STAT.1
#bit STAT0 = DAC1STAT.0
#Fuses  NOWDT,NOPUT,HS,PR
#use delay(clock=10M,oscillator=10M)
int16 i=60000,z=0;
void main()
{
STAT7=1;
CON12=0;
CON0=0;
CON1=1;
CON2=0;
CON3=1;
CON4=0;
CON5=0;
CON6=0;
CON8=0;
DAC1DFLT=0x8000;
CON15=1;
while(1)
{
DAC1RDAT=50000;
while(STAT1==0);
DAC1RDAT=0;
while(STAT1==0);
}
}


bir diger sorumda rs232 de uart pinlerini ayarlayınca yollamada problem kalmadı ama string ifade almada problem var string alırken garip ifadeler alıyor tek bir karakter almada problem yok acaba problem nerdedir?khbit i kullanarak string ifade nasıl alabilirim?
Herkes ölür ama herkes gerçekten yaşamaz

skara1214

problemlerin hepsini çözdüm arkadaşlar ccs c sürümünü 4.093 e çevirince çözüldü herşey.gets ifadesi çalışıyor.pic zaten 80 Mhz de çalışıyormus.normalde işlem hızı fosc /4 ama bunda fosc/2 oldugu için 40 mıps e ulaşıyor 80 Mhz de.kodları burada paylaşıyorum inşallah birilerine faydası dokunur .özellikle iyiyıldırım hocama çok teşekkür ederim....
DAC
#include "33FJ128GP802.h" 
#word DAC1CON =0x03F0
#word DAC1STAT =0x03F2
#word DAC1DFLT =0x03F4
#word DAC1RDAT =0x03F6
#bit CON8 = DAC1CON.8
#bit CON0 = DAC1CON.0
#bit CON1 = DAC1CON.1
#bit CON2 = DAC1CON.2
#bit CON3 = DAC1CON.3
#bit CON4 = DAC1CON.4
#bit CON5 = DAC1CON.5
#bit CON6 = DAC1CON.6
#bit CON12 = DAC1CON.12
#bit CON15 = DAC1CON.15
#bit STAT5 = DAC1STAT.5
#bit STAT7 = DAC1STAT.7
#bit STAT1 = DAC1STAT.1
#bit STAT0 = DAC1STAT.0
#Fuses  NOWDT,HS,PR_PLL
#use delay(clock=80M,oscillator=10M)
unsigned int16 i=0;
void main()
{
STAT7=1;
CON12=0;
CON0=0;
CON1=1;
CON2=1;
CON3=1;
CON4=0;
CON5=0;
CON6=0;
CON8=0;
DAC1DFLT=0x8000;
CON15=1;
while(1)
{
if(STAT1==0)
{
DAC1RDAT=i;
i++;
}
}
}
Herkes ölür ama herkes gerçekten yaşamaz