CCSPic

Tam Versiyon: Ccs uart sorunu neden interrupt üretmiyor
Şu anda tam olmayan bir versiyonun içeriğine bakıyorsunuz. Tam versiyona bakınız.
Herkeze merhaba

rs232 ile uğraşırken hiç beklemediğim bir sorunla karşılaştım çözümünü 2 gündür uğraşmama ramen hala bulamadım.

devrem aşağıdaki gibidir.

[img]http://www.elektrotekno.com/userpix/15112_electronik_timer_1.jpg[/img]


baund rateleri 9600 olan 2 tane seri bilgi yollayan birim mevcut, hangisini dinleyeceğimi 74151 multiplexer ile seçiyorum ve pice giriyor. Proteusta devre sorunsuz çalışıyor.

Gerçek hayata geçtiğimde ise #int_rda interrupt'ını üretmediğini gördüm. Pic gelen bilgiyi göremiyor.

Denemek için max3232 li küçük bir prob yaptım picin RX bacağına deydirdiğimde bilgisayarda bütün bilgileri görebiliyorum yani bilgiler pice ulaşıyor.


18F4620 'yi 8Mhz kristal ve "4 x pll" aktif şekilde kullanıyorum program kısmı ise şu şekilde

Kod:
#include <18F4620.h>
#FUSES NOWDT,WDT128,H4,NOPROTECT,BROWNOUT,NOPUT,STVREN,NODEBUG,NOLVP,NOWRT,NOWRTB,NOWRT C,NOCPD,NOCPB,NOEBTR,NOEBTRB,CCP2B3
#device ADC=10
#use delay(clock=32Mhz,oscillator=8Mhz)


#use rs232(baud=9600, uart, parity=N, stop=1,bits=8)

#define FAST_GLCD

#include "HDM64GS12.c"
#include <MATH.H>
#include "graphics.c"

.
.
.
.
.

#INT_RDA
void SeriVeriAl(void)
{
veri=getc();
alll=true;
}

void main(void) // Ana program
  
{    


set_tris_b(0xFF);
set_tris_e(0xFF);


setup_psp(PSP_DISABLED);
setup_spi(SPI_SS_DISABLED);
setup_timer_0(RTCC_INTERNAL);
setup_timer_1( T1_INTERNAL | T1_DIV_BY_1);
setup_timer_2(T2_DISABLED,0,1);
setup_timer_2(T2_DIV_BY_4, 255,4);
setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
setup_wdt(WDT_OFF);
setup_ccp1(CCP_OFF);
setup_ccp2(CCP_OFF);
clear_interrupt(INT_RDA);
enable_interrupts(INT_RDA);
disable_interrupts(INT_timer0);
enable_interrupts(GLOBAL);

setup_adc( ADC_CLOCK_INTERNAL );
setup_adc_ports(  AN0_TO_AN2);

do{

if(alll){sprintf(dene3,"G");glcd_text57(15,8,dene3,1,ON);}
}while(TRUE); //Sonsuz Döngü

}



Bu şekilde seri porttan herhangi bir bytelık bilgi aldığında ekranda G yazması lazım. Ama Proteusta olmasına ramen gerçekte olmuyor.

bunun nedeni hakkında birkaçtane yorum yapabilirsek daha kolay çözebilirim.

kurduğunuz devrede max232 entegresi kullandınız mı yoksa doğrudan multuplexer a mı gidiyor?
iki adet seri bilgi gönderen kaynak nedir?
multiplexer ı kontrol eden b3 pini ile ilgili programda herhangi bir komut gözükmüyor
birde yaptığınız programı ilk olarak 4mhz lik basit bir sistemle denemeniz daha sağlıklı olacaktır
2 farklı gps modülünden seri bilgi alıyorum gps'in çıkışını direk multiplexer a takıyorum. Deneme amacı ile sadece tek takynaktan bilgi okuyorum multiplexerın seçici ucuna devamlı 1 gidiyor. Herşeyi devren çıkartıp picin rx bacağına max3232 ile bilgisayardan bilgi gönderdim yine olmadı. devrenin herşeyi sorunsuz çalışıyor. ADC den bilgi okuyorum hesap yapıp glcd de yazdırıyorum timerlar çalışıyor. ama uart interruptı çalışmıyor. putc fonksiyonu çalışıyor picten dışarıya bilgi çıkışı var ama getc çalışmıyoru. Proteusta sorunsuz çalışıp gerçekte çalışmaması çok kötü. 5 gün oldu hala sorunu bulamadım. İlginiz için teşekkür ederim birkaç yorum yapılsa şurdan olabilir burdan olabilir, ben bütün olasılıkları denedim ama mutlaka atladığım bir yer var.
Devreni göremediğim için tam yorum yapamıyorum çünkü verdiğin şemada c6 pini boş gözükmekte.
Bence ilk olarak setup_spi(SPI_SS_DISABLED); satırını silerek bir daha deneme yap olmazsa (Bu satırlar derleyici tarafından proje oluşturulurken programa eklenmekte. Kullanmayacağın kısımları silersen daha rahat edersin çünkü orada bazı pinleri iptal ediyorsun)
her şeyi söküp rs232 üzerine yoğunlaş ve aşağıdaki en basit örneği devrende uygula

Kod:
#include <18F4620.h>
#fuses XT, NOWDT, BROWNOUT, PUT, NOLVP
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, ERRORS)
//====================================
void main()
{
char c;
printf("Start: ");
while(1)
  {
   c = getc();
   putc(c);
  }}

Bu programda klavyeden gönderdiğin karakter geri terminal ekranına gelmeli. Bu prog çalışmıyosa donanımında hata var demektir. Bu kısmı aştıktan sonra diğer pll grafik lcd gibi kısımlara geçersen daha rahat edersin bence.

Referans URL