Picproje Elektronik Sitesi

DERLEYİCİLER => CCS C => Konuyu başlatan: Recep METE - 19 Nisan 2014, 20:51:00

Başlık: Binler basamağı olan sayılarda yüzler basamağında 299'a kadar işlem yapıyor
Gönderen: Recep METE - 19 Nisan 2014, 20:51:00
Arkadaşlar yaptığım çalışmada
if(sifre==6299 && e==14)
output_high(pin_b0);
keypadle girdiğim sayılarda yüzler basamağında 299'a kadar sayılarla işlem yapıyor. 299'u geçince duruyor.Birde binler basamağı kaç olursa olsun çalışıyor.Örneğin 7299'a kadar sayılarla çalışyor.7300'de ve yukarısında işlem yapmıyor.8299'a kadar sayılarla çalışıyor.8300'de duruyor.9299 a kadar sayılarlaçalışıyor,9300'de çalışmıyor.v.b.Bu sayıları0000'dan - 9999'a kadar nasıl çalştırtabilirim.
Başlık: Ynt: Binler basamağı olan sayılarda yüzler basamağında 299'a kadar işlem yapıyor
Gönderen: kantirici - 19 Nisan 2014, 21:26:57
değişken tipleri bu sayıları tutmaya yetiyor mu? Ayrıca programı gömek lazım.
Başlık: Ynt: Binler basamağı olan sayılarda yüzler basamağında 299'a kadar işlem yapıyor
Gönderen: Recep METE - 19 Nisan 2014, 23:59:45
Alıntı yapılan: kantirici - 19 Nisan 2014, 21:26:57
değişken tipleri bu sayıları tutmaya yetiyor mu? Ayrıca programı gömek lazım.


Hocam, değişkenler:
  unsigned int8  tus,e,a,b,c,d;
 
  unsigned  int16 sifre=0;


Kodlar: 
#include        <16f877.h>
#fuses          XT,NOWDT,NOPROTECT
#use            delay(clock=4000000)
#include        <lcd.c>
#use            fast_io(c) 
#use            fast_io(b)             
#use            fast_io(d)
#use            fast_io(a)
#use            fast_io(e)



#define         sut1 pin_B4                                       
#define         sut2 pin_B5                     
#define         sut3 pin_B6 


#define         sat1 pin_B0
#define         sat2 pin_B1               
#define         sat3 pin_B2                   
#define         sat4 pin_B3 


#define         m1 pin_a0
#define         m2 pin_a1
#define         ea pin_a2
#define         eb pin_a3
#define buton_ileri pin_e0
#define buton_geri  pin_e1
#define buton_stop  pin_e2



#define buzzer      pin_c0   
#define use_portd_lcd TRUE
           

  unsigned int8  tus,e,a,b,c,d;
 
  unsigned  int16 sifre=0;

void tus_al()// yazılım bu fonksiyona geldiğinde buradan bir
{            // tus değeri almadan bu fonksiyondan çıkmaz
don:
output_low(sut1);output_high(sut2);output_high(sut3);
if(input(sat1)==0){tus=1;goto brk;}
if(input(sat2)==0){tus=4;goto brk;}
if(input(sat3)==0){tus=7;goto brk;}
if(input(sat4)==0){tus=15;goto brk;}

output_high(sut1);output_low(sut2);output_high(sut3);
if(input(sat1)==0){tus=2;goto brk;}
if(input(sat2)==0){tus=5;goto brk;}
if(input(sat3)==0){tus=8;goto brk;}
if(input(sat4)==0){tus=0;goto brk;}                       

output_high(sut1);output_high(sut2);output_low(sut3);
if(input(sat1)==0){tus=3;goto brk;}
if(input(sat2)==0){tus=6;goto brk;}
if(input(sat3)==0){tus=9;goto brk;}     
if(input(sat4)==0){tus=14;goto brk;}


goto don; 
brk:
while(!input(sat1));
while(!input(sat2));         
while(!input(sat3));
while(!input(sat4));                           
output_high(buzzer);delay_ms(100);output_low(buzzer);
}   



void main()
{           
  set_tris_b(0b00001111);//keypad baglı   
set_tris_c(0b00000000);
set_tris_a(0b00000000);
set_tris_d(0b00000000);
set_tris_e(0b00000111);
port_b_pullups(true);//*** CMOS girişler voltaja hassastır , en ufak voltajı 0-1 olarak kabul edebilirler.
//Bunun önüne geçmek için pull-up yada pull-down direnci ile hat 0'a yada 5V'a çekilir ve stabil hale getirilir.
output_a(0x00);                           
output_b(0x00);
output_c(0x00);
output_d(0x00);
output_e(0x00);

output_high(ea);
output_low(eb);

lcd_init();   // LCD hazırlanıyor
basla:

printf(lcd_putc,"\fsifre:");
delay_ms(500);

  all:



tus_al();
a=tus;
lcd_gotoxy(9,1);
printf(lcd_putc,"*");
if(tus==14||tus==15) {goto basla;}
delay_ms(300);

tus_al();
b=tus;
lcd_gotoxy(10,1);
printf(lcd_putc,"*");
if(tus==14||tus==15) {goto basla;}
delay_ms(300);

tus_al();
c=tus;
lcd_gotoxy(11,1);
printf(lcd_putc,"*");
if(tus==14||tus==15) {goto basla;}
delay_ms(300);
 
tus_al();
d=tus;
lcd_gotoxy(12,1);
printf(lcd_putc,"*");
if(tus==14||tus==15) {goto basla;}
delay_ms(300);

tus_al();
e=tus;

if(tus==15) {goto basla;}
delay_ms(300);
 

sifre=((a*1000)+(b*100)+(c*10)+(d*1));

if(sifre==8299 && e==14)



  {
   lcd_gotoxy(1,1);
  printf(lcd_putc,"\f   DOGRU SIFRE");
  printf(lcd_putc,"\n  PROJE CALISTI");
  delay_ms(300);
   

  while(1) // Sonsuz döngü
   {
      if (input(buton_ileri)) // İLERİ Butonuna basılsı ise
      {
         output_high(m1); // L298 Input1 girişi lojik-1
         output_low(m2);  // L298 Input2 girişi lojik-0
      }

      if (input(buton_geri)) // GERİ Butonuna basılsı ise
      {
         output_low(m1);  // L298 Input1 girişi lojik-0
         output_high(m2); // L298 Input1 girişi lojik-1
      }
      if (input(buton_stop)) // HIZLI STOP Butonuna basılsı ise
      {
         output_low(m1); // L298 Input1 girişi lojik-0
         output_low(m2); // L298 Input1 girişi lojik-0
         // Hızlı stop için burada her iki girişte lojik-1 olabilirdi.
         // Önemli olan Hızlı Stop için, her iki girişin aynı seviyede olması
      }

   }
 
  }
 
  else
  {
 
   lcd_gotoxy(1,1);
  printf(lcd_putc,"\f  YANLIS SIFRE");
  printf(lcd_putc,"\nTEKRAR DENEYINIZ");
  delay_ms(1000);
 
  goto basla;
 
}}
 


 


