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
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
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