74hc595 e binary gönderme ?[Çözüldü]

Başlatan baran123, 10 Mayıs 2014, 00:16:51

baran123

Merhaba arkadaşlar bir kaç gündür binary saat yapmaya çalışıyorum fakat bilgi göndermede daha doğru nasıl nasıl bir türde veri göndereceğimde takıldım semada yapmak ıstedıgımı gosterdım kodlarda assagıda yardımcı olursanız cok sevınırım ıyı calısmalar

not : kodlarda cok degısıklık yaptım basaramadım suankı halı bayağı sacma gibi

#include <16F84A.h>
#device adc=16         
#fuses XT,NOWDT,NOPUT,NOPROTECT
#use delay(clock=4M)                                              

#include "ds1302.c"
                  
#define DS     pin_A0                 
#define SH_CP  pin_A1                              
#define ST_CP  pin_A2  

BYTE hr,min,sec;
const unsigned int digit[10]={0x00,0x10,0x20,0x30,0x40,0x50,0x60,0x70,0x80,0x90};
                                 
void send(unsigned char data)
{                                  
   unsigned char i;       
              
   for(i = 0x80; i > 0; i >>= 1)
   {                                
      if(i & data) output_high(DS);
      else output_low(DS);     
      output_high(SH_CP);           
      output_low(SH_CP);   
   }                                
}              

void main(void)
{
   setup_timer_0(RTCC_INTERNAL);
   
   rtc_init(); 
   
   for(;;)             
   {
      rtc_get_time(hr,min,sec);
      send(digit[(hr / 10)]);
      send(digit[(hr % 10)]);
      send(digit[(min / 10)]);
      send(digit[(min % 10)]);
      send(digit[(sec / 10)]);
      send(digit[(sec % 10)]);
      output_high(ST_CP);        
      output_low(ST_CP);
   }
}                     



mehmet

#1
Önce ondalık sayıları hanelerine ayırınız. Örneğin;
23:59:45--> 25 sayısını 2 ve 5 olarak ayırınız. 23 sayısını 2 ve 3 olarak ayırınız.
Bu sayıların binary değeri:
0b0010 ve 0b1001 0b0011 buradan da 8 bit
elde edelim: 0b00101001 0b00100011
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr

baran123

#2
Alıntı yapılan: mehmet - 10 Mayıs 2014, 00:30:21
Önce ondalık sayıları hanelerine ayırınız. Örneğin;
23:59:45--> 25 sayısını 2 ve 5 olarak ayırınız.
Bu sayıların binary değeri:
0b0010 ve 0b1001 buradan da 8 bit
elde edelim: 0b00101001

Dediğiniz gibi bir mantık kurdum zaten ama nedense yapamadım

söyle bir sey denedim

#include <16F84A.h>
#device adc=16         
#fuses XT,NOWDT,NOPUT,NOPROTECT
#use delay(clock=4M)                                              

#include "ds1302.c"
                  
#define DS     pin_A0                 
#define SH_CP  pin_A1                              
#define ST_CP  pin_A2  

BYTE hr,min,sec;
const unsigned int digit[10]={0b0000,0b0001,0b0010,0b0011,0b0100,0b0101,0b0110,0b0111,0b1000,0b1001};

void send(unsigned char data)
{                                  
   unsigned char i;       
              
   for(i = 0x80; i > 0; i >>= 1)
   {                                
      if(i & data) output_high(DS);
      else output_low(DS);     
      output_high(SH_CP);           
      output_low(SH_CP);   
   }                                
}              

void main(void)
{
   setup_timer_0(RTCC_INTERNAL);
   
   rtc_init(); 
   
   for(;;)             
   {
      rtc_get_time(hr,min,sec);      
      
      send(digit[hr / 10]);
      send(digit[hr % 10]);
      send(digit[min / 10]);
      send(digit[min % 10]);
      send(digit[sec / 10]);
      send(digit[sec % 10]);
      output_high(ST_CP);        
      output_low(ST_CP);
   }
}                     


