CCS C alıştırma Turlarım

Başlatan Mucit23, 10 Şubat 2012, 15:29:51

JKramer

read_adc() fonksiyonu muhtemelen 16 bit döndürüyordur, cast etmeniz lazım.

Mucit23

Hocam anlayamadım "cast" terimi nedir? Ne yapmam gerekiyor.

JKramer


Mucit23

Evet dediğiniz gibi yapınca sorun çözüldü. Teşekkür ederim.

Mucit23

Arkadaşlar Merhaba

CCS de usart ile bilgisayardan data almaya çalışıyorum. Usar kesmesi kullandım. Haberleşme hızım 19200, Programımı yazdım denemelerimi yapıyorum fakat bir terslik var.

Bilgisayardan her data geldinğinde işlemci resetleniyor. Bazen donuyor. Bazen ise düzgün bir şekilde alıyor.

Yazdığım program şudur.

#include <16F877A.h>
#device adc=10

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES HS                       //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O

#use delay(clock=8000000)

#include <lcd_driver.c>

#use rs232 (baud=19200, xmit=pin_C6, rcv=pin_C7, parity=N, stop=1)

#use fast_io(a)
#use fast_io(b)
#use fast_io(c)
#use fast_io(d)
#use fast_io(e)

char rx_data="-";
#int_rda   // RX ucuna veri gelince meydane gelen kesme
void usart_kesme ()
{
   disable_interrupts(int_rda); // int_rda kesmesini pasif yap
   rx_data=getc();
   enable_interrupts(int_rda);
}

void main()
{
   
  set_tris_a(0x00);
  set_tris_b(0x00);
  set_tris_c(0x80);
  set_tris_d(0x00);
  set_tris_e(0x00);
  output_a(0x00);
  output_b(0x00);
  output_c(0x00);
  output_d(0x00);
  output_e(0x00);
  
   setup_psp(PSP_DISABLED);        // PSP 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ışı
   
   enable_interrupts(GLOBAL); 
   enable_interrupts(int_rda);
   lcd_init();
   delay_ms(100);
   printf(lcd_putc,"\f");
   lcd_gotoxy(1,1);
   printf(lcd_putc,"Xbee Denemesi");
   
   while(true)
   {
   lcd_gotoxy(1,2);
   printf(lcd_putc,"Gelen Data=%c",rx_data);
   
   if(rx_data=='A')
   {
   output_high(pin_b0);
   }
   if(rx_data=='B')
   {
   output_low(pin_b0);
   }
   

   }

}


Tahminimce kesme gelince işlemciye birşeyler oluyor. Sorun nerde olabilir.

justice_for_all

#use rs232 (baud=19200, xmit=pin_C6, rcv=pin_C7, parity=N, stop=1,ERRORS)


bide boyle denermisin.
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

Mucit23

evet hocam biraz düzeldi. Çok nadir oluyor. Mesela çık hızlı datalar gönderirsem ekran bazen saçmalıyor. Ama eskisi gibi olmuyor artık.

Mucit23

CCS de pwm modülünü set ediyorum. 4Mhz de 250Hz olarak ayarladım. Herşey güzel pwm çıkıyor ama normalde ben pwm duty registelerine 0-1000 arası bir değer yazabilmem gerekir.

Ama set_pwm1_duty fonksiyonuna 124 değerini yüklediğimde duty değeri %100e ulaşmış oluyor.

CCS neden böyle yapıyor?

Normalde ben direk registerlere(CCP1_CON, CCP1L, PR2 vs...) değer vererek yapmak isterim bu işi. Bunu bu şekilde direk registere nasıl ulaşırım ccs de?

skara1214

Herkes ölür ama herkes gerçekten yaşamaz

Mucit23


skara1214

istediğin registera ulaşman için register 8 bit ise #byte 16 bit ise #word  atadoğın isim = register maptaki adres
Herkes ölür ama herkes gerçekten yaşamaz

Mucit23

Hocam anladım. Istediğim registerin adresine nerden ulaşırım

skara1214

datasheetten register map yazın hocam o listede var
Herkes ölür ama herkes gerçekten yaşamaz

Mucit23

CCP1CON.4=ham_DUTY.0
CCP1CON.5=HAM_DUTY.1
CCPR1L=HAM_DUTY>>2


Basicde yaptığım bu işlemin aynısını C de nasıl yaparım

skara1214

valla hocam kendi tanımladığınız bir sayının 1. bitini nasıl alıyorsunuz bilmiyorum ama değişkeni pointer olarak tanımlarsanız olur heralde diğer kısma gelirsek;
#bit hambit1 = CCP1CON.4 şeklinde
Herkes ölür ama herkes gerçekten yaşamaz