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

Atmega16 - Obsługa TWI i zegara czasu rzeczywistego

luckas09 12 Gru 2012 15:52 1485 3
REKLAMA
  • #1 11642695
    luckas09
    Poziom 10  
    Zmagam się z odczytaniem czasu układu PCF8583. Napisałem krótki kod na podstawie instrukcji napisanych w manualu Atmegi, który ma odczytać wyłącznie wartość sekund. Problem jaki się pojawił to zatrzymanie programu na funkcji oczekiwania odbioru flagi przerwania po zakończeniu transmisji instrukcji startu magistrali TWI:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Poniżej cały kod programu:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • Pomocny post
    #2 11642963
    Andrzej__S
    Poziom 28  
    W linijce:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    masz błąd. Brakuje Ci jednego znaku < w nawiasie (1<TWEN), i to nie jest odosobniony przypadek.
    Poza tym zamiast TWCR |= ... wystarczy zwyczajnie TWCR = .... Tak zresztą jest w nocie mikrokontrolera ATmega16, na podstawie której pisałeś ten kod :)
  • REKLAMA
  • #3 11643199
    luckas09
    Poziom 10  
    Poprawiłem błędy. Program jest już wykonywany w pętli while, natomiast wartość sekund nie jest odczytywana. Dodałem na początku programu inicjalizację TWI, czyli ustawienia zegara szyny SCL i po obliczeniu wyszło 489 Hz. Co spełnia wymagania wg noty katalogowej czyli 16 razy mniej niż częstotliwość układu PCF 32768Hz.
    Poprawiony kod:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #4 11643591
    Andrzej__S
    Poziom 28  
    Po pierwsze:
    luckas09 napisał:
    ...czyli ustawienia zegara szyny SCL i po obliczeniu wyszło 489 Hz. Co spełnia wymagania wg noty katalogowej czyli 16 razy mniej niż częstotliwość układu PCF 32768Hz.

    Nie wiem skąd ten pomysł. W nocie katalogowej układu PCF8583, którą ja znalazłem, częstotliwość maksymalna szyny SCL wynosi 100kHz.

    Po drugie:
    Sprawdzaj chociaż, czy otrzymujesz bit potwierdzenia od układu slave. W swoim kodzie nie masz kompletnie kontroli nad tym, co się dzieje na magistrali. Odczyt rejestru TWSR po każdej operacji na magistrali znacznie ułatwia diagnostykę i zapobiega powstawaniu "bałaganu" na magistrali.

    Po trzecie:
    luckas09 napisał:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Przeanalizuj, co chcesz osiągnąć tym fragmentem kodu.
    Wysyłasz adres z bitem R_W ustawionym na READ.
    Nastęonie wpisujesz do rejestru TWDR zmienną 'sekundy'. Po co? Będziesz ją wysyłał? Przecież teraz odczytujesz dane z magistrali.
    W którym miejscu po odebraniu bajtu danych z magistrali odczytujesz go z rejestru TWDR do zmiennej 'sekundy'?

    PS. No i nadal używasz TWCR |= ...
REKLAMA