pic ile lcd keypad li sayıcı yardım

Başlatan jildrime, 05 Mayıs 2008, 05:22:28

jildrime

lcd ve keypad kullanılan bi sayıcı devresi yapmaya çalışstım proteusta cok iyi çalışıyor fakat eger semaya bakarsanız sensor pice algı yaptıgında bir buton gibi lojik 1 veriyor mantıgını dusundum..
sensorler hakkında pek bilgim yok arastırdım pek bi sonuca ulasamadım
nasıl bir hareket sensoru kullanablirim kucuk bir kutu dusunuyorum gerceklerken tam onunden gecenleri saymasını istiyorum geniş bir alanda tarama yapmaması lazım sensorun birde anladığım kadarı ile sensoru pice  direk suremiyorum bu konu hakkında yardım lazım
programı ccs c de yazdm bazı hatalar var mesela geri sayım kısmında sayım 0 a eşit oldugunda cıksılardan biri aktif oluyor ve led yanıyor fakat geri sönmesi olayını beceremedm
yardımlarınız için teşekkürler





http://rapidshare.com/files/112616074/yld.rar.html

ipek

RA4 T0CKI PIN Schmitt Trigger input saydırabiliyor isen daha mantıklı olur
switch için 100ms gecikme koyabilirsin OneShoot gibi parazitleri önlemek için switch'e paralell capasite bağlayabilirsin 10nf den küçük olmasın 220nf'den büyük olmasın sayma girişin uzak bir yerde ise opto kuplör bağlayabilirsin...gibi

jildrime

schmit trigger input kullanma olayını biraz açabilirmisin
birde mesafe onemli değil 50 cm dahi yeterli uzak mesafeli bi olcum olmasına gerek yok

ipek

schmit trigger input girişi yükselen yada alçalan seviyede tetiklenerek
bounce dediğimiz sıçramalardan  (gereksiz parazitler) diğer giriş ayaklarına göre en az etkilenen ayaktır...

ete

Ayrıca bu RA4 bacağını TMR0 üzerinden kullanarak geri planda saydırma yapmasınıda sağlayabilirsin. Böylece program bir takım işler yaparken TMR0 geçenleri saymaya arka planda devam edebilir.
Yapılacak iş,
- TMR0 sayacını RA4 bacağından sinyal alacak şekilde ayarlayacaksın. Option Registeri 5. bit bu işi ayarlıyor.
- Prescaler (bölücü) değerini 1:1 olarak vereceksin. Option Reg. 0-1-2 ci bitleri bu işi yapıyor.
- Bölücü ayarını WDT için uyarlayacaksın Çünkü 1:1 oranı Timer0 için yok. Option Reg 3. biti bu işi ayarlıyor.
- TMR0=0 deyip saydırmayı başlatacaksın.
Her hangi bir zamanda SAYAC=TMR0 diyerek sayılan değerleri Sayac değişkenine aktarabilir ve değerlendirebilirsin.

KOlay Gelsin
Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

ete

Ayrıca bu RA4 bacağını TMR0 üzerinden kullanarak geri planda saydırma yapmasınıda sağlayabilirsin. Böylece program bir takım işler yaparken TMR0 geçenleri saymaya arka planda devam edebilir.
Yapılacak iş,
- TMR0 sayacını RA4 bacağından sinyal alacak şekilde ayarlayacaksın. Option Registeri 5. bit bu işi ayarlıyor.
- Prescaler (bölücü) değerini 1:1 olarak vereceksin. Option Reg. 0-1-2 ci bitleri bu işi yapıyor.
- Bölücü ayarını WDT için uyarlayacaksın Çünkü 1:1 oranı Timer0 için yok. Option Reg 3. biti bu işi ayarlıyor.
- TMR0=0 deyip saydırmayı başlatacaksın.
Her hangi bir zamanda SAYAC=TMR0 diyerek sayılan değerleri Sayac değişkenine aktarabilir ve değerlendirebilirsin.

KOlay Gelsin
Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

jildrime

