iki kesme birarada nasıl olacak

Başlatan promete1, 21 Mayıs 2009, 00:07:08

promete1

hocam iyiakşamlar,
benim kodlar şu şekilde;

#int_ad
    if(mesafe<50){
    Do_Stop();}

#int_rda
switch(getc()){      //
        case 'S':      Do_Stop();break;
        case 'F':      Do_Fwd();break;
        case 'B':      Do_Rev();break;
        case 'L':      Do_Left();break;

yapı bu şekilde şimdi sensörden aldıgım mesafe bilgisi 50cm.den küçükse motora dur diyorum ve motor  duvara toslamadan duruyor.bundan sonra kullanıcı seri olarak PCden motoru geri çekmesini  isteyecek.Ancak
motor bi defa durdumu bidaha emir almak istemiyor;)
Sorum şu:adcdeki if döngüsünü sadece 1 defa kullandırıp seri datayı beklicek hale getirecek kod nasıl olmalı?
NOT:altprogramlar mevcut ama gerksiz oldugu için uzatmadım.Saygılar

promete1

hocam şimdi gördüm programın başına #priority rda,ad satırını girmek aklıma geldi ama gene 1 defa dönüp stoplamaya başlıyor:(

ferdem

İlgili "interrupt flag" ini CCS C sıfırlamıyor olabilir, dolayısıyla interrupta bir defa girdiğinde bir daha da çıkamıyor olabilir. ADIF bitini sıfırlamayı deneyin. Örnek:

ADIF in 16F877 deki adresi
#bit ADIF=0x0C.6


#int_ad
void adc_okudu(){
ADIF=0;
   if(mesafe<50){
      Do_Stop();
   }
}

Seri data kesmesinin çalıştığına emin olun. Diğer türlü program adc kesmesindemi çakıldı yoksa seri data kesmesimi çalışmıyor anlayamayız. Seri data kesmesinde getc() çalışınca ilgili "flag" CCS C tarafından sıfırlanıyor. Kolay gelsin.

MURSEL

#int_ad
void kesmead(void)
{
enable_interrupts(GLOBAL);  
if(mesafe<50)  
{
Do_Stop();
}
}

#int_rda
void kesmerda(void)
{
switch(getc()){ //
case 'S': Do_Stop();break;
case 'F': Do_Fwd();break;
case 'B': Do_Rev();break;
case 'L': Do_Left();break;
}}

//şimdi usart dan gelen dataları işler gibi