Strana 1 z 2

DS1302

Napísané: 28 Dec 2012, 19:12
od používateľa fkvrtak
chcem si spravit hodiny v Bascome s atmegou8 a DS1302.
problem je ze v bascome nemam ds1302clock.lib
neviete kde by som ho stiahol, alebo poradit ako dalej bez tohto lib.

Dakujem

Re: DS1302

Napísané: 28 Dec 2012, 19:23
od používateľa jaromir
A co takto si to naprogramovat sam?
Kam sa podela hrdost programamtorov, ze na vsetko potrebuju nejaku kniznicu?

Komunikacny protokol je pomerne jednoduchy, predpokladam ze pojde asi o 50 riadkov kodu. Mozeme sa na to pozriet spolocne, ak chces.

Re: DS1302

Napísané: 28 Dec 2012, 19:36
od používateľa fkvrtak
ok, budem rad.
Len dopredu upozornim, ze s programovanim iba zacinam a zatial sa mi podarilo naprogramovat si teplomer IN/OUT s DS1621, ale ten je na i2c zbernici.
Problem je ze DS1302 nieje I2C, ale neaka ina zbernica. Asi microwire?

Re: DS1302

Napísané: 28 Dec 2012, 19:39
od používateľa jaromir
Ked uz mas zmaknute I2C, nemozes pouzit DS1307 alebo PCF8563, resp. podobne RTC s I2C zbernicou?

Re: DS1302

Napísané: 28 Dec 2012, 19:41
od používateľa fkvrtak
no ked sa mi nepodarilo zohnat DS1307 tak som vzal DS1302

Re: DS1302

Napísané: 28 Dec 2012, 19:58
od používateľa jaromir
Jo ako ked vari Babica... ked nemas limetku, daj tam citron a ked nemas citron, drbni tam Fixinelu :D

OK, tak sa na to podme pozriet. Datasheet je tu http://pdfserv.maximintegrated.com/en/ds/DS1302.pdf a na strane 8 mas napisane ako urobit jednobytovy zapis alebo citanie. Treba manipulovat s tromi vodicmi.
CE ide do jednotky na zaciatku komunikacie. Potom treba urobit nejaky loop a bity vypluvat von po jednom, od najnizsieho bitu a vzdy potvrdit clockom.
teda nieco taketo

Kód: Vybrať všetko

for (i=0; i<8; i++)
{
if (data&0x01==0) DATA_PIN =0;
else DATA_PIN = 1;
CLOCK_PIN = 1;
delay_1us;
CLOCK_PIN = 0;
data = data >> 1;
}
teda nastavis pin podla stavu najniziseho bitu v slove, odclockujes, a data si posunies doprava, aby si mal v dalsom kole pripraveny dalsi bit.
Toto je rutinka na vyslanie jedneho bajtu. Pouzijes ju takto

Kód: Vybrať všetko

CE = 1;
posli_byte(adresa);
posli_byte(data);
CE = 0;
A mas poslane data do DS1302. Treba si este pozriet, ze prvy bit (resp. najnizsi bit) v prvom slove urcuje, ci ides prijimat alebo vysielat. Ak vysielas, robis to ako hore, ak prijimas, tak to urobis asi takto:

Kód: Vybrať všetko

data = 0;
nastav_data_pin_ako_vstupny;
for (i=0; i<8; i++)
{
CLOCK_PIN = 1;
delay_1us;
if (DATA_PIN==1) data = data|0x80;
CLOCK_PIN = 0;
data = data >> 1;
}
nastav_data_pin_ako_vystupny;
teda nastavis clock do jednotky, chvilku pockas, pozries si aky je stav data pinu. Ak je vysoky, tak data OR-ujes s hodnotou 0x80, cim vlastne nastavis najvyssi bit. Ak je nula, tak nic nerobis. Vzdy sa data zrotuju doprava, cim sa bity poposuvaju na spravne miesto.
Cele citanie jedneho bajtu bude potom vyzerat asi takto:

Kód: Vybrať všetko

CE = 1;
posli_byte(adresa);
data  = citaj_byte();
CE = 0;
Tie ukazky zdrojakov su pisane v pseudo-c-nezmyslenom jazyku, ale snad budu pochopitelne. Prepisat to do basicu bude jednoduche ked to pochopis. Treba sa dobre pozriet do datasheetu.
Pisal som to z hlavy, takze chyby su vyhradene :)