cok guzel seyler ogrendim şu halini bir gerçekleyip çalıştırayım gösterdiğiniz yolları deneyeceğim teşekkürler

jildrime

dediğiniz gibi yaptm a4 ucundan saydırıyorum timer ı ayarlayamıyorum ama onemli değil 2 isi bir arada yapmasına gerek yok ama programda bi hata var. mesela adet değişkenini kaydet diyorum ccs c dilinde write_eeprom(0,adet) seklinde sonra gucu kesiyorum geri verdiğimde adet sayısı sacmalamıs oluyor 35500 seklinde bu neyden kaynaklanabilir

ete

Eeprom her adrese 8 bitlik bilgileri kayıt eder. Kullandığın değişken word (16 bit) ise bu saçmalık ordan geliyordur. CCS belki otomatik yapıyordur bu işi ama sen yinede 16 bitlik değişkenini 8 er bitlik iki bilgi halinde kayıt et cve bak bakalım sonuç ne oluyor.

Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

jildrime

evet haklısın her bite hex tabanında mesela FF seklinde yani max 255 olcak şekilde yazıyor eeprom şimdi ben bunları ayırmayı denedim mesela 9999 sayısını array olarak tanıtıyorum sayıdan son iki basamağı çıkartıyorum yuze bolup eeproma ilk iki basamağı kaydediyorum sonra son 2 basamagı diger bite kaydediyorum.
bundan daha kolay ve kısa bir yol varmı yoksa böyle olunca okutmasıda zor oluyor ben bunu bulabildim program yazmada cok yeniyim ilk denemem diyebilirim ugrasıp bişiler oldu ama rom hafızasıda onemli
kısa yolları ogrenmeye calısıyorum

ete

Pic Basic de bu iş çok kolay. 16 bitlik sayı değişkeni;
Değişken,Byte0
Değişken,Byte1
şeklinde iki parçaya ayrılıveriyor. Ancak temel mantık şudur.
Byte1 x 256+Byte0
Örneğin elimizde 475 sayısı olsun. Bunu 8 bitlik iki parçaya ayırmak için;
475/256 =1
475 - 1*256=219
şeklinde yapıyoruz. Bu sistem HEX sayı formatının temelini oluşturur ve bütün işlemciler bu temel üzerinden çalışırlar.

C dilinde işin kısa bir komutu olması gerek sanırım benzer şekilde Byte0 ve Byte1 şeklinde denemeni öneririm. C dilini bilmediğim için daha fazla yardımcı olamıyorum.
Şimdi aklıma geldi diğer bir yöntem de şu olabilir.
LowByte=Sayı Mod 256
HighByte=Sayı/256

Mod alma işlemini bilmen gerekir. Bir sayıyı başka bir sayıya bölüp kalanı bulma işlemi diyebiliriz kısaca.  Önceki örneğimize dönersek;
Sayı=475 olsun
LowByte=Sayı Mod 256 = 219
High Byte=Sayı/256=1 olarak çıkar.  C dilinde HighByte için kullanacağın değişken tipi Integer olması gerekir.


Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

jildrime

Uğraştım eeprom olayını çözemedim ama onu hallediceğim bir şekilde

3 gündür araştırıyorum rs232 ile bilgisayara veri yollamaya çalışıyorum max232N entegresini aldım. Her baktığım şemada kapasitör değerleri farklı hemen hemen hepsini denedim hiçbir veri alamadım PC den.Sadece pic ten Pc ye veri yollamam yeterli. Bu entegrenin tam olarak devresi nasıldır? birde herhalde kodda eksiklik var kodu incelerseniz benim bir integer değişkenini bilgisayara yollamam lazım adet diye tanımladığım. Bunu nasıl yapacağımı açıklarsanız sevinirim teşekkürler..
#include "C:\Documents and Settings\ylddd\Desktop\calısan devre\yld\keypad.h"
#include <flex_lcd.c>
#use delay (clock=4000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)

#include <kbd1.c>



