...
Problemów jest więcej do rozwiązania.
Po pierwsze trzeba się jakoś zsychronizować, z sygnałem badanym/monitorowanym, chodzi o to że mikroprocesor tak naprawdę nie wie w jakim momencie wstrzela się sygnał po starcie.
Wiec w pierwszej fazie, program musi jakoś odnaleźć początek ramki. Chyba najprościej jest to zrobić, szukając / czekając MIN 500ms przerwy. Jeżeli przez 500ms, nie wykryjemy żadnego sygnału który nas interesuje, to znaczy że jesteśmy w przerwie między paczkami, i następne poprawne sygnały, będą już częścią paczki.
Jak rozpoznać czy sygnał jest dłuższy od 20ms ?
Miałem to opisać, ale robiła sie z tego spora litania, bo trzeba to robić w przerwaniach. postaram się sklecić przykładowy kod. Ogólnie Timer0 powinien zgłaszać przerwania co 1ms, w zależności od tego czy sygnał mierzony jest poprawny czy nie, te przerwania zwiększają licznik czasu tonu. jeżeli z jakiegoś powodu nie zostanie on zatrzymany i zrestartowany, chodzi o zakłócenia,czy fałszywe sygnały, to odmierzy czas 20 do 120ms, przy czym musi być warunek, że jak czas przekroczy 120ms to jest to fałszywy sygnał, np. stale podany sygnał 1124Hz.
Po pierwsze trzeba się jakoś zsychronizować, z sygnałem badanym/monitorowanym, chodzi o to że mikroprocesor tak naprawdę nie wie w jakim momencie wstrzela się sygnał po starcie.
Wiec w pierwszej fazie, program musi jakoś odnaleźć początek ramki. Chyba najprościej jest to zrobić, szukając / czekając MIN 500ms przerwy. Jeżeli przez 500ms, nie wykryjemy żadnego sygnału który nas interesuje, to znaczy że jesteśmy w przerwie między paczkami, i następne poprawne sygnały, będą już częścią paczki.
Jak rozpoznać czy sygnał jest dłuższy od 20ms ?
Miałem to opisać, ale robiła sie z tego spora litania, bo trzeba to robić w przerwaniach. postaram się sklecić przykładowy kod. Ogólnie Timer0 powinien zgłaszać przerwania co 1ms, w zależności od tego czy sygnał mierzony jest poprawny czy nie, te przerwania zwiększają licznik czasu tonu. jeżeli z jakiegoś powodu nie zostanie on zatrzymany i zrestartowany, chodzi o zakłócenia,czy fałszywe sygnały, to odmierzy czas 20 do 120ms, przy czym musi być warunek, że jak czas przekroczy 120ms to jest to fałszywy sygnał, np. stale podany sygnał 1124Hz.
TZN. Tak dopiero w piątek dostałem zamówione scalaki w AVT, głównie napięcie odniesienia (LM385Z-2,5V). więc nic nie próbowałem. Nakreśliłem na kartce także zarys algorytmu, ale nie jest on kompletny i przetestowany, wiec zawiera pewnie sporo błędów i uproszczeń.
Jeżeli masz kod do tej 2051, i jest on np. w C, można spróbować go przeanalizować, gorzej jak to ASM. Ostatecznie daj link do tego projektu na 89C2051 jak masz.
Jeżeli masz kod do tej 2051, i jest on np. w C, można spróbować go przeanalizować, gorzej jak to ASM. Ostatecznie daj link do tego projektu na 89C2051 jak masz.
Moja idea w programie wyglądałaby mniej więcej tak:
Przy czym Licz_tonu można by chyba olać ? aczkolwiek może on służyć do wykrycia ile razy dany ton wykryto w czasie, ale zasadniczo zabezpieczeniem jest licz_error, który jest zwiększany o 1 dla każdego niezgodnego pomiaru.
Ale nie miałem w żaden sposób tego sprawdzić.
Kod: Zaznacz cały
$regfile = "m32def.dat"
Config Lcdpin = Pin , Db4 = Porta.4 , Db5 = Porta.5 , Db6 = Porta.6 , Db7 = Porta.7 , E = Porta.3 , Rs = Porta.2
$crystal = 16000000
Config Lcd = 16 * 2
Config Timer1 = Timer , Prescale = 1 , Capture Edge = Rising , Noise Cancel = 1
On Oc0 Sys_time
On Icp1 Przerwanie
Enable Icp1
Cls
Enable Interrupts
Const Przerwa = 100 ' czas przerwy w sygnale w ms
Dim Podstawa As Single
Dim Countcycles As Word
Dim Icr_new As Word
Dim Icr_old As Word
Dim Wynik As Word
Dim Pomiar As Bit
Dim F_on As Bit
Dim Pocz_tonu As Bit
Dim F_time As Word
Dim Hister As Word
Dim Slownik As Word
Dim Wzor As Word
Dim I As Byte
Dim Licz_tonu As Word
Dim Licz_error As Byte
Ocr0 = 250 'ustaw przepełnenie timera0 co 1ms
Tccr0 = &H0B 'uruchom Timer0 z przeskalerem 64, w trybie CTC
Reset F_on 'zeruj flage pomiaru
Podstawa = _xtal 'Uwaga !! Jeżeli Timer1 Ma Preskaler Nalerzy Zapisać podstawa = _xtal / Preskaler
Do
'Algorytm sortujaco decyzyjny
If Pomiar = 1 Then 'był pomiar ? Tak:
Reset Pomiar 'zeruj falagę pomiaru
If Pocz_tonu = 0 Then 'czy pierwszy pomiar tonu ? Tak:
Restore Szukane 'zeruj index do słownika
For I = 1 To 16 'przeszukaj słownik
Read Slownik
Hister = Slownik + 4 'oblicz histereze
If Wynik > Slownik Or Wynik < Hister Then 'wynik zgodny z wzorem w słowniku ? TAK:
F_time = 0 'czas tonu na 0
Set F_on 'niech Timer 0 co 1ms zlicza czas trwania tonu
Wzor = Slownik 'zapisz wzor do dalszych operacji
Hister = Slownik + 4
Set Pocz_tonu 'początek tonu wykryty, od teraz sortowanie uproszczone tylko do wykrytygo wzorca
Licz_tonu = 1
Licz_error = 0
Exit For 'koniec sortowania
End If
Next I
Else 'dla już wykrytego tonu :
If Wynik > Wzor Or Wynik < Hister Then
Incr Licz_tonu
If F_time > 100 Then
Reset F_on ' zatrzymaj dalsze zliczanie czasu tonu
'czas tunu wiekszy niż 100ms tutaj trzeba zadecydować co robimy dalej ?
End If
Else
Incr Licz_error
If Licz_error > 100 Then
'ilość błędów większa od 100, tu trzeba zadecydowac co robimy dalej ?
End If
End If
End If
End If
Loop
'Co 1ms
Sys_time:
If F_on = 1 Then 'jeżeli wykryto sygnał to
Incr F_time 'zliczaj czas jego trwania
End If
Return
Przerwanie:
Countcycles = Timer1
Icr_new = Countcycles - Icr_old
Icr_old = Countcycles
Wynik = Podstawa / Icr_new 'oblicz wynik
Set Pomiar 'ustaw flage zakończenia pomiaru
Return
Szukane:
'Wer 1.1, słownik zoptymalizowany pod katem szybkości szukania i histerezy -2Hz
Data 2398 'C (2400Hz),Najkrutszy impuls, najkrutszy czas wyszukania
Data 2245 'F (2247Hz)
Data 2108 'E (2110HZ)
Data 1979 '0 (1981Hz)
Data 1858 '9 (1860Hz)
Data 1745 '8 (1747Hz)
Data 1638 '7 (1640Hz)
Data 1538 '6 (1540Hz)
Data 1444 '5 (1446Hz)
Data 1348 '4 (1350Hz) '
Data 1273 '3 (1275Hz)
Data 1195 '2 (1197Hz)
Data 1122 '1 (1124Hz)
Data 1053 'A (1055Hz)
Data 988 'D (990Hz)
Data 928 Ale nie miałem w żaden sposób tego sprawdzić.
Ja znalazłem wreszcie trochę czasu aby sklecić przystawkę do kompa, która pozwoli mi podpiąć, sygnał z dźwiękówki do procesora. W sumie nic szczególnego, parę oporników, dwa kondki i TL431. Co prawda czeski błąd na PCB dał mi trochę pić, ale udało się z tego wybrnąć.
Szczerze nie wiem kiedy znajdę czas na pisanie softu, bo w pracy zawracają mi głowę jakimś nietypowym PWMem do sterowania silnikiem, i będę musiał chcąc nie chcąc, nad tym siąść.
po godzinach w domu.
Szczerze nie wiem kiedy znajdę czas na pisanie softu, bo w pracy zawracają mi głowę jakimś nietypowym PWMem do sterowania silnikiem, i będę musiał chcąc nie chcąc, nad tym siąść.