628a da tus takımı ve haberlesme denemesı

Başlatan toprak0258, 19 Ocak 2013, 09:38:48

toprak0258

merhabalar....
ccs c de ceşıtlı denemeler yaymaya devam edıyorum....bu sefer tus takımını ve haberlesmeyı ıc ıce denemeye calıstım..deneme olumludur bır sorun gozukmuyor...arkadaslar fıkır belırtebılır...

http://www.dosya.tc/server26/BQIikk/628ailetustakimidenemesi.rar.html
bakan arkadaslara bır sorumda var...suan sureklı bılgı gonderıyor...ben sadece herhangı bır tusa basıldığında göndermesını istiyorum...bu konuda ne yapabılırım...
selamlar....
Bilgi paylaşıldıkca değer kazanır.

serhat1990

Merhabalar ;

Kodu buraya direk eklesen daha iyi olmazmı . İncelemek için dosya indirmek zor oluyor , zaten meslek gereği dosya dolu her yer :)
Ben indirdim inceledim . Sürekli veri göndermesi normal çünkü keypad'den okuduğun değeri direk gönderiyorsun .
Bunun için şöyle birşey yapabilirsin . Verileri gönderdikten sonra bir değişkene kaydedersin . Eğer gönderdiğin değişken durumu en son gönderilene göre değişmemiş ise göndermezsin .

void main()
{
   int gidenveri=0;
   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);
   setup_oscillator(False);

   set_tris_b(0x0F);
   set_tris_a(0x00);
   
   output_a(0x00);
   
   while(1)
   {
    veri=keypad_oku();
    if(gidenveri!=veri){putc(veri);putc(veri);putc(veri);gidenveri=veri;}
    delay_ms(10);
   }
}


İyi çalışmalar dilerim .

toprak0258

merhabalar...
cevaplarınız ıcın tesekurler...verdiğiniz tarzda yaptım sorun gıderildi......fakat örneğın 1 tusuna bastım 20 sanıye sonra tekrar 1 tusuna basarsam gondermıyor...cunku öncekı bılgı ıle aynıdır....bu durumda sorun yaratmazmı ....burada wdt kullanabılırmıyım yada boyle 5 sanıye gıbı bır zaman farkı yaratıp sorunu gıdebılırmıyım...dığer kodları yukleme noktasında soyledın nokta benım eksıklıgım...ama ne yaptıysam o sorunu gıderemedım.....
selamlar....
Bilgi paylaşıldıkca değer kazanır.

F.T

#3
gönderme işlemini tuşa basınca yap.keypad sıfırdan farklı ise gönderme işlemini yaptır.tuş bırakılmışsa göndermesin.
Hakk şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

JOKERAS

Selam,
Bana göre bu şekilde tuş okumak iyi bir yöntem değil...
Tuş okumak için tamda bu işe göre olan port change interrupt'ını kullanmak çok iyi bir yöntem olur.
Birde Tuş okumada debounce olayı vardır ve bence çok önemlidir,eğer debounce kontrolü yapmadan
yaparsanız butonlar kullanımdan dolayı kontaklarında olabilecek hatalar,oksitlenmeler vs bir süre sonra sapıtmaya başlayacaklar.
Proteus'ta debounce hatası olmayacağı için sizi yanıltır,tavsiyem PIC'in port change interrupt'ını ve debounce kontrolü yaparak yapmanızdır.

toprak0258

merhabalar...
bahs etiğin konuda biraz daha acımlayıcı olsan ....yada benzer konularda varsa örnekleyebilseniz iyi olur böylelikle anlaşılır hale getirip çalıştırız....
selamlar....
Bilgi paylaşıldıkca değer kazanır.

Sdttn

Şu kod istediğini yapar he tuşa basışta SPI'den tuş değerini gönderir.

#include <16F688.h> 
#device adc=16
#fuses NOWDT,NOPROTECT,BROWNOUT,INTRC_IO,NOMCLR
#use delay(clock=8000000)  
#use SPI(MASTER,DI=PIN_C5,DO=PIN_C4,CLK=PIN_C2,SAMPLE_RISE, BITS=8,MSB_FIRST,IDLE=0)
#use rs232(baud=9600,parity=N,xmit=PIN_C1,bits=8,stream=PORT1)
//============================= 
#int_ext
 void kesme_fonk(){

 delay_ms(1000);
 printf("\rFORKLIFT CAGIR");
 }
//Keypad connection: 
#define row0 PIN_c0 
#define row1 PIN_a1 
#define row2 PIN_a0 
#define row3 PIN_a3 
#define col0 PIN_a4 
#define col1 PIN_a5 
#define col2 PIN_c3 


// Keypad layout: 
char const KEYS[4][3] = 
{{'1','2','3',}, 
 {'4','5','6',}, 
 {'7','8','9',}, 
 {'*','0','#',}}; 


#define KBD_DEBOUNCE_FACTOR 100 // Set this number to apx n/333 where 
// n is the number of times you expect 
// to call kbd_getc each second 

void kbd_init() 
{ 
//set_tris_a(0x0F); 

//output_a(0xF0);

port_a_pullups(FALSE);  
} 

short int ALL_ROWS (void) 
{ 
if(input (row0) & input (row1) & input (row2) & input (row3)) 
   return (0); 
else 
   return (1); 
} 



