RB0 kesme sorunu???

baddog777

Üye
Katılım
21 Haz 2009
Mesajlar
43
Puanları
1
Yönetici Notu: Paylaşılan fotoğraf, fotoğraf paylaşım sitesinden silindiği için kaldırılmıştır.

resimdeki devrede kullandıgım programda RB0 kesmesini microcode basic de asagıdakı gıbı yapıp derledıgımde sorunsuz calısıyor..
Kod:
define osc 20
adim var word
bekle var Word
adimlar var Byte[8]

TRISB=%00000000

ON interrupt GoTo kesme
OPTION_REG=255' high ise kes
INTCON=%10010000
TRISB=%00000011
TRISA=%00000000
CMCON=7


adimlar[0] = %00000001
adimlar[1] = %00000011
adimlar[2] = %00000010
adimlar[3] = %00000110
adimlar[4] = %00000100
adimlar[5] = %00001100
adimlar[6] = %00001000
adimlar[7] = %00001001
porta=0
adim = 0

'bekle = 50  '30 ms adım arası süre

basla:
' pauseus bekle
if adim=8 Then adim = 0
If adim=-1 Then adim = 7
PORTA = adimlar[adim]
GoTo basla


Disable
kesme:

if portb.1=1 then
adim=adim+1
endif
if portb.1=0 then
adim=adim-1
endif

INTCON.1=0

Resume
   Enable
   End

Fakat bu kodu proton basıce uygun hale getırip derledıgımde sorun var, kesme mı gerceklesmıyor yoksa kesme bır kez gerceklesıyor Flag mı sıfırlanmıyor anlayamadım.. hatam nerde acaba
Kod:
Device 16F628A

XTAL = 20
        Dim adim As Byte
        Dim bekle As Word
        Dim adimlar[8] As Byte

TRISB=%00000000

ON_hardware_interrupt kesme
OPTION_REG=255
OPTION_REG.6=1'
OPTION_REG.7=1
INTCON=%10010000
TRISB=%00000011
TRISA=%00000000
CMCON=7

Symbol sinyal = PORTB
Symbol a1 = PORTA
adimlar[0] = %00000001
adimlar[1] = %00000011
adimlar[2] = %00000010
adimlar[3] = %00000110
adimlar[4] = %00000100
adimlar[5] = %00001100
adimlar[6] = %00001000
adimlar[7] = %00001001

sinyal = 0
adim=0
a1 = 0
'bekle = 100

basla:
'DelayMS bekle
If adim=8 Then adim = 0
If adim=-1 Then adim = 7
a1 = adimlar[adim]
GoTo basla


Disable
kesme:
If sinyal.1=1 Then Inc adim
If sinyal.1=0 Then Dec adim
INTCON.1=0
Return
 Enable
 
isis de debug kısmında gozlemledıgım sey kesme gercelesıyor,
kesme gerceklestıgınde intcon nun birinci bit'i 1 oluyor bu esnada 7nci bit 0 degerıne donuyor ! dısable edıltıkten sonra tekrar enable olmuyor!
return komutundan once intcon.7=1 komutunu yazdım, 7ncı biti mauel olarak enable yaptım ve calıstı program! bu hata benım code danmı kaynaklanıyor yoksa proton da mı sorun! anlamamadım! bu sekılde cozum buldum!
 
Konuyu kilitleyebilirsiniz sorun cozulmustur :)
kesme basına context save
return komutu yerine context restore
diyerek sorun cözülüyor,!! kesme basında degıskenlerın yedegını alıp kesme sonunda yerine koymak proton basic için sorunu hallediyor! microPB de bu sorun yok. aynı sorunla karsılasmıs olan arkadaslar varsa umarım yardımcı olur :)
 
yazdığım program preuteusta calışıyor fakat uygulamada kesme yapıyor.program aşağıda ilgilenirseniz çok sevinirim.

#include <18f2455.h>
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD
#use delay (clock=4000000)
#use rs232 (baud=9600, xmit=pin_C6, rcv=pin_c7, parity=N, stop=1)
#use fast_io(b)
#use fast_io(a)

#define zaman 1000
char klavye[1];
int i;
#int_rda

void serihaberlesme_kesmesi ()
{

disable_interrupts(int_rda);

output_high(pin_a0);


gets(klavye);
i=0;
switch(klavye){
case 'a':
output_b(0xf0);
delay_ms(3000);
output_b(0x00);
break;
}


output_low(pin_a0);
delay_ms(zaman);





}

void main ( )
{

setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_CCP1(CCP_OFF);
setup_CCP2(CCP_OFF);




set_tris_a(0xf0);
set_tris_b(0x00);
output_b(0x00);



output_low(pin_a0);


while(true){
enable_interrupts(GLOBAL);
enable_interrupts(int_rda);

output_b(0xff);
delay_ms(zaman);
output_b(0x00);
delay_ms(zaman);
output_high(pin_a1);
delay_ms(zaman);
output_low(pin_a1);

delay_ms(zaman);
output_high(pin_a2);
delay_ms(zaman);
output_low(pin_a2);

delay_ms(zaman);
}



}
 

Forum istatistikleri

Konular
129,867
Mesajlar
930,872
Kullanıcılar
452,732
Son üye
erencok

Yeni konular

Geri
Üst