Dobry den, rozbiham komunikaci mezi ATMEGA8 a RTC DS1302 a nejak mi nasledujici procedura nevraci obsah z pameti RTC. SDI a SDO je tentyz pin, akorat SDI je vazan na PINB0 kvuli cteni a SDO na PORTB0 kvuli zapisu. RTC komunikuje prostrednictvi 3 wire komunikace. Elektronicka komunikace je OK, testoval jsem pomoci osciloskopu. Poradte prosim, kde mam chybu. Mam podezreni, ze je chyba v bitovych posunech
Dekuji
unsigned char read_DS1302 (unsigned char adresa)
{
unsigned char cc1, data;
init_DS1302();
data=0;
RESET = 1; // aktivovat linku, zahajit prenos
for (cc1=0; cc1<8; cc1++) // prenos command BYTE
{
if ((adresa&0x01) == 1) SDO = 1;
else SDO = 0;
adresa = adresa >> 1; // posunout o jeden bit vpravo
SCLK = 0;
delay_us(1);
SCLK = 1;
delay_us(1);
SCLK=0;
}
SDA_M = 0; // nastavit linku SDA jako vstup
data = 0;
for (cc1=0; cc1<8;cc1++) // prenos data
{
SCLK = 0;
delay_us(2);
data = data|(unsigned char)SDI;
LED = !(unsigned char)SDI; // abych overil na osciloskopu, ze to funguje
data>>1;
SCLK = 1;
delay_us(2);
}
SDO =0; // ukonceni komunikace
SCLK = 0;
RESET =0;
return data;
}
po skonceni behu funkce mam hodnotu v data = 0x01. Ten radek by mel zapsat LSB bit podle toho jestli nastakl nebo ne. Zkousel jsem to i timto zapisem a vysledek je stejny:
if (SDI == 1) {LED=1; data = data|0x01;}
else {LED=0; data = data|0x00;};
zajimave je ze na vystupu LED mam skutecne hodnoty vyctene z EEPROM, zatimco v promenne data jen 0x01
Dekuji zkusil jsem to a opet mi to nefunguje. Testuji to tak, ze vysledek odesilam na seriovy port do hyperterminalu.
zapisi hodnotu do RAM RTC treba 0x6D
to se pak precte funkci viz. vyse
pak se to vypise na seriovy port:
k = read_DS1302(0xC1);
putchar(k);
Bohuzel na seriovem portu mi i pri ruzne zapsanych znacich leze tentyz znak. S posledni upravou je jiny, ale ne ten co jsem zapsal do RTC.
Uz netusim, kde mam chybu. Prosim jeste o jednu radu