logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

avr zegar czasu rzeczywistego ds1307 językC

svensonie 04 Cze 2010 18:48 3156 10
REKLAMA
  • #1 8155192
    svensonie
    Poziom 11  
    Witam. Odrazu usprawiedliwię się, że dopiero zaczynam swoją przygode z mikrokontrolerami. Mój problem jest następujący: na początku pracy mojego programu mam potrzebę sczytać z zegara wartość sekund. Jest to mi potrzebne do generowania liczb pseudolosowych. Sprawa pewnie jest prosta, niestety ja się zafiksowałem. W necie znajduje kody albo pod bascoma, a jak już są w C to dużo bardziej rozbudowane od tego co ja potrzebuje i nie potrafie wyłuskać włąściwych części kodu. Jakby ktoś miał coś podobnego już napisanego, albo żeby wytłumaczył co po kolei mam zrobić byłbym wdzięczny.
    Zapomniałem dodać, że mikrokontroler na którym pracuje to atmega16.
  • REKLAMA
  • #2 8155356
    acid12
    Poziom 21  
    1) wysyłasz START
    2) wyslasz adres urzadzenia + write,
    3) posylasz 0x00 - adres rejestru na ktory układ ma ustawić wskaźnik)
    4) posyłasz powtórzony START
    5) wyslasz adres urzadzenia + read,
    6) czytasz 1 bajt = sekundy
    7) czytasz 2 bajt = minuty (automatycznie wskaznik w urzadzeniu się przesunie na kolejny adres)
    .
    .
    .
    n) wysyłasz STOP
  • REKLAMA
  • #3 8155517
    utak3r
    Poziom 25  
    acid12 napisał:

    2) wyslasz adres urzadzenia + write,
    5) wyslasz adres urzadzenia + read,


    innymi słowy:
    2) wysyłasz bajt 0xD0
    5) wysyłasz bajt 0xD1
  • REKLAMA
  • #4 8156041
    svensonie
    Poziom 11  
    czyli chcąc odczytać tylko wartość sekund, będę musiał odczytać wszystko od sekund aż do daty i roku?
  • REKLAMA
  • #6 8157279
    acid12
    Poziom 21  
    svensonie napisał:
    czyli chcąc odczytać tylko wartość sekund, będę musiał odczytać wszystko od sekund aż do daty i roku?


    po odczytaniu sekund, zamiast bitu 'acknowledge', wysyłasz 'notacknowledge' i STOP i tyle

    przy nastepnym czytaniu najpierw też będziesz musiał wysłać 0x00 aby wskaznik ponownie ustawił się na rejestrze sekund
  • #7 8181506
    svensonie
    Poziom 11  
    Cytat:

    #include <avr/io.h>
    #include <string.h>
    #include <avr/pgmspace.h>
    #include "char_code.h"
    #include "LCD_lib.h"
    #include "twi.h"
    #include "rtc_lib.h"
    #include <util/delay.h>

    uint8_t company[] = "PROPOX";



    const uint8_t backslash[] PROGMEM=
    {
    0b00000000,
    0b00010101,
    0b00001110,
    0b00010101,
    0b00001110,
    0b00010101,
    0b00000000,
    0b00000000
    };



    int main(void)
    {

    char tmp;
    rtc_init();
    LCDinit();
    LCDcursorOFF();
    LCDdefinechar(backslash,0);

    while(1) {
    twistart();
    twiwrite(0xD0);
    twiwrite(0x00); //0x00 - adres bajtu, który zachowuje wartość sekund
    twistart();
    twiwrite(0xD0);
    tmp = twiread(NOACK);
    twistop();

    _delay_ms(20);


    LCDGotoXY(0,1);
    LCDsendChar(0x00);
    LCDstring(tmp,2);
    LCDsendChar(0x00);
    }

    return 0;
    }


    To mój programik roboczy, mam on wyswietlać wartość sekund na wyświetlaczu LCD. Niestety nie dziala on poprawnie, na wyświetlaczu pojawiają się krzaki. Dodatkowo mam pytanie czy zegar czasu rzeczywistego działa nawet jak płytka jest wyłączona (ciągnąc zasilanie z baterii) czy za każdym razem gdy włączę płytkę zegar zacznie działać zawsze od tej samej wartości (godziny, daty)?
  • #8 8181551
    acid12
    Poziom 21  
    adres urzadzenia do odczytu tj ADRES + 1, więc u Ciebie 0xD1, oczywiscie zmieniasz tylko to drugie wywołanie, pierwszy adres masz dobry 0xD0 bo piszesz do urzadzenia
  • #9 8181677
    svensonie
    Poziom 11  
    zmieniłem kod tak jak mówiłeś. Niestety nadal nie działa, teraz nawet krzaczków nie ma na wyświetlaczu :/
  • #10 8181786
    acid12
    Poziom 21  
    twistart(); 
    twiwrite(0xD0); 
    twiwrite(0x00); //0x00 - adres bajtu, który zachowuje wartość sekund 
    twistart(); 
    twiwrite(0xD1); 
    tmp = twiread(NOACK); 
    twistop(); 


    nie wiem jak wygladają Twoje funkcje obsługi i2c, ale umnie ten schemat odczytu działa :)

    jak znikły krzaki tzn ze coś się dzieje, obsługe LCD masz poprawną ?
  • #11 8181832
    janbernat
    Poziom 38  
    Jeśli jest to płytka z PROPOX-u to zacznij od sprawy podstawowej- wylutuj akumulator, wyjmij zworkę do ładowania i wlutuj normalne giazdko na baterię CR2032 i wsadź tam baterię.
    Akumulator ma napięcie >3.6V a przy ładowaniu- jeszcze większe.
    Co sprawia że DS1307 wchodzi w stan "uśpienia" i nic nie można z niego odczytać.
    Co jest opisane w DS do ds1307.
    A potem program.
REKLAMA