mesaj birleştirme:: 10 Mayıs 2014, 01:53:02

Edit : Soruyu şöyle sorsam ? iki tane binary sayı var bunları yan yana nasıl eklerim örneğin

sayı 1 = 0b0000
sayı 2 = 0b0001

sonuc = 0b0000 0001 şeklinde olmasını istiyorum bunun nasıl yapabilirim ?

hasankara

sayi1 ve sayi2 sayılarının yüksek 4 bitlerinin tümü 0 olduğunu düşünürsek
unsigned char i;
i=sayi1<<4;
i=i|sayi2;

istediğin sonucu i nin içine kaydeder.

Gökhan BEKEN

Alıntı yapılan: baranekrem9 - 10 Mayıs 2014, 01:01:27
Soruyu şöyle sorsam ? iki tane binary sayı var bunları yan yana nasıl eklerim örneğin

sayı 1 = 0b0000
sayı 2 = 0b0001

sonuc = 0b0000 0001 şeklinde olmasını istiyorum bunun nasıl yapabilirim ?
char değişkenler 8 bitlik olduğu için yukarıdaki yazdığınız şekilde değil de, aşağıdaki şekilde olur.
sayı 1= 0b00000000
sayı 2= 0b00000001

@hasankara'nın dediği şekilde bunları birleştirebilirsiniz.
Özel mesaj okumuyorum, lütfen göndermeyin.

izzethoca

  // 595 bağlantı pinleri
          #DEFINE DAT_P PIN_B5
          #DEFINE CLC_P PIN_B6
          #DEFINE LCH_P PIN_B7

.
.
.
.
INT16 A_TAKIMI=12;
INT16 B_TAKIMI=34;
INT RAKAM[10]={63,6,91,79,102,109,125,7,127,111};
UNSIGNED INT SAY=1;
UNSIGNED INT SAY1=1;
UNSIGNED INT SAY2=1;
UNSIGNED INT SAY3=1;
INT8 X=0;
INT TEMP=0;
.
.
.
.

          ///595 e sinyal gönderme kısmı
  VOID W_595(TEMP){
          OUTPUT_LOW(CLC_P);OUTPUT_LOW(LCH_P);
          FOR (X=0;X<8;X=X+1){
             OUTPUT_BIT(DAT_P,BIT_TEST(TEMP,(7-X))); 
             OUTPUT_HIGH(CLC_P);
             OUTPUT_LOW(CLC_P);
          }
          }
        //displaye göderilecek değer                     }
  VOID GONDER(){
        TEMP=SAY;  W_595(TEMP);TEMP=0;
        TEMP=SAY1;  W_595(TEMP);TEMP=0;
        TEMP=SAY2;  W_595(TEMP);TEMP=0;
        TEMP=SAY3;  W_595(TEMP);TEMP=0;
        OUTPUT_HIGH(LCH_P);OUTPUT_LOW(LCH_P);
   
   }
      