Sorun:Yazılmış olan program sayıları  1299-2299-3299-4299...9299 'a kadarlığını kullanıyor.Program içinde sifre oluşturduğumda bu sayılara kadar olanları program dikkate alıyor,kullanıyor.Bu sayılardan büyüklerinde programda hatalı bir çalışma oluyor.Bunları  0000'dan -9999'a kadar kullanmak istiyorum ne yapmalıyım.
Başlık: Ynt: Binler basamağı olan sayılarda yüzler basamağında 299'a kadar işlem yapıyor
Gönderen: kantirici - 20 Nisan 2014, 00:27:00
x
Başlık: Ynt: Binler basamağı olan sayılarda yüzler basamağında 299'a kadar işlem yapıyor
Gönderen: Kabil ATICI - 20 Nisan 2014, 00:40:40
@semfero
o kadar goto kullanmışsın ki bir an için basic programına bakıyorum zannettim. Örneğin tuş basması için b portu kesmesini kullanabilirsin. Böylece sürekli tuş basıldı mı diye bakmana gerek kalmaz.

Yok onu kullanmam dersen bir ve değil kapısı ile işlemciye giren bacaklardan birer tanesi VE DEĞİL kapısına uygulanır çıkışı da harici kesmeye uygulanır.



tuşları tek tek değişkene eşitlemene gerek yok
e=d;
d=c;
c=b;
b=a;
a=tus;
böylece bir seferde girilen son değere göre değerler kaydırılır.

hani olabilir ya
if(sifre==8299 && e==14)
bunu a,b,c,d değerlerini tek tek bakacak şekilde düzenleyip bir deneyebilirsin..
if(a==8 && b==2 && c==9 && d==9 && e==14)
gibi bir şey oluyor...
Başlık: Ynt: Binler basamağı olan sayılarda yüzler basamağında 299'a kadar işlem yapıyor
Gönderen: pwm.c - 20 Nisan 2014, 00:51:50
tuş takımından girilen sayıları toplarken işlem türünü bildirmen gerekiyor yoksa 8 bitlik işlem yapar. bu nedenle 300 sayısını elde edemiyorsun.
işlemi şu şekilde yap bakalım:
sifre=(((int16)a*1000)+((int16)b*100)+(c*10)+(d*1));
Başlık: Ynt: Binler basamağı olan sayılarda yüzler basamağında 299'a kadar işlem yapıyor
Gönderen: Recep METE - 20 Nisan 2014, 06:56:40
Alıntı yapılan: pwm.c - 20 Nisan 2014, 00:51:50
tuş takımından girilen sayıları toplarken işlem türünü bildirmen gerekiyor yoksa 8 bitlik işlem yapar. bu nedenle 300 sayısını elde edemiyorsun.
işlemi şu şekilde yap bakalım:
sifre=(((int16)a*1000)+((int16)b*100)+(c*10)+(d*1));

Hocam çok teşekkür ederim, sayenizde sorun giderildi.

mesaj birleştirme:: 20 Nisan 2014, 06:59:32

Alıntı yapılan: ambar7 - 20 Nisan 2014, 00:40:40
@semfero
o kadar goto kullanmışsın ki bir an için basic programına bakıyorum zannettim. Örneğin tuş basması için b portu kesmesini kullanabilirsin. Böylece sürekli tuş basıldı mı diye bakmana gerek kalmaz.

Yok onu kullanmam dersen bir ve değil kapısı ile işlemciye giren bacaklardan birer tanesi VE DEĞİL kapısına uygulanır çıkışı da harici kesmeye uygulanır.



tuşları tek tek değişkene eşitlemene gerek yok
e=d;
d=c;
c=b;
b=a;
a=tus;
böylece bir seferde girilen son değere göre değerler kaydırılır.

hani olabilir ya
if(sifre==8299 && e==14)
bunu a,b,c,d değerlerini tek tek bakacak şekilde düzenleyip bir deneyebilirsin..
if(a==8 && b==2 && c==9 && d==9 && e==14)
gibi bir şey oluyor...


Hocam verdiğiniz bu bilgilerden sonra programı  bu bilgiler ışığında yeniden düzenlemeye karar verdim.Ancak kesmeler üzerine biraz daha araştırma yapmam lazım.Teşekkür ederim.