Bawię się programowaniem stąd flowcode. Chce sobie zrobić taki mały zegarek (wiem projektów jest dużo itd itp) z obsługą DCF77 i RTC. Opracowałem już sobie dekodowanie sygnału DCF77 może mało elegancko ale działa. Teraz przyszła kolej na RTC DS1307 i zaczeły się schodki. Sam moduł RTC który jest powszechnie dostępny kupiłem.
Podłączyłem pod odpowiednie linie w PIC. Program "dekoduje" informacje z DCF i ma je zapisać do RTC, a później co 0,5 s odczytywać RTC i wyświetlać czas na LCD. Niestety odczyt jak i zapis danych do RTC kończy się w dziwny sposób. Na wyświetlaczu otrzymuje informacje "45:85:85 45/25/165" tak jakby nie było układu. A adresuje RTC 0x68. Analizując układ napotkałem dziwne zjawisko odłączając masę GND od modułu RTC pojawia się prawidłowy odczyt informacji z RTC co jest dla mnie dziwne ponieważ wtedy DS1307 powinien nie nadawać? Oto mały fragment kodu inicjacja RTC:
Kod: Zaznacz cały
void FCM_RTC_INIT()
{
//
//Wywo?aj makro komponentu: MI2C_Init()
FCD_I2C_Master0_MI2C_Init();
//definicja parametrow
//Blok obliczeniowy:
// RTC = 0x68
// RTC_R = (RTC << 1) + 1
// RTC_W = (RTC << 1) + 0
FCV_RTC = 0x68;
FCV_RTC_R = (FCV_RTC << 1) + 1;
FCV_RTC_W = (FCV_RTC << 1) + 0;
//
//Wywo?aj makro komponentu: MI2C_Start()
FCD_I2C_Master0_MI2C_Start();
//ecrire
//Wywo?aj makro komponentu: ack=MI2C_Transmit_Byte(RTC_W)
FCV_ACK = FCD_I2C_Master0_MI2C_Transmit_Byte(FCV_RTC_W);
//reg0
//Wywo?aj makro komponentu: ack=MI2C_Transmit_Byte(0)
FCV_ACK = FCD_I2C_Master0_MI2C_Transmit_Byte(0);
//restart
//Wywo?aj makro komponentu: MI2C_Restart()
FCD_I2C_Master0_MI2C_Restart();
//lecture
//Wywo?aj makro komponentu: ack=MI2C_Transmit_Byte(RTC_R)
FCV_ACK = FCD_I2C_Master0_MI2C_Transmit_Byte(FCV_RTC_R);
//second
//Wywo?aj makro komponentu: reg_a=MI2C_Receive_Byte(0)
FCV_REG_A = FCD_I2C_Master0_MI2C_Receive_Byte(0);
//min
//Wywo?aj makro komponentu: reg_b=MI2C_Receive_Byte(0)
FCV_REG_B = FCD_I2C_Master0_MI2C_Receive_Byte(0);
//hour
//Wywo?aj makro komponentu: reg_c=MI2C_Receive_Byte(1)
FCV_REG_C = FCD_I2C_Master0_MI2C_Receive_Byte(1);
//
//Wywo?aj makro komponentu: MI2C_Stop()
FCD_I2C_Master0_MI2C_Stop();
//Calculation
//Blok obliczeniowy:
// reg_a = reg_a AND 0x7F
// reg_c = reg_c AND 0x3F
FCV_REG_A = FCV_REG_A & 0x7F;
FCV_REG_C = FCV_REG_C & 0x3F;
//Komentarz:
//OSCILLATOR ENABLE
//Komentarz:
//Clock Halt Bit
//Bit 7 rejestru sekund jest odpowiedzialny za
//prac? wewn?trznego oscylatora (Clock Halt Bit).
//Stan 0 w??cza oscylator, stan 1 powoduje jego
//wy??czenie. Nale?y, bezwzgl?dnie, pami?ta?
//o wyzerowaniu tego bitu przy inicjalizacji uk?adu
//
//Wywo?aj makro komponentu: MI2C_Start()
FCD_I2C_Master0_MI2C_Start();
//ecrire
//Wywo?aj makro komponentu: ack=MI2C_Transmit_Byte(RTC_W)
FCV_ACK = FCD_I2C_Master0_MI2C_Transmit_Byte(FCV_RTC_W);
//reg0
//Wywo?aj makro komponentu: ack=MI2C_Transmit_Byte(0)
FCV_ACK = FCD_I2C_Master0_MI2C_Transmit_Byte(0);
//Oscillator enable
//Wywo?aj makro komponentu: ack=MI2C_Transmit_Byte(reg_a)
FCV_ACK = FCD_I2C_Master0_MI2C_Transmit_Byte(FCV_REG_A);
//
//Wywo?aj makro komponentu: MI2C_Stop()
FCD_I2C_Master0_MI2C_Stop();
//Komentarz:
//24 HOUR ENABLE
//
//Wywo?aj makro komponentu: MI2C_Start()
FCD_I2C_Master0_MI2C_Start();
//ecrire
//Wywo?aj makro komponentu: ack=MI2C_Transmit_Byte(RTC_W)
FCV_ACK = FCD_I2C_Master0_MI2C_Transmit_Byte(FCV_RTC_W);
//reg2
//Wywo?aj makro komponentu: ack=MI2C_Transmit_Byte(02)
FCV_ACK = FCD_I2C_Master0_MI2C_Transmit_Byte(02);
//12hour
//Wywo?aj makro komponentu: ack=MI2C_Transmit_Byte(reg_c)
FCV_ACK = FCD_I2C_Master0_MI2C_Transmit_Byte(FCV_REG_C);
//
//Wywo?aj makro komponentu: MI2C_Stop()
FCD_I2C_Master0_MI2C_Stop();
}
W załączniku całość flowcode i C.