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

Jak wybrać uP i napisać program do sterowania TDA7449 przez I2C?

..::radzio::.. 20 Paź 2006 19:01 2818 18
REKLAMA
  • #1 3136215
    ..::radzio::..
    Poziom 12  
    Posty: 35
    Pomógł: 1
    Ocena: 1
    Witam.
    po padnieciu monitora z glosnikami lg studioworks 77M,wyciagnalem z niego glosniki i wzamcniacz. Jednak aby wszysko dzialalo potrzebne jest sterownanie I2C przedwzamcniaczem na TDA7449 (balans, bass, sopran i glosnosc)
    http://www.st.com/stonline/products/literature/ds/6317.pdf
    SCHEMAT CALEGO WZMACNIACZA.
    Jak wybrać uP i napisać program do sterowania TDA7449 przez I2C?
    nie potrafie napisac programu i nie wim jaki uP wybrac.
    prosze o pomoc forumowiczow.
    Pozdrawiam.
  • REKLAMA
  • #2 3136315
    spuki
    Poziom 14  
    Posty: 68
    Pomógł: 4
    Ocena: 1
    Witam.

    Jeśli nie miałeś wcześniej zbyt dużo wspólnego z elektroniką to chyba najprostrzym rozwiązaniem będzie wykorzystanie portu LPT (interface będzie bardzo prosty). Resztę należy napisać na komputerze (dowolność formy i treści :D)

    Podchodząc to problemu bardziej ambicjonalnie można by zbudować coś np. na jakiejś 51'.

    Pozdrawiam,
    Spuki.
  • #3 3136466
    ..::radzio::..
    Poziom 12  
    Posty: 35
    Pomógł: 1
    Ocena: 1
    myslalem o jakims Atmega.
    a co do sterowania to lpt mnie za bardzo nie urzadza.
    jesli mozna napisac program na kopma to mozna rowniez na uP.
    w datasheet do tda7449 sa opisane jakie stany odpowiadaja za bass, sopran itd.
    ja poprostu potzrebuje dowiedziec sie jak zaczac pisac program oraz jak podlaczyc uP do calego ukladu(scl i sda).
  • #4 3136502
    spuki
    Poziom 14  
    Posty: 68
    Pomógł: 4
    Ocena: 1
    Jeśli to Twój "pierwszy raz" to przydałaby się jakaś literatura (i chociaż mała pomoc :D).
    Poza tym jeśli ma to być urządzenie typu stand-alone to przydałby się jakiś wyświetlacz, switche, obudowa itd - w końcu musisz jakoś wpływać na wybór parametrów TDA7449. W tym momencie komunikacja okazuje się nie największym problemem do rozwiązania... ale ile satysfakcji na końcu :D

    Pozdrawiam,
    Spuki
  • REKLAMA
  • #5 3136608
    ..::radzio::..
    Poziom 12  
    Posty: 35
    Pomógł: 1
    Ocena: 1
    chodzimi o sterowanie za pomoca guzikow push.po dwa do kazdej opcji(glosnosc+-,bass+-,sopran+-,balance+-),w sumie 8.
    wyswietlcz nie jest potrzebny.a pamiec ustawien chce wyeleminowac,po ponownym wlaczeniu ukladu beda ustawienia domyslne.

    PS. jak pisalem to wzamcniacz od monitora,moc wyjsciowa to 4,6W:D
    a chce sie tym pobawic.
  • #6 3136638
    spuki
    Poziom 14  
    Posty: 68
    Pomógł: 4
    Ocena: 1
    W takim razie polecam literaturę , bo na pewno nie jest to zabawa na jeden dzień (projekt, schemat, PCB, soft itd).

    Pozdrawiam,
    Spuki
  • #7 3136705
    ..::radzio::..
    Poziom 12  
    Posty: 35
    Pomógł: 1
    Ocena: 1
    Spuki chodzi mi o konkretna pomoc a nie o wpisanie avr na google.
    schemat?plytka? mam kompletny wzamcniacz z przdwzmacniaczem,musze podlaczyc do niego uP przez szyne I2C = 2 przewody. chodzi mi glownie o kod programu.
    czy mozna to wykonac na atmega8?

    P.S. forum jest od pomagania a nie od nabijania sobie ilości postów.
  • REKLAMA
  • #8 3136819
    spuki
    Poziom 14  
    Posty: 68
    Pomógł: 4
    Ocena: 1
    Oczywiście że się da. Co prawda układ ten nie posiada hardware'owego I2C ale można go obsłużyć programowo. Rozwiązań jest mnóstwo na sieci i bez sensu jest umieszczać tu jakieś przykłady bo nawet nie ma schematu takiego urządzenia (więc nie ma się na czym oprzeć).

    P.S.
    Nie mam takich ambicji i potrzeb żeby sobie "nabijać" ilość postów.
  • #9 3137295
    leoha
    Poziom 17  
    Posty: 173
    Pomógł: 18
    Ocena: 8
    spuki napisał:
    Oczywiście że się da. Co prawda układ ten nie posiada hardware'owego I2C (...)

    atmega8 posiada hardware'owy TWI ktory jest kompatybilny z I2C.
  • #10 3137304
    spuki
    Poziom 14  
    Posty: 68
    Pomógł: 4
    Ocena: 1
    Aaa, zgadza się. W ATMEGACH nie jestem za mocny :D

    Pozdro,
    Spuki
  • #11 3137456
    greatlukas
    Poziom 14  
    Posty: 122
    Pomógł: 3
    Ocena: 7
    Witam, pisałem kiedyś soft do obsługi TDA7439 na ATmega8, nie chce mi sie sprawdzać, czy adresy rejestrów 7449 są takie same, ale nawet jesli nie są, to żaden problem pozmieniać je w definicjach zgodnie z kartą katalogową.
    Poniżej kawałek kodu, którym do sterowania:
    
    // TWI   - Two Wire Interface
    
    
    #define SLA_W        0x88                // Adres urządzenia slave (TDA7439)                                 
    
    // Adresy rejestrów TDA
    
    #define Input_Select 0x0
    #define Input_Gain   0x1
    #define Volume       0x2
    #define Bass         0x3
    #define Middle       0x4
    #define Treble       0x5
    #define Speaker_AR   0x6
    #define Speaker_AL   0x7
    
    // Input Multiplexer
    
    #define Input1       0x3
    #define Input2       0x2
    #define Input3       0x1
    #define Input4       0x0
    
    
    // inicjalizacja TWI - częstotliwość transmisji f=10kHz
    void TWI_Init()
    {
    //     f=10kHz
           TWSR|=(1<<TWPS0);
           TWBR=198;
    }
    
    
    // funkcja wysyłająca informacje do TDA przez TWI (I2C)
    void TWI_send(unsigned char SADDR,unsigned char DATA)
    {
    
    // send START condition
        TWCR=(1<<TWINT) | (1<<TWSTA) | (1<<TWEN);
    // Wait for TWINT Flat set. This indicates that the START condition has been transmited
       while (!(TWCR & (1<<TWINT)));
    
    // wyślij adres urządzenia
       TWDR=SLA_W;
       TWCR=(1<<TWINT) | (1<<TWEN);
       while (!(TWCR & (1<<TWINT)));
    
    // wyślij adres rejestru w urządzeniu, który ma byc zmodyfikowany
       TWDR=SADDR;
       TWCR=(1<<TWINT) | (1<<TWEN);
       while (!(TWCR & (1<<TWINT)));
    
    // wartość jaką należy wprowadzić do wybranego wcześniej rejestru TDA
       TWDR=DATA;
       TWCR=(1<<TWINT) | (1<<TWEN);
       while (!(TWCR & (1<<TWINT)));
    
    // wyślij warunek STOP
       TWCR= (1<<TWINT) | (1<<TWEN) | (1<<TWSTO);
       while (!(TWCR & (1<<TWSTO)));
    }
    

    Najpierw uruchamiasz TWI_Init(), a potem TWI_send(unsigned char SADDR,unsigned char DATA) wysyłasz do odpowiednich rejestrów (SADDR) odpowiednie wartości (DATA), wszystko zgodnie z tabelkami w karcie katalogowej.
  • REKLAMA
  • #12 3138663
    greatlukas
    Poziom 14  
    Posty: 122
    Pomógł: 3
    Ocena: 7
    Prograj powinien wyglądać mniej wiecej tak.
    W karcie katalogowej są tabele, z odpowiednimi wartościami, jakie należy wysłać do rejestrów, należy w programie zadeklarować tablice z tymi wartościami, i potem stworzyć sobie zmienną np
    uint8_t volume;

    potem przyciksami zwiększać bądź zmniejszać jego wartość o jeden, a do TDA wysyłać np tak:
    
    TWI_send(Volume,Tablica_Volume[volume]);
    

    i podobnie robi się z pozostałymi nastawami, takimi jak balans, treble itd.
  • #13 3852997
    fliku
    Poziom 11  
    Posty: 21
    Ocena: 3
    mam pytanie/prośbę do ..::radzio::.. - czy możesz zamieścić schemat podłączenia wzm do uP
  • #14 4092724
    artur_g3
    Poziom 11  
    Posty: 71
    Pomógł: 1
    Ocena: 1
    Mam prośbę do greatlukas, czy mógłbyś udostępnić cały program???
  • #15 5370800
    romantv
    Poziom 17  
    Posty: 328
    Pomógł: 11
    Ocena: 8
    Witam jak powinien wyglądać kod w Bascomie ja mam tak i coś mi nie działa Kość TDA7439

       I2cstart
       I2cwbyte 136                                             'adres
    
       I2cwbyte &B00010000                                      'input selekt
       I2cwbyte &B00000000                                      'IN4
    
       I2cwbyte &B00010001                                      'input GAIN
       I2cwbyte &B00000000                                      '0 dB
    
       I2cwbyte &B00010010                                      'Volume
       I2cwbyte &B00000000                                      '0 dB
    
    
       I2cstop
    


    Proszę o pomoc , dziękuję


    Proszę umieszczać listingi programów w znacznikach "Code", oraz nie dublować tematów. [c_p]

    Dodano po 4 [godziny] 6 [minuty]:

    Witam ponownie.

    Sterowanie działa dziwne ale jest błąd w doc. układu.

    Jednak nie mogę sterować jednym kanałem Prawy działa poprawnie a lewy zawsze ma taki sam poziom.

    PS
    w doc jest pomylone BASS z VOLUME
  • #16 5372460
    crazy_phisic
    VIP Zasłużony dla elektroda
    Posty: 2244
    Pomógł: 278
    Ocena: 130
    Jesteś pewien że wartość z "SPEAKER ATTENUATE" są poprawne? Korzystasz z "Incremental Bus" więc nie wysyłaj subaddress'ów.
  • #17 5372682
    romantv
    Poziom 17  
    Posty: 328
    Pomógł: 11
    Ocena: 8
    Witam.
    Częściowo układ już działa jednak,
    sterując układem TDA7439 po I2C nie mogę sterować jednym kanałem.
    Mam pytanie czy są jakieś dodatkowe ustawienia co do tematu.
    Znalazłem jeden błąd w doc. Jest zamiana Jeśli chodzi o parametry BASS i Volume

    MSB LSB
    SUBADDRESS
    D7 D6 D5 D4 D3 D2 D1 D0
    X X X B 0 0 0 0 INPUT SELECT
    X X X B 0 0 0 1 INPUT GAIN
    X X X B 0 0 1 0 VOLUME
    X X X B 0 0 1 1 BASS
    X X X B 0 1 0 0 MIDDLE
    X X X B 0 1 0 1 TREBLE
    X X X B 0 1 1 0 SPEAKER ATTENUATE "R"
    X X X B 0 1 1 1 SPEAKER ATTENUATE "L"

    A kod do sterowania jest napisany w bascom-ie i wygląda tak :

    ...
    I2cstart
    I2cwbyte 136 'adres
    I2cwbyte &B00010000 'input selekt
    I2cwbyte &B00000000 'IN4
    
    I2cwbyte &B00010001 'input GAIN
    I2cwbyte &B00000000 '0 dB
    
    I2cwbyte &B00010010 'Bass
    I2cwbyte &B00000011 '0 dB
    
    I2cwbyte &B00010011 'Volume
    I2cwbyte Audio 'X dB
    
    I2cwbyte &B00010100 'MIDDLE
    I2cwbyte &B00001000 '0 dB
    
    I2cwbyte &B00010101 'TREBLE
    I2cwbyte &B00001000 '0 dB
    
    I2cwbyte &B00010110 'SPEAKER ATTENUATE "R"
    I2cwbyte &B10010111 '0 dB
    
    I2cwbyte &B00010111 'SPEAKER ATTENUATE "L"
    I2cwbyte &B10010111 '0 dB
    
    I2cstop
    ...
    

    Jeśli jednak kod powinien wyglądać inaczej to proszę byś go poprawił.

    dziękuję

    Proszę umieszczać listingi programów w znacznikach "Code". [c_p]
  • #18 5373322
    greatlukas
    Poziom 14  
    Posty: 122
    Pomógł: 3
    Ocena: 7
    W jakim "doc" miałeś błąd? W karcie katalogowej stoi VOLUME 2, BASS 3.
    Nie można ustawić oddzielnych nastaw dla poszczególnych kanałów, funkcję "Balansu" można zrealizować za pomocą rejestrów SPEAKER ATTENUATION.

    a w kodzie masz pewną nieścisłość - wysyłając SUBADDRESS
    I2cwbyte &B00010000 'input selekt
    korzystasz z adresowania inkrementacyjnego, w karcie katalogowej jest to opisane na stronie 10. Jeżeli chcesz adresować każdy rejestr z osobna, wystarczy wysłać
    I2cwbyte &B00000000 'input selekt

    czyli 4. bit subadresu musi być 0
  • #19 5375287
    romantv
    Poziom 17  
    Posty: 328
    Pomógł: 11
    Ocena: 8
    ok dziękuję za pomoc działa poprawnie
    .

