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

Przeróbka programu analizatora widma akustycznego - bascom

manekinen 14 Cze 2007 14:43 36649 57
  • #1 14 Cze 2007 14:43
    manekinen
    Poziom 29  

    Witam, próbuje przerobić lekko program analizatora widma, autorstwa Hunterhouse (temat pierwotny https://www.elektroda.pl/rtvforum/topic465823.html)..

    Chodzi o to że zamiast na diodach LED, widmo ma się wyświetlać na wyświetlaczu LCD 2x16. Było 10 słupków każdy po 16 poziomów, więc na LCD podobnie, 10 podwójnych słupków po 16 poziomów (dolny 8 i górny 8 co daje razem 16).

    Tak z grubsza rozumiem działanie tego programu (nie wnikałem w sposób obliczania kątów i poziomu słupków, tego nie zamierzam ruszać), usunąłem troche nie potrzebnych rzeczy, dopisałem obsługę wyświetlacza LCD na warunkach, biorąc już wyliczony poziom słupka ze zmiennej "wynik_o" która wynosi od 1 do 16 (16 poziomów). Dopisałem więc 16 warunków, i w ciągu jednej pętli tylko jeden jest prawdziwy, i obsługuje dany słupek, zmieniany za pomocą zmiennej "K" która co pętle zmienia się od 1 do 10 (10 słupków). Zmienna "K" jest wykorzystywana w obliczaniu wysokości słupka, więc się pod nią podpiąłem, i od razu wyświetlam dany słupek na wyświetlaczu, wszystko w jednym podprogramie "save".

    Problem polega na tym, że wszystkie słupki pokazują ten sam poziom. Przy częstotliwości 8MHz działało to zbyt wolno. Więc jak zrobił to Autor, tak i ja zrobiłem, i dałem 16MHz. Odświerzanie było znośne, ale LCD zaczął się krzaczyć, i wyświetlać jakieś nie porządane znaki. Tylko chwilami pracuje dobrze, ale nadal pozostaje problem wyświetlania tej samej wartości dla każdego słupka.

    uC jaki użyłem to ATMega8, przestawiłem tylko porty. Załączam schemat(pierwotny), i przerobiony przeze mnie kod, widać które komentarze zostały dodane przeze mnie :) . Dołączam także krótki filmik obrazujący działanie LCD. Kod pierwotny znajduje się pod linkiem podanym wyżej, wraz z dodatkowymi schematami, i dokładnym opisem.

    Nie mam pojęcia już co może być nie tak, specem w programowaniu to ja nie jestem, jak dotąd napisałem samodzielnie tylko program cyfrowego zegarka/stopera z budzikiem i jakimiś tam wodotryskami. Byłbym wdzięczny jeżeli ktos zechciał by rzucić okiem i ew. coś poprawić/poradzić/zoptymalizować, moge rozdać swoje skromne 40 punktów :)

    Pozdrawiam.

    filmik - http://www.mediafire.com/?5j4zi13rooe

    0 29
  • Oscyloskop cyfrowy Siglent SDS1104X
  • Pomocny post
    #2 14 Cze 2007 17:56
    hunterhouse
    Poziom 26  

    Witam

    Cieszę się, że mój program, który defakto nie jest szczytem programowania, kogoś zainteresował.
    Ogólnie działa on dość fajnie ale mógł by lepiej hehe.

    Teraz co do programu, to nie mam czasu na dokładną analizę całości (sesja :/ ), nawet swojego kodu już dobrze nie kojarze, ale zauważyłem jedną rzecz:
    kolega, w tym co dopisał używa zmiennej

    Code:
    wynik_o
    a tak naprawdę to to jest tablica 10 zmiennych i powinno się używać
    Code:
    wynik_o(k)


    Niech kolega to zmieni, i napisze co i jak

    Co do wykrzaczania to możliwe ze bufor się kończy. :/ Ja to projektowałem na ATmega8. Potem się okazało. że trzeba dać 8535 bo ma więcej pinów i był problem z wolnym ramem.

    Teraz jak kolega ma atmega8 to proponuje zwiększyć bufor w opcjach kompilacji
    "Hard stach", "Soft stack" oraz "Frame" w granicach rozsądku.

    Pozdrawiam i czekam na odzew

    0
  • #3 14 Cze 2007 19:07
    manekinen
    Poziom 29  

    Tak, jest 10 zmiennych "wynik_o"

    Ale każda jest wyświetlana osobno (mam nadzieje).

    To może ja przytocze tutaj fragment żeby nie mieszać całością:


    Tutaj wyliczane są końcowe wartości poszczególnych słupków, i dalsze wyniki za każdym razem są zmieniane dla następnego słupka, dochodzi "for K = 1 to 10"

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


    Sing = Sing / 0.775
    Sing = Log10(sing)
    Sing = 20 * Sing
    Tmp_c = Sing + 6



    Ten zdaje się odpowiada za to żeby wartości słupków utrzymywały się w swojej granicy, czyli od 0 do 16. Pobiera wynik z "tmp_c".
    Code:
    If Tmp_c < 0 Then Tmp_c = 0
    
    If Tmp_c > 16 Then Tmp_c = 16

    Wynik(k) = Tmp_c                                            'przeniesienie wyniku z TMP_C do zmiennej WYNIK


    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) = 7
    Else
          Decr Peks_o(k)
          If Peks_o(k) = 0 Then
             Peks_o(k) = 7
             If Peks(k) > 0 Then Decr Peks(k)
          End If
    End If



    Tutaj był wybór rodzaju wyświetlania, peaks itp, na razie go pominąłem w programie...


    Tutaj rodzieliłem "wynik_o(K)" , "wynik_o" i "K" używane są osobno...

    A więc
    Code:
    Kl = K + 6

    Analizator ma być z prawej strony wyświetlacza, czyli zajmować pozycje od 7 do 16, więc do "K" która jest od 1 do 10, dodaje 6, i otrzymuje wynik w zmiennej "KL"


    Tutaj dopisałem wyświetlanie odpowiednich wartości na lcd, gdzie:
    chr(32) to spacja - kasowanie słupka
    chr(95) to jedna kreska na dole - _
    chr(255) to znak zapełnionego całego pola 5x8, czyli max połowy słupka
    chr(0) do chr(5) to własne znaki, określające stopniowe wypełnienie jednego znaku...
    Jest razem 17 warunków, bo jeszcze wartość 0 kiedy nie ma podanego sygnału i nic się nie wyświetla, kasując poprzednie słupki (nie używam komendy "cls" która wprowadza straszne migotanie i niemiły efekt).

    A więc najpierw lokuje położenie kursora na pierwszej linii, na znaku K+6, czyli KL, wpisuje odpowiedni znak dla odpowiedniej wartości 0-16, następnie lokuje kursor na linii niżej na tym samym znaku K+6 co w pierszej linii, i także wpisuje do niego znak określony w danym warunku 0-16.




    Code:
    If Wynik_o = 0 Then
    
    Locate 1 , Kl
    Lcd chr(32)
    Locate 2 , Kl
    Lcd chr(32)
    End If

    If Wynik_o = 1 Then
    Locate 1 , Kl
    Lcd Chr(32)
    Locate 2 , Kl
    Lcd Chr(95)
    End If

    If Wynik_o = 2 Then
    Locate 1 , Kl
    Lcd Chr(32)
    Locate 2 , Kl
    Lcd Chr(0)
    End If

    If Wynik_o = 3 Then
    Locate 1 , Kl
    Lcd Chr(32)
    Locate 2 , Kl
    Lcd Chr(1)
    End If

    If Wynik_o = 4 Then
    Locate 1 , Kl
    Lcd Chr(32)
    Locate 2 , Kl
    Lcd Chr(2)
    End If

    If Wynik_o = 5 Then
    Locate 1 , Kl
    Lcd Chr(32)
    Locate 2 , Kl
    Lcd Chr(3)
    End If

    If Wynik_o = 6 Then
    Locate 1 , Kl
    Lcd Chr(32)
    Locate 2 , Kl
    Lcd Chr(4)
    End If

    If Wynik_o = 7 Then
    Locate 1 , Kl
    Lcd Chr(32)
    Locate 2 , Kl
    Lcd Chr(5)
    End If

    If Wynik_o = 8 Then
    Locate 1 , Kl
    Lcd Chr(32)
    Locate 2 , Kl
    Lcd Chr(255)
    End If

    If Wynik_o = 9 Then
    Locate 1 , Kl
    Lcd Chr(95)
    Locate 2 , Kl
    Lcd Chr(255)
    End If

    If Wynik_o = 10 Then
    Locate 1 , Kl
    Lcd Chr(0)
    Locate 2 , Kl
    Lcd Chr(255)
    End If

    If Wynik_o = 11 Then
    Locate 1 , Kl
    Lcd Chr(1)
    Locate 2 , Kl
    Lcd Chr(255)
    End If

    If Wynik_o = 12 Then
    Locate 1 , Kl
    Lcd Chr(2)
    Locate 2 , Kl
    Lcd Chr(255)
    End If

    If Wynik_o = 13 Then
    Locate 1 , Kl
    Lcd Chr(3)
    Locate 2 , Kl
    Lcd Chr(255)
    End If

    If Wynik_o = 14 Then
    Locate 1 , Kl
    Lcd Chr(4)
    Locate 2 , Kl
    Lcd Chr(255)
    End If

    If Wynik_o = 15 Then
    Locate 1 , Kl
    Lcd Chr(5)
    Locate 2 , Kl
    Lcd Chr(255)
    End If

    If Wynik_o = 16 Then
    Locate 1 , Kl
    Lcd Chr(255)
    Locate 2 , Kl
    Lcd Chr(255)
    End If


    Next K                                                      'przeniesione znad warunków
    Return

    i dopiero tutaj na koniec przeniosłem "next K" aby wyliczyć kolejną wartość słupka i wyświetlić. Więc za jednym razem do wyświetlacza wysyłane są tylko dwa znaki, górnej i dolnej linii. Na pewno jest to mniej obciążające niż jak by wysyłać wszystkie znaki na raz.

    Więc nie wiem czy dobrze to wykombinowałem, bo wysokość wszystkich słupków jest taka sama, mimo że się zmienia. A nie wiem jak miał bym użyć całości "wynik_o(K)". Czy to jest źle? Jeśli tak to jak można to rozwiązać inaczej?


    A co do wykrzaczania, to ewidentnie proc się zapycha, bo czasami aż się zawiesza i nie rusza. A atmega8 ma taką samą częstotliwość co atmega8535, a nawet dwa razy więcej sramu, więc nie wiem czy nie jest to wina dopisanej obsługi wyświetlacza?

    hunterhouse napisał:
    co do wykrzaczania to mozłiwe ze bufor sie konczy :/ ja to projektowałe na ATmega8 potem sie okazało że trzeba dać 8535 bo ma więcej pinów i był problem z wolnym ramem

    teraz jak kolega ma atmega8 to proponuje zwiekszyc bufort w opcjach kompilacji
    "Hard stach", "Soft stack" oraz "Frame" w granichach rozsądku.

    Zwiększałem, najpierw dwukrotnie od domyslnych ustawień, później czterokrotnie, tak jak by chodzi troszkę płynniej, ale nadal się wykrzacza i zawiesza.


    DODANO

    Chyba mózgu rano nie ubrałem :oops:
    Ok już złapałem, teraz każdy warunek zamiast wyglądać
    Code:
    If Wynik_o = 1 Then
    
    Locate 1 , Kl
    Lcd Chr(32)
    Locate 2 , Kl
    Lcd Chr(95)
    End If

    to wygląda
    Code:
    If Wynik_o(K) = 1 Then
    
    Locate 1 , Kl
    Lcd Chr(32)
    Locate 2 , Kl
    Lcd Chr(95)
    End If



    Zrobiłem jednak jak kolega radził, aby stosować całą "wynik_o(k)", i dopiero teraz zajarzyłem o co chodzi
    Teraz słupki chodzą już osobno, i naprawde fajnie się zaczyna robić, gdyby jeszcze wszystko się nie krzaczyło...
    teraz już słupki chodzą osobno

    0
  • Pomocny post
    #4 14 Cze 2007 19:35
    hunterhouse
    Poziom 26  

    k jest tylko indeksem i niejest w żadne sposób powiązany z wynik_o
    jak użyjesz wynik_o to zawsze kozystasz z piewszej komurki tablicy danych niezależnie od k, i to właśnie z tąd te same wyniki

    zamien analogicznie reszte i powinno być oki

    Code:
    If Wynik_o(k) = 0 Then 
    
    Locate 1 , Kl
    Lcd chr(32)
    Locate 2 , Kl
    Lcd chr(32)
    End If


    jeszcze jedna opcja do wykrzaczania jeśli wyświetlacz pracuje w trybie 4 bitowym (a raczje tak jest) to nieurzywane piny LCD podłącz do masy (DB0-DB3)

    0
  • #5 14 Cze 2007 19:46
    manekinen
    Poziom 29  

    Oczywiście każdy warunek zmieniłem i wygląda to już po ludzku, i nawet kompilując to pod bascomem osiąga przyzwoite odświerzanie.

    Tak, w 4 bitowym - akurat 6 pinów portu b jest przyłączonych do wyświetlacza, a B.6 i B.7 to XTAL.

    Może to wina kwarcu który jest na tym samym porcie co wyświetlacz? spróbuje wyświetlacz dać pod port D.

    Dzięki za dotychczasowe wskazówki.

    0
  • Oscyloskop cyfrowy Siglent SDS1104X
  • #6 14 Cze 2007 20:09
    hunterhouse
    Poziom 26  

    (DB0-DB3) chodzi o piny wyświetlacza a nie uP.

    napisz też jakiś prosty program co będzie wyświetła powiedzmy kolejne liczby i jakiś tekst i daj to w pętle i sprawdz jak to wtedy wychodzi, taki test systemu

    0
  • Pomocny post
    #7 14 Cze 2007 21:27
    zumek
    Poziom 39  

    manekinen napisał:
    Oczywiście każdy warunek zmieniłem i wygląda to już po ludzku, i nawet kompilując to pod bascomem osiąga przyzwoite odświerzanie...

    Kurcze muszę się wtrącić , bo jak patrzę na ten kod , ...
    Code:

    If Wynik_o = 0 Then
    Locate 1 , Kl
    Lcd chr(32)
    Locate 2 , Kl
    Lcd chr(32)
    End If

    If Wynik_o = 1 Then
    Locate 1 , Kl
    '...
    ' itd.

    ... to mi sie normalnie serce kraje :cry:
    Czy Ty nie widzisz , że 16 razy powtórzyłeś jota w jotę , ten sam fragment kodu , marnując niepotrzebnie pamięć programu :?: Potem się dziwisz , że odświeżanie kiepskie :(
    Przepraszam że tak Cię "objechałem" , ale tę procedurę można skrócić , do zaledwie kilku linijek i na dokładkę będzie szybciej działać , co zapewni szybsze odświeżanie LCD.Żeby nie być gołosłownym , fragment kodu przystosowanego do Twoich zmiennych :)
    Code:


    Const Lcd_offset = 7   'chciałeś po prawej
    Dim Line1 As String * 10 , Line1d(10) As Byte At Line1 Overlay
    Dim Line2 As String * 10 , Line2d(10) As Byte At Line2 Overlay

    ' ********

    Lcd_disp:
    '-------------------------------------------------------------------------------------------
    For Kl = 1 To 10   '10 "słupków"
       Line1d(kl) = Lookup(wynik_o(kl) , L1)
       Line2d(kl) = Lookup(wynik_o(kl) , L2)
    Next
    Locate 1 , Lcd_offset
    Lcd Line1;
    Locate 2 , Lcd_offset
    Lcd Line2;
    Return

    L1:
    Data 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 95 ,  1 , 2 , 3 , 4 , 5 , 6 , 255
    L2:
    Data 32 , 95 ,  1 , 2 , 3 , 4 , 5 , 6 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255


    Zysk w stosunku do Twojej wersji to: 50% pamięci programu i blisko 200% szybkości.

    Piotrek

    PS
    Byłbym zapomniał ;)
    To nie jest oczywiście maksimum , bo można jeszcze przyśpieszyć o kilkadziesiąt procent :)

    PS2
    Aha ;) Przenieś definicję znaków w LCD , od 1 do 6.

    0
  • #8 15 Cze 2007 14:15
    manekinen
    Poziom 29  

    Co do wyświetlacza, połączyłem też wolne piny z masą, skracałem przewód łączący z uP do minimum, podłączałem pod inny port... i dalej się wykrzaczał.

    Hunterhouse napisał:
    napisz też jakiś prosty program co będzie wyświetła powiedzmy kolejne liczby i jakiś tekst i daj to w pętle i sprawdz jak to wtedy wychodzi, taki test systemu

    I tak też uczyniłem, napisałem program który co sekunde odświerza jakis napis na wyświetlaczu - oczywiście przy 16MHz wyświetlacz nie potrafił tego wyświetlić, efekt identyczny jak w analizatorze widma :(

    Szukałem noty kadalogowej tego LCD, znalazłem jedynie opis wyprowadzeń, wymiary, i napięcia. Jest to LCD-AC-1602E-YIY Y - więc sam już nie wiem.


    Co do programu, tak mi się wydawało że sprawdzanie 17 razy tego warunku nie wpływa zbyt dobrze na prędkość. Ale niestety jak na razie pisze tylko tak jak potrafie :(

    (Przeniosłem definicje znaków od 1 do 6)
    Męcze się z tym co kolega tutaj podał, teraz odświerzanie to raz na sekunde :(
    Dopisałem to do podprogramu "save" aby na bieżąco, od razu po obliczeniu uaktualniał dany słupek, tzn
    Code:
    Save:
    



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


    Sing = Sing / 0.775
    Sing = Log10(sing)
    Sing = 20 * Sing
    Tmp_c = Sing + 6


    If Tmp_c < 0 Then Tmp_c = 0
    If Tmp_c > 16 Then Tmp_c = 16

    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) = 7
    Else
          Decr Peks_o(k)
          If Peks_o(k) = 0 Then
             Peks_o(k) = 7
             If Peks(k) > 0 Then Decr Peks(k)
          End If
    End If


    'I TUTAJ WYŚWIETLANIE


    For Kl = 1 To 10                                         
       Line1d(kl) = Lookup(wynik_o(kl) , L1)
       Line2d(kl) = Lookup(wynik_o(kl) , L2)
    Next Kl
    Locate 1 , Lcd_offset
    Lcd Line1;
    Locate 2 , Lcd_offset
    Lcd Line2;

    Next K                                 'przełączamy na liczenie kolejnego słupka
    Return                                 'i wracamy



    Program próbuje wyświetlić wszystkie znaki po kolei (nie po dwa jak wcześniej) i nie wychodzi mu to. Nadąża pokazać 4 do 5 słupków, wymazuje je, i za sekunde mozolnie wyświetla następne.

    0
  • Pomocny post
    #9 15 Cze 2007 15:43
    zumek
    Poziom 39  

    manekinen napisał:
    ... Ale niestety jak na razie pisze tylko tak jak potrafie :(

    No tak ... hmmm ... każdy orze , jak moż... umie ;)
    manekinen napisał:

    Męcze się z tym co kolega tutaj podał, teraz odświerzanie to raz na sekunde :(
    Dopisałem to do podprogramu "save" aby na bieżąco, od razu po obliczeniu uaktualniał dany słupek, tzn

    Nie wiem czy zauważyłeś , ale podany przeze mnie "podprogram" wyświetla wszystkie słupki , więc powinien się wykonać po wypełnieniu nowymi danymi całej tablicy wynik_o , a nie po każdej aktualizacji jednej komórki tablicy.Przenieś instrukcją Next K , przed komentarz - jak poniżej:
    Code:
    Save:
    

    For K = 1 To 10                                     
    Sing = Wynik(k) * 0.02
    Sing = Sing / 0.775
    Sing = Log10(sing)
    Sing = 20 * Sing
    Tmp_c = Sing + 6

    If Tmp_c < 0 Then Tmp_c = 0
    If Tmp_c > 16 Then Tmp_c = 16
    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) = 7
    Else
          Decr Peks_o(k)
          If Peks_o(k) = 0 Then
             Peks_o(k) = 7
             If Peks(k) > 0 Then Decr Peks(k)
          End If
    End If

    Next K

    'I TUTAJ WYŚWIETLANIE   ' trwa około 26.6ms dla _XTAL=16MHz i 30ms dla 1MHz

    For Kl = 1 To 10                                         
       Line1d(kl) = Lookup(wynik_o(kl) , L1)
       Line2d(kl) = Lookup(wynik_o(kl) , L2)
    Next Kl
    Locate 1 , Lcd_offset
    Lcd Line1;
    Locate 2 , Lcd_offset
    Lcd Line2;

    ' *****Next K                                 'przełączamy na liczenie kolejnego słupka
    Return                                 'i wracamy


    Jeśli to będzie za wolno(nie wiem na razie , ile czasu zajmują prockowi obliczenia) , to daj znać , a "sie przerobi" ;)

    Piotrek

    PS
    Jaki masz $Crystal :?: ;)

    0
  • #10 15 Cze 2007 16:35
    manekinen
    Poziom 29  

    Zumek napisał:
    PS
    Jaki masz $Crystal

    Crystal jaki podałem to oczywiście 16000000, z tego co się orientuje, to na podstawie tej wartosci są liczone stałe odpowiadające za przerwania dla sample_h i sample_l - próbowałem przyśpieszyć to troche, ale okazało się że jest to ustawione już z dużym zapasem. Procek jest załadowany robotą po brzegi, więc nawet te przerwania obsługuje z lekkim opóźnieniem. Autor zapewne celowo to zrobił, by w pełni wykorzystać jego mozliwości - przynajmniej tak ja to widze.

    Z wyświetlaczem się już uporałem, dodałem 100nF na jego piny zasilające - i błędy w komunikacji znikły :D Oczywiście przewody muszą być jak najkrótsze. Teraz pracuje już przy 16MHz beż żadnego krzaczka :D

    Zumek napisał:
    Nie wiem czy zauważyłeś , ale podany przeze mnie "podprogram" wyświetla wszystkie słupki , więc powinien się wykonać po wypełnieniu nowymi danymi całej tablicy wynik_o , a nie po każdej aktualizacji jednej komórki tablicy.Przenieś instrukcją Next K , przed komentarz - jak poniżej:

    Faktycznie, a ja co jedno wyliczenie wyświetlałem dziesięć słupków :oops: , nie potrzebnie obciążając wszystko. Przeniosłem "next K" przed wyświetlanie, teraz faktycznie chodzi szybciej od mojej wersji na 17 warunkach :)

    Odświerzanie (przy 16MHz) jest już zadowalające, ale widze że LCD był by w stanie wyświetlać to jeszcze szybciej... może da się jeszcze troche to zoptymalizować? Teraz program zajmuje 79% pamięci, wcześniej 91.

    Postaram się zaraz wrzucić krótki filmik jak to teraz funkcjonuje.

    PS
    no i odkryłem mały błąd, "chr(95)" to jest znak "_" - ale nie jest on wyświetlany na samym dole pola, tylko na poziomie innych znaków, więc musiałem go zdefiniować i wpisywać do ramu lcd jak pozostałe.


    DODANO

    filmik - http://www.mediafire.com/?5qgmuliwmtv

    Aha - górne pasmo (5 słupków od prawej strony) mało się udziela bo mam na razie zrobiony w pająku kiepski filtr-przedwzmacniacz, po prostu podaje za słaby sygnał na wejścia przetwornika, ale odświerzanie widać i o to chodzi.

    0
  • #11 15 Cze 2007 16:46
    hunterhouse
    Poziom 26  

    Cytat:
    z tego co się orientuje, to na podstawie tej wartosci są liczone stałe odpowiadające za przerwania dla sample_h i sample_l - próbowałem przyśpieszyć to troche


    kolego tego nie ruszaj, te przerwania pobieraja kolejne wartości napięcia (samplują) jak zmienisz to to szlak trafi cały wskażnik czestotliwości sie pozmieniaja i nic z tego nie bedzie.

    cały układ dział na 2 osobnyc pasmach wysokie cześtotliwości i niskie i jak jeden jest samplowany to drugi obliczany, wiec przyspieszenie przerwań da tylko jeden skutek, czestotliwości ci sie rozjadą i będzie dupa. a najwiecej czasu i tak zajmuje obliczanie DFT... które jest już bardzo mocno zoptymalizowane, pozostaje tylko przepisanie go w asm ;)

    optymalizacji według mnie najlepiej poddać wysyłanie do LCD
    najpierw przygotować całość w jakiejśc zmiennej a potem za 1 transmisja wysłać do LCD.

    pozdrawiam


    ADD:
    tak w sumie to kolega mógł by sie pokusić o zastosowanie biblioteki do LCD która urzywa flagi busy, to powinno znacznie przyspieszyć transmisje z LCD a to jest kolegi wąskim gardłem , no może nielicząc całego DFT :PP

    0
  • #12 15 Cze 2007 17:19
    manekinen
    Poziom 29  

    Hunterhouse napisał:
    optymalizacji według mnie najlepiej poddać wysyłanie do LCD
    Najpierw przygotować całość w jakiejśc zmiennej a potem za 1 transmisja wysłać do LCD

    właśnie lcd miałem na myśli, bo czytałem poprzednie wątki w których kolega pisał ten program, i wiem że samych wyliczeń nie na się już przyśpieszyć.
    Hunterhouse napisał:
    tak w sumie to kolega mógł by sie pokusić o zastosowanie biblioteki do LCD która urzywa flagi busy, to powinno znacznie przyspieszyć transmisje z LCD a to jest kolegi wąskim gardłem , no może nielicząc całego DFT P

    Właśnie, kiedy ja jestem zielony w temacie :(
    W sumie na diodach można było wyświetlić wynik na trzy rodzaje, zwykły, zwykły i peaks, i samo peaks. Na lcd mam do zdefiniowania tylko 8 własnych znaków, więc ledwie się mieszcze z poziomami słupków. Mógłby kolega rozwinąć blizej ten temat? Możliwe było by zdefiniowanie większej ilosci własnych znaków tym sposobem?

    PS
    Hunterhouse napisał:
    kolego tego nie ruszaj, te przerwania pobieraja kolejne wartości napięcia (samplują) jak zmienisz to to szlak trafi cały wskażnik czestotliwości sie pozmieniaja i nic z tego nie bedzie.

    cały układ dział na 2 osobnyc pasmach wysokie cześtotliwości i niskie i jak jeden jest samplowany to drugi obliczany, wiec przyspieszenie przerwań da tylko jeden skutek, czestotliwości ci sie rozjadą i będzie dupa.

    Usunąłem następujące linie, mniemam że były one wyłącznie do wyświetlania wyniku na LED'ach
    Code:
    Const Refresh = 50                                          'HZ
    
    Const Timer0_set = 254 -((_xtal / 256) /(refresh * 10))

    a także wszystko co związane z timerem0
    mam nadzieje że nie zepsułem nic? :oops:

    0
  • #13 15 Cze 2007 17:26
    hunterhouse
    Poziom 26  

    nom nie znaków mozna tylko 8 bo taka jest konstrukcja LCD i tego już nie zmienimy

    a odczytywanie flagi busy przyspiwszyło by wyswietlanie na LCD, większe odswieżanie

    może to coś pomoze:
    z przetłumaczoneho helpa do bascoma
    Copyright by Zbigniew Gibek. Poland 2002.
    chyba niebędzie miał nic na przeciwko ;)

    Cytat:
    Biblioteka LCD4BUSY.LIB może być używana jeśli istotny jest czas działania programu. Podstawowa biblioteka obsługi LCD używa sztywnych opóźnień podczas komunikacji z wyświetlaczem. Biblioteka lcd4busy.lib używa dodatkowej końcówki (linia R/W) by móc odczytać flagę statusu wyświetlacza.
    Końcówki Db4-Db7 wyświetlacza LCD muszą być podłączone do starszej połówki portu. Inne końcówki mogą być określone przez programistę.

    '--------------------------------------------------------------------
    ' (c) 2002 MCS Electronics
    ' lcd4busy.bas pokazuje jak używać LCD z sprawdzaniem jego gotowości
    '--------------------------------------------------------------------
    'kod testowano dla 90s8515
    $regfile = "8515def.dat"

    'stk200 ma kwarc 4 MHz
    $crystal = 4000000

    'definicja używanej biblioteki
    'używa $184 bajtów (liczba hex)

    $lib "lcd4busy.lib"

    'definicja potrzebnych stałych
    'do testów używany jest portA
    Const _lcdport = Porta
    Const _lcdddr = Ddra
    Const _lcdin = Pina
    Const _lcd_e = 1
    Const _lcd_rw = 2
    Const _lcd_rs = 3


    'jak zwykle musimy określić typ wyświetlacza
    Config Lcd = 16 * 2

    'a teraz prosty kod
    Cls

    Lcd "test"
    Lowerline
    Lcd "test"

    End


    ADD:

    nie te dwie linie chyba duzo nie zepsuły hehe
    jeszcze jedno mi sie przypomniało kolega pisła że ma kiepski filtr górno przepustowy ja też tak miałem ale tak w sumie to on jest niepotrzebny, filtrację od doły robi samo DFT potrzebny jest tylko filkt dolnoprzepustowy ;)

    0
  • #14 16 Cze 2007 00:50
    manekinen
    Poziom 29  

    Tak, o filtrze czytałem w dokumencie doc który kolega umieścił we wcześniejszych wątkach, zrobiłem filtr wg tamtego schematu, do samplowania górnego pasma przyłączony jest bezpośrednio, a do dolnego poprzez filtr, no i sygnał górnego jest za słabo wzmacniany po prostu, to się później zrobi porządnie...

    Mam problem z zaadoptowaniem tej dodatkowej instrukcji, szukałem o użyciu tej biblioteki ale praktycznie żadnych przydatnych informacji nie znalazłem, ew. wszędzie znajdowałem to co kolega tutaj wkleił - a to mi nie wiele mówi.
    Otóż:


    Code:
    $lib "lcd4busy.lib"

    bibliotekę dodaje bez problemu


    Code:
    Const _lcdport = Portd
    
    Const _lcdddr = Ddrd
    Const _lcdin = Pind

    Normalnie "a" zmienił bym na "b" ALE:
    Cytat:
    Końcówki Db4-Db7 wyświetlacza LCD muszą być podłączone do starszej połówki portu.

    Czyli analogicznie pb4 - pb7. Tak się składa że na pb6 i pb7 mam kwarc. Więc postanowiłem użyć portu D - nie wiem czy dobrze zrobiłem


    Code:
    Const _lcd_e = 1
    
    Const _lcd_rw = 2
    Const _lcd_rs = 3

    Tu nic nie ruszam. (ALE czy to nie przypadkiem nie są numery portu które musze sam zdefiniować?


    Cytat:
    Inne końcówki mogą być określone przez programistę.

    A więc definiuję sobie:
    Code:
    Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.3 , Rs = Portd.2  , Rw = Portd.1

    ALE wg kompilatora oznaczenie "Rw" jest błędne. Więc skoro potrzebny jest pin RW to jak mam go zdefiniować?
    Bez tego program się kompiluje ale wyświetlacz nie pracuje, a z tym jest błąd. Więc nie wiem :|

    0
  • #15 16 Cze 2007 07:26
    hunterhouse
    Poziom 26  

    w sumie to ja nigdy tego nie urzywałem ;) wiec pewności niemam
    ale z tego co mi sie wydaje to powinno być tak

    Code:
    $lib "lcd4busy.lib"
    
    Const _lcdport = Portd
    Const _lcdddr = Ddrd
    Const _lcdin = Pind
    Const _lcd_e = 1
    Const _lcd_rw = 2
    Const _lcd_rs = 3

    i nic wiecej konfuguracji nie potrzeba

    teraz hardware
    LCD PIN -------- AtMega PIN
    _______________________
    DB4 ------------- portd.4
    DB5 ------------- portd.5
    DB6 ------------- portd.6
    DB7 ------------- portd.7
    E ---------------- portd.1
    RW -------------- portd.2
    RS --------------- portd.3
    (przy tym sposobie połączenia potrzebny jest dodatkowy przewód RW a komunikacja jest 2 stronna)

    i żadnego config lcd bym już nie używał

    0
  • #16 16 Cze 2007 14:08
    manekinen
    Poziom 29  

    Tak też uczyniłem. Niestety nic z tego. Działa tylko pierwsze pole wyświetlacza (1,1) i zmieniają się na przemiennie dwa znaki - czarny kwadracik i spacja

    Wrzuciłem też ten programik do testowania lcd4busy który ma wyświetlić "TEST" - ale efekt ten sam.

    A próbowałem jeszcze zwyczajnie podłączyć LCD pod port D (bez tej biblioteki), i w ogóle nie chce pracować. Nie rozumiem już w czym problem :(

    Pracuje tylko pod portem B, a tam z tego nie skorzystam ze względu na kwarc. No chyba że bez kwarcu na 8MHz udało by się użyć tej biblioteki, ale to się całkowicie mija z celem :/




    Ale wpadłem na pewien pomysł. Może nie związany z tematem, bo problem przerobienia programu został rozwiązany, za co srdecznie dziękuje i jak obiecałem przekazuje punkciki - ale już będ ekontynuował w tym temacie żeby nie robić zamieszania...

    Aktualnie posiadam dwa proce atmega8. Doszedłem do wniosku że jeden i tak mi nie wystarczy, bo jeszcze musze napisać program obsługi cyfrowego procesora dźwięku, komendy po RC5, i menu, co się nie zmieści do jednej atmegi8...

    A wiec albo zmienić proc na np. atmega16, gdzie 16kB by mi wystarczyło - ale częstotliwość pozostaje ta sama, więc uC nie miał by czasu na oługe pozostałych funkcji.




    A teraz w czym rzecz - połączyć dwie amtegi8 szyną I2C. atmega nr.1 pracuje tylko jako slave, liczy widmo, i wysyła poprzez I2C wartości do atmegi master - sterującej całością, która to odbiera i sobie wyświetla lub nie w zależności od ustawień.

    Przypuszczając że jeden słupek zmienia się 10 razy na sekunde, a jest ich 10, każda wartość 0-16 to jeden bajt - więc prędkość transmisji musiała by wynosić 100b/s.

    A więc atmega slave wysyła po I2C dane, przypuśćmy z tą szybkością 100b/s, gdzie w przeciągu 9 taktów zegara wysyła 8 bitów a dziewiąty bit to bit wysyłany przez master, jako potwierdzenie odbioru danych.
    I tak w kółko.

    I teraz kilka pytań, czy ten dziewiąty bit nie spowalniał by pracy amtegi slave liczącej widmo? tak jak to robiły sztywne opóźnienia przy komunikacji z wyświetlaczem? Założenie było by takie, że slave wysyłał by tylko dane, i nie musiał czekać na informacje od master że dane zostały wyświetlone, po prostu by je wysyłał. A master by decydował co z nimi robić - czy przetwarzać i wyświetlać, czy "olewać" i robić to co użytkownik mu w danym momencie każe.

    Dobrze kombinuje?


    DODANO

    Przetaktowałem "troche" atmege, dałem kwarc 27MHz, uaktualniłem $crystal, włączyłem bit CKOPT - słupki skaczą jak szalone. Nawet błędy nie występują żadne :D
    ekhm... Jak bardzo jest to niebezpieczne? :D

    0
  • #17 16 Cze 2007 18:32
    zumek
    Poziom 39  

    manekinen napisał:
    Tak też uczyniłem. Niestety nic z tego. Działa tylko pierwsze pole wyświetlacza (1,1) i zmieniają się na przemiennie dwa znaki - czarny kwadracik i spacja...

    Ja się nie dziwię że nie działa :(
    Przy inicjacji LCD używa się opóźnień , a w kodzie biblioteki w komentarzu stoi JAK BYK:
    Code:

        Ldi R30, 28
        Ldi R31, 78
        Rcall _lcd_delay                    ; 20 ms delay at 4 MHz
    ;   ...

    ... a Ty masz ... 16MHz :idea:
    Trzeba policzyć nowe wartości wpisywane do rejestrów R30 i R31 , albo użyć wbudowane w Bascom makro , które "wygeneruje" odpowiednią "pustą pętlę".

    Piotrek

    0
  • #18 16 Cze 2007 20:29
    manekinen
    Poziom 29  

    Faktycznie. Ale żeby otworzyć biblioteke zwykłym notatnikiem to do głowy mi nie przyszło...

    W sumie w pełni wystarcza mi gdy całość chodzi na 27MHz, odświerzanie jest naprawde dobre i płynnie się to porusza, program chodził tak bez przerwy 4 godziny, i tylko raz się wykrzaczył.

    A jeśli nawet można jeszcze szybciej, to i tak nie mam zielonego pojęcia jak to obliczyć :/
    Z resztą teraz się męcze nad komunikacją dwóch uC, i jeśli zacznie mi to działać, tak jak opisałem to wyżej, to ta biblioteka nie okaże się specjalnie potrzebna.

    Ale dzięki :)

    0
  • #19 17 Cze 2007 22:19
    hunterhouse
    Poziom 26  

    hehe dzięki za punkciki ale jak kolega widzi aż tak mi na nich nie zależy :PP z resztą nie poto to robie.

    teraz z tego co bym koledze mógł doradzić to jeśli komunikowac sie mają tylko 2 proce to ja bym zalecił UART dużo wygodniejsze i pewniej sze niż i2c które bascom średnio wspiera.
    UART naprawde był by tutaj exstra a jedyny problem to czestotliwość taktowania ;)
    I2C polecła bym kiedy komunikować sie musi wiecej jak 2 procesory

    oczywiscie jeśli sie kolega uprze to moze to zrobić na i2c tylko prosze sprawdzic czy napewno całośc działa na sprzęcie bo jak implementacja wyjdzie programowa to bez sensu

    Teraz co do biblioteki do LCD to nieomieszkam tego przetestować choć niewiem kiedy :PP
    tak se pomyślałem że moze też sobie cos takiego zrobie do siebie na LCD bo ten egzemplaż na diodach został w szkole:/ praca dyplomowa a 2 raz na lutowanie tych diod bym sie niedał namówić :D

    ale to sie jeszcze okaże.

    ADD:
    a tak wogóle jeśli kolege to interesuje to łatwo mozna by to przerobić do wyświetlania 16 słupków a nie 10

    0
  • #20 18 Cze 2007 11:18
    manekinen
    Poziom 29  

    hunterhouse napisał:
    A tak wogóle jeśli kolege to interesuje to łatwo mozna by to przerobić do wyświetlania 16 słupków a nie 10


    To by było wręcz idealne, tylko czy nie spowalniało by mocno całości?

    Co do komunikacji dwóch proców - już zmieniłem zdanie :) ale dzieki za porade.
    Znalazłem artykuł jak sterować cd-romem komputerowym za pomocą uC, wszystko sobie podsumowałem, i okazało się że musze mieć większą atmege. Np m16 by wystarczyła. Pinów by wystarczyło co do jednego, pamięci 16kB też tak na styk, no i 16Mhz. A więc zmieniam koncepcję, jednak może skorzystam z tej biblioteki. Program był by wtedy podzielone na dwie części, jedna to analizator widma jako "wygaszacz" lcd, zżerający całą moc, a drugi wywoływany z przerwania int0, za pomocą RC5. Wyłączał by analizator, i mógł by spokojnie działać na czas ustawień itp, a po jakimś tam czasie powracał by do analizatora. Myśle że to był by najlepszy pomysł.

    Co do 16 słupków - jestem zainteresowany:D

    DODANO
    Co do punktów, też mi nie są potrzebne, i nie będe nikomu ich żałował, bo nic mnie nie kosztują :)

    A tak w tej chwili to działa http://www.youtube.com/watch?v=2bN8Q_ABDpk

    Poprawiłem filtr, ale okazuje się że chyba będe musiał zrobić dwa filtry, i to dość strome, jeden poniżej a drugi powyżej 1KHz - bo teraz jedna połowa zachodzi na drugą. Dawałem sinusoide i zwiększałem częstotliwość - w okolicach 1KHz występują jakieś anomalie, słupki poruszają się dosyć dziwnie, rzekłbym chaotycznie.

    0
  • #21 18 Cze 2007 17:50
    hunterhouse
    Poziom 26  

    zmiany niesą duze
    wystarczy zmodyfikować podprogramy Przelicz_high: oraz Przelicz_low:
    zmienić definicje zmiennej wynik oraz wynik_o no i w pętli na koncu zmienić żeby sie powtarzała 16 razy

    bo ogólnie DFT liczy 2 razy i otrzymujesz z każdego obliczania 16 wyników
    w podporogramie Przelicz_high: oraz Przelicz_low: odpowiada temu tablica Rex().
    tylko że ona odpowiada kolejnym paskom, czestotliwość sie zmienia liniowo, a w analizatorze musi być logarytmicznie dlatego dla wyższych czestotliwości pakuje po kilka prązków w jeden słupek na wyswietlaczu czyli z w sumie 32 pasków robie 10 słupków led
    ale przecież nic nie stoi na przeszkodzie zeby ich zrobić 16 ;)

    hehe troche sie wkręciłem w to chyba sam sobie zrobie takie urządzonko :D

    ADD:

    hmm to ciekawe co kolega mówi ze paski sie powtarzają i pewnie nie koło 1kh tylko 1,375 kHz ;)
    nom i to w sumie nic dziwnego bo filtry sie nakładają i prawdziwy podział jest właśnie na 1375 Hz.
    początkowo miało być 1khz ale wyszło 1,3kHz

    trzeba by zmienic
    Const Timer1_l = _xtal / 2750

    na

    Const Timer1_l = _xtal / 2000

    Dodano po 5 [godziny] 5 [minuty]:

    Code:
    $regfile = "m8def.dat"
    
    $crystal = 4000000
    $lib "lcd4busy.lbx"
    Const _lcdport = Portd
    Const _lcdddr = Ddrd
    Const _lcdin = Pind
    Const _lcd_e = 3
    Const _lcd_rw = 2
    Const _lcd_rs = 1

    Config Lcd = 16 * 2

    Cls
    Lcd "test test TEST"
    Lowerline
    Lcd "test2 test2 TEST"
    End

    taki kod na mojej Atmega na 4Mhz chodzi

    niech kolega sprawdzi czy takie ustawienia będą dziać u niego
    mam też prośbę mógł by kolega zaktualizować lub wkleić pilk z programem (aktualnym w całosci).
    postykałem sobie taki układzik i chce coś sprawdzić

    0
  • #22 18 Cze 2007 19:09
    manekinen
    Poziom 29  

    Hunterhouse napisał:
    hmm to ciekawe co kolega mówi ze paski sie powtarzają i pewnie nie koło 1kh tylko 1,375 kHz

    Z tego co czytałem we wcześniejszych wątkach, to podział jest przy 1KHz. ALE około - czyli tak troche poniżej i troche powyżej 1KHz. Wtedy wszystkie słupki górnej połowy skaczą tak jak by troche losowo, ale jak to ktoś mądry powiedział muzyki się nie ogląda na oscyloskopie, tylko słucha - więc mniejsza z tym :)


    Co do tej biblioteki na pewno wypróbuje jak już będe miał atmege16.

    Jak narazie pisze menu.


    Aha i w programie są zaremowane dodatkowe opcje, próbowałem zrobić przełączanie wyświetlania - słupki lub peaks. Przełączanie ma sie odbywac na takiej zasadzie że podczas przełączenia, tylko raz wysyłany jest do pamięci LCD nowy zestaw zdefiniowanych znaków, czyli pasków, a później za każdym razem program korzysta z drugiego zestawu tabel. Mniejwięcej to działało, ale wymaga usprawnienia, bo dziwne rzeczy się potrafią dziać. Ostatecznie nie wiem czy ta funkcja działa bo coś później zmieniałem ale nie sprawdzałem. Może kolega poprawi coś.
    AHA trzeba zmienić $crystal bo jest kosmiczny :twisted:

    DODANO
    aha jednak nie działa to, dołączam wcześniejszą wersje, działającą, bez tych udziwnień. Niech kolega spróbuje dać większy kwarc bo na 16MHz to troche za wolno chodzi.

    0
  • #23 18 Cze 2007 21:13
    manekinen
    Poziom 29  

    Przepraszam za post pod postem, ale załączniki by mi się pomieszały :)

    Hunterhouse napisał:
    wystarczy zmodyfikować podprogramy Przelicz_high: oraz Przelicz_low:
    zmienić definicje zmiennej wynik oraz wynik_o no i w pętli na koncu zmienić żeby sie powtarzała 16 razy

    bo ogólnie DFT liczy 2 razy i otrzymujesz z każdego obliczania 16 wyników
    w podporogramie Przelicz_high: oraz Przelicz_low: odpowiada temu tablica Rex().
    tylko że ona odpowiada kolejnym paskom, czestotliwość sie zmienia liniowo, a w analizatorze musi być logarytmicznie dlatego dla wyższych czestotliwości pakuje po kilka prązków w jeden słupek na wyswietlaczu czyli z w sumie 32 pasków robie 10 słupków led
    ale przecież nic nie stoi na przeszkodzie zeby ich zrobić 16


    I tak też zrobiłem. Wszystkie liczby "10" określające 10 śłupków zmieniłem na "16", a fragment o kórym kolega wspomniał wygląda następująco:
    Code:
    Przelicz_high:
    

    Suma = Rex(2)
    'If Rex(2) > Suma Then Suma = Rex(2)
    Wynik(9) = Suma

    Suma = Rex(3)
    If Rex(4) > Suma Then Suma = Rex(4)
    Wynik(10) = Suma


    Suma = Rex(5)
    If Rex(6) > Suma Then Suma = Rex(6)
    Wynik(11) = Suma


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


    Suma = Rex(9)
    If Rex(10) > Suma Then Suma = Rex(10)
    Wynik(13) = Suma


    Suma = Rex(11)
    If Rex(12) > Suma Then Suma = Rex(12)
    Wynik(14) = Suma


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


    Suma = Rex(15)
    If Rex(16) > Suma Then Suma = Rex(16)
    Wynik(16) = Suma


    Return


    '---------OBLICZANIE WYSOKOŚCI DLA LOW (1-5)--------------


    Przelicz_low:

    Suma = Rex(2)
    Wynik(1) = Suma


    Suma = Rex(3)
    If Rex(4) > Suma Then Suma = Rex(4)
    Wynik(2) = Suma


    Suma = Rex(5)
    If Rex(6) > Suma Then Suma = Rex(6)
    Wynik(3) = Suma


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


    Suma = Rex(9)
    If Rex(10) > Suma Then Suma = Rex(10)
    Wynik(5) = Suma


    Suma = Rex(11)
    If Rex(12) > Suma Then Suma = Rex(12)
    Wynik(6) = Suma


    Suma = Rex(13)
    If Rex(14) > Suma Then Suma = Rex(14)
    Wynik(7) = Suma


    Suma = Rex(15)
    If Rex(16) > Suma Then Suma = Rex(16)
    Wynik(8) = Suma

    Return






    Zmieniłem też stałą "lcd_offset" która odpowiadała za to żeby słupki zaczynały się wyświetlać od 4 pola.
    Efekt przy muzyce wręcz olśniewający, ale postanowiłem prawdzić jak Analizator opowiada na poszczególne częstotliwości...
    Moje zawiedzenie było wielkie, porównując do wcześniejszej wersji z 10 słupkami... tam każdy słupek mniejwięcej odpowiadał danej częstotliowości, nie było tak że się wychylały np. 3 na raz...
    a teraz... załączniki mówią same za siebie. możliwe że coś pokręciłem, nie wiem. Może niech kolega sam sprawdzi jak u niego to będzie funkcjinować...

    w sumie narzekać na co nie mam, bo przy muzyce efekt jest fajny, ale skoro jest to już analizator widma, to niehc analizuje te widmo, zamiast wręcz losowo wymachiwac słupkami :cry:

    0
  • #24 18 Cze 2007 22:18
    hunterhouse
    Poziom 26  

    poprubuje coś i zobacze co i jak

    ale nawet w pierwotnej wersji u mnie były takie dziwne zawirowania dlatago od pewnego czasu nienazywam tego analizatorem tylko wskażnikiem :PP
    z tego co myślałem nad tym wszystkim to wychodzi że bardzo prawdopodobne jest to ze przetwornik ADC pracuje na wyżyłowanej czestotliwości. już na 16Mhz miał troche zawyżone taktowanie a na 27 to już pewnie wiecej jest zakłuceń niż faktycznie napięcia.

    ale to juztrudne do przeskoczenia, jak będe miał czas to sprubuje coś nie coś zoptymalizować taż zeby dać 16Mhz kwarc a kolega też niech sprawdzi czy na niższych czestotliwosciach też tak przekłamuje ??

    ADD:

    ta linia
    Config Adc = Single , Prescaler = 8 , Reference = Avcc
    konfiguruje ADC i z tego co widze to adc pracuje na 3,25 Mhz kiedy uP ma 27Mhz a atmel zaleca czestotliwośc mniejszą do 200kHz :P
    niech kolega sprubuje na prescaler = 16 i 32 czy sie coś poprawi
    z tym że na 32 już moze nienadążyc próbkować

    0
  • #25 18 Cze 2007 23:14
    manekinen
    Poziom 29  

    Słuszna uwaga co do przetwornika, ale to nie to.

    Sprawdzałem z dzielnikiem 16 i 32, chodzi troszke bardziej mułowato
    Sprawdzałem na f 8Mhz i na 4Mhz
    W obu przypadkach nie chce odzwierciedlać dobrze danej częstotliwości, wszystko się "rozlewa". Być może namieszałem coś w kodzie, ale nie sądze.

    Hunterhouse napisał:
    ale nawet w pierwotnej wersji u mnie były takie dziwne zawirowania dlatago od pewnego czasu nienazywam tego analizatorem tylko wskażnikiem

    A mi właśnie zanim nie zmieniłem programu na 16 słupków, na 10ciu chodził b.dobrze, każdej częstotliwości przypisywał nie więcej jak dwa słupki, żadne obok się nie wyrywały, tyle że dwa pasma na siebie nachodziły ale to kwestia filtra.

    hmmm... a może podzielić pasmo na cztery części? Dużo było by roboty? Pytam o program, bo policzyć filtry analogowe to nie problem, a opampy tanie.

    Hunterhouse napisał:
    poprubuje coś i zobacze co i jak

    Jesli kolega znajdzie troche czasu to może sprawdzić czy dużo daje użycie tej biblioteki lcd4busy, bo za chiny nie mogę jej uruchomić na porcie D, a port B zajęty.

    Załączam wersję z 16 słupkami

    0
  • #26 19 Cze 2007 10:37
    hunterhouse
    Poziom 26  

    wiec tak pooptymalizowałem teraz DFT i co tam jeszcze było sens i powiem tak. cały obrut programu trwa 17ms z wykasowanymi dwoma linijkami LCD. gdy je dam obrut trwa 70ms !!!!!
    samo prubkowanie LOW trwa 12 ms ;) ale jest w przerwaniu idzieje sie podczas obliczania high

    tak że jak dobrze kolega widzi to LCD zabiera duzo czasu, poprostu bascom niewiedząc jaki LCD jest podpięty czeka bardzo duzo czasu żeby LCD napewno zdązył zareagować.

    dodałem też obsługe flagi BUSY czyli procek sprawdza czy LCD jest juz gotowy, to powinno znacznie przyspieszyć program ale ile to juzniewiem bo to zalezy od LCD

    całośc testów przeprowadziłem narazie w symulatorze bo niemam jeszcze całego układu, niech kolega jeszcze raz sprawdzi LCD z tą biblioteką

    zamieściłem jej deklaracje w programie, oczywiscie trzeba podłaczyc dodatkowy pin z LCD do uP, mi to działało na porcie D wiec niewiem czemu koledze niechce, moze coś było zle podpięte??


    ADD:

    jak kolega chce robić tyle filtrów analogowych to mozna całość zrobić na analogu bedzie jeszcze lepiej, ale to nie o to chodzi bo to miało być maksymalnie proste w polutowaniu i jak najmniej cześci analogowej

    0
  • #27 19 Cze 2007 12:58
    manekinen
    Poziom 29  

    Oj coś kolega ostro namieszał, w ogóle nie działa.

    Hunterhouse napisał:
    cały obrut programu trwa 17ms z wykasowanymi dwoma linijkami LCD. gdy je dam obrut trwa 70ms

    Nie zauważyłem żeby brakowało czegoś w wyświetlaniu LCD, ale zauważyłem brak tego:
    Code:
    If Peks(k) < Wynik_o(k) Then
    
          Peks(k) = Wynik_o(k)
          Peks_o(k) = 7
    Else
          Decr Peks_o(k)
          If Peks_o(k) = 0 Then
             Peks_o(k) = 7
             If Peks(k) > 0 Then Decr Peks(k)
          End If
    End If

    A to raczej musi być. Usunąłem ten fragment z wcześniejszej działającej wersji 16x16, i żadnego słupka nie zobaczyłem.

    A więc dodałem ten fragment do "troche poprawione", i nadal nic. żadnej reakcji.

    I widze duże zmiany w DFT, ale tam już się nie pchałem.

    Aha zaremowałem tą biblioteke przy sprawdzaniu.
    Hunterhouse napisał:
    mi to działało na porcie D wiec niewiem czemu koledze niechce, moze coś było zle podpięte??

    A mi za Chiny. Już pisałem wcześniej, że w ogóle nie mogę uruchomić LCD na porcie D, nawet bez tej biblioteki, to jakaś czarna magia, bo w ogóle LCD nie startuje, a połączenia po 20 razy sprawdzam. Sprawdzałem też na drugim procku, to samo. Pomęcze sie jeszcze z tym troche, zobaczymy.

    0
  • #28 19 Cze 2007 14:07
    hunterhouse
    Poziom 26  

    nom nie kłuce sie moze nie działać, to były poprawki teoretycznie testowałem tylko w symulatorze ale tam zadużo nie potestuje jako całości.

    jak zbuduje całe to będe myślał, a kolega niech sprubuje coś z tym portem D bo bez tego to nic sensownego nie wyjdzie

    0
  • #29 19 Cze 2007 20:11
    hunterhouse
    Poziom 26  

    wiec zbudowałem sobie układ z pominięcem filtrów, i też działa z tym że z generatora jak dam sinusoide to są odbicia powyżej 1 kHz ale to normalne bez filtrów

    teraz jest zoptymalizowane i przetesotowane i na 16 słupków i ładnie idze sobie fala jak podam sinusoide a PCgena

    oczywiście działa to na LCD4budy.lbx i bez tego niema co prubować, kolega niech sie postara i uruchomi ten LCD na PORTD moze ten mój program zadziała z twoim LCD

    choć musze zauważyć że mi też czasem niechce sie LCD zainicjalizować za 1 razem, i czasem musze puszczać kilka resetów

    w tej chwili prędkość to około 3,5 Odświeżenia na 1MHz czyli na 8 tak ja ja sie bawie (bo niemam szybszego kwarcu) wychodzi 8*3,5=28Hz

    na większych kwarcahc proponuje zmiększyć Presclaler w ADC bo ja troche zmniejszyłem do mojego słabego kwarcu

    niech kolega to potestuje

    0
  • #30 19 Cze 2007 22:15
    manekinen
    Poziom 29  

    Hmm ta biblioteka faktycznie dużo daje! Z biblioteką przy 8MHz chodzi szybciej jak bez biblioteki na 16MHz.

    Na 16MHz niestety nie sprawdziłem, bo z biblioteką odpaliłem na porcie B. A na D po prostu nie idzie i już. Już sił na to nie mam :evil:

    A kolega na jakim uC to włączał?

    DODANO

    Hunterhouse napisał:
    wiec zbudowałem sobie układ z pominięcem filtrów, i też działa z tym że z generatora jak dam sinusoide to są odbicia powyżej 1 kHz ale to normalne bez filtrów

    teraz jest zoptymalizowane i przetesotowane i na 16 słupków i ładnie idze sobie fala jak podam sinusoide a PCgena


    Tzn bez filtrów... czyli bezpośrednio, ale pod które wejście? bo w kodzie widze że obydwa sa aktywne... pod dwa na raz ten sam sygnał?

    DODANO

    No tak, teraz to naprawde nieźle chodzi, pod jedno wejście dałem jeden kanał, pod drugie drugi. Dolne pasmo bardzo ładnie pokazuje, górne jest jeszcze troche zakręcone. Trzeba zbudować do tego porządny filtr, albo dwa - postaram się jutro tym zająć. 1,35KHz.

    0