char kbd_getc() 
{ 
static byte kbd_call_count; 
static short int kbd_down; 
static char last_key; 
static byte col; 

byte kchar; 
byte row; 

kchar='\0'; 

if(++kbd_call_count>KBD_DEBOUNCE_FACTOR) 
  { 
   switch (col) 
     { 
      case 0: 
        output_LOW(col0); 
        output_HIGH(col1); 
        output_HIGH(col2); 
       
        break; 
    
      case 1: 
        output_HIGH(col0); 
        output_LOW(col1); 
        output_HIGH(col2); 
       
        break; 

      case 2: 
        output_HIGH(col0); 
        output_HIGH(col1); 
        output_LOW(col2); 
      
        break; 

     
      } 

   if(kbd_down) 
     { 
      if(!ALL_ROWS()) 
        { 
         kbd_down=false; 
         kchar=last_key; 
         last_key='\0'; 
        } 
     } 
   else 
     { 
      if(ALL_ROWS()) 
        { 
         if(!input (row0)) 
            row=0; 
         else if(!input (row1)) 
            row=1; 
         else if(!input (row2)) 
            row=2; 
         else if(!input (row3)) 
            row=3; 

         last_key =KEYS[row][col]; 
         kbd_down = true; 
        } 
      else 
        { 
         ++col; 
         if(col==3) 
            col=0; 
        } 
     } 
   kbd_call_count=0; 
  } 
return(kchar); 
} 

//=========================== 
void main() 
{ 

set_tris_a(0b00000100);
enable_interrupts(int_ext);
enable_interrupts(global);
ext_int_edge(H_TO_L);

setup_oscillator(OSC_8MHZ);

char k;



kbd_init(); 



while(TRUE) 
  { 
 //spi_xfer(0b10101010);
   k=kbd_getc(); 
   if(k!=0) 
     { 
      //if(k=='*') 
         //printf("%c", '*'); 
         //spi_xfer('*');
      //else 
         //printf("%c", k); 
         spi_xfer(k);
     } 
  } 

}

toprak0258

merhabalar...
öncelıkle sdttn arkadasa tesekur ederım...fakıt ayırıp ayrıntılı bır program verdiği icin....fakat bazı seylere takıldım....bır neden 628 değıl de 688 kullanılmıs baktım tek avantası adc sının olmasıdır ...programda baktım adc=16 yazılmıs ama tam anlamadım...bırde mesele o ıse 877 kulanamazmıyım...cunku elımde 628 ve 877 coktur ...688 3tane sade kalmıs...bazı komutları yenı gördum onları anlamaya calısıyorum...bazı yerlerı acımlama vaktın varmı acaba....cunku buna bırde alıcı yapmak gerekıyor....
selamlar....
Bilgi paylaşıldıkca değer kazanır.

toprak0258

merhabalar.....
programin son halini basitlestirerek verici kismini yeniden ayarladim...hem kisa hemde sorunsuz calisiyor...isteyen baksin diye koyuyorum,,,,
#include <16f628a.h>
#fuses HS,NOWDT,PUT,NOPROTECT,NOLVP,NOBROWNOUT
#use delay(clock=4000000)

#use fast_io(a)
#use fast_io(b)

#use rs232(baud=9600,xmit=pin_a1,parity=N,stop=1)

#define sut1  pin_b0
#define sut2  pin_b1
#define sut3  pin_b2
#define sut4  pin_b3

#define sat1  pin_b4
#define sat2  pin_b5
#define sat3  pin_b6
#define sat4  pin_b7

#define uyku  pin_a0


char tus=0;
int veri=0;
int b=0;
////,,,,,,,,keypad tarama fonksiyonu,,,,,,

char keypad_oku()
{
  output_b(0*00);

  output_high(sat1);
  if (input(sut1))
  {delay_ms(20); tus=1; b=1;}
  if (input(sut2))
  {delay_ms(20); tus=2; b=1;}
  if (input (sut3))
  {delay_ms(20); tus=3; b=1;}
  if (input(sut4))
  {delay_ms (20) ; tus=0xA; b=1;}
  output_low(sat1);
 
   output_high(sat2);
  if (input(sut1))
  {delay_ms(20); tus=4; b=1;}
  if (input(sut2))
  {delay_ms(20); tus=5; b=1;}
  if (input (sut3))
  {delay_ms(20); tus=6; b=1;}
  if (input(sut4))
  {delay_ms (20) ; tus=0xB; b=1;}
  output_low(sat2);
 
   output_high(sat3);
  if (input(sut1))
  {delay_ms(20); tus=7; b=1;}
  if (input(sut2))
  {delay_ms(20); tus=8; b=1;}
  if (input (sut3))
  {delay_ms(20); tus=9; b=1;}
  if (input(sut4))
  {delay_ms (20) ; tus=0xC; b=1;}
  output_low(sat3);

   output_high(sat4);
  if (input(sut1))
  {delay_ms(20); tus=0xE; b=1;}
  if (input(sut2))
  {delay_ms(20); tus=0; b=1;}
  if (input (sut3))
  {delay_ms(20); tus=0xF; b=1;}
  if (input(sut4))
  {delay_ms (20) ; tus=0xD; b=1;}
  output_low(sat4);
 
  return tus;
}
//,,,,,,,,,,,,ana prugram,,,,,,

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);
   setup_oscillator(False);

   set_tris_b(0x0F);
   set_tris_a(0x00);
   
   output_a(0x00);
   
   while(1)
   {
    veri=keypad_oku();
    veri=veri+111;
    if (b==1)
    {
     b=0;
     output_high(uyku);
     putc(veri);
     putc(veri);putc(veri);
    delay_ms(500);
    output_low(uyku);
    }
   }
}
arkadaslar niye boyle koyuyorsun diye kizarlarsa ...ben ya dosya  kayacaktim yada boyle ...cunku diger olmasi gerekeni henuz yapamiyorum...
selamlar...
Bilgi paylaşıldıkca değer kazanır.