Podsumowanie tematu

✨ Dyskusja dotyczy wyboru mikrokontrolera oraz napisania programu do sterowania przedwzmacniaczem TDA7449 przez interfejs I2C w układzie audio z monitora LG Studioworks 77M. Proponowano użycie mikrokontrolera Atmega8, który posiada sprzętowy interfejs TWI kompatybilny z I2C, co ułatwia komunikację. Omówiono podstawy programowania sterowania rejestrami TDA7449, w tym adresację rejestrów takich jak bass, sopran, balans i głośność, oraz sposób podłączania linii SCL i SDA. Podkreślono, że TDA7449 nie posiada dedykowanego sprzętowego I2C, ale można go obsłużyć programowo lub wykorzystać sprzętowy TWI mikrokontrolera. Przedstawiono fragmenty kodu w języku C i Bascom, pokazujące inicjalizację TWI i wysyłanie danych do rejestrów układu. Zwrócono uwagę na poprawne adresowanie rejestrów i różnice w dokumentacji dotyczące przypisania funkcji do subadresów (np. pomyłka między BASS a VOLUME). Omówiono także implementację sterowania za pomocą przycisków push (po dwa na każdą funkcję: głośność, bass, sopran, balans) bez wyświetlacza i bez pamięci ustawień po wyłączeniu. Wskazano, że projekt wymaga zaprojektowania schematu, PCB i oprogramowania, co nie jest trywialne. W końcowej fazie autor potwierdził poprawne działanie sterowania po uwzględnieniu korekt w adresacji rejestrów.
Wygenerowane przez model językowy.
REKLAMA