...

Tutaj będą przenoszone tematy, którymi dalej nie warto się zajmować, co jakiś czas zawartość tego forum jest kasowana.
SQ8
-
Posty: 44
Rejestracja: 30 paź 2011, 14:11
Lokalizacja: ---

Post autor: SQ8 » 01 lis 2012, 10:46

...
Ostatnio zmieniony 31 gru 2012, 17:09 przez SQ8, łącznie zmieniany 1 raz.

Awatar użytkownika
kayron
Użytkownik
Posty: 2065
Rejestracja: 21 wrz 2008, 12:53
Lokalizacja: Poland
Kontakt:

Post autor: kayron » 01 lis 2012, 12:03

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.

SQ8
-
Posty: 44
Rejestracja: 30 paź 2011, 14:11
Lokalizacja: ---

Post autor: SQ8 » 01 lis 2012, 17:32

...
Ostatnio zmieniony 31 gru 2012, 17:09 przez SQ8, łącznie zmieniany 1 raz.

SQ8
-
Posty: 44
Rejestracja: 30 paź 2011, 14:11
Lokalizacja: ---

Post autor: SQ8 » 09 lis 2012, 21:57

...
Ostatnio zmieniony 31 gru 2012, 17:09 przez SQ8, łącznie zmieniany 1 raz.

Awatar użytkownika
kayron
Użytkownik
Posty: 2065
Rejestracja: 21 wrz 2008, 12:53
Lokalizacja: Poland
Kontakt:

Post autor: kayron » 09 lis 2012, 22:55

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.

SQ8
-
Posty: 44
Rejestracja: 30 paź 2011, 14:11
Lokalizacja: ---

Post autor: SQ8 » 10 lis 2012, 11:14

...
Ostatnio zmieniony 31 gru 2012, 17:09 przez SQ8, łącznie zmieniany 1 raz.

SQ8
-
Posty: 44
Rejestracja: 30 paź 2011, 14:11
Lokalizacja: ---

Post autor: SQ8 » 11 lis 2012, 16:26

...
Ostatnio zmieniony 31 gru 2012, 17:09 przez SQ8, łącznie zmieniany 1 raz.

Awatar użytkownika
kayron
Użytkownik
Posty: 2065
Rejestracja: 21 wrz 2008, 12:53
Lokalizacja: Poland
Kontakt:

Post autor: kayron » 11 lis 2012, 19:15

Moja idea w programie wyglądałaby mniej więcej tak:

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

SQ8
-
Posty: 44
Rejestracja: 30 paź 2011, 14:11
Lokalizacja: ---

Post autor: SQ8 » 11 lis 2012, 21:42

...
Ostatnio zmieniony 31 gru 2012, 17:10 przez SQ8, łącznie zmieniany 1 raz.

SQ8
-
Posty: 44
Rejestracja: 30 paź 2011, 14:11
Lokalizacja: ---

Post autor: SQ8 » 11 lis 2012, 22:00

...
Ostatnio zmieniony 31 gru 2012, 17:10 przez SQ8, łącznie zmieniany 1 raz.

Awatar użytkownika
kayron
Użytkownik
Posty: 2065
Rejestracja: 21 wrz 2008, 12:53
Lokalizacja: Poland
Kontakt:

Post autor: kayron » 12 lis 2012, 5:22

Ah.. bo to nie jest jeszcze skończony program, szczerze to go napisałem w 40 minut wczoraj wieczorem, i nie ma tam wyświetlania wyniku, i kompletengo algorytmu, głównie watki w przypadku niepowodzenia wykrycia tonu.

SQ8
-
Posty: 44
Rejestracja: 30 paź 2011, 14:11
Lokalizacja: ---

Post autor: SQ8 » 13 lis 2012, 21:51

...
Ostatnio zmieniony 31 gru 2012, 17:10 przez SQ8, łącznie zmieniany 1 raz.

Awatar użytkownika
kayron
Użytkownik
Posty: 2065
Rejestracja: 21 wrz 2008, 12:53
Lokalizacja: Poland
Kontakt:

Post autor: kayron » 18 lis 2012, 16:11

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ąść. :sad: po godzinach w domu.

SQ8
-
Posty: 44
Rejestracja: 30 paź 2011, 14:11
Lokalizacja: ---

Post autor: SQ8 » 20 lis 2012, 22:58

...
Ostatnio zmieniony 31 gru 2012, 17:10 przez SQ8, łącznie zmieniany 1 raz.

SQ8
-
Posty: 44
Rejestracja: 30 paź 2011, 14:11
Lokalizacja: ---

Post autor: SQ8 » 05 gru 2012, 19:26

...
Ostatnio zmieniony 31 gru 2012, 17:10 przez SQ8, łącznie zmieniany 1 raz.

Zablokowany