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 napisać analizator widma akustycznego w Bascom dla LCD i Atmela?

bartods 05 Mar 2006 21:48 26173 86
Najlepsze odpowiedzi

Jak zrealizować analizator widma akustycznego na AVR w Bascomie z wyświetlaniem na LCD?

Zrób to przez próbkowanie sygnału audio, zebranie np. 128 próbek i policzenie DFT/FFT, a jeśli chcesz wykrywać tylko konkretne składowe, rozważ algorytm Goertzela; częstotliwość próbkowania musi być co najmniej dwukrotnie większa od szerokości pasma sygnału [#2380245] BASCOM jest do takiego zadania zwykle zbyt wolny, więc najlepiej pisać całość w ASM albo C [#2380245] Da się jednak zrobić DFT w Bascomie z wstawkami ASM — w wątku pokazano działający projekt z odświeżaniem około 25 Hz [#2381173] Wyniki widma możesz potem wyświetlać na LCD, ale trzeba liczyć się z ograniczeniami wydajności mikrokontrolera [#2380245][#2381173]
Wygenerowane przez model językowy.
REKLAMA
  • #31 2394724
    adamusx
    Poziom 27  
    Posty: 977
    Pomógł: 94
    Ocena: 28
    Reszte rozumem, ale do konca nie skumalem tego fragmentu z dzieleniem przez 32.

    hunterhouse napisał:
    Beta = I * K
    Beta = Beta And 31 // dlaczego Beta And 31 ???

    - to jest obliczenie kąta (i*k)
    and 31 to zamiana na kąt z przedziału do 0 do 2pi.
    bo w moim programie są 32 prubki numerowana od 0 do 31 czyli kąt też jest od 0 do 31. 31 to po prostu kąt 360st czyli 2pi.
    AND działa na bitach czyli m tym przypadku daje nam reszte z dzielenia przez 32.
    j.


    Beta przyjmuje wartosci od 0 do 15*31= 465 tak?
    powiedzmy ze Beta = 12 , po operacji:
    Beta = 12 And 31 ( bitowo 1100 And 11111) co da wynik 1100 czyli nadal 12, dla kazdej liczby mnieszej od 31 wykonanie tej operacji da nam to sama liczbe, dla liczb wiekszych od 31 wynikiem bedzie cos innego ( np Beta= 34 And 31 = 100010 And 11111 = 000010 czyli 2 . Nie bardzo mi sie to wszystko zgadza :/


    A tak wogóle to obliczasz 16 punktowa DFT dla 32 próbek, dla gornego i dolnego pasma ?

    Jeszcze jedna rzecz mi nie pasuje. Beta osiagnie maks wartosc 465 , po podzieleniu przez 32 = 15 ,czyli maks wartosc jaka mozemy wyciaganc z tablicy sinus:
    Tmp_c = sinus(15 + 8) * Dane[i] ,czyli
    sinus(23). Wiec dlaczego zdefiniowales tablice sinus na 32 elementy i dodatkowo jeszcze 8 kolejnych:

    Sinus(33) = Lookup(0 , Tab_sin)
    Sinus(34) = Lookup(1 , Tab_sin)
    Sinus(35) = Lookup(2 , Tab_sin)
    Sinus(36) = Lookup(3 , Tab_sin)
    Sinus(37) = Lookup(4 , Tab_sin)
    Sinus(38) = Lookup(5 , Tab_sin)
    Sinus(39) = Lookup(6 , Tab_sin)
    Sinus(40) = Lookup(7 , Tab_sin)

    ????
  • REKLAMA
  • #32 2394884
    hunterhouse
    Poziom 26  
    Posty: 893
    Pomógł: 84
    Ocena: 3
    bez karty katalogowej to nic nie zrobisz. to jest naprawde niezbędne.
    a tak wogóle to ja bym sobie odpuścił ten LCD bo AVR i tak bo dobrze nie obsłuży.
  • #34 2395066
    hunterhouse
    Poziom 26  
    Posty: 893
    Pomógł: 84
    Ocena: 3
    beta to kąt

    0
    ReX[i] = k= ∑ (x[k] * cos(2*pi*k*i / N))
    N-1

    to jest wrór na Rex
    i co w nim najważniejsze 2*pi/N jest stałe i można tak przygotować tablice sinusów i cosinusów aby dane te nie były potrzebne. wtedy kąt to tylko I*K i mamy duzo mniej do liczenia a wynik mamy ten sam

    teraz tak po wsztskich obiczeniach wyszło mi że potrzebuje 32 wartości sinusów i 32 wartości cosinusów do obliczania bo mam 32 prubki

    czyli 360st musze podzielić na 32 równe częsci i dla tych wartości muszę pamiętać wartości funkcji trygonometrycznych
    z tego wychodzi żę w mojej skali kąt pełen (360st) to 32 jednostki
    a ze sinus jest funkcja okresową powtażajacą sie co 360st (32 jednostki) to mogę kąt przelicząs na kąt z zakresu 0st-360st (0-32 jednostki)
    do tego służy właśnie ten AND 31.
    liczby 0-32 to kąt 0 do 360st.
    liczby 32-63 to kąt 360 do 720st

    czyli liczba 32 to 360st
    sinus(360st)= sin(0st)
    i tak samo
    sin(0)=sin(32)
    ale żeby nietrzeba było pamiętac takiej duzej tablicy to mogę tylko pamietać o 0 do 31 i potem sobie przelicząć kąt na taki jaki mam w tablicy
    xxx AND 31 czyli xxxxxxxx and 00011111 czyli działa to tak jak xxx mod 31
    tak samo sie przelicza kąty w stopniach
    xxx mod 360 czyli reszta z dzielenia przez 360

    teraz dalej cos(x)=sin(x+90) tak mnie na matmie uczyli bo cosinus wyglada tak samo jak sinus tylko jest przesuniety o kat 90st
    tak samo ja licze cosinuja biore watość sinusa szukanego kata + 90st
    a ze w programie kąt pełen to 32 to kąt 90st to 8

    teraz tak DFT i FFT tak działają że jak dasz im 32 prubki to ona ci wyżuci 2x16 wyników z tym że jedne są na osi rzeczywistej a drugie na urojonej.
    niema jak liczby zespolone :P

    tak liczyłem 2xDFT dla 2 częstotliwości prubkowania. a to dlatego że dft ma liniową skale częstotliwości
    czyli jak pasmo sprubkował bym z f=32kHz i pobrał 32 prubki to podzielił bym pasmo na 16 części przesuniętych co 1khz od 0 do 16kHz
    człowik niestety słyszy na logarytmicznej skali częstotliwości i żeby uzyskać odpowiednią rozdzielczość w niskich cześtotliwościach to musiałem prubkowąc z f =2kHz dla basów i z f=44kHz dla reszty.

    Cytat:
    Jeszcze jedna rzecz mi nie pasuje. Beta osiagnie maks wartosc 465 , po podzieleniu przez 32 = 15 ,czyli maks wartosc jaka mozemy wyciaganc z tablicy sinus:
    Tmp_c = sinus(15 + 8) * Dane[i] ,czyli
    sinus(23). Wiec dlaczego zdefiniowales tablice sinus na 32 elementy i dodatkowo jeszcze 8 kolejnych:

    tojuz chyba wyjaśniłem ale moge napisac jeszzce raz
    beta AND 31 daje jako wynik reszte z dzielenia przez 32 czyli liczby z zakresu od 0 do 31. powtażaja cię cylkicznie bo sin też jest cylkiczny

    a +8 (w sumie +9 ale to przez bascoma który dziwnie adresuje tablice) to zamiana cos na sinusa.
    poto też pobieram kolejne 8 wartośc do tablicy sinusów żeby wartość cosinusów mogła być poprawnie pobrana.

    jak byś jeszcze czegos nie wiedziłą to pisz.
    pozdrawiam

    ADD
    co do wyświetlania to ja bym naprawde propnował led'y sa dużo lepiej widoczne i tansze.
    np http://www.tme.pl/arts2/pl/opto/opto152.html przy 20 sztukach wychodzi 2PLN + vat czyli za 60PLN (już z przesyłką) masz 10słupków po 20 diodek.
    mój program obsługuje coprawda tylko 16 diodek ale 1 żądek możesz zapalić na stałe a 3 ostatnie zostawić niepodłaczone.

    jak byś kupił diody luzem to wyjdze jeszcze taniej tylko cały dzien lutowania :P
  • #35 2395301
    bartods
    Poziom 16  
    Posty: 356
    Ocena: 258
    Wiem że taniej ale chce to dać do przedwzmacniacza i chcę aby były też na LCD oprócz analizatora widma akustycznego wyświetlane informacje dotyczące poziomu głośności , line in-u , głośności basu i sopranu itd.
  • #36 2395423
    hunterhouse
    Poziom 26  
    Posty: 893
    Pomógł: 84
    Ocena: 3
    to daj 2x16 alfanumeryczny do przedwzmacniacza i ledy do DFT.

    na LCD to będzie widać tylko z bliska i naprawde nieda efektu
    ja juz 3 przedwmacniacze zrobiłem 2 z lcd i ci powiem że menu zabardzo komplikuje sprawe

    teraz ostatni co zrobiłem wyświetlanie też mam na ledach i jest duzó wygodniejsze w użyciu
  • #37 2395527
    adamusx
    Poziom 27  
    Posty: 977
    Pomógł: 94
    Ocena: 28
    Hunterhouse ten sposób z liczeniem liczby modulo jest genialy :) Sam na to wpadles??
    Na koncu jest jeszcze obliczany pierwiastek,tez to jest dosc czasochlonne dla procka , zastanawiam sie czy na niego nie ma podobnego sposobu :)

    Czyli beta przyjmuje wartosci od 0- 31, i zmienia sie w zaleznosci od k ,ale caly czas w zakresie 0-31 .

    Jak dokladnie obliczone sa sinusy w tebeli sinusow , kombinowalem ale nie chcialy my wyjsc takie wartosci:
    int16_t sinus[40]={0,50,98,142,181,213,237,251.... };
    Zgodnie ze wzorem na transformate i tak jak mowisz ze te katy sa stale i wynosza : 2*pi/N * (0..31) . To ze pierwsza wartosc =0 to logiczne :)
    Ale skad potem np 50??... licze 2*3,14/32*1 .... nie chce mi wyjsc :)


    Kwestia ldzielenia przez 256:. Tmp_s to liczba 16 bitowa ze znakiem?
    Tmp_s = High(tmp_s) wykonuje operacje >>8
    If Tmp_s.7 = 1 Then 'gdy ujemne uzupełnia 2 bajt
    Tmp_s = Tmp_s Or &HFF00
    Incr Tmp_s
    End If

    Z tego co zrozumialem- Tmp ma wartosci od -32768 do 32768
    Zapis binarny zxxxxxxxxxxxxxxx , gdzie z oznacza znak ,jesli 1 to liczba jest ujemna

    Tmp_s = High(tmp_s) -> zxxxxxxx
    If Tmp_s.7 = 1 Then -> jesli z =1 to mamy
    Tmp_s = Tmp_s Or &HFF00 - > xxxxxxxx zxxxxxxx ????
    Incr Tmp_s -> ???????????????

    Jesli liczba jest dodatnia wykonujemy tylko zwykle przesuniecie bitowe o 8 czyli dzielimy nasza liczbe przez 256 to kumam. Ale jesli liczba jest ujemna ??

    Tmp_s = High(tmp_s) -> zxxxxxxx
    If Tmp_s.7 = 1 Then -> jesli z =1 to mamy
    Tmp_s = Tmp_s Or &HFF00 - > xxxxxxxx zxxxxxxx ????
    Incr Tmp_s -> ???????????????

    otrzymujemy liczbe 16 bitowa :/


    Czy w programie pojawiaja sie gdzies obliczenia zmiennoprzecinkowe ??
  • REKLAMA
  • #38 2395847
    hunterhouse
    Poziom 26  
    Posty: 893
    Pomógł: 84
    Ocena: 3
    adamusx napisał:
    Ale skad potem np 50??... licze 2*3,14/32*1 .... nie chce mi wyjsc

    sin((360/32)*1)*256=49,8xxx czyli około 50
    sin((360/32)*2)*256=97,9xxx czyli około 98
    ..........
    i tak dalej

    co do pierwiastka to faktycznie troche mu to zajmuje (około 600 instrukcji) ale w sumie jest to robione jakieś 64 razy na odświeżenie i w skali glogalnej nie zabiera aż tak duzo zasobów.

    Cytat:
    Czyli beta przyjmuje wartosci od 0- 31, i zmienia sie w zaleznosci od k ,ale caly czas w zakresie 0-31 .

    dokładnie tylko w zależnoći ok K i I

    co do dzieleniea to wiem że to dziwnie wyglada ale działa bo testowałem to na różnych liczbach nawet taka pętle zrobiłem co liczyła normalnie i moim sposobem i porunwnywałe wyniki

    to chba przez to że bascom używa do zapisu liczb ujemnych kodu U1 czyli
    1 to 000000000000001
    0 to 000000000000000
    -1 to 1111111111111111
    -2 to 1111111111111110
    -3 to 1111111111111101
    -4 to 1111111111111100
    itp ..............................
    jak robisz w c albo asm to zrub tu poprostu przesunuiece arytmetyczne albo jakiś inny knyf na podzielenie przez 265

    teraz tak co do tego modulo to już nie pamiętam jak to było dokładnie ale jak być przeczytał cały temat ja to robiłem to tam wszystko jest

    liczba zmienno przecinkowa chba jest ale to dopieor na koncu .
    tak znalazłem jak licze wysokość słupka to używam logarytmu a on działa tylko na zmiennym przecinku, ale to dało by sie stablicować albo jakoś inaczej ominąć.
  • #39 2396012
    adamusx
    Poziom 27  
    Posty: 977
    Pomógł: 94
    Ocena: 28
    heh faktycznie ,ze tez nie pomyslalem ze nie 2*Pi tylko 360 :)

    Przenosze ten kod do C i mam male problemy z ujemnymi liczbami.

    Dane[k] = Sample[k] - Poziom; Wychodzi mi ze Dane[k] przyjmuja tez ujemne wartosci, moze tak byc ? z tym ze np dla -1 mam FFFF , dla -2 FFFE , dla -3 FFFD.. i tu wlasnie mam maly problem ..GCC cos kaszani z ujemnymi.
  • REKLAMA
  • #40 2396070
    hunterhouse
    Poziom 26  
    Posty: 893
    Pomógł: 84
    Ocena: 3
    dane(k) - to dane wejsciowe dla DFT i one musza być ze znakiem
    Sample(k) - to dane z przetwornika ADC (8bitowe)
    Poziom - średnia z wszystkich próbek czyli poziom masy

    ja wszysstki obliczenia robiłem na liczbach integer czyli 16 bitowe za znakiem czyli -32768 do 32768
    i to starczyło

    Cytat:
    .GCC cos kaszani z ujemnymi.

    ludzie nazekają na bascoma a on jest naserio dobry tylko trzeba umieć w nim pisać. i niepozwolić żeby myślał za ciebie.
    jak go się dobrze zna i umie nad nim zapanować to jest naprawde dobry.

    w c za duzu ci nie pomogę niestety

    ADD:
    te ujemne to chyba tak jak bascom kod U1 bo na nim najłatwiej obliczenia robić
  • #41 2396100
    bartods
    Poziom 16  
    Posty: 356
    Ocena: 258
    znalazłem w końcu datasheet tego LCD i wiem już który pin to który a oprócz tego ten LCD jest dzielony na 2, górę i dół.

    SHARP LM64P728

    Pin No,Pin name/signal;
    1 S (startup scan signal)
    2 CP1 (input data latch signal)
    3 CP2 (Data input latch signal)
    4 Vdd (power suply for logic and LCD +5V)
    5 Vss (GND)
    6 Vee (~-16.2V)
    7 Vss (GND)
    8 DU0 (data Upper half area)
    9 DU1
    10 DU2
    11 DU3
    12 DL0 (data lower half area)
    13 DL1
    14 DL2
    15 DL3


    Screen area;

    ____________________
    |1,1.....................1,640|
    |....Upper half area...... |
    |240,1..............240,640
    ----------------------------
    |241,1 ..............41,640|
    |....Lower half area.......|
    |480,1..............480,640|
    ----------------------------

    Czy to znaczy że osobno można podłączyć 2 układy aby jeden wyświelał na górze a drugi na dole :?:
  • #42 2396128
    hunterhouse
    Poziom 26  
    Posty: 893
    Pomógł: 84
    Ocena: 3
    no to sterowanie ma tak jak mój. przynajmnie podobnie tylko że ja miałem tylko 4DATA a ty masz 8 data i o raz wiecej pikseli.

    teraz tak dwa procki to chba nie dasz rady bo sygnały
    1 S (startup scan signal)
    2 CP1 (input data latch signal)
    3 CP2 (Data input latch signal)
    masz wspulne dla obu częsci

    na wysokość to procek sie obrobi tylko potrzebuje sporo pamieci ale na szerokosć to chyba nie
    bo mój miał 320 i ledwo zipał a tu jest jeszcze raz tyle :((
    no chba zeby dało sie pominac część ekranu ale to bez sensu.
    czyli zostaje ci przyspieszyć mój program chociż w sumie tego juz duzo sie nieda bo jest w asm i naprawde duzo nad tym siedziałem.
    albo OVERCLOKING AVR. kiedyś o tym czytałem ponoś 22MHz wytrzymują na zewnętrznym oscylatorze.

    no albo inny procesor :))

    ADD: wybaczcie moja ortografie ale kiepsko mi to idzie :D
  • #43 2396146
    adamusx
    Poziom 27  
    Posty: 977
    Pomógł: 94
    Ocena: 28
    Juz sobie poradzilem z ujemnymi liczbami, GCC liczyl poprawnie tylko ja popelnilem blad.
    Co do BASCOMA od niego zaczynalem zabawe z mikrokontrolerami. Pisze sie w nim naprawde szybko i przyjemnie i faktycznie jesli potrafi sie nad nim zapanowac to jest to naprawde dobre narzedzie. Na GCC przerzucilem sie niedawo z tego wzgledu ze jest to darmowe srodowisko, poza tym jestem na etapie poszukiwania pracy i czestokrosc juz trafilem na firmy gdzie wymagali znajomosci programowania prockow w C.
  • #44 2396161
    bartods
    Poziom 16  
    Posty: 356
    Ocena: 258
    znaczy się tak planuje aby analizator był wyświetlany na mniej więcej połowie ekranu a druga połowa to mają być informacje dotyczące poziomu głośności itp...
    Do samych informacji chyba nie będzie potrzebna aż taka moc obliczeniowa a Analizator może być i na 1/4 ekranu.
    Lub zamiast analizatora paskowego może oscyloskop mniej by potrzebował. Co wdg Ciebie będzie lepsze :?:
    A jaki procesor by się obrobił :?: :D
  • #45 2396197
    hunterhouse
    Poziom 26  
    Posty: 893
    Pomógł: 84
    Ocena: 3
    @adamusx ja umiem bascom i asm jak potrzeba to wstawiam.
    co c niemogę sie przekonać bo ma taką dzika składnie. i wkurza mnie że wszyscy tylko ten c i c jak by to było niewiem co.
    wiem że basick kładzie go na łopadki jeśli chodzi o operacje na stringach hehe.

    juz kilka razy prubowałem przejść na c ale zawsze wracam na Basica.

    @bartods
    wyświetlanie paskowe czy oscyloskop nie ma ruznicy to tylko reprezentacje wyników, a DFT (lub fft) i tak trzeba zrobić.

    co do mocy obliczeniowej uP to chodzi o to że obraz do tego wyswietlacza trzeba wysłac 70x na sekunde
    czyli 640x480x70/8 =2688000 B musisz pobrać z ramu i wysłąć do LCD. a to właśnie zajmuje najwiecej czasu. dużo no nie ????
    potrzebujesz 38400b pamięci ram do zapisania obrazu w ramie.
    ten LCD to tylko szklany panel i prosta logika.

    ADD:
    Cytat:
    A jaki procesor by się obrobił

    ARM to napewno ale to by była profanacja taki wydajny chip do takich prostych rzeczy. hehe
  • #46 2396237
    adamusx
    Poziom 27  
    Posty: 977
    Pomógł: 94
    Ocena: 28
    Mierzyles moze czas wykonania obliczen DFT ?? U mnie w symulatorze liczy DFT ( dla jednego pasma) w 3.5ms , nie wiem czy to dobry czas czy nie :)
  • #47 2396264
    hunterhouse
    Poziom 26  
    Posty: 893
    Pomógł: 84
    Ocena: 3
    niebardzo pamiętam ale chyba wiecej.
    w sumie mam do pełnych cylki na sekunde czyli cały cykł trwa 50ms.
    na jedno pasmo wychodzi 25ms umie prubkowanie jest robione równolegle z DFT (dla drugiego pasma)
    do tego dochodzi okienkowanie itp i pierwiastki i potęgi i ten logarytm na końcu.

    ale w sumie to chyba u mnie to gożej wygłądało pewnie z 5-15ms (pomyłka juz poprawiłem) ale dokładnie nie pamietam co ile trwało.
    a pokaz co napisałeś ??
  • #48 2396311
    adamusx
    Poziom 27  
    Posty: 977
    Pomógł: 94
    Ocena: 28
    W zasadzie wzoruje się na Twoim kodzie, skoro dziala to nie bede narazie nic modyfikowal tylko go przerzucm do C. Musze zakupic procka to wtedy potestuje to w realu :) i ewentualnie cos pozmieniam Wrzuce calosc jak skoncze.

    Co do C też mialem kilka podejsc, ale w koncu sie przerzucilem i w sumie nie narzekam. Duzym plusem jest to ze wspolpracuje z AVRstudio, gdzie mam mozliwosc dokladnego przesledzenia pracy programu, lacznie z podgladem kodu w ASM , pomiaru czasu i cykli.
    Sprawdzilem tez obliczenia pierwiastka- zajmuja 26us ( 416 cykli )

    Pytanko co do tego :

    Przelicz_high:
    Suma = Rex(2)
    If Rex(3) > Suma Then Suma = Rex(3)
    Wynik(6) = Suma


    Suma = Rex(4)
    If Rex(5) > Suma Then Suma = Rex(5)
    Wynik(7) = Suma


    Suma = Rex(6)
    If Rex(7) > Suma Then Suma = Rex(7)
    If Rex(8) > Suma Then Suma = Rex(8)
    Wynik(8) = Suma


    Suma = Rex(9)
    If Rex(10) > Suma Then Suma = Rex(10)
    If Rex(11) > Suma Then Suma = Rex(11)
    If Rex(12) > Suma Then Suma = Rex(12)
    Wynik(9) = Suma


    Suma = Rex(13)
    If Rex(14) > Suma Then Suma = Rex(14)
    If Rex(15) > Suma Then Suma = Rex(15)
    If Rex(16) > Suma Then Suma = Rex(16)
    Wynik(10) = Suma


    Return


    Co to za czary mary tam się dzieja :) ?
  • #49 2396747
    hunterhouse
    Poziom 26  
    Posty: 893
    Pomógł: 84
    Ocena: 3
    Cytat:
    Co to za czary mary tam się dzieja

    hehe prawdziwe czary.
    najpierw troche teori: sygnał wyściewy z DFT ma liniową skale częstotliwości. człowiekowi lepiej podać logarytmiczna bo jemu lepiej to odpowiada.
    czyli mamy z pojedyńczej transformaty 16 prązków i musimy to zapisąć na 5 słupkach (tak było w moim przypadku) i do tego rozplanować logarytmicznie.
    czyli na 1 słupak idzie 2 i 3 wynik transformaty
    (pierwszy odrzucamy bo jego wynikiem jest składowa stała i bardzo niskie częstotliwości)
    na 2 słupak idzie sygnał z 4 i 5 dft
    na 3 słupek idzie wynik z 6,7,8 dft
    itd..........................

    teraz tak należy te słupki jakoś złączyćw jeden wynik.
    najpierw myślałem o średniej ale ona miała poważny minus im więcje składowych na jeden słupek tym słupek ten stawał sie bardziej statyczny i mulasty, reagowałbardzo powoli i był raczej w okolicy połowy skali.

    wiec wymyśliłem sobie ze do wyników będe pobierał zawsze największy wynik z danego zekresu i to włąśnie jest to
    Suma = Rex(13) 
    If Rex(14) > Suma Then Suma = Rex(14) 
    If Rex(15) > Suma Then Suma = Rex(15) 
    If Rex(16) > Suma Then Suma = Rex(16) 
    Wynik(10) = Suma

    sprawdza które jest największe i ten wynik zapisuje
    nierobiłe tego w pętli bo była ona skomplikowana i działała wolniej a pamięci na program jeszcze miałem troche wolnej i postanowiłem jej nie oszczędzać.

    bascom też ma symulatro który pokażuje ilość cylki, symuluje timery itp, jedyne czego niema to podglądu asm.
    w sumie to jest największa wada bascoma że nie wyżuca kodu pośredniego w asm. można by wtedy jeszcze wiele żeczy poprawić albo przyspieszyć. :((
  • #50 2397495
    adamusx
    Poziom 27  
    Posty: 977
    Pomógł: 94
    Ocena: 28
    Juz rozumiem:)

    A jeszcze sama koncowka czyli obliczanie wartosci wyswietlanej na ledach :

    Save:
    For K = 1 To 10
    Sing = Wynik(k) * 0.02

    'do poprawy liniowaści widma (analogowe filty coś inaczej chodzą niż miały)
    'If K > 5 Then Sing = Sing * 1.25 // dobierales tu wzmocnienie ?

    Sing = Sing / 0.775
    Sing = Log10(sing)
    Sing = 20 * Sing // tu tez widze jakies przeskalowanko
    Tmp_c = Sing + 6

    If Tmp_c < 0 Then Tmp_c = 0
    If Tmp_c > 15 Then Tmp_c = 15


    // ta czesc jest dosyc zakrecona :)
    Wynik(k) = Tmp_c

    If Wynik(k) >= Wynik_o(k) Then
    Wynik_o(k) = Wynik(k)
    Else
    Wynik_o(k) = Wynik_o(k) - 1
    End If

    If Peks(k) < Wynik_o(k) Then
    Peks(k) = Wynik_o(k)
    Peks_o(k) = 5
    Else
    Decr Peks_o(k)
    If Peks_o(k) = 0 Then
    Peks_o(k) = 5
    If Peks(k) > 0 Then Decr Peks(k)
    End If
    End If

    // tu rozumiem ze w zaleznosc od konfiguracji( stanow pinow 3 i 4 ) mozna wybrac efekt samo peak , samo widmo albo i to i to tak ?

    Wynik_c(k) = 0
    Wynik_d(k) = 0
    If Pina.3 = 0 Then Wynik_c(k) = Lookup(wynik_o(k) , Portc_out)
    If Pina.3 = 0 Then Wynik_d(k) = Lookup(wynik_o(k) , Portd_out)

    I = Lookup(peks(k) , Peks_c)
    Beta = Lookup(peks(k) , Peks_d)
    If Pina.4 = 0 Then Wynik_c(k) = Wynik_c(k) Or I
    If Pina.4 = 0 Then Wynik_d(k) = Wynik_d(k) Or Beta


    Tylko troche sie pogubilem w samym sposobie wyswietlania
  • #51 2397609
    hunterhouse
    Poziom 26  
    Posty: 893
    Pomógł: 84
    Ocena: 3
    If K > 5 Then Sing = Sing * 1.25 - filtr górno przepustowy (analogowy) coś zamocno tłumił i musiałem to wzmocnić programowo bo płytka była juz dość mocno pogmatwanai niebyło miejśca na przerubkę.
    poprostu wzmacnia górną transformate.


    Sing = Sing / 0.775 -to niepamiętam po co pewnie żeby mi się ni przesterował

    Sing = Log10(sing)
    Sing = 20 * Sing - to jest wzór na moc sygnału w decybelach
    x(w jednostach dB)= 20 * log( y(w Woltach) )

    Tmp_c = Sing + 6 -to po to bo logarytm wychodził na minusie i żeby szło to normalnie obrabiać to przesuwam o 6 do góry



    Wynik(k) = Tmp_c 
    
    If Wynik(k) >= Wynik_o(k) Then 
    Wynik_o(k) = Wynik(k) 
    Else 
    Wynik_o(k) = Wynik_o(k) - 1 
    End If 
    
    If Peks(k) < Wynik_o(k) Then 
    Peks(k) = Wynik_o(k) 
    Peks_o(k) = 5 
    Else 
    Decr Peks_o(k) 
    If Peks_o(k) = 0 Then 
    Peks_o(k) = 5 
    If Peks(k) > 0 Then Decr Peks(k) 
    End If 
    End If


    to jest odpowiedzialne za powolne opadanie słupków, słupek skacze do góry bardzo sybko a opada powoli.

    peaks opada jeszcze wolniej
    wynik(k) - to wynik do wyświetlenia aktualnie juz przeliczony na ilość diodek
    wynik_o(k) - to wynik z poprzedniego obliczenia i wartość diodek do wyświetlania

    teraz co do wyświetlania. zmienne :
    Wynik_c(k)
    Wynik_d(k)
    to wartości które są wzucane bezpośrednio na portc i portd uP
    ich wartości sa pobierane bezposrednio z tablicy a indeksowane są przez zmienna wynik_o(k)

    wyświetlanie jest multipleksowe
  • #52 2448391
    bartods
    Poziom 16  
    Posty: 356
    Ocena: 258
    Długo mnie nie było.
    Koledzy mam mały problemik z układzikiem i programatorem.
    mianowicie:
    zrobiłem sobie prosty programator i zakupiłem ATMEL Attiny2313v i mam problem ponieważ sprawdzałem już programator czy gdzieś nie było zimnego lutu i wyszło że wszystko git ale w Bascomie nie chce mi nawet wykryć czipu i niewiem co jest.
    Może ktoś mógł by mi pomóc :cry:
    a poniżej umieszczam schemat tego programatorka z resztą ściągniętego z elektrody :P

    A i non stop wyświetla mi w Bascom (Could not identify chip with ID:FFFFFF) nie można zidentyfikować układu z identyfikatorem FFFFFF.
    Co to znaczy :?: Gdzie jest błąd :?:
    A także Verify failed :?:
    Czy to wina układu czy programatora :?:
    Zasilanie na układzik dałem z zasilacza kompa 5V sprawdzałem woltomierzem i było 5.15V , czy to możliwe że te 0,15V przeszkadza :?:
    Załączniki:
    • Jak napisać analizator widma akustycznego w Bascom dla LCD i Atmela? progrmmr.gif (8.18 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #53 2449563
    hunterhouse
    Poziom 26  
    Posty: 893
    Pomógł: 84
    Ocena: 3
    co do napiecie zasilania to 5,5V jeszcze niepowiduje żadnych negatywnych skutków a jak znam życie to i 6 jeszcze będzie chodził.

    co do programatora to ja bym proponował sprawdzić ten z pomocy bascoma. nazywa sie sample programer, stosowałem go dość długo i niebyło z nim kłopotów, przynajmniej jak procek chodził poniżej 8Mhz

    ten twój programator to jest cos podobnego ale dokładnie niepamiętam które nuzki gdzie idą. polecam lekture pomocy do bascoma

    Could not identify chip with ID:FFFFFF - to standardowy błąd jak niewykryje chipa
    sprawdz też czy w ustawieniach programatora masz poprawny programator i czy jest ustawiony na poprawy adres lpt
  • #54 2452753
    bartods
    Poziom 16  
    Posty: 356
    Ocena: 258
    Właśnie niewiem na jaki typ programatora ustawić.
    Sprawdzałem już wszystkie możliwości i nic.
    Ale dzięki za pomoc spróbuje tego programatorka z helpa Bascoma .

    Pozdrawiam..

    Szukałem w helpie ale znalazłem tylko podłączenie I2C , 1WIRE i nic więcej :( mógł byś wrzucić schemat tego programatora :?: i do których pinów portu podłączyć :?:
  • #56 2454739
    bartods
    Poziom 16  
    Posty: 356
    Ocena: 258
    A ma może ktoś z was jakiś już sprawdzony schemat programatora który poradzi sobie z układem ATTINY2313V-10SI :?:
    I czy mógł by go wrzucić :?:
  • REKLAMA
  • #58 2459543
    bartods
    Poziom 16  
    Posty: 356
    Ocena: 258
    A czy ktoś z was próbował takiego programatora do ATTINY2313v-10si :?:
    I czy to ma szansę pójść na Bascomie :?:
    Załączniki:
    • Jak napisać analizator widma akustycznego w Bascom dla LCD i Atmela? schemat02a.gif (6.19 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #59 2460103
    hunterhouse
    Poziom 26  
    Posty: 893
    Pomógł: 84
    Ocena: 3
    moze być kiepsko bo bascoma raczej nie daje zasilania na wolne piny lpt

    zato ja mam do ciebie cos innego
    jest to programator z pomocy do bascoma. używałem go dość długo i dalej czasami używam.
    na kwarcu 4Mhz śmiga bardzo ładnie, przy większych kwarcach troche się wykłada.

    w pomocy jest on opisany jako "The simple cable programmer from Sample Electronics."

    tak też trzeba go ustawić w ustawieniach programowania w bascom.
    Załączniki:
    • Jak napisać analizator widma akustycznego w Bascom dla LCD i Atmela? Clipboard02.jpg (42.35 KB) Musisz być zalogowany, aby pobrać ten załącznik.

Podsumowanie tematu

✨ Dyskusja dotyczy realizacji analizatora widma akustycznego w Bascomie dla mikrokontrolerów Atmel z wyświetlaczem LCD. Podstawowym problemem jest ograniczona moc obliczeniowa AVR, co utrudnia implementację szybkiej transformaty Fouriera (FFT) lub DFT w Bascomie, dlatego zalecane jest stosowanie asemblera lub C dla efektywności. Proponowane metody obejmują próbkowanie sygnału z częstotliwością co najmniej dwukrotnie większą niż pasmo sygnału, zbieranie próbek (np. 32 lub 128) i obliczanie widma za pomocą FFT lub algorytmu Goertzela. Wyniki widma można wyświetlać na graficznym LCD lub diodach LED, jednak wyświetlacze graficzne bez sterownika (np. SHARP LM64P728 640x480) wymagają bardzo dużej przepustowości i pamięci RAM, co przekracza możliwości pojedynczego AVR. Rozwiązaniem może być zastosowanie dwóch mikrokontrolerów – jeden do obliczeń, drugi do wyświetlania – jednak wymaga to zaawansowanej synchronizacji i szybkiej pamięci zewnętrznej. W Bascomie brak natywnego wsparcia dla wyświetlaczy graficznych bez sterownika, co wymusza ręczne programowanie obsługi pikseli i czcionek. Dyskutowano także o problemach z programowaniem mikrokontrolerów ATTiny2313 za pomocą prostych programatorów, gdzie istotne są poprawne połączenia, ekranowanie kabli, odpowiednie ustawienia portu LPT i stabilne zasilanie 5V. Wątki obejmowały także implementację funkcji DFT, zarządzanie tablicami sinusów i okienkowania (Blackman, Hamming, Hanning), obsługę wartości ujemnych w obliczeniach, oraz skalowanie i logarytmowanie wyników do wyświetlania na LED. Podkreślono, że Bascom jest dobrym narzędziem, jeśli zna się jego ograniczenia i potrafi optymalizować kod, ale dla bardziej zaawansowanych projektów lepszy jest C lub asembler. Wskazano na konieczność posiadania dokumentacji LCD i dobranie odpowiedniego wyświetlacza z wbudowanym sterownikiem dla łatwiejszej obsługi.
Wygenerowane przez model językowy.
REKLAMA