2 çıkışla ve 2 buttonla 7segment kontrolü - hatayı bulamadım

Başlatan samuray84, 16 Aralık 2011, 14:29:08

samuray84

merhaba, şimdi devreyi serdar çiçek'in kitabındaki gibi kurdum, fazladan 2 tane düğme koyrum bunları da b2 ve b3 e koydum. b0 ve b1 den cıkan uçlar da 74hc164 entegresine gidiyor. o da 7-segmente bağlı.

digit arrayi da 6 tane değer tutuyor. düğmelere bastıkca sevensegmentte digit arrayındaki değerleri görcez ileri geri şeklinde.
devrede hata yok. Koddaki hatayı da ben bulamadım. Anlayan varsa bi bakıversin ya hayrına.

#include <16f877.h>   
#include <stdio.h>
#include <math.h>
//***********Denetleyici konfigürasyon ayarları************
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD

#use delay(clock=4000000)   // Gecikme fonksiyonu için kullanılan osilatör frekansı belirtiliyor

#use fast_io(b)

#define data pin_b0
#define clock1 pin_b1

int k=600000, j=0,i=0;

int digit[6]={0xde,0xfa,0x7a,0xf6,0x3e,0xdf};




void main ()
{
   int mod=0;
   
      setup_psp(PSP_DISABLED);
      setup_spi(SPI_SS_DISABLED);
      setup_timer_1(T1_DISABLED);
      setup_timer_2(T2_DISABLED,0,1);
      setup_adc_ports(NO_ANALOGS);
      setup_adc(ADC_OFF);
      setup_CCP1(CCP_OFF);
      setup_CCP2(CCP_OFF);
   
     
   set_tris_b(00001100);  //B portu
   output_b(00000000);
   
     
   while(1)
   {
           
      if(input(pin_b2))    //b2 ye bağlı butona basılırsa
      {
         k=k+1;
         mod=k%6;
         
         for(j=0;j<8;j++)
            { 
               output_bit(data,bit_test(digit[mod],j));
               output_high(clock1);
               output_low(clock1);
           
            }
            delay_ms(250);
         
      }
     
      if(input(pin_b3))   //b3 pinine bağlı butona basıldığında
      {
         k=k-1;
         mod=k%6;
         for(j=0;j<8;j++)
            { 
               output_bit(data,bit_test(digit[mod],j));
               output_high(clock1);
               output_low(clock1);
           
            }
            delay_ms(250);
         
      }
     
     //buttona basılmadığında

      mod=k%6;
      for(j=0;j<8;j++)
         { 
            output_bit(data,bit_test(digit[mod],j));
            output_high(clock1);
            output_low(clock1);
           
         }
         delay_ms(50);
     
     
     //if(input(pin_d7))
     //break;
         
   }

JKramer

int 8 bit'likdir, 600000 gibi bir değer atayabilmek için (neden böyle bir şeye gerek duyduğunuzu anlamadım) int32 şeklinde tanımlamanız gerekiyor.

samuray84

deniyorum.
bu arada bişey daha farkettim, devrede düğmeye bastığımda pic' in b2 ve b3 bacaklarına 0.45 volt gidiyor.  Halbuki düğmeleri motor kontrol devresindeki gibi aynen yerleştirdim. o devrede butona basınca normal şekilde 5v gidiyor.

sorun ne olabilir? acaba pic mi arızalı?

samuray84

int32 tanımı ve başka picle denedikten sonra yine aynı sonuc. 7 segment pırpır ediyor. düğmeler de 0.4 volt gönderiyor. yani hala çalışmıyor. Bu arada düğmeleri pic'e takmadığım zaman 5v gidiyor düzgün şekilde.

JKramer

set_tris_b(00001100);  //B portu 
output_b(00000000);

yerine
set_tris_b(0b00001100);  //B portu 
output_b(0b00000000);

yazmayı deneyin. Simulasyonda deniyorsanız o dosyayı da koyarsanız daha kolay yardımcı olunabilir.

samuray84

hocam hiç ümidim yoktu ama ilginç bi şekilde, çalıştı :) halbuki motor çevirttiğim kodda da 0b kullanarak yazmadım binary giriş cıkış komutlarını ama çalışmıştı:) Neyse, çok teşekkürler...

şimdi de ohalde bi sorum daha olacak.
int a= 0x00; şeklinde tanım yaptığımda a değişkeni hexadecimal bi sayı olacak ya,

misal, ardından,

a= pow(2,5); komutu girsem, a değeri 0010 0000 = 20 mi olcak yoksa hex olarak 32 mi olmuş olcak?

yani pow() fonksyonu 10luk tabana mı ceviriyor direk sayıyı, yoksa değişken kaçlık tabandaysa o tabana mı?
yada bitane de normal c derleyici yükleyip matematik fonksyonlarını orda mı denesem acaba:)

JKramer

int a= 0x00

ile a hexadecimal bir sayı olmuyor, sadece atamayı hex sayı ile yapmış oluyorsunuz. a'nın tipini belirleyen başındaki int, yani integer'dır:

2^5=32 (decimal)=0x20 (hex) ...

samuray84

ohalde,

şöyle diyim,

giris=input_a();

deger=pow(2,5);

if(giris==deger) //bu karşılaştırmayı yaptığımda, 0010 0000 değeri ile a portundan gelen değeri mi karşılaştırır?