Aktyw Forum

Zarejestruj się na forum.ep.com.pl i zgłoś swój akces do Aktywu Forum. Jeśli jesteś już zarejestrowany wystarczy, że się zalogujesz.

Sprawdź punkty Zarejestruj się

PIC16F876A i komunikacja I2C (Flowcode 5PIC)

siwo78
-
-
Posty:2
Rejestracja:14 lip 2014, o 06:31
PIC16F876A i komunikacja I2C (Flowcode 5PIC)

Postautor: siwo78 » 14 lip 2014, o 06:58

Witam

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.
SchowekRTC.jpg
SchowekRTC.jpg (14.21KiB)Przejrzano 15475 razy
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(); }
Może Któryś z Kolegów pomoże mi rozwiązać ten problem?

W załączniku całość flowcode i C.
Załączniki
rtc.rar
(190.19KiB)Pobrany 332 razy

Awatar użytkownika
rafal.220
-
-
Posty:1274
Rejestracja:27 paź 2012, o 15:46

Re: PIC16F876A i komunikacja I2C (Flowcode 5PIC)

Postautor: rafal.220 » 14 lip 2014, o 14:33

Witam
Czemu ten rezonator połączyłeś do VCC przez rezystor? Co prawda nie miałem do czynienia z takim zegarem RTC, ale w każdym innym przypadku X1 zaleca się łączyć poprzez kondensator do VCC dla kwarcu 32,768.

siwo78
-
-
Posty:2
Rejestracja:14 lip 2014, o 06:31

Re: PIC16F876A i komunikacja I2C (Flowcode 5PIC)

Postautor: siwo78 » 16 lip 2014, o 08:37

Witam

To nie mój wymysł, tylko producenta modułu. Sam to zauważyłem, bo takiego rozwiązania nie ma w datasheet DS1307. Co więcej z tego co wyczytałem nie trzeba niczego więcej łączyć do X1, X2 oprócz kwarcu, bo reszta jest w samym układzie DS1307. Niemniej jednak sam moduł RTC i jego połączenia działają, ponieważ moduł ten sprawdziłem na innej platformie - Arduino Uno. I tam odczyt, zapis do RTC działa znakomicie, a jak odłączę masę GND od modułu RTC znika komunikacja, co program testowy arduino zgłasza.

Wróć do „Pozostałe mikrokontrolery (PIC, MSP430, PSoC, 8051 ...)”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 12 gości