Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailemVyřešeno 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.

Předmět Autor Datum
Další poznatek - nyní jsem dokončil DPS pro čtení / zápis do EEPROM pamětí a I2C skutečně funguje -…
marekdrtic 26.02.2010 17:36
marekdrtic
Za prve citas offset 0 a to nie su sekundy ale status, vid datasheet PCF8583. Sekundy su offset 2. S…
MM.. 26.02.2010 18:02
MM..
ked nieco nefunguje tak vezmem pamatovy osciloskop Paměťový osciloskop nemám a nikoho známého, kter…
marekdrtic 26.02.2010 19:32
marekdrtic
INT je vystup pre prerusenie (INTerrupt) pre procesor. Da sa nastavit control registrom ze kedy to m…
MM.. 26.02.2010 19:43
MM..
A0 je uzemněný, přehozený to nemám. vzdálenost mezi krystalem, kondenzátorem a IO není větší, než 2c…
marekdrtic 26.02.2010 20:13
marekdrtic
Skus precitat status register (offset 0), ze co precitas. Ked precitas cokolvek ine ako 0xFF tak to…
MM.. 26.02.2010 19:51
MM..
Přečetl jsem 0x00, takže to asi bude fungovat. Přečtu si ještě jednou datasheet, snad to tam bude.
marekdrtic 26.02.2010 20:13
marekdrtic
:beer::beer::beer: Uložím si do mozku - přečtu si datasheet před tím, než něco budu dělat. Těch pár… poslední
marekdrtic 26.02.2010 20:28
marekdrtic
... este nieco, preistotu, daj priamo na chip medzi VDD a GND 100n kondenzator, ale priamo na chip n…
MM.. 26.02.2010 19:56
MM..
Tuhle "ochranu" dávám ke všem integrovaným obvodům, takže to tam mám.
marekdrtic 26.02.2010 20:10
marekdrtic

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.

ked nieco nefunguje tak vezmem pamatovy osciloskop

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.

INT je vystup pre prerusenie (INTerrupt) pre procesor. Da sa nastavit control registrom ze kedy to ma aktivovat interrupt. Vsetko je v datasheete. 1Hz by tam byt nemal, ale nestudoval som datasheet podrobne ze jake vsetky registre to ovplyvnuju.
Over si ze mas vsetko zapojene spravne presne podla schemy, a ze nemas IO naopak atd., piny ku krystalu a 22p kondiku viest co najkratsie, u krystalu su signaly extremne citlive.
P.S. nemyslim si ze je odpaleny, take obvody vydrzia nenormalne vela. ale clovek nikdy nevie. Over si vsetko este raz, napatie atd. pozri v datasheete jake napatie to potrebuje (min-max) atd.
P.S.2. over si ze nemas prehodene SCL, SDA a uisti sa ze A0 je uzemneny...

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.

:beer::beer::beer:

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.

Zpět do poradny Odpovědět na původní otázku Nahoru