18f4550 a portundaki buton rastgele işlem yapıyor

Başlatan tekosis, 21 Ocak 2014, 12:06:35

tekosis

selamün aleyküm arkadaşlar. bir cihazda butonu 18f4550 nin A2 pinine bağladım(kodlarda hatam yok ise sadece AN0 kanalı analog olacak). bu butonu 10K dirençle pull-down bağladım. girişte butona basılı değilken normalde 0V olması gerekirken yaklaşık 0,16V gibi bir değer okuyorum. ve cihazım çalışmaya başlar başlamaz buton kontrol fonksiyonu sanki buton basılı gibi algılıyor. acaba bilmediğim bir ayar mı yaptım ya da hala girişim analog mu kaldı. aşağıda ilgili programı kırparak uzatmadan, sigorta ayarları ve main tanımlamalarını verdim. yardımcı olabilirseniz sevinirim. teşekkürler.
#include <18F4550.h>
#device adc=16

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES WDT128                   //Watch Dog Timer uses 1:128 Postscale
#FUSES HS                       //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOBROWNOUT               //No brownout reset
#FUSES PUT                    //No Power Up Timer
#FUSES NOCPD                    //No EE protection
#FUSES STVREN                   //Stack full/underflow will cause reset
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOLVP     //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOWRT                    //Program memory not write protected
#FUSES NOWRTD                   //Data EEPROM not write protected
#FUSES IESO                     //Internal External Switch Over mode enabled
#FUSES FCMEN                    //Fail-safe clock monitor enabled
#FUSES PBADEN   //PORTB pins are configured as analog input channels on RESET
#FUSES NOWRTC                   //configuration not registers write protected
#FUSES NOWRTB                   //Boot block not write protected
#FUSES NOEBTR                   //Memory not protected from table reads
#FUSES NOEBTRB                  //Boot block not protected from table reads
#FUSES NOCPB                    //No Boot Block code protection
#FUSES MCLR                     //Master Clear pin enabled
#FUSES LPT1OSC                  //Timer1 configured for low-power operation
#FUSES NOXINST                  //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
#FUSES PLL12                    //Divide By 12(48MHz oscillator input)
#FUSES CPUDIV1                  //System Clock by 4
#FUSES USBDIV                   //USB clock source comes from PLL divide by 2
#FUSES VREGEN                   //USB voltage regulator enabled
#FUSES ICPRT                    //ICPRT enabled

#use delay(clock=20000000)

#use fast_io(a)

#define buton_baslat    pin_a2
#define buton_menu_onay pin_c5

//*************************************************************************************************
// buton tarama fonksiyonu

void buton_tara_menu_3()
   {
   while(1)
   {   
   if(input(buton_menu_onay)==1)
      {
         delay_ms(25);
            while(input(buton_menu_onay)==1)
               {}
               delay_ms(20);
               basilan_buton=menu_butonu;
               goto buton_tarama_menu_3_cikis;
      }  
      
   if(input(buton_baslat)==1)
      {
         delay_ms(25);
            while(input(buton_baslat)==1)
            {}
            delay_ms(20);
            basilan_buton=baslat_butonu;
            goto buton_tarama_menu_3_cikis;
      }  
      
   }
buton_tarama_menu_3_cikis:
   delay_cycles(1);
   } 
//********************* ANA PROGRAM FONKSİYONU**********************************
void main ( )
{
   setup_adc_ports(AN0|VSS_VREF);//AN0 ANALOG GİRİŞ / SADECE +Vref REFERANS GİRİŞİ
   setup_adc(ADC_CLOCK_DIV_2);
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_wdt(WDT_OFF);
   setup_timer_0(RTCC_INTERNAL);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
   setup_ccp1(CCP_OFF);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);


   set_tris_a(0xef);//a portu A4 pini haricindekiler giriş olarak ayarlandı

   output_a(0x10);//çıkış pini olan A4 "1" yapıldı

   buton_tara_menu_3();
  //diye devam ediyor program
İlim ilim bilmektir, ilim kendin bilmektir, sen kendin bilmezsin, bu nice okumaktır.


tekosis

aşağıdaki kod programda mevcut. bu koda göre sadece AN0 analog giriş, AN3 "+" referans voltajı ve A portunun geri kalan pinleri dijital olması lazım değil mi? ben mi hatalıyım? Başka ne olabilir acaba?
setup_adc_ports(AN0|VSS_VREF);
İlim ilim bilmektir, ilim kendin bilmektir, sen kendin bilmezsin, bu nice okumaktır.

selimkoc

MCLR enable edilmiş 10klık dirençle 5V bağlandı mı?

Tagli

