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

[ATMEGA8/ATMEGA88][GCC/AVRStudio4] Problem z TWI

fami89 20 Sty 2011 18:19 2724 13
  • #1 9033020
    fami89
    Poziom 10  
    Witam

    Przewertowałem już wszystko co się dało, ale nie znalazłem rozwiązania problemu z TWI, dlatego piszę tutaj z prośbą o pomoc.

    Problem polega na tym, iż po włączeniu zasilania na pinie SDA jest ciągle 5V, a na SCL 0V (sprawdzane na oscyloskopie) i nic się nie zmienia mimo zapętlenia nawet samego sygnału START.

    Kod do obsługi TWI już napisałem według noty katalogowej, różnych bibliotek znalezionych na internecie (np. ze strony: http://radzio.dxp.pl/twi/) czy też na tym forum i zawsze jest to samo.

    Próbowałem już wszystkiego nawet Atmegi8 i Atmegi88 działających raz na wewnętrznym raz na zewnętrznym zegarze 8MHz.

    Obie linie są podciągnięte przez zewnętrzne rezystory 4,7k.

    Przy inicjalizacji TWSR ustawiam na 0, a TWBR na 32 tak jak powinno być.

    Czy ktoś wie co może być przyczyną i gdzie może być jakiś błąd, że TWI wogóle nie chce ruszyć?
    Dodam jeszcze, że sprawdziłem wszystko pisząc kod w Bascomie i tam TWI zadziałało...
  • #4 9033240
    fami89
    Poziom 10  
    Fragment schematu układu:
    [ATMEGA8/ATMEGA88][GCC/AVRStudio4] Problem z TWI

    Przykładowy kod (funkcje TWI ze strony http://radzio.dxp.pl/twi/):

    #define F_CPU 8000000UL
    #define SCL_CLOCK  100000UL
    #include <avr/io.h>
    #include "TWI.h"
    
    int main()
    {
        	DDRC = 0x09;
    	PORTC = 0x09;
    
    	DDRD = 0x03;
    	PORTD = 0x00;
    
    	TWSR = 0;
    	TWBR = 32;
    
    	while(1)
                {
    		twistart();
    	             twiwrite(0x01);
    		twiwrite(0x10);
    		twiwrite(0x02);
    		twistop();
                }
                return 0;
    }
    

    Przez I2C chce podłączyć Mobot'a US v2.
  • #5 9033342
    LordBlick
    VIP Zasłużony dla elektroda
    Dlaczego chodzi to w kółko ? Podepnij jakiś przycisk i niech działa tylko, gdy naciśniesz...
    Przypuszczam, ze skonfigurowałeś go jako slave... Notę katalogową czytałeś ?
    P.S. Kod pisz w znacznikach code...
  • #6 9033686
    fami89
    Poziom 10  
    No przycisk podpiąłem, naciśnięcie przycisku wykrywa poprawnie, lecz na TWI nadal nic się nie dzieje.. Notę katalogową czytałem i nie znalazłem żadnej informacji, żeby trzeba coś więcej jeszcze ustawiać dla mastera. Chyba, że coś pominąłem to proszę o jakąś podpowiedź.
  • #8 9033843
    janbernat
    Poziom 38  
    Ja bym dał TWBR = 8;
    Bo TWPS to jest wartość prescalera a nie bitów.
    Też się na to kiedyś naciąłem i podnosiłem do potęgi 0.
    A schematu nie rozumiem- zwora między zasilaniem a masą?
    Kolektor tranztstora NPN na masie?
    Podciąganie za buforem?
    Wyjmij 244 i sprawdź oscyloskopem czy coś wychodzi z procesora.
  • #9 9035082
    zumek
    Poziom 39  
    fami89 napisał:
    ...Przewertowałem już wszystko co się dało, ...

    Jakoś nie mogę w to uwierzyć :D
    A od kiedy to, 'dwieścieczterdziestkaczwórka' jest buforem dwukierunkowym :?:

    janbernat napisał:
    ...Wyjmij 244 i ...

    Zrób właśnie tak.
  • #10 9035204
    fami89
    Poziom 10  
    zumek napisał:
    A od kiedy to, 'dwieścieczterdziestkaczwórka' jest buforem dwukierunkowym

    Jest zrobiony na "pseudodwukierunkowy" sygnał z SDA ma w dwie strony, tak gościu na uczelni stwierdził, że mam zrobić, a ja tam mistrzem elektroniki nie jestem więc się nie będe wymądrzał (w sumie to mój pierwszy projekt).

    A co do wyjmowania tej 244, to na procku i tak się nic nie dzieje. W większości sprawdzałem sygnał na procesorze, a nie za buforem. No ale w każdym razie dzięki za rady.
  • #11 9035314
    zumek
    Poziom 39  
    fami89 napisał:
    ...Jest zrobiony na "pseudodwukierunkowy" sygnał z SDA ma w dwie strony, tak gościu na uczelni stwierdził, że mam zrobić, a ja tam mistrzem elektroniki nie jestem więc się nie będe wymądrzał (w sumie to mój pierwszy projekt)...

    Racja. Nie zauważyłem, że "dolna połówka" jest odwrócona :|
    Tylko żeby prawidłowo nadawać i odbierać, to trzeba odpowiednio sterować połówkami bufora, a Ty je masz non stop "otwarte" obie.
  • #12 9035465
    LordBlick
    VIP Zasłużony dla elektroda
    A rzeczywiście, nie przyglądałem się dokładnie schematowi... Te 74HC244 to poroniony pomysł, ponadto w specyfikacji I²C jest możliwość przytrzymania w stanie niski linii SCL przez slave, który nie nadąża z odpowiedzią. Jak już miałby być tam bufor którejkolwiek z linii to na dwóch komparatorach, np. na podwójnym LM393...
  • #13 9036539
    p_zag
    Poziom 14  
    witam
    Na początek sprawdź Fuse Bits (taktowanie procesora) na jaką częstotliwość zegara jest ustawiony procesor. Potem już w programie zainicjuj magistrale TWI. Jak to zrobić, ano tak:
    
    void TWI_inicjacja(void)
    {
      // Czestotliwosc TWI(i2c) = 100kHz (max 100kHz)
      // ------------------------------------------------
      /* TWSR = TWS7 TWS6 TWS5 TWS4 TWS3  -   TWPS1 TWPS0 */
      TWSR =0b00000000;    // Preskaler = 1  ->> TWPS1=0 TWPS0=0
      // ------------------------------------------------------
      /* TWBR = TWBR7 TWBR6 TWBR5 TWBR4 TWBR3 TWBR2 TWBR1 TWBR0 */
      TWBR =0b00100000;
      /* Rejestr odpowiedzialny za wybór współczynnika podziału dla generatora.
         Generator ten odpowiada za czestotliwosc która jest dzielona przez
         sygnał zegarowy SCL w trybie pracy Master.
         ->> TWBR musi byc wieksze od 10 dla stabilnej pracy TWI(i2c) 
       ->> ((częstotliwość Atmegi/częstotliwość TWI)-16)/2 =TWBR 
     Czyli ((8MHz/100kHz)-16)/2=32  => TWBR=32 lub TWBR=0x20 lub TWBR=0b00100000 */ 
    } 
    

    Ta inicjacja TWI jest obliczona dla magistrali TWI f=100kHz i procesora Atmega8 f=8MHz (obojętnie czy taktowany wewnętrznie RC, czy zewnętrznie przez kwarc).
    Całość mojego kodu wraz z odnośnikiem do działającego ma Magistrali TWI kodu zagara led (Atmega8 i TWI na przykładzie zegara LED) znajdziesz tu[Atmega8][C] Atmega8 i TWI , ale jak zacząć...
    Mam nadzieje, że to ci pomoże i coś sobie wybierzesz.
    Powodzenia.
  • #14 9037959
    janbernat
    Poziom 38  
    fami89 spróbuj na stałe ustawić PD0 i PD1 jako wyjścia w stanie niskim- może coś z tego będzie.
REKLAMA