16f1788 başlangıçta kesme oluşturuyor çözemedim!!!

Başlatan muratgunduz, 27 Mayıs 2016, 13:49:41

muratgunduz

arkadaşlar, daha önce hiç başıma gelemdi ama 16f1788 smd kullanıyorum. kesme aktif olduktan sonra bir kereye mahsus kesme oluşturuyor. fişi çekip taktığım zaman ilk ekranım geliyor sonra kesme oluyor. kesme şemalarına baktım, 5v a direncle bağlıyken kesme devamlı oluyor. H to L, L to H denedim, gnd-rb0 arasına 100n koydum, vdd-rb0 arasına 100n koydum, rb0-gnd arasına 4.7v zener koydum rb0-12V arasına 4.7k koydum.. hiç biri fayda etmedi. kenar ayarı yapamıyorum. H L, ve L H hiç farketmiyor.


kesme olarak kullanacağım kaynak ise basit para seçici. puls çıkışı var ve pulsları 12V. gnd den rb0 a 4.7V zener ordan da puls çıkışına 4.7k koymak zorundayım. bir de  ozenere paralel 100n koymazsam devamlı kesme oluyor. osiloskopta da rb0 üzerinde NC ve NO dayken pulsları çok temiz alıyorum para atınca. puls çıkışı NO dayken sabit 5V rb0 da duruyor ve sadece enerji verince bikereye mahsus kesme alıyor ondan sonra düzene giriyor.

şu anki ana problemim nedne başlangıçta kesme oluşuyor.

#include <16f1788.h>
#device ADC=12

#FUSES PUT
#FUSES NOWDT
#FUSES MCLR                	//Master Clear pin used for I/O
#FUSES NOBROWNOUT          	//No brownout reset
#FUSES NOIESO              	//Internal External Switch Over mode disabled
#FUSES NOFCMEN             	//Fail-safe clock monitor disabled
#FUSES NOSTVREN            	//Stack full/underflow will not cause reset
#FUSES NOLVP               	//No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O


#use delay(internal=4MHz)

#include <lcd.c>

#INT_EXT
void  EXT_isr(void)
{
 disable_interrupts(INT_EXT);
 disable_interrupts(GLOBAL);
 k=1;
}
//!
void main()
{
		
    output_high(paraen);
    output_low(led);
    delay_ms(1);
     
    setup_adc_ports(sAN0);
    setup_adc(ADC_CLOCK_INTERNAL);
    delay_ms(1);

      
   set_adc_channel(0);
   delay_us(20); 
     
   
   lcd_init();

  
   enable_interrupts(INT_EXT);  // INT_EXT kesmesini aktif yapar
   enable_interrupts(GLOBAL);   // Aktif edilen kesmelere izin ver
   ext_int_edge(H_TO_L);   // INT_EXT kesmesinin düşen kenarda aktif olacağını belirtir
   delay_ms(100);

   
main programım ve kesmem de bu şekilde ayarlı.


 

ferit06


muratgunduz

#2
Alıntı yapılan: ferit06 - 27 Mayıs 2016, 14:02:45
Portları tanımlayan TRIS ler nerede?

ccs c de output_high(pin_x) ve input(pin_x)  komutları direk tanımlama yapıyor diye biliyorum arka plandan tek dezavantajı boşuna ram falan harcar. bir de bişey farkettim ekran takılı değilken yapmıyor bu hatayı =) ama trisleri denerim b portu komple 1-7 ekranda zaten.

mesaj birleştirme:: 27 Mayıs 2016, 14:30:02

trisleri d denedim set_tris_b(0b00000001); bu şekilde.. ekran data pinlerine 100n denicem şimdi

kantirici

Kesmeyi aktif yapmadan önce kesme bayrağını temizleyiniz. Ayrıca programın ilk satırına bir süre gecikme ekleyiniz.

muratgunduz

#4
bütün kesme aktif ettiğim yerlerde gecikme ekledim. özellikle izliyorum osiloskoptan sıfırda duruyo rb0, kesmeden sonraki işleri yaptırıyorum, paranın enerjisini verdikten sonra minik bi peak geliyor yaklaşık 60ms kadar. ben paramatiği enerjilendirdikten 3sn sonra kesmeleri aktif yapıyorum. o değil de bu devre breadboard da dip kasayla çalışıyor hiç bir problem yoktu. smd ye geçince başladı.

k=0; d=0; output_low(led); output_high(paraen); delay_ms(3000);
enable_interrupts( INT_EXT_H2L ); enable_interrupts(GLOBAL);


işimi bitirip beklemeye geçmeden önceki son satır yukardaki gibi. "paraen" dediğim parama seçicinin beslemesi minik mosfetle on off yaptırıyom. ccs c de kesme bayrağı bitini nasıl temizleriz.

mesaj birleştirme:: 28 Mayıs 2016, 07:12:07

clear_interrupt(int_timer1); diye buldum yardım konusundan sanırım şöyle olcak clear_interrupt(int_ext); bi deneyeyim.

mesaj birleştirme:: 27 Mayıs 2016, 17:34:58

olmadı yine :S


k=0; d=0; output_low(led); output_high(paraen); clear_interrupt(int_ext); delay_ms(3000);
enable_interrupts( INT_EXT_H2L ); enable_interrupts(GLOBAL);


no nc de de denedim. görüyorum sıfırda beklerken int alıyor. kafayı yicem. bu para secici manyetik okuyor sanırım bu da bobin gerektirir. ters diyot falan da denedim olmadı. en son opto koycam artık.

dursuncemal

opto mantikli bu arada para matik kac volt ile besleniyor?
:=

ErsinErce

kesme kullanırken ilk başta kesmelerin içerikleri ayarlanır sonra kesmeler temizlenerek kesmeye izin verilir.

sizin sıralamanız yanlış yukarıdaki yapıda programınızı düzenleyin