pozri sa este sem:
http://www.dontronics.com/rtc.html
http://playground.arduino.cc/Main/DS1302
http://www.phanderson.com/stamp/ds1302_des.html
http://www.nomad.ee/micros/ds1302.html

Re: DS1302

Napísané: 28 Dec 2012, 20:56
od používateľa Pega

Re: DS1302

Napísané: 08 Feb 2024, 21:51
od používateľa boraicho
nema niekto funkčny program na henten obovod? diky

Re: DS1302

Napísané: 09 Feb 2024, 07:13
od používateľa budvar10
Na internete sú mraky toho. Otázka je, kde ten program má bežať, resp. k čomu to chceš pripojiť.

Napr. Arduino/AVR:
https://github.com/msparks/arduino-ds13 ... r/examples

Re: DS1302

Napísané: 09 Feb 2024, 22:42
od používateľa boraicho
Ako nakoniec mi CHATGPT vygeneroval kod, samozrejme nefunčkný ale s minimalnými chybami. čiže už to funguje , porovnal som si to s tymto https://github.com/oagml/watering-timer ... ster/rtc.c

funguje to všetko, ale robi to chybu a neviem prisť na to kde je problem.
sekundy to počita takto a minuty tiež, toto mam na výstupe čo mi hádže dysplaj.

1 2 3 4 5 6 7 8 9 16 17 18 19 20 21 22 23 24 25 32 33 34 35 36 37 38 39 40 41 48 49 50 51 52 53 54 55 56 57 64 65 66 67 68 69 70 71 72 73 80 81 82 83 84 85 86 87 88 89

je to 60 sekund ale prečo to preskakuje čisla?

Kód: Vybrať všetko

unsigned char rtc_read(unsigned char address) {
    TRISB1=0;
    unsigned char i;
    uint8_t data = 0;
    RTC_CE_PIN = 1; // Aktivuje RTC
    RTC_CLK_PIN = 0;
    __delay_us(5); // ?asové oneskorenie
    for(i=0; i<=7; i++) {
        RTC_IO_PIN = (uint8_t)(0x01 & (address >> i)); // Nastaví adresu
        __delay_us(10); // ?asové oneskorenie
        RTC_CLK_PIN = 1; // Hodinový signál
        __delay_us(10); // ?asové oneskorenie
        RTC_CLK_PIN = 0;
    }
    RTC_IO_PIN = 0;
    TRISB1=1;
    __delay_us(5); // ?asové oneskorenie
    
    for(i=0; i<=7; i++) {
        data |= (uint8_t)(RTC_IO_PIN << i); // ?íta dáta
        __delay_us(5); // ?asové oneskorenie
        RTC_CLK_PIN = 1; // Hodinový signál
        __delay_us(10); // ?asové oneskorenie
        RTC_CLK_PIN = 0;
        __delay_us(5); // ?asové oneskorenie
        
    }
    RTC_CE_PIN = 0; // Deaktivuje RTC
    return data;
}

Re: DS1302

Napísané: 10 Feb 2024, 00:13
od používateľa peterple
Pretože to má uložený čas ako dve BCD číslice. To znamená že po 09 dostaneš 10
čo je binárne 0001_0000
No a ty to vypisuješ desiatkovo a to je 16.
Vypisuj to ako hexa a bude to OK

Re: DS1302

Napísané: 10 Feb 2024, 07:39
od používateľa boraicho
Vieš mi zhruba napísať ako to má vyzerať?

Re: DS1302

Napísané: 10 Feb 2024, 08:24
od používateľa Atlan
Z 8bit cisla odstranis horne 4 bity. A zostanu ti 1sekund.
Potom odstranis z 8bit cisla spodne 4 bity, vykonas posun vvpravo o 4 miesta a dostanes 10sekund

Re: DS1302

Napísané: 10 Feb 2024, 16:08
od používateľa boraicho
dakujem atlan, ked som tvoju vetu hodil do chatgpt tak to vygenerovalo tento kod ktorý funguje a hodiny mi idu ako maju :D

Kód: Vybrať všetko

unsigned char units = uloz_hodnotu & 0x0F; // získa jednotky sekúnd
unsigned char tens = (uloz_hodnotu >> 4) & 0x0F; // získa desiatky sekúnd
unsigned char seconds = tens * 10 + units; // spočíta celkový počet sekúnd

