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

Atmega8 Komunikacja TWI wysyłanie danych działa, odbiór nie

maxtreaming 19 Lip 2015 10:30 786 5
  • #1 14859043
    maxtreaming
    Poziom 2  
    Mam plytke prototypową EvbAvr04 i zacząłem bawić się komunikacją z zegarem RTC (DS1307) za pomoca TWI. Wysyłanie danych działą, ale odbiór danych wiesza program. Identyczne "symptomy" były w temacie https://www.elektroda.pl/rtvforum/topic2483381.html
    tyle że problem nie tkwi w adresie zegara, bo sprawdziłem dokładnie. Podłączyłem też wykrywanie przerwania wywoływanego przez zegar. Częstotliwość kwarca RTC ustawiłem na 1hz a przerwanie wywoływane jest z większą czestotliwością ? Kody do transmisji wziałęm z książki p. Kardasia, sprawdziłem je wielokrotnie innymi w sieci i nadal nic. Raz się udało, że zegar dobrze liczył sekundy, ale lekki ruch płytki powodował powrót problemu.
    Kod głowny programu
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    kody TWI
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #2 14859358
    jaca_76
    Poziom 12  
    Jak dla mnie to takie rzeczy są w przerwaniu niedopuszczalne.
    Ustaw sobie jakąś flagę i obsłuż w pętli głównej.

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #3 14859364
    maxtreaming
    Poziom 2  
    Wiem ze tak nie powinno byc, ale tak na szybko to napisalem. Problem nie tkwi w przerwaniu, bo to samo bylo przedtem. Przerwanie zrobilem tylko i wylacznie zeby sprawdzic czy uklad w ogole cos do atmegi wysyla, w sensie o sygnal z kwarca zegara.
  • #4 14859420
    jaca_76
    Poziom 12  
    A gdzie inicjalizacja TWI ?
    coś jak i2cSetBitrate(100); ?
  • #5 14859500
    maxtreaming
    Poziom 2  
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #6 14859579
    Andrzej__S
    Poziom 28  
    maxtreaming napisał:
    Wysyłanie danych działa...

    Jesteś tego pewien? Funkcje, które przedstawiłeś w ogóle nie korzystają z rejestru TWSR, więc nie wiesz, co dzieje się na magistrali. Nie sprawdzają nawet, czy układ slave odpowiedział bitem potwierdzenia. Samo wysłanie danych na magistralę nie oznacza, że transmisja przebiegła prawidłowo i że układ slave prawidłowo odebrał dane.

    Jeśli wszystko jest OK, funkcje mają szansę działać prawidłowo, ale w przypadku wystąpienia problemów zdiagnozowanie ich źródła jest znacznie utrudnione, szczególnie jeśli ktoś nie dysponuje oscyloskopem cyfrowym lub analizatorem stanów logicznych. Poza tym układ slave może być zajęty jakimiś wewnętrznymi operacjami w momencie zainicjowania transmisji przez układ master i nie odpowie bitem potwierdzenia. Układ master powinien wtedy zakończyć transmisję poprzez wygenerowanie STOP lub ponowić transmisję generując REPEATED START. Funkcje, których używasz, tego nie robią.

    maxtreaming napisał:
    Częstotliwość kwarca RTC ustawiłem na 1hz

    Chyba raczej chodziło Ci o częstotliwość na wyjściu SQW/OUT. Z tego, co napisałeś nie wynika jednoznacznie, czy uzyskałeś tam jakiś sygnał, a jeśli tak, to o jakiej częstotliwości.

    maxtreaming napisał:
    Raz się udało, że zegar dobrze liczył sekundy, ale lekki ruch płytki powodował powrót problemu.

    To by sugerowało problem z połączeniami.

    PS. Jeszcze jedna uwaga:
    maxtreaming napisał:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Rejestr TWBR jest 8-bitowy, a wynik obliczeń jest większy od 255.
REKLAMA