

miniOT - Obvod reálného času PCF8583 - jak ho přimět, aby se do něj zapsal datum?
Ahoj,
mám vývojovou desku EasyPIC 6 a v ní PIC16F887. Vyrobil jsem si k ní modul reálného času dle následujícího schematu: http://www.mikroe.com/pdf/rtcproto_schematic_v100. pdf . Zapojil jsem do desky k pinům RC3 a RC4 a zkusil jsem přečíst přes sběrnici I2C sekundy, které by měly být uložené v tom obvodu. Napsalo mi to 255. Tak jsem si řekl, že ten obvod nebyl rok zapnutý a dostal zabrat při vyletování, tak se to z tý paměti nějak vymazalo. Nahrál jsem tedy program, přes který by mělo jít zapsat. Zkusil jsem, ale 255 tam je zapsáno pořád. Osciloskopem jsem zkontroloval, jestli probíhá samotná komunikace a "jehličky" na "datovém drátu" naskakujou, takže komunikace tam nějaká je. Hodinový signál 1Hz generuje taktéž, oscilátor funguje. Je to jasný příznak toho, že je odpálenej nebo jsem ještě něco opomněl? Takto vypadá kod na čtení (psaný v mikroC PRO for PIC):
// nadefinované piny LCD displeje a toho RTC obvodu
void main()
{
ANSEL = 0x0f; // Configure AN2 pin as analog
ANSELH = 0; // Configure other AN pins as digital I/O
C1ON_bit = 0; // Disable comparators
C2ON_bit = 0;
TRISA = 0xFF; // PORTA is input
TRISC = 0; // PORTC is output
Lcd_Init();
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);
while(1)
{
Soft_I2C_Init();
Soft_I2C_Start(); // Issue repeated start signal
Soft_I2C_Write(0xA0); // Address PCF8583, see PCF8583 datasheet
Soft_I2C_Write(0); // Start from address 2
Soft_I2C_Write(0xA1); // Address PCF8583 for reading R/W=1
seconds = Soft_I2C_Read(1); // Read seconds byte
Soft_I2C_Stop(); // Issue stop signal
Lcd_Chr(1,1,48+seconds/100);
Lcd_Chr(1,2,48+(seconds%100)/10);
Lcd_Chr(1,3,48+(seconds%100)%10);
}
}
Díky za odpovědi a kdybych něco zapomněl napsat, tak doplním.
Za prve citas offset 0 a to nie su sekundy ale status, vid datasheet PCF8583. Sekundy su offset 2.
Soft_I2C_Write(0); // Start from address 2
Za druhe ked sa cita z I2C tak pred tou adresou A1 musi byt I2C restart. Vid datasheet resp. I2C specifikaciu. Neviem jak vyzeraju tvoje I2C funkcie ale napr. by to mohlo vyzerat takto
Soft_I2C_Start(); // Issue repeated start signal
Soft_I2C_Write(0xA0); // Address PCF8583, see PCF8583 datasheet
Soft_I2C_Write(2); // Start from address 2
Soft_I2C_Start(); // Issue repeated start signal
Soft_I2C_Write(0xA1); // Address PCF8583 for reading R/W=1
...
ked tam neurobis I2C start, tak sa to 0xA1 bere ako data pre zapis, a nie ako I2C device adress. Pred kazdou device address musi byt na I2C urobena start condition. Vzdy.
P.S. za tretie ked nieco nefunguje tak vezmem pamatovy osciloskop a skontrolujem clock a data presne ze co tam posielam a jak presne...
P.S.2. a za stvrte neviem odkial beres to "Hodinový signál 1Hz generuje taktéž" (?) ten chip nema ziaden 1Hz hodinovy signal...
P.S.3. ked tam mas aj baterku tak ju odpoj, nech sa zresetuje control register, kedze si do neho doteraz zapisoval smeti (data 0xA1). Alebo zapis do control registra 0.
Paměťový osciloskop nemám a nikoho známého, který by ho měl neznám.
Baterku jsem vyndal a do control registru zapsal nulu. Upravil jsem kod podle toho, jak jsi to napsal a pořád to nejde. Pokud hodinový signál nemá, tak nevim, proč v intervalu jedné sekundy naskakovala na výstupu INT logická jednička a nula. Ten čip buď nepřežil odpálení videorekordéru, ve kterém byl nebo letování. Jakmile se dostanu do Budějic (tam je nejbližší obchod s elektronikou), tak se zeptám, jestli ho tam budou mít a jestli nebude o moc dražší než v GME tak koupím a ozvu se, jestli komunikace funguje.
Skus precitat status register (offset 0), ze co precitas. Ked precitas cokolvek ine ako 0xFF tak to bude znamka uspechu. V tom pripade je nutne pre citanie casu (resp. sekund) mozno aktivovat nejaky bit v control registri (nacitanie do latch) robi sa to preto aby si nacital do "medziregistra" cas v jednom okamziku, aby si napr. na prelome hodiny medzi 12:59 a 13:00 neprecital hodiny 12 a potom precitas minuty a bude 00 t.j. bol by o hodinu blby cas. Takze je zvycajne nutne pred vycitavanim casu niektory bit v control registri nastavit na 0 a potom na 1 alebo naopak alebo neico podobne, aby naplnil latch register. Musis citat datasheet, tam je urcite vsetko presne popisane. Ja som ho podrobne nestudoval.
Uložím si do mozku - přečtu si datasheet před tím, než něco budu dělat. Těch pár minut ušetří hodiny času.
Čip byl pravděpodobně přepnutý do EVENT COUNTER modu, takže neukládal / nezobrazoval čas. Stačilo zapsat do control/status bajtu hodnotu 0x80 (128 v desítkové soustavě) a funguje to. Díky.