Re: DS1302

Napísané: 10 Feb 2024, 19:16
od používateľa peterple
Hmm, otázka je prečo si sa to tej UI nepýtal rovno. Všetko čo si sa pýtal tu si sa mohol pýtať jej.

Re: DS1302

Napísané: 10 Feb 2024, 19:45
od používateľa budvar10
Kedysi dávno, keď som chcel použiť DS3231, v podstate podobný čip, preštudoval so si najprv datasheet. Všetko je tam napísané, HW, princíp funkcie, registre, práca so zbernicou, atď. To už som ale vedel veci okolo AVR. Trvalo to ale pár dní. Vtedy to bola novinka a neboli k tomu knižnice, voľne dostupné na nete.
Dnes ti dá AI na všetko odpoveď hneď, už ani gogliť nemusíš, alebo ísť na GitHub. Začínam vážne pochybovať, či to ide dobrým smerom. :pain:

Re: DS1302

Napísané: 10 Feb 2024, 20:44
od používateľa Atlan
Az zacnes nieco vazne programovat ta ti gpt bude na dve veci :D

Re: DS1302

Napísané: 11 Feb 2024, 09:36
od používateľa boraicho
niesom programator, a neprogramujem, som v zahraniči, a napadlo ma vziať RTC modul z poličky a vyvojovu dosku s PIC16F1939 reku nech sa nenudim po večeroch. to je cele.
Momentálne bojujem s teplotnym čidlom DS18b20 hažde mi to na vystupe divne čísla, neviem prečo. funguje lebo meni čísla na vystupe ked sa čidla dotknem lenže niekde je zrada hažde to -17000 a take bludy.
Hmm, otázka je prečo si sa to tej UI nepýtal rovno. Všetko čo si sa pýtal tu si sa mohol pýtať jej.
jasne že pytal, lenže je hlupa :D a generuje nefunkčne kody. možno ak by som mal tu platenu verziu ....

na githube neviem nič funkčne najsť dokonca aj tie kody ktore na githube som našiel s tym DS1302 , neobsahuju ten prevod čo som tu naposledy daval tak nechapem ako im to može fungovať.


atlan ano maš pravdu, je to na dve veci, ale trošku pomože, a nie nikdy nezačnem vážne programovať. Práca za pc nieje moja. Raz som pracoval za PC ked som kreslil 2D vykresy pre laser, ale vydržal som 2 tyzdne, fyzicky som to nezvladal tu prácu. Strašne som zaspaval.

Re: DS1302

Napísané: 11 Feb 2024, 10:15
od používateľa budvar10
DS18B20, k tomu môžem napísať to isté ako som písal k DS3231. V datatsheete je dokonca funkčný diagram. Podľa neho som si napísal knižnicu. V čase, keď som to robil, našiel som jediný dostupný kód od PJRC.com a ten bol chybný.

Ja s PIC nerobím ale tu som našiel niečo:
https://github.com/simonbarker/pic-libr ... /DS18B20.c
V princípe je to to ale podobné na všetkých platformách.

Mimochodom, až 9. príspevok od môjho si napísal informáciu o aký MCU sa jedná.
To máš nejakú originál vývojovú dosku?

Re: DS1302

Napísané: 11 Feb 2024, 10:41
od používateľa boraicho
Aky mcu je použiťý nieje doležité, či už tak či onak, program je vždy ten istý.
Ano je to doska ktorú som robil dáávno.
https://svetelektro.com/phpbb/?w3=dmlld ... 90PTMzNzgy

idem pozrieť.
teplotu čidlo meria, ale neviem dostať rozumny vystup.
toto mam momentálne ale je to zle. ja to neviem prepisať do programatorskeho jazyka.
hladam aj po tých knižniciach napriklad čo si poslal, ako čítaju teplotu....

Kód: Vybrať všetko

temp = ds18b20_read_byte(); // Prečítaj menej významný bajt teploty
    temp |= ((unsigned int) ds18b20_read_byte() << 8); // Prečítaj viac významný bajt teploty

    if (temp & 0x8000) { // Ak je nastavený bit znamienka
        temp = (~temp) + 1; // Doplňková hodnota pre záporné číslo
        sign = -1;
    }

    temperature = (float) temp / 16.0 * sign; // Výpočet teploty
    return temperature;