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

Atmega8 - [bascom] Funkcja do wyliczania wartości dla TDA7318 (tony niskie/wysokie)

mkpl 14 Lip 2012 23:26 1671 12
REKLAMA
  • #1 11106875
    mkpl
    Poziom 37  
    Witam
    Piszę program obsługi dla TDA7318 i utknąłem przy wyliczaniu wartości dla nastaw niskich i wysokich tonów.

    Wartości zmieniają się wg następującej tabelki:
    Atmega8 - [bascom] Funkcja do wyliczania wartości dla TDA7318 (tony niskie/wysokie)

    Wartość bajtu wyliczam prosto

    Bass = 96 + Wart
    Teb = 111 + wart

    gdzie wart to wartość wynikająca z bitów C3...0

    Problem jest w tym, że dla wartości decymalnej 0 (przeliczone z bitów) wartość wynosi -14dB i tak sobie implementując zmienną wszystko jest ok do wartości 0dB = 7 (dec)
    bo potem 8 dec = 14dB, 9 dec = 12db i tak do 15 dec = znów 0dB

    Jak napisać funkcję która to ładnie wyliczy?

    Myślałem o select case i przypisywać konkretnej wartości zmiennej odpowiednią wartość do wysłania ale to mało eleganckie rozwiązanie i szukam lepszego
  • REKLAMA
  • #2 11106958
    farmerro
    Poziom 16  
    Musisz liczyć to logarytmicznie. Decybel to logarytmiczna jednostka miary.


    Cytat:
    ...zmienną wszystko jest ok do wartości 0dB = 7 (dec)

    To akurat fart, bo do wartości "około zera" funkcja idzie w miarę liniowo.

    Szukaj jak liczyć logarytm w Bascomie (funkcja log).
  • REKLAMA
  • #3 11106991
    mkpl
    Poziom 37  
    To nie chodzi o te logarytmy tylko to co mam do scalaka wysłać:

    Zmienna: | To co śle do scalaka:
    0 -- 0
    1 -- 1
    2 -- 2
    3 -- 3
    4 -- 4
    5 -- 5
    6 -- 6
    7 -- 7
    8 -- 14
    9 -- 13
    10 -- 12
    11 -- 11
    12 -- 10
    13 -- 9
    14 -- 8


    Jak na razie rozwiązalem to przez select case ale chciałbym zrobić zgrabniejszy kod. Jakoś dziko to zaprojektowali...
  • REKLAMA
  • #4 11107011
    farmerro
    Poziom 16  
    Aha widzę, musiałem ściągnąć datasheeta,
    Faktycznie case mało elegancka, już lepiej if. Case jest chyba nawet wolniejszą funkcją niż if. Ja bym nie patrzył na wygląd kodu ale na jego zoptymalizowanie. Sprawdź co jest szybsze - case czy if.
  • #5 11107023
    mkpl
    Poziom 37  
    Masz jakiś pomysł na IF'a ? walczę z tym już z 6 godzin i lipa.

    Chwilowo napisałem select case jako wspólny podprogram dla basu i wysokich i jakoś to działa ale drażni mnie :)

    Na IF kombinowałem tak

    If zmienna >7 then
    zmienna = 14 - zmienna
    end if

    Oraz inne podobne i lipa nigdy to nie pracowało tak jak chciałem
  • Pomocny post
    #6 11107030
    Mundi1970
    Poziom 24  
    A nie lepiej zastosować Lookup?

    Kod: text
    Zaloguj się, aby zobaczyć kod
    -
  • Pomocny post
    #7 11107032
    farmerro
    Poziom 16  
    Cytat:
    If zmienna >7 then
    zmienna = 14 - zmienna
    end if
    Ale robiłeś to bez ELSE ?
  • #8 11107044
    mkpl
    Poziom 37  
    Mundi1970 > masz rację o Lookup zapomniałem ! i to chyba rozwiązuje wszystkie moje problemy. Sprawdzę to rano bo dziś już niedomagam.
  • Pomocny post
    #9 11107570
    Fredy
    Poziom 27  
    Chyba raczej tak powinieneś to przeliczyć :


    If zmienna >7 then
    zmienna = 22 - zmienna
    end if
  • #10 11108439
    mkpl
    Poziom 37  
    Dałem Lookup i działa wzorcowo. Przy okazji pozbyłem się przeliczania dla basu + 96 i wysokich 112 co wiązało się niestety z 2 tablicą ale przynajmniej kod prostszy.

    Oczywiście kod który przedstawił Fredy też działa poprawnie :)

    Pytanie czy IF jest szybszy niż Lookup? i jak się to ma do objętości kodu? Bo napisać kobyłę nie sztuka
  • #11 11109053
    Fredy
    Poziom 27  
    Taki if to kilka bajtow i napewno zajmie mniej pamieci flash i Ram. Skompiluj program w wersji 1 i 2 i sam porownaj wielkosc kodu .
  • REKLAMA
  • #12 11110518
    mkpl
    Poziom 37  
    Taka tablica w bascomie dajmy na to 10 elementowa zajmuje 10 bajtów? Tj 1 bajt na 1 element czy może jest to jakoś zoptymalizowane pod kątem ilości przechowywanych danych?
REKLAMA