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! ![]()