Ynt: Binary saat yaptım doğrumu ?

Başlatan baran123, 09 Mayıs 2014, 01:02:29

baran123

Merhaba binary saat yaptım 74hc595 ile saat dakika saniye şeklinde 6 tane 595 var logicprobe koydum çalıştı aklıma takıldıda binary kısmında bir problem varmı sizce ?

Edit : bir problem proteusda sürekli ubir uyarı veriyor ama yinede çalışıyor ds1302 de gösteriyor uyarıyı bir ara kütüphanede değişiklik yaparak çözmüştüm fakat gene olmaya başladı sizce neden olabilir.

Uyarı = #00061.

kütüphanem
//////////////////////////////////////////////////////////////////////////
////                               DS1302.C                           ////
////                     Driver for Real Time Clock                   ////
////                                                                  ////
////  rtc_init()                                   Call after power up////
////                                                                  ////
////  rtc_set_datetime(day,mth,year,dow,hour,min)  Set the date/time  ////
////                                                                  ////
////  rtc_get_date(day,mth,year,dow)               Get the date       ////
////                                                                  ////
////  rtc_get_time(hr,min,sec)                     Get the time       ////
////                                                                  ////
////  rtc_write_nvr(address,data)                  Write to NVR       ////
////                                                                  ////
////  data = rtc_read_nvr(address)                 Read from NVR      ////
////                                                                  ////
////  get_bcd(data)                              Convert data to BCD  ////
////                                                                  ////
////  rm_bcd(data)                               Convert data to int  ////
////                                                                  ////
//////////////////////////////////////////////////////////////////////////
////        (C) Copyright 1996,2003 Custom Computer Services          ////
//// This source code may only be used by licensed users of the CCS C ////
//// compiler.  This source code may only be distributed to other     ////
//// licensed users of the CCS C compiler.  No other use, reproduction////
//// or distribution is permitted without written permission.         ////
//// Derivative programs created using this software in object code   ////
//// form are not restricted in any way.                              ////
//////////////////////////////////////////////////////////////////////////

#ifndef RTC_SCLK

#define RTC_SCLK PIN_B6
#define RTC_IO   PIN_B7
#define RTC_RST  PIN_B5

#endif

void write_ds1302_byte(BYTE cmd) {
   BYTE i;
//RTC_IO çıkış olarak ata
   for(i=0;i<=6;++i) {
      output_bit(RTC_IO, shift_right(&cmd,1,0) );
      output_high(RTC_SCLK);
      output_low(RTC_SCLK);
   } 
      output_bit(RTC_IO, shift_right(&cmd,1,0) );
      output_high(RTC_SCLK);
//RTC_IO giriş olarak ata  
      output_low(RTC_SCLK);
}
           
void write_ds1302(BYTE cmd, BYTE data) {
           
   output_high(RTC_RST);
   write_ds1302_byte(cmd); 
   delay_us(2);             
   write_ds1302_byte(data);
   output_low(RTC_RST); 
}

BYTE read_ds1302(BYTE cmd) {
   BYTE i,data;

   output_high(RTC_RST);
   write_ds1302_byte(cmd);

   for(i=0;i<=7;++i) {
      shift_right(&data,1,input(RTC_IO));
      output_high(RTC_SCLK);
      delay_us(2);
      output_low(RTC_SCLK);
      delay_us(2);
   }
   output_low(RTC_RST);

   return(data);
}

void rtc_init() {
   BYTE x;
   output_low(RTC_RST);
   delay_us(2);
   output_low(RTC_SCLK);
   write_ds1302(0x8e,0);
   write_ds1302(0x90,0xa4);
   x=read_ds1302(0x81);
   if((x & 0x80)!=0)
     write_ds1302(0x80,0);
}

int get_bcd(BYTE data)
{
   int nibh;
   int nibl;

   nibh=data/10;
   nibl=data-(nibh*10);

   return((nibh<<4)|nibl);
}

int rm_bcd(BYTE data)
{
   int i;

   i=data;
   data=(i>>4)*10;
   data=data+(i<<4>>4);

   return data;
}

void rtc_set_datetime(BYTE day, BYTE mth, BYTE year, BYTE dow, BYTE hr, BYTE min) {

   write_ds1302(0x86,get_bcd(day));
   write_ds1302(0x88,get_bcd(mth));
   write_ds1302(0x8c,get_bcd(year));
   write_ds1302(0x8a,get_bcd(dow));
   write_ds1302(0x84,get_bcd(hr));
   write_ds1302(0x82,get_bcd(min));
   write_ds1302(0x80,get_bcd(0));
}

void rtc_get_date(BYTE& day, BYTE& mth, BYTE& year, BYTE& dow) {
   day = rm_bcd(read_ds1302(0x87));
   mth = rm_bcd(read_ds1302(0x89));
   year = rm_bcd(read_ds1302(0x8d));
   dow = rm_bcd(read_ds1302(0x8b));
}

void rtc_get_time(BYTE& hr, BYTE& min, BYTE& sec) {
   hr = rm_bcd(read_ds1302(0x85));
   min = rm_bcd(read_ds1302(0x83));
   sec = rm_bcd(read_ds1302(0x81));
}

void rtc_write_nvr(BYTE address, BYTE data) {
   write_ds1302(address|0xc0,data);
}

BYTE rtc_read_nvr(BYTE address) {
    return(read_ds1302(address|0xc1));
}


#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 sec,min,hr;
const signed int digit[10]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09};
                                 
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[(int)sec % 10]);     
      send(digit[(int)sec / 10]);
      send(digit[(int)min % 10]);     
      send(digit[(int)min / 10]);
      send(digit[(int)hr % 10]);     
      send(digit[(int)hr / 10]);
      output_high(ST_CP);        
      output_low(ST_CP);
   }
}                     


mesaj birleştirme:: 09 Mayıs 2014, 01:17:37

galiba 6 tane 595 saçma oldu çünkü sonraki 4 bit sürekli 0 olduğu için 3 tane ile tam yapabilirim ama kafam karıştı bir 595 de 4 bit bir sayı sonraki 4 bitine başka bir sayıyı nasıl atarım ?

hasankara

2 sene kadar önce ds1307 i kurcalamıştım. içerisinden veri okurken ve veya yazarken çok kısada olsa sarkmalar meydana geliyordu. 1hz çıkışını harici giriş pini ile saydırıp kendin tekrar saydırabilirsin. ds1307 i den kritik zamanlarda veri okutup veri yazarsın. mesela ayar yaparken yaptığın ayarı entegreye kaydettirmek için ve sistem ilk açılırken sadece güncelleme yapmak için kullanabilirsin.

b=a; a=a>>4; b&=00001111; yaparsan a nın ilk 4 bitini b e taşımış olursun, son 4 bitini de a ya yüklemiş olursun.