18f252 rs232 rda problemi

Başlatan SpeedyX, 22 Mayıs 2007, 19:41:16

SpeedyX

18F252 yi max232 aracılığı ile pc ye bağladım,
ilk enerjilendiğinde rda ya 3 tane istenmeyen kesme geliyor ve sonra pc den hyperterminalden birşey göndermeyi denediğimde hiç kesme oluşmuyor, dolayısıyla bilgi almıyor, bilgi gönderiyor ama almıyor.
benzeri bir olayı önceden 16 serisi pic ler le yapmıştım onlarda çalışıyordu. f252 de nasıl bir fark olabilir ki? Ne gibi bir ayar gerekiyor? Problem nedir?

Programım:
#include <18F252.h>

#device *=16 adc=10

#FUSES NOWDT,HS,NOPROTECT,NOOSCSEN,BROWNOUT,NOPUT,STVREN ,NODEBUG,NOLVP,NOWRT,NOWRTD,NOWRTB,NOWRTC,NOCPD,NOCPB,NOEBTR ,NOEBTRB

#use fast_io(A)
#use fast_io(B)
#use fast_io(C)

#use delay(clock=20000000)

#use rs232(baud=115200,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)

#priority RDA

#byte PORTC      = 0xF82
#byte PORTB      = 0xF81
#byte PORTA      = 0xF80

#byte PIR1=0xF9E
#bit  RDAIF   = PIR1.5

#bit  BusyLED = PORTB.4

int sayac=0;

#int_RDA
void RDA_isr() {
   sayac++;
   if(sayac>3) {
      putc(getc());
      printf("\nxxn\n");
   }
   //enable_interrupts(INT_RDA);
}

void main() {
   int sifir=60,x=0;
   //setup_adc_ports(AN0_VREF_VREF);
   //setup_adc(ADC_CLOCK_DIV_64);
   setup_spi(FALSE);
   setup_wdt(WDT_OFF);
   SETUP_TIMER_0(RTCC_INTERNAL|RTCC_DIV_1);
   SETUP_TIMER_1(T1_DISABLED);               // Disable Timer 1
   SETUP_TIMER_2(T2_DISABLED, 127, 1);       // Disable Timer 2
   SETUP_TIMER_3(T3_DISABLED);               // Disable Timer 3
   SETUP_CCP1(CCP_OFF);                      // Disable CCP1
   SETUP_CCP2(CCP_OFF);                      // Disable CCP2
   SET_TRIS_A(0b00001111);
   SET_TRIS_B(0b00000100);
   SET_TRIS_C(0);
   PORTA = 0;
   PORTB = 0;
   PORTC = 0;
   BusyLED=1;
   delay_ms(500);
//   while (RDAIF) getc();      // ilk gelen intleri yok etmek icin..
   enable_interrupts(INT_RDA);
   enable_interrupts(GLOBAL);
   printf("deneme deneme\n");
   for(;;) {
      x++;
      do {
         BusyLED=0;
         delay_ms(sifir);
         BusyLED=1;
         delay_ms(60-sifir);
      } while(--sifir!=0);
      while(++sifir!=60) {
         BusyLED=0;
         delay_ms(sifir);
         BusyLED=1;
         delay_ms(60-sifir);
      }
      printf("\n%u",x);
   }
}


ilk anda gelen kesmeleri yok etmek için while (RDAIF) getc(); kullandım ama birşey farketmedi, hatta #int_rda da sayac değişkeniyle 4.kesmeden sonrasına cevap vermesini sağlamaya çalıştım ama nasıl oluyorsa o ilk 3 kesme geliyor,sonrada pc den gelen hiç bir bilgiyi almıyor.

*Düşük hızlarda da denedim, fark yok (2400,9600)

MICROCEBEL

Hocam ben şuna dikkat ettim hiç kullanmadım bu özelliği 18f serisinde ama benim anladığım şu.Seri porttan PIC e bilgi gönderildiğinde kesme oluşmasını istiyorsunuz.Böyle bir işlemin oluşması için tüm interrupt işlemleri yapıldıktan sonra birde PIE1 reg in 5 inci biti 1 yapılmalıdır.Çünkü PIE1 ile bir işlem yapılmadığını farkettim.İnş problemin nedeni budur.Kolay gelsin hocam...

Ziya

overrun error oluşmuş olabilir. programın başında üç kere seri portu okutun. Arada bir de overrun ve frame error flaglerini kontrol edin. Haberleşme hızınız yüksek, peşpeşe çok sayıda bilgi geliyorsa bu hatalar oluşabilir.
Bu günden sonra hiç kimse sarayda, divanda, meclislerde ve seyranda Türk dilinden başka dil kullanmaya. (13 Mayıs 1277) Karamanoğlu Mehmet Bey

SpeedyX

  PIEIF=1;
   enable_interrupts(INT_RDA);
   enable_interrupts(GLOBAL);
   getc();getc();getc();

şeklinde denedim ama busefer hiç çalışmıyor, sanki kilitleniyor...
@Ziya, overrun hatasından kasıt?
hata denetimi için örnek kod verebilir misiniz? bahsettiğiniz şey errors direktifi mi?

ve şu anda 9600 ile çalıştırıyorum hızdan kaynaklanan bir problem olduğunu düşünmüyorum.

SpeedyX

donması getc() lerden kaynaklanıyormuş, sanırım bekliyor...
PIE1.5 i de 1 yaptım ama yine aynı.. pc ye veri yolluyor ama almıyor, terminal, hyperterminal ve docklight adlı 3 programla denedim, hepsinde durum aynı.

SpeedyX

portc.7 yi giriş yapmayı unutmuşum, sorun çözülmüştür.

TRISC=0x80;