int okunan;
int16 adet;
int16 şifre;
int16 code;
int16 adetdown;
int16 dongu;
int8 e,f;

void write_int16_eeprom(int8 address, int16 data) {
   int8 i;
   for(i = 0; i < 2; ++i) { write_eeprom(address + i, *(&data + i)); }
}

void main()
{
e = read_eeprom(0);
f = read_eeprom(1);
delay_ms(100);
code = make16(e,f);
e = read_eeprom(8);
f = read_eeprom(9);
delay_ms(100);
adet=make16(e,f);




   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   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);
   

   basla:
   
   lcd_init();
   printf(lcd_putc,"\fup1 res2 new3 ");
   printf(lcd_putc,"\nDOWN Press 4 ");

while(1) {
   k = kbd_getc();

   if(k=='1')
   {
      lcd_init();
      goto upcounter;
   }
   if(k=='2')
   {
      lcd_init();
      goto sifirlama;
   }
   if(k=='3')
   {
      lcd_init();
      goto degistirme;
   }
   if(k=='4')
   {
      lcd_init();
      goto downcounter;
   }
  
  
   

}
   sifirlama:
   
   lcd_init();
   printf(lcd_putc,"\fşifreyi girin ");
   printf(lcd_putc,"\n* a basin");
   
   şifre = yazi();
   if(şifre==code)
     {
     adet=0;
     write_eeprom(8,0);
     write_eeprom(9,0);
     delay_ms(200);
     goto upcounter;
     }
   if(şifre!=code)
     {
     lcd_init();
     printf(lcd_putc,"\fyanlis şifre ");
     printf(lcd_putc,"\nyeniden dene");
     delay_ms(1000);
     goto sifirlama;
     }
   degistirme:
     printf(lcd_putc,"\feski şifreyi gir ");
     printf(lcd_putc,"\n* a bas");
     şifre = yazi();
     if(şifre!=code)
       {
        lcd_init();
        printf(lcd_putc,"\fyanlis şifre ");
        printf(lcd_putc,"\nyeniden dene");
        delay_ms(1000);
        goto degistirme;
       }
     if(şifre==code)
       {
       lcd_init();
       printf(lcd_putc,"\fyeni şifreyi gir");
       printf(lcd_putc,"\n* a bas");
       code = yazi();
       
       write_int16_eeprom(0,code);
       delay_ms(200);
       goto basla;
       }
       
     

   upcounter:
   

   while(1){
      //okunan=0;
      
      okunan=input_a();
      printf(lcd_putc,"\fUP COUNTER ");
      printf(lcd_putc,"\nADET :%lu",adet);
   
      delay_ms(100);
    
      if(bit_test(okunan,4)==true) 
      {
         while(bit_test(okunan,4)==true)
         {
         okunan=input_a();
         }
         adet++;
         delay_ms(50);
         write_int16_eeprom(8,adet);
         delay_ms(50);
      } 
      
   }
   
   downcounter:
   
   
   printf(lcd_putc,"\fEnter value ");
   printf(lcd_putc,"\nthen press *");
         adetdown=0;
         
        adetdown = yazi();
        dongu=adetdown;
      
          
        goto fonksiyon;
    fonksiyon:
    
         printf(lcd_putc,"\fDOWN COUNTER ");
         printf(lcd_putc,"\nADET :%lu",adetdown);
      while(adetdown!=0){ 
      output_high(pin_c0);
      okunan=0;
      okunan=input_a();
         if(bit_test(okunan,4)==true) 
         {
          while(bit_test(okunan,4)==true)
          {
          okunan=input_a();
          }
          adetdown--; 
          lcd_init();
          printf(lcd_putc,"\fDOWN COUNTER ");
          printf(lcd_putc,"\nADET :%lu",adetdown);

          delay_ms(100);
          if(adetdown==0)
           {                               
            output_low(pin_c0);                
            output_high(pin_c1);  
            delay_ms(1000);
            output_low(pin_c1);
            adetdown=dongu;
            goto fonksiyon;
            
           
            
            
           }
         } 
      }
      
   
}