Aşağıdaki Program, normalde sonsuz döngüde dönüyor, interruPt bacağından sinyal gelince RB5'i logic 1 yaPıyor sonra a Portuna bakıyor, oradan çekeceği 8 bitlik değer kadar milisaniye gecikmeden sonra RB5'i logic sıfır yaPıyor. CCS C ile yazdım, herhangi bir sorun çıkarmadı, ama US-Burn isimli Programla hex dosyasını PIC'e atmaya çalıştığımda hata verdi. Nerede hata var çözemedim.
void EXT_isr(void) { int gecikme; char ports; ports=input_a(); //A portundan gelen girişi ports değerine eşitledim output_high(PIN_B5); //Çıkışı 1 yaptı, RB5'e bağlanan kapağı açtı for(gecikme=0;gecikme<8;++gecikme) //RB5'den gelen binary rakamın karşılığı olan 0-255 arası sayının 8 katı kadar gecikme yaptı { DelayMs(ports); } Output_low(PIN_B5); //Gecikme bitince RB5'i sıfır yaptı yani RB5'teki kapağı kapattı #asm //ASM koduna geçiş yaptı BCF 0x0B,1; //Interrupt Flag'i sıfırla, program otomatik yapıyormuş #endasm //ASM kodundan çıkış yapıldı
}
void main() { setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1); setup_timer_1(T1_DISABLED); setup_timer_2(T2_DISABLED,0,1); setup_comparator(NC_NC_NC_NC); setup_vref(FALSE); enable_interrupts(INT_EXT); //RB0 bacağı interrupt'a açıldı enable_interrupts(GLOBAL); //Genel interrupt'lar açıldı set_tris_a(0xFF); //port A tamamen input olarak seçildi set_tris_b(0x01); //port B'de RB0 input, diğerleri output olarak seçildi #asm //ASM koduna geçiş yapıldı BSF 0x81,6; //Interrupt Edge Select Bit'inden rising edge seçildi #endasm
#FUSES NOWDT //No Watch Dog Timer #FUSES INTRC_IO //Internal RC Osc, no CLKOUT #FUSES PUT //Power Up Timer #FUSES NOPROTECT //Code not protected from reading #FUSES BROWNOUT //Reset when brownout detected #FUSES NOMCLR //Master Clear pin used for I/O #FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O #FUSES NOCPD //No EE protection
zaten compile ederken (yani hex e dönüştürürken) bir hata vermediyse ve usburn ile pic e atarken hata verdiyse sorun programda değil ya programlayıcınızda ya usburn dediğiniz programda yada pic'inizde olabilir.. eğer kod zaten isiste sorunsuz çalışıyorsa, picte de aşağı yukarı aynı şekilde çalışması lazımdı diye düşünüyorum...
#include "C:\Documents and Settings\Günay\Desktop\PIC Programlama\Etiket Ayıklama\proje_dip_switchli.h"
#include <delay.c> //Delay kütüphanesi seçildi
#int_EXT //Interrupt fonksiyonu tanımlandı
void EXT_isr(void)
{
int gecikme;
char ports;
ports=input_a(); //A portundan gelen girişi ports değerine eşitledim
output_high(PIN_B5); //Çıkışı 1 yaptı, RB5'e bağlanan kapağı açtı
for(gecikme=0;gecikme<8;++gecikme) //RB5'den gelen binary rakamın karşılığı olan 0-255 arası sayının 8 katı kadar gecikme yaptı
{
DelayMs(ports);
}
Output_low(PIN_B5); //Gecikme bitince RB5'i sıfır yaptı yani RB5'teki kapağı kapattı
#asm //ASM koduna geçiş yaptı
BCF 0x0B,1; //Interrupt Flag'i sıfırla, program otomatik yapıyormuş
#endasm //ASM kodundan çıkış yapıldı
}
void main()
{
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
enable_interrupts(INT_EXT); //RB0 bacağı interrupt'a açıldı
enable_interrupts(GLOBAL); //Genel interrupt'lar açıldı
set_tris_a(0xFF); //port A tamamen input olarak seçildi
set_tris_b(0x01); //port B'de RB0 input, diğerleri output olarak seçildi
#asm //ASM koduna geçiş yapıldı
BSF 0x81,6; //Interrupt Edge Select Bit'inden rising edge seçildi
#endasm
while(1) //Sonsuz döngüye girildi
{
}
}
_______________________________________________
AŞAĞIDAKİ KOD'DA İNCLUDE ETTİĞİM .h DOSYASI
#include <16F628A.h>
#FUSES NOWDT //No Watch Dog Timer
#FUSES INTRC_IO //Internal RC Osc, no CLKOUT
#FUSES PUT //Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES BROWNOUT //Reset when brownout detected
#FUSES NOMCLR //Master Clear pin used for I/O
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection
#use delay(clock=4000000)
#use rs232(baud=9600,parity=N,xmit=PIN_A3,rcv=PIN_A2,bits=8)
DH forumlarında vakit geçirmekten keyif alıyor gibisin ancak giriş yapmadığını görüyoruz.
Üye Ol Şimdi DeğilÜye olduğunda özel mesaj gönderebilir, beğendiğin konuları favorilerine ekleyip takibe alabilir ve daha önce gezdiğin konulara hızlıca erişebilirsin.
< Bu mesaj bu kişi tarafından değiştirildi m.gunay88 -- 20 Ekim 2011; 13:20:09 >