Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[Mega8] - TWI działa dopiero po resecie

afterparty 17 Wrz 2014 16:43 735 6
  • #1 17 Wrz 2014 16:43
    afterparty
    Poziom 12  

    Witam Was.

    Tym razem mam problem z TWI. Po kilku nieudanych próbach usunąłem cały swój kod do obsługi TWI, i napisałem wszystko od nowa - inspirując się kodami TMF'a i Mirkka36 oraz Datasheetem Atmela.

    Otóż mam zegar PCF8563 i na początku chciałem się z nim skomunikować, tak aby generował mi sygnał z prędkością 1Hz na wyjściu CLKOUT. Przerwanie w ATmega8 miałoby z tą samą prędkością migać diodą LED dla sprawdzenia.

    I teraz dziwna rzecz: kod działa (tzn. dioda miga mi z 1Hz), ale dopiero po zresetowaniu mikrokontrolera. Gdy włącze go po chwili gdy nie miał zasilania dostaję na wyjściu zegara 32.768kHz - czyli domyślną wartość ustawioną po włączeniu układu.

    Próbowałem różnych rzeczy:
    -Dodałem dodatkowy kodensator 1uF przy zegarze
    -Próbowałem różnych wartośći Pull Upów na SDA i SCL
    -Zamieniałem miejsce linijki włączającej 1Hz w zegarze
    -Opóźniłem maksymalnie czas startu mikrokontrolera we Fuse Bitach

    Ale nic to nie dało, wszystko działa tak samo.

    OK tutaj kod w języku C:

    main.c:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    TWI.c
    Kod: c
    Zaloguj się, aby zobaczyć kod


    TWI.h
    Kod: c
    Zaloguj się, aby zobaczyć kod


    PCF.c
    Kod: c
    Zaloguj się, aby zobaczyć kod


    PCF.h
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Prosty kod, ale czemu nie działa? Tego ja niestety nie wiem

    0 6
  • #2 17 Wrz 2014 19:04
    lukastoja
    Poziom 16  

    Witaj,

    nie chcę się zagłębiać w meandry kodu - ale jest jeden detal, zgodnie z dokumentacją (Fig. 13) Twój zegarek po resecie potrzebuje przynajmniej 8ms.
    Pasowało by to że po resecie już działa.
    Spróbuj na początku main dać opóźnienie lub fusami możesz opóźnić start atmegi
    Pozdrawiam

    0
  • #3 18 Wrz 2014 15:09
    afterparty
    Poziom 12  

    No witam.

    Też o tym pomyślałem
    Przed Twoim postem miałem już opóźnienie we fuskach ustawione na 64ms.
    Działo się to samo.

    Po dodaniu delaya 10ms na początku też to samo :/

    Może jakieś inne pomysły/domysły?

    0
  • #4 18 Wrz 2014 17:13
    zumek
    Poziom 39  

    afterparty napisał:
    ...Może jakieś inne pomysły/domysły?

    Zainteresuj się rejestrem TWSR i nie zakładaj, że transmisja ZAWSZE przebiega bezbłędnie. Nawet nie sprawdzasz, czy po wysłaniu bajtu z adresem urządzenia, otrzymałeś status TW_MT_SLA_ACK. Zajrzyj do pliku nagłówkowego include/util/twi.h - pouczające :D

    0
  • #5 18 Wrz 2014 18:44
    afterparty
    Poziom 12  

    No faktycznie, nie dostaję bitu ack po wysłaniu adresu SLA+W i po wysłaniu obu bajtów danych :/
    Po szybkim ponownym uruchomieniu już tych błędów nie widać.

    Problem tylko w tym, że nie mam pojęcia co teraz zrobić? :scrambleup:

    Może jakaś wskazówka? :D

    0
  • #6 19 Wrz 2014 22:20
    zumek
    Poziom 39  

    afterparty napisał:
    ...Po dodaniu delaya 10ms na początku też to samo :/

    A czy stoi coś na przeszkodzie, żeby dać na próbę 10000ms :?:
    Albo w pętli, co 10ms próbuj adresować PCF-a np. max 255 razy i sprawdzaj kiedy odpowie ACK, a wtedy po ilości prób będziesz wiedział ... "jak długi ma POR" :D

    0
  • #7 21 Wrz 2014 11:12
    afterparty
    Poziom 12  

    Działa dopiero po delay'u 800ms. Zamykam temat, dzieki wszystkim za pomoc.

    0