Binary Clock

Ebbene funziona!

dopo un'oretta di prove sulle temporizzazioni da usare per leggere l'RTC e poi scrivere sul SAA, ho fatto una prova a "non aspettare" e quindi interpellare l'RTC e scrivere l'ora sul display a piena velocità, senza attese o delay!

tutto funziona perfettamente!

adesso manca solo la parte della regolazione dell'ora tramite tasti esterni. (per ora l'ho impostata con un'altra programma)

il codice attuale è il seguente! non sarà magari snello, ma occupa meno di 2K.

////////Include////////////////
#include <TinyWireM.h>
#include <USI_TWI_Master.h>

////ADDRESS////////////////
byte saa1064 = 0x38;
byte DS1307 = 0x68;

////Dichiarazioni//////////



////Variabili///////////
byte Digit1, Digit2, Digit3 = 0;

byte seconds,minutes,hours,             
     day_of_week,days,months;
int years;



void setup()
{

 // RTCsetTime();
  
  TinyWireM.begin();
  delay(200);
  initDisplay();
  clearDisplay();
  
}


void loop()
{
 
  RTCgetTime();
  delay(200);
  
  Digit1 = seconds;
  Digit2 = minutes;
  Digit3 = hours;
   
  adaptBCD();
  displayDigits();
}

/////Funzioni SAA1064

void initDisplay()
{
    TinyWireM.beginTransmission(saa1064);
    TinyWireM.send(B00000000); 
    TinyWireM.send(B01000111); 
    TinyWireM.endTransmission();
}

void displayDigits() {
  

    TinyWireM.beginTransmission(saa1064);
    TinyWireM.send(2);
    TinyWireM.send(Digit1); 
    TinyWireM.send(Digit2); 
    TinyWireM.send(Digit3);
    //Wire.send(B00000000);
    TinyWireM.endTransmission();
  
}

void clearDisplay()

{
    TinyWireM.beginTransmission(saa1064);
    TinyWireM.send(1); 
    TinyWireM.send(0); 
    TinyWireM.send(0); 
    TinyWireM.send(0); 
    TinyWireM.send(0); 
    TinyWireM.endTransmission();
}


///Funzioni RTC DS1307

void RTCsetTime(void) {
    TinyWireM.beginTransmission(DS1307);
    TinyWireM.send((uint8_t)0x00);
    TinyWireM.send(dec2bcd(seconds) | 0x80);            
    TinyWireM.send(dec2bcd(minutes));                   
    TinyWireM.send(dec2bcd(hours) & 0x3f);              
    TinyWireM.send(dec2bcd(day_of_week+1));             
    TinyWireM.send(dec2bcd(days));                      
    TinyWireM.send(dec2bcd(months));                    
    TinyWireM.send(dec2bcd(years-2000));                
    TinyWireM.endTransmission();
}

void RTCgetTime(void) {
    TinyWireM.beginTransmission(DS1307);
    TinyWireM.send((uint8_t)0x00);
    TinyWireM.endTransmission();
    TinyWireM.requestFrom(DS1307, 7);                 
    seconds     = bcd2dec(TinyWireM.receive() & 0x7f);      
    minutes     = bcd2dec(TinyWireM.receive());             
    hours       = bcd2dec(TinyWireM.receive());               
    day_of_week = bcd2dec(TinyWireM.receive());  day_of_week--;	                              
    days        = bcd2dec(TinyWireM.receive());                
    months      = bcd2dec(TinyWireM.receive());              
    years       = bcd2dec(TinyWireM.receive());  years = years + 2000;                                 
}

////BCD2DEC & DEC2BCD

uint8_t dec2bcd(uint8_t num) {
  return ((num/10 * 16) + (num % 10));
}
uint8_t bcd2dec(uint8_t num) {
  return ((num/16 * 10) + (num % 16));
}

/////ADAPT BCD////////

void adaptBCD() {
  
  if(Digit1 > 9) {
  Digit1 = Digit1 + 6; }
  if(Digit1 > 25) {
  Digit1 = Digit1 + 6; }
  if(Digit1 > 41) {
  Digit1 = Digit1 + 6; }
  if(Digit1 > 57) {
  Digit1 = Digit1 + 6; }
  if(Digit1 > 73) {
  Digit1 = Digit1 + 6; }
  
  if(Digit2 > 9) {
  Digit2 = Digit2 + 6; }
  if(Digit2 > 25) {
  Digit2 = Digit2 + 6; }
  if(Digit2 > 41) {
  Digit2 = Digit2 + 6; }
  if(Digit2 > 57) {
  Digit2 = Digit2 + 6; }
  if(Digit2 > 73) {
  Digit2 = Digit2 + 6; }
  
  if(Digit3 > 9) {
  Digit3 = Digit3 + 6; }
  if(Digit3 > 25) {
  Digit3 = Digit3 + 6; }
  if(Digit3 > 41) {
  Digit3 = Digit3 + 6; }
  if(Digit3 > 57) {
  Digit3 = Digit3 + 6; }
  
}

si accettano commenti o correzioni! :smiley: