Cały program poza zegarem sterującym [ kwestia porównywania czasu ] działa i napięcia oraz prądy są odczytywane poprawnie a co za tym idzie sterowanie dwoma zasilaczami oraz monitorowanie ogniwa foto galwanicznego [na razie brak - symulacja] działa również poprawnie.Mierzone napięcie jest napięciem skutecznym. Nadal próbuje dociec dlaczego mam błędny odczyt wartości miesięcy po zmianie wartości dni np;lipiec czyli 07 następnego dnia wyświetlany jest jako 27 a następnego 47.
Zmieniłem funkcje odczytu czasu z pcf-a i napisałem na próbę funkcje porównywania czasu bieżącego z odczytana z pamięci pcf-a nastawa i przy "okazji" przestał działać klawisz 3 w trybie ustawiania godzin czasu...
Zaloguj się, aby zobaczyć kod
//==========================================================================================
// ODCZYT ZEGARA CZASU RZECZYWISTEGO RTC
//==========================================================================================
int licznik;
for(licznik=0;licznik<5;licznik++)
{
buffer_t[licznik] = TWI_read(pcf8583,rtc_adres[licznik]);
sekundy = bcd_na_dec(buffer_t[0]);
minuty = bcd_na_dec(buffer_t[1]);
godziny = bcd_na_dec(buffer_t[2]);
dni = bcd_na_dec(buffer_t[3]);
miesiace = bcd_na_dec(buffer_t[4]);
}
//brak odczytu dnia tygodnia nie wim jak to ugryść.
//==========================================================================================
// ODCZYT CZASU NASTAW CZASU DLA ZEGARA STERUJĄCEGO OBWODAMI ZEWNĘTRZNYMI
//==========================================================================================
// if(sekundy==50) //odczyt nastaw timera co 1 minutę
{
for(licznik=10;licznik<27;licznik++)
{
buffer_t[licznik] = TWI_read(pcf8583,rtc_adres[licznik]);
tc1[1] = bcd_na_dec(buffer_t[10]); //w dni robocze dla kanału 1
tc1[2] = bcd_na_dec(buffer_t[11]);
tc1[3] = bcd_na_dec(buffer_t[12]);
tc1[4] = bcd_na_dec(buffer_t[13]);
tc2[1] = bcd_na_dec(buffer_t[14]); //w dni robocze dla kanału 2
tc2[2] = bcd_na_dec(buffer_t[15]);
tc2[3] = bcd_na_dec(buffer_t[16]);
tc2[4] = bcd_na_dec(buffer_t[17]);
//==========================================================================================
tc1[5] = bcd_na_dec(buffer_t[20]); //w dni wolne dla kanału 1
tc1[6] = bcd_na_dec(buffer_t[21]);
tc1[7] = bcd_na_dec(buffer_t[22]);
tc1[8] = bcd_na_dec(buffer_t[23]);
tc2[5] = bcd_na_dec(buffer_t[24]); //w dni wolne dla kanału 2
tc2[6] = bcd_na_dec(buffer_t[25]);
tc2[7] = bcd_na_dec(buffer_t[26]);
tc2[8] = bcd_na_dec(buffer_t[27]);
}
}
//==========================================================================================
// FUNKCJE PORÓWNYWANIA CZASU BIERZĄCEGO Z CZASEM NASTAW pcf8583A STERUJĄCEGO
//==========================================================================================
// przykładowe działanie
if(dzien_tygodnia > 5)//jeżeli od poniedziałku do piatku
{ //czas bieżący 13:00 jest większy niż nastawa 13:00
if(time(godziny,minuty)>(tc1[1],tc1[2])) //załączenie obwodu na kanale 1
{
if(tryb[1]==0) { PORTC &=~ 0x10; } // to załacz optotriak obwodu nr.1
if(tryb[2]==0) { PORTC &=~ 0x20; } // to załacz optotriak obwodu nr.2
if(tryb[3]==0) { PORTC &=~ 0x40; } // to załacz optotriak obwodu nr.3
if(tryb[4]==0) { PORTC &=~ 0x80; } // to załacz optotriak obwodu nr.4
}
if(time(godziny,minuty)>(tc1[3],tc1[4])) //wyłączenie obwodu na kanale 1
{ //czas bieżący 20:00 jest większy niż nastawa 20:00
if(tryb[1]==0) { PORTC |= 0x10; } // to wyłacz optotriak obwodu nr.1
if(tryb[2]==0) { PORTC |= 0x20; } // to wyłacz optotriak obwodu nr.2
if(tryb[3]==0) { PORTC |= 0x40; } // to wyłacz optotriak obwodu nr.3
if(tryb[4]==0) { PORTC |= 0x80; } // to wyłacz optotriak obwodu nr.4
}
//tutaj dla kanału 2
{
}
}
else //jeżeli w sobote oraz niedziele
{
//analogicznie jak wyżej
}
}
}
return;
}
//******************************************************************************************
//************************************ END MAIN ********************************************
a tu cały kod