..
 while(TRUE){
                SAY=RAKAM[A_TAKIMI/10];      //B TAKIMI birler basamağı dijiti
                SAY1=RAKAM[A_TAKIMI%10];     //B TAKIMI onlar basamağı dijit
                SAY2=RAKAM[B_TAKIMI/10];     //A TAKIMI birler basamağı dijiti
                SAY3=RAKAM[B_TAKIMI%10];     //A TAKIMI onlar basamağı dijit
                GONDER();
                // A TAKIMI  PUAN ARRTIRMA VE AZALTMA

baran123

Arkadaslar yaptım fakat cok kucuk bir problem var bitler ters oluyor yanı soyle ornegın sanıye kısmı

saniye = 01 olsun 0000 0001 olması gerekırken 0000 1000 seklınde oluyor bunu nasıl duzeltebılırım ?

hasankara

unsigned char i;
i=sayi2<<4;
i=i|sayi1;

void send(unsigned char data)
{                                  
   unsigned char i;       
              
   for(i = 1; i <=0B10000000; i <<= 1)
   {                                
      if(i & data) output_high(DS);
      else output_low(DS);     
      output_high(SH_CP);           
      output_low(SH_CP);   
   }                                
}


gökhan, const int tanımladığı için yüksek bitler hep 0 olur diye gereksiz kod eklemek istememiştim. Birde const unsigned char tanımlarsan 8 byte program hafızan yanına kar kalabilir baran.

aklında bulunsun diye bir başka yöntem daha söyleyeyim.
#define bitset(var, bitno) ((var) |= 1UL << (bitno))
#define bitclr(var, bitno) ((var) &= ~(1UL << (bitno)))
#define bittest(var, bitno)(var&(0b00000001 << (bitno)) ? 1 :0	)  tanımlamasını yaparsan
unsigned char i,j;

if(bittest(i,0))bitset(j,4); else bitclr(j,4);
i nin 0. biti j nin 4. bitine kopyalanmış oldu. aklına kestirme bir şeyler gelmezse böyle tek tek bitleri kopyalayabilirsin.

baran123

#8
EDİT : pardon yanlıs calısıyor hala anlayamadım bir türlü bitler ters 0111 yerine 1110 oluyor alttaki kodlarda ki mantık ile nasıl yapablirim

#include <16F84A.h>
#device adc=16         
#fuses XT,NOWDT,NOPUT,NOPROTECT
#use delay(clock=4M)                                              

#include "ds1302.c"
                  
#define DS     pin_A0                 
#define SH_CP  pin_A1                              
#define ST_CP  pin_A2  

BYTE hr,min,sec;

void send(unsigned char data)
{                                  
   unsigned char i;       
              
   for(i = 0x80; i > 0; i >>= 1)
   {                                
      if(i & data) output_high(DS);
      else output_low(DS);     
      output_high(SH_CP);           
      output_low(SH_CP);   
   }                                
}              

void main(void)
{
   setup_timer_0(RTCC_INTERNAL);
   
   rtc_init(); 

   unsigned char a=0,b=0,c=0,k=0,l=0,m=0,n=0,o=0,p=0;
   
   for(;;)             
   {
      rtc_get_time(hr,min,sec);      
      
      k = hr / 10;
      l = hr % 10;
      
      m = min / 10;
      n = min % 10;
      
      o = sec / 10;
      p = sec % 10;
      
      a=l<<4;
      a=a|k;
      
      b=n<<4;
      b=b|m;
      
      c=p<<4;
      c=c|o;
      
      send(c);
      send(b);
      send(a);
      output_high(ST_CP);        
      output_low(ST_CP);
   }
}                     


Recep METE

Ben 74hc595 ile saati sorunsuz çalıştırdım.İşte videosu.
http://youtu.be/u4MMsIRn8ig
printf(lcd_putc,"\f  Ne kadar okursan oku, bilgine, yakışır şekilde davranmıyorsan cahilsin demektir.  \n   semfero");d

baran123

Alıntı yapılan: semfero - 10 Mayıs 2014, 21:24:48
Ben 74hc595 ile saati sorunsuz çalıştırdım.İşte videosu.
http://youtu.be/u4MMsIRn8ig
Bende saat yaptım çok güzel bir şekilde ama binary saat yapmaya çalışıyorum bu arada video açılmıyor "Bu video gizlidir" uyarısını veriyor.

hasankara

baran benim yazdığım ilk kod parçasını denedin mi?

baran123

evet denedim bu seferde çok saçma oluyor karışıyor yerleri iyice


hasankara

unsigned char i;
i=sayi2<<4;
i=i|sayi1;

burayı neden tekrar yazdığımı anlayabildin mi? önceki yazdığıma göre sayi1 ile sayi2 yerlerini değiştirdiğimi fark edebildin mi?

baran123

evet fark ettim 2 sinide denedim 2 sinde de sonuç olumsuz ama gönderme fonksiyonun daki for döngüsünü kurcalıyorum bulcam gibi az kaldı  ;D