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

[Rozwiązano] Atmega128A + DS3231: Nie mogę zapisać wartości 0x00 w rejestrze Control

z_lak1 02 Sie 2019 13:56 393 3
REKLAMA
  • #1 18093318
    z_lak1
    Poziom 8  
    Witam,
    Mam problem z konfiguracją DS3231 (gotowy moduł). Czytam bez problemu rejestr Control (0x0E), otrzymuję wartość 0x1C. Aby DS3231 na pinie SQW wystawił sygnał 1 Hz powinienem w tym rejestrze zapisać wartość 0x00 (proszę mnie poprawić jeśli się mylę).
    Próba modyfikacji jego zawartości kończy się niepowodzeniem. Ciągle w tym rejestrze jest wartość 0x1C a na pinie SQW wysoki stan.
    Dodam, że na pinie 32kHz jest przebieg prostokątny o częstotliwości 32,768 kHz.
    Próbowałem obniżyć częstotliwość taktowania magistrali I2c ze 100 do 20 kHz. Ale to nic nie dało.
    Do komunikacji I2c wykorzystuję bibliotekę zaczerpniętą z książki Tomasza Francuza "Język C dla mikrokontrolerów AVR. Od podstaw do zaawansowanych aplikacji" wydanie II.
    Program kompiluję w środowisku Atmel Studio 7 (Version: 7.0.1931).
    Do debugowania używam Atmel-ICE.
    Poniżej zamieszczam kod (linijka asm("nop"::); służy do ustawienia breakpointa).
  • REKLAMA
  • #2 18093458
    Konto nie istnieje
    Poziom 1  
  • REKLAMA
  • #3 18093508
    z_lak1
    Poziom 8  
    Bardzo dziękuję za podpowiedź.
    Uświadomiłem sobie, że popełniłem błąd zamiast I2C_SendStartAndSelect(0x00); w funkcji DS3231_init powinno być oczywiście I2C_SendByte(0x00);.
    Naprowadziło mnie na to Twoje pytanie o ACK.
    Po poprawieniu kodu zmienna Ctrl dostała wartość taką jaka powinna być czyli 0x00.
    Na wyjściu SQW pojawił się przebieg 1 sekundowy.
    Jeszcze raz bardzo dziękuję za pomoc.
    Pozdrawiam
    Zamykam temat
  • #4 18093512
    z_lak1
    Poziom 8  
    Bardzo dziękuję za podpowiedź.
    Uświadomiłem sobie, że popełniłem błąd zamiast I2C_SendStartAndSelect(0x00); w funkcji DS3231_init powinno być oczywiście I2C_SendByte(0x00);.
    Naprowadziło mnie na to Twoje pytanie o ACK.
    Po poprawieniu kodu zmienna Ctrl dostała wartość taką jaka powinna być czyli 0x00.
    Na wyjściu SQW pojawił się przebieg 1 sekundowy.
    Jeszcze raz bardzo dziękuję za pomoc.
    Pozdrawiam
    Zamykam temat

    Dodano po 1 [minuty]:

    To był mój błąd. Wystarczyło go porawić.
REKLAMA