Pulldown direncinin değerini düşür. 1k ile bir dene.
Veya 10k ile pullup yap.
Gökçe Tağlıoğlu

tekosis

#5
bağlantı şeklim


pull down dirençleri 10k dediğiniz gibi 1k ile denersem belki etkileyebilir. ayrıca mclr ucu da 10k ile powere ne yazık ki bağlı.
İlim ilim bilmektir, ilim kendin bilmektir, sen kendin bilmezsin, bu nice okumaktır.

diot

Ben butonları bu şekilde kullanmıyorum. sıkıntı çıkabiliyor. Buton girişini 470 ohm -> 1k arası bir dirençle (+) ya pullup yapıyorum ve butonu giriş ile gnd arasına koyup birde buton uçlarına 100 nf kondansatör koyuyorum. Kondansatör  kontak sıçramalarını engelliyor.


ferit06

Yazmış olduğunuz kod  tam olarak ne yazıyor bilmiyorum ama ADCON1  ayarlaması yapıyor olması gerek. Datasheets sayfa 262 ye baktınız mı? ADCON1 registerinde AN3 (VREF tanımlıyorsunuz) analog ise AN2 de analogtur. bu nedenle butonu AN3 ten daha büyük bir girişte kullanmanız gerekir.

tekosis

#8
kesinlikle doğru. bundan sonra pullup kullanacağım. ilave olarak butona 100nf bağlamayı unutmuşum bunu da ilave edeyim. yine de başka fikri olan varmıdır arkadaşlar. bu arada kodlar simülasyonda hiçbir sıkıntı çıkarmıyor.

mesaj birleştirme:: 21 Ocak 2014, 17:37:32

hocam asm sinden bakmadım ama bakayım.  şu an ccs c nin kendi 18f4550 kütüphanesine bakıyorum. benim istediğim gibi sadece AN0->analog, AN3 -> +Vref ve diğer portlar ki AN2 de dijital olacak şekilde kodum doğru gibi.
setup_adc_ports(AN0|VSS_VREF);


kütüphaneye göre setup_adc tanımlamaları;
İlim ilim bilmektir, ilim kendin bilmektir, sen kendin bilmezsin, bu nice okumaktır.

selimkoc

setup_adc_ports(AN0|VSS_VREF);

komutu AN0 analog giriş

VREF-  = GND  olarak tanıtmıyor mu?

Halbuki resimde AN0 analog giriş, Vref+ harici giriş olarak görünüyor.

ADCON1 değeri 0x1E olmalı

tekosis

evet bu kodda yapmaya çalıtığım şey AN0 analog giriş ve AN3 +Vref olacak diğer pinler de dijital giriş olacak. bu durumda ben AN3 pinini
(-Vref pinini) şaseye bağlamalıyımıyım yoksa normal sayısal giriş/çıkış olarak kullanabilir miyim?
İlim ilim bilmektir, ilim kendin bilmektir, sen kendin bilmezsin, bu nice okumaktır.

selimkoc

Entegre içinden bağlıyor. Siz pin olarak kullanabilirsiniz. VCFG0: Voltage Reference Configuration bit (VREF- source) bitini 1 yaparsanın harici gnd bağlarsınız.

kudretuzuner

#12
Merhaba,
18F4550'de bu tarz mekanik uygulamalar için buton yerine optokaplır kullanmanızı tavsiye ederim.Pin'i gerek şaseye çekerken gerekse voltaj vermek opto ile yapılırsa daha sorunsuz olacağını düşünüyorum.Bir başka sorun da butona basarken oluşabilecek arklardır zaten arkadaşlar da yazmışlar.Kolay gelsin.
Not:18F4550 nin data şitine bakarsanız biraz farklı bir besleme  ve reset bağlantısı göreceksiniz.
Amatör

tekosis

hocam şu an pcb montajı yapıldığı için elimdeki devrede optokuplör eklemem pek mümkün değil ama reset devresini ben kabaca çizmiştim. bende de bu sistem var. butona basılmadan program işleme girdiği için şu an problem ark değil sanırım bir şekilde gerilim dalgalanması oluyor ve pic butona basılmış gibi algılıyor. yarın değişiklikleri yapıp yeniden deneyeceğim.
İlim ilim bilmektir, ilim kendin bilmektir, sen kendin bilmezsin, bu nice okumaktır.

tekosis

problem halloldu. arkadaşlar yazılımda sıkıntı yok tamamen pull-down direnci ve kodansatörler ilgili. pulldown direncini 1k'ya düşürünce ve butona 100nf bağlayınca mesele halloldu. yardımcı olan herkese teşekkürler.
İlim ilim bilmektir, ilim kendin bilmektir, sen kendin bilmezsin, bu nice okumaktır.