logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[A32] Emulator dekodera PT2272 w Bascom - problem z wykrywaniem bajtu synchronizacji

PiotrEtenM500 27 Lut 2012 22:47 3301 10
REKLAMA
  • #1 10608793
    PiotrEtenM500
    Poziom 19  
    Próbuję zrobić emulator dekodera PT2272 (dekoder pilotów radiowych), transmisja nie jest zbyt skomplikowana i wykonanie kodera było proste. Problem zaczyna sie po stronie odbiorczej. Na przebiegu zaznaczyłem wszystkie 4 stany jakie występują w słowie kodowym. Są to odpowiednio "0" "1" "T" i ostatni synchronizujący.

    [A32] Emulator dekodera PT2272 w Bascom - problem z wykrywaniem bajtu synchronizacji

    Napisałem programik i coś nie wykrywa bajtu synchronizacji który jest na końcu

    [syntax=basic4gl]$regfile = "m32def.dat"
    $crystal = 16000000
    
    
    'Config Lcd = 16 * 2
    'Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 , Db7 = Portc.7 , E = Portc.3 , Rs = Portc.2
    
    
    
    Config Pind.2 = Input
    Config Porta.1 = Output
    Config Timer0 = Timer , Prescale = 256                      '16000000/256=15625 Hz
    Config Int0 = Rising                                        'Wyzwalanie zboczem opadającym
    Stop Timer0
    Enable Timer0
    Enable Int0
    Enable Interrupts
    On Timer0 Szpilka                                           'timer
    On Int0 Rf433                                               'przerwanie 0
    
    
    Dim Detekcja As Bit                                         'informacja o odnalezieniu bytu synchro
    Dim Czas As Integer                                         'zmienna długości impulsu
    Dim T1 As Byte                                              'wynik pomaitu długości impulsu sychronizującego
    Dim T2 As Word
    
    
       Do
    
        If Detekcja = 1 Then
    
          Porta.1 = 1                                           'informacja - synchronizacji
           Wait 1
            Else
             Porta.1 = 0                                        'informacja - brak synchronizacji
        End If
    
    
      Loop
    
    End
    
    '###############################################################################
     Szpilka:
    
     Timer0 = 255                                               '15625/(256-255)=15625 Hz
    
     Incr Czas
    
      If Czas >= 1500 Then
         Czas = 0
         Stop Timer0
      End If
    
    
    
     Return
    
    '###############################################################################
    
    
     Rf433:
    
    
     Start Timer0
     Czas = T1
     T2 = T1 * 16                                               ' tu powinno być x64, ale przekracza to już deklaracje WORD
     If Czas = T2 Then
     Detekcja = 1
     Czas = 0
     T1 = 0
     T2 = 0
     End If
    
     Return
    
    '################################################################################################################[/syntax]


    Co tu jest nie tak w kodzie?

    liczyć mam tak:
    pojawia się zbocze narastające wiec czas=0. wchodzi do Timera0 liczy czas do chwili zbocza opadającego. Czyli zakładamy ze trwało to 400 cykli. wiec czas = 400. Teraz mnożymy czas*16 i odliczamy T2 jeśli T2 = czas*16 to oznacza, że mam poprawnie odczytany bajt synchronizacji. Ale tego nie mogę osiągnąć.

    [A32] Emulator dekodera PT2272 w Bascom - problem z wykrywaniem bajtu synchronizacji[/url]

    czyli kolejność:
    1. detekcja zbocza narastającego uruchamia licznik
    2. licznik do zmiennej Czas wstawia wartość czasu stanu wysokiego
    3. zbocze opada i Czas przepisuje do T2 i mnożę razy 16
    6. czas liczony jest od 0, jeśli czas stanu niskiego osiągnie wartość T2, wpisuje do zmiennej Detekcja wartość 1. wszystkie zmienne zeruje wyświetla tekst, wstrzymuje działanie na 1 sek
    7. proces od początku
  • REKLAMA
  • #2 10610602
    Konto nie istnieje
    Konto nie istnieje  
  • REKLAMA
  • #3 10611990
    PiotrEtenM500
    Poziom 19  
    1) Dokładnie tak chciałem zrobić, czyli przerwaniem INT0 wykrycie zbocza narastającego i uruchomienie TIMER0 do obliczenia „czas” i od razu z automatu stany niskiego „czas” x 7. Czyli 4 bity poskładane w bajt synchronizacji i tym otworzyć „bramę” do odczytu pozostałych które są tworzone w ten sam sposób. Tylko za CHRL nie daje rady z tymi obliczeniami czasu trwania stanu wysokiego podstawowego, bo bez tego dalej nie ruszę.

    2) 400, nie jest stałą, a zmienną. Stała jest tylko w czasie nadawania i długość podaje bajt synchronizacji. Obliczenia, są zmiennymi do kolejnych odczytów i obliczeń.

    3) Tak zrobiłem bez przerwań „ręcznie” na stałych niestety rozjeżdża się to strasznie i raz na 50 prób zadziała.

    4) już szukam, bo w zasadzie jest to, dokładnie to samo tyle, że więcej zakłóceń/szumów i z tego trzeba wyłuskać właściwe słowo

    5) Kod który podałeś nic nie zmienia wartość nadal otrzymuje 0 czyli brak poprawności odczytu.

    6) tu obrazek dokładnie jak to wygląda

    [A32] Emulator dekodera PT2272 w Bascom - problem z wykrywaniem bajtu synchronizacji

    Jeśli coś pomoże to mam napisany i działający kod nadajnika. Dział doskonale ze sprzętowym odbiornikiem PT2272. Chyba nawet lepiej niż oryginalny pilot jest to kwestią nadajnika jak sadzę. Jeszcze jedna uwaga jeśli w pilocie stałą czas zmieniam w przedziale od 150 do 600 uS odbiornik sprzętowy spokojnie sobie z tym radzi.
  • #4 10612263
    Konto nie istnieje
    Konto nie istnieje  
  • REKLAMA
  • #5 10612302
    PiotrEtenM500
    Poziom 19  
    PiotrEtenM500 napisał:
    1) Dokładnie tak chciałem zrobić, czyli przerwaniem INT0 wykrycie zbocza narastającego i uruchomienie TIMER0 do obliczenia „czas” i od razu z automatu stany niskiego „czas” x 7. Czyli 4 bity poskładane w bajt synchronizacji i tym otworzyć „bramę” do odczytu pozostałych które są tworzone w ten sam sposób. Tylko za CHRL nie daje rady z tymi obliczeniami czasu trwania stanu wysokiego podstawowego, bo bez tego dalej nie ruszę.

    2) 400, nie jest stałą, a zmienną. Stała jest tylko w czasie nadawania i długość podaje bajt synchronizacji. Obliczenia, są zmiennymi do kolejnych odczytów i obliczeń.

    3) Tak zrobiłem bez przerwań „ręcznie” na stałych niestety rozjeżdża się to strasznie i raz na 50 prób zadziała.

    4) już szukam, bo w zasadzie jest to, dokładnie to samo tyle, że więcej zakłóceń/szumów i z tego trzeba wyłuskać właściwe słowo

    5) Kod który podałeś nic nie zmienia wartość nadal otrzymuje 0 czyli brak poprawności odczytu.

    6) tu obrazek dokładnie jak to wygląda

    [A32] Emulator dekodera PT2272 w Bascom - problem z wykrywaniem bajtu synchronizacji

    Jeśli coś pomoże to mam napisany i działający kod nadajnika. Dział doskonale ze sprzętowym odbiornikiem PT2272. Chyba nawet lepiej niż oryginalny pilot jest to kwestią nadajnika jak sadzę. Jeszcze jedna uwaga jeśli w pilocie stałą czas zmieniam w przedziale od 150 do 600 uS odbiornik sprzętowy spokojnie sobie z tym radzi.


    Kod nadajnika PT2262 załączający kolejno karzy port dekodera PT2272

    
    'Emulator układu kodującego PT2262 stosowanego w większości pilotów
    ' samochodowych, zabawek, aparatury modelarskiej, etc...............
    'Do Portu B0 Podłaczamy Dowolny Nadajnik Na 433mhz Np Tx433 Volleman
    
    $regfile = "m32def.dat"
    $crystal = 16000000
    
    Config Portb.0 = Output
    
    Dim T As Word                                               'oscylator
    Dim T1 As Word                                              'oscylator x3
    Dim T2 As Word                                              'oscylator x7
    Dim T3 As Word                                              'przerwa pomiedzy słowem
    Dim A As Byte , C As Byte
    
    Rfout Alias Portb.0
    
    
    Pocz:
    Do
            Gosub Push1
            Gosub Push2
            Gosub Push3
            Gosub Push4
            Gosub Push5
            Gosub Push6
            Gosub Push7
            Gosub Push8
            Gosub Push9
            Gosub Push10
            Gosub Push11
            Gosub Push12
            Wait 10
    
    Loop
    End
    
          '*************************************************************************
          '**************************** Przycisk nr 1  *****************************
          '**************************** KLUCZ 0-0-0-1  *****************************
          '*************************************************************************
    Push1:
                For A = 0 To 3
                Gosub Kodpilot
    
                Gosub Sendbit0
                Gosub Sendbit0
                Gosub Sendbit0
                Gosub Sendbit1
    
                Gosub Syncbit
                Waitus T3
                Next A
    
    
    Goto Pocz
    
          '*************************************************************************
          '**************************** Przycisk nr 2  *****************************
          '**************************** KLUCZ 0-0-1-0  *****************************
          '*************************************************************************
    Push2:
                For A = 0 To 3
                Gosub Kodpilot
    
                Gosub Sendbit0
                Gosub Sendbit0
                Gosub Sendbit1
                Gosub Sendbit0
    
                Gosub Syncbit
                Waitus T3
                Next A
    Return
    
          '*************************************************************************
          '**************************** Przycisk nr 3  *****************************
          '**************************** KLUCZ 0-0-1-1  *****************************
          '*************************************************************************
    Push3:
                For A = 0 To 3
                Gosub Kodpilot
    
                Gosub Sendbit0
                Gosub Sendbit0
                Gosub Sendbit1
                Gosub Sendbit1
    
                Gosub Syncbit
                Waitus T3
                NEXT a
    Return
    
          '*************************************************************************
          '**************************** Przycisk nr 4  *****************************
          '**************************** KLUCZ 0-1-0-0  *****************************
          '*************************************************************************
    Push5:
                For A = 0 To 3
                Gosub Kodpilot
    
                Gosub Sendbit0
                Gosub Sendbit1
                Gosub Sendbit0
                Gosub Sendbit0
    
                Gosub Syncbit
    
                waitus T3
                Next A
    Return
    
          '*************************************************************************
          '**************************** Przycisk nr 5  *****************************
          '**************************** KLUCZ 0-1-0-1  *****************************
          '*************************************************************************
    Push6:
                For A = 0 To 3
                Gosub Kodpilot
    
                Gosub Sendbit0
                Gosub Sendbit1
                Gosub Sendbit0
                Gosub Sendbit1
    
                Gosub Syncbit
                Next Awaitus T3
    
    Return
    
          '*************************************************************************
          '**************************** Przycisk nr 6  *****************************
          '**************************** KLUCZ 0-0-1-0  *****************************
          '*************************************************************************
    Push4:
                For A = 0 To 3
                Gosub Kodpilot
    
                Gosub Sendbit0
                Gosub Sendbit1
                Gosub Sendbit1
                Gosub Sendbit0
    
                Gosub Syncbit
                Waitus T3
                NEXT a
    Return
    
          '*************************************************************************
          '**************************** Przycisk nr 7  *****************************
          '**************************** KLUCZ 0-1-1-1  *****************************
          '*************************************************************************
    Push7:
                For A = 0 To 3
                Gosub Kodpilot
    
                Gosub Sendbit0
                Gosub Sendbit1
                Gosub Sendbit1
                Gosub Sendbit1
    
                Gosub Syncbit
                Waitus T3
                NEXT a
    Return
    
          '*************************************************************************
          '**************************** Przycisk nr 8  *****************************
          '**************************** KLUCZ 1-0-0-0  *****************************
          '*************************************************************************
    Push8:
                For A = 0 To 3
                Gosub Kodpilot
    
                Gosub Sendbit1
                Gosub Sendbit0
                Gosub Sendbit0
                Gosub Sendbit0
    
                Gosub Syncbit
                Waitus T3
                NEXT a
    Return
    
          '*************************************************************************
          '**************************** Przycisk nr 9  *****************************
          '**************************** KLUCZ 1-0-0-1  *****************************
          '*************************************************************************
    Push9:
                For A = 0 To 3
                Gosub Kodpilot
    
                Gosub Sendbit1
                Gosub Sendbit0
                Gosub Sendbit0
                Gosub Sendbit1
    
                Gosub Syncbit
                Waitus T3
                NEXT a
    Return
    
          '*************************************************************************
          '**************************** Przycisk nr 10  *****************************
          '**************************** KLUCZ 1-0-1-0  *****************************
          '*************************************************************************
    Push10:
                For A = 0 To 3
                Gosub Kodpilot
    
                Gosub Sendbit1
                Gosub Sendbit0
                Gosub Sendbit1
                Gosub Sendbit0
    
                Gosub Syncbit
                Waitus T3
                NEXT a
    Return
    
          '*************************************************************************
          '**************************** Przycisk nr 11 *****************************
          '**************************** KLUCZ 1-0-1-1  *****************************
          '*************************************************************************
    Push11:
                For A = 0 To 3
                Gosub Kodpilot
    
                Gosub Sendbit1
                Gosub Sendbit0
                Gosub Sendbit1
                Gosub Sendbit1
    
                Gosub Syncbit
                Waitus T3
                NEXT a
    Return
    
          '*************************************************************************
          '**************************** Przycisk nr 12 *****************************
          '**************************** KLUCZ 1-1-0-0  *****************************
          '*************************************************************************
    Push12:
                For A = 0 To 3
                Gosub Kodpilot
    
                Gosub Sendbit1
                Gosub Sendbit1
                Gosub Sendbit0
                Gosub Sendbit0
    
                Gosub Syncbit
                Waitus T3
                Next A
    Return
    
    '*******************************************************************************
    '*******************************************************************************
    '*******************************************************************************
    
    Sendbit0:                                                   ' Hi
             Set Rfout
             Waitus T
             Reset Rfout
             Waitus T1
             Set Rfout
             Waitus T
             Reset Rfout
             Waitus T1
    
    Return
    
    '*******************************************************************************
    
    Sendbit1:                                                   'Lo
             Set Rfout
             Waitus T1
             Reset Rfout
             Waitus T
             Set Rfout
             Waitus T1
             Reset Rfout
             Waitus T
    Return
    
    '*******************************************************************************
    
    Sendbit2:                                                   ' F
             Set Rfout
             Waitus T
             Reset Rfout
             Waitus T1
             Set Rfout
             Waitus T1
             Reset Rfout
             Waitus T
    Return
    
    '*******************************************************************************
    
    Syncbit:
             Set Rfout                                          ' sync bit
             Waitus T
             Reset Rfout
             Waitus T2
    Return
    
    '*******************************************************************************
    '*******************************************************************************
    '*******************************************************************************
    
    Kodpilot:
          T = 467                                               'od 150 do 1000
          T1 = T * 3
          T2 = T * 7
          T3 = T * 8
          Reset Rfout
          Gosub Sendbit0
          Gosub Sendbit1
          Gosub Sendbit1
          Gosub Sendbit1
          Gosub Sendbit0
          Gosub Sendbit2
          Gosub Sendbit2
          Gosub Sendbit2
    Return


    Dodano po 17 [minuty]:

    Saabotaz napisał:
    1)

    Już ci pisałem, jeśli wiesz że szpilka będzie miała długość "Czas=400" to zrób porównanie ale z przedziałem np 395<x<405



    napisałem wcześniej że czas 400 nie jest stałą. To było tylko założenie teoretyczne waha się od 150-1000

    dlatego wyjściowym problemem jest obliczenie czasu mniejszej szpilki w bajcie synchronizacji, dalej pomnożyć przez 3 i to dopiero daje pełny bajt otwarcia dekodowania całego słowa. Zmienna czas jest kluczowa dla wszystkich bitów i w całości bajtów i kompletnego słowa. Dopiero pierwszy bajt słowa może dać możliwość sprawdzenia czy jest to poprawna kombinacja.

    Na wstępie nie masz do czego się odnieść.

    Zwróć uwagę na przebieg są tam wysokie szpilki możliwe, ze one są szukaną stałą do szacowania poprawności czasowych pomiędzy bajtami w słowie. Jeśli są zachowane występuje poprawność dekodowania. Stała "czas" niema wpływu na dekoder sprzętowy. Rozciągam bajty od 150 - 1000 i jest poprawnie dekodowane. Np wysyłam 2 słowa z oscylacja 150, kolejne dwa z 600 i następne, 2 z 300 i nie ma to wpływu, jest poprawny odczyt

    Dodano po 31 [minuty]:

    Saabotaz napisał:
    1) To jest twoj problem

    Czas = T1
    T2 = T1 * 16
    If Czas = T2 Then



    No własnie tak tylko mogę wyznaczyć stałe czasowe, dlaczego?
    Już wyjaśniam
    Zmienna "Czas" nie jest stała wartością należy ja obliczyć
    Zaczyna się od zbocza rosnącego i trwa (czyli to jest szukana zmienna "czas") do chwili zbocza opadającego, następnie zbocze opadające trwa 3 x czas
    czyli matematycznie zakładamy że:

    1. AVR zmierzył "czas" - 200 teraz ja mnożę czas x 3 czyli 600 czyli cały bajt zajmuje 200+600=800 cykli i to jest klucz ze każdy następny musi mieć tyle samo. Ale zweryfikować go mogę tylko następnym który nadejdzie, a przyjdzie on też w różnych przedziałach. raz jest to czas x 4(minimalny) a czasem, czas x 64 lub czas x 128 (największy odstęp pomiędzy słowem)
    Myślę że teraz to jest trochę transparętniej napisane

    Jedyną stałą wartością przed rozpoczęciem transmisji jest zbocze narastające i utrzymanie czasu trwania stanu wysokiego w przedziale 150-1000


    Założyłem że:

    1 czekam na stan wysoki
    2 licznik zlicza takty do chwili zbocza opadającego
    3 mam hipotetyczną wartość "czas"
    4 czas mnożę x 3 = T2
    5 licznik liczy teraz stan niski
    6 sprawdzam czy stan niski osiągnął wartość czas >= T2 jeśli tak TIMER0 STOP
    jeśli pojawi się w czasie "czas x 3" stan H TIMER0 STOP - czas=0 reset zminnych i odczytuje dalej
    ale jeśli jest spełniony warunek to czekaj max czas x 128 jeśli przekroczenie czas = 0 jeśli pojawi się stan wysoki licz czas if czas => T2 or czas=> t2x3 then zapisz do tablicy i tak kolejnych 26 razy tyle co wynosi pełne słowo az do bajtu od którego zaczynaliśmy

    ale pierwsze słowo zawsze jest na straty bo ma bajt synchronizacji na końcu a nie na początku wiec nadaje stałe czasowe większe i mniejsze szpilki. Mogę już zacząć szukać stałej czasowej z mniejszą szpilka, bo na 99% kolejne słowo zacznie sie własnie od tej zmiennej "czas" mniejszej szpilki. wiec w pierwszym słowie którego nie odczytam poprawnie na końcu pojawia sie bajt synchronizujący i już mogę porównać z czymś co jest w tablicy

    Szpilki ze stanem H mam tylko o dwóch szerokościach "czas" i "czas x 3"
    wiec z tego coś pewnie wyłuskam ale praktycznie posklejać tego nie mogę programowo.

    Z wiadomych i stałych wiem ze wszystkie bajty, a jest ich rodzaje 4 czyli 0,1,T,S zaczynają się od stanu H

    Wiec może faktycznie nie głupim jest zastosować bitwait?
  • #6 10614617
    PiotrEtenM500
    Poziom 19  
    Saabotaz napisał:
    1) To jest twoj problem

    Czas = T1
    T2 = T1 * 16
    If Czas = T2 Then



    Tu masz rację błędy są aż 2

    pierwszy to co teraz zmierzyłem to wartość jest stała i wynosi nie 16 a 31 długości "czas"

    więc może uporządkuję to co już jest wiadome.

    zmienna "czas" jest różna w każdym pilocie i wynosi w 10 szt jakich mam w domu od 153 uS do 526 uS

    jeśli zrobił bym takie sztywne złożenie jakie proponujesz czyli np. 153<X>526, to jest to błędne założenie bo różnica pomiędzy najniższą wartością a najwyższą przekracza 100% co koliduje z logiką mniejszej części.

    Więc to założenie jest słuszne jako korekcja ale nie podstawą obliczenia czasu trwania zmiennej podstawowej "czas"

    Błąd drugi w zapisie, to fakt że T2 jest stanem L i ma trwać "czas" x 31.
    Natomiast T2 nie został niczym zmierzony wiec fragment kodu jest kompletnie bez sensu.

    pokazuje to poniższy obraz bitu synchronizacji:

    [A32] Emulator dekodera PT2272 w Bascom - problem z wykrywaniem bajtu synchronizacji
  • #7 10615132
    Konto nie istnieje
    Konto nie istnieje  
  • #8 10615373
    PiotrEtenM500
    Poziom 19  
    a to niby dlaczego?

    skro znam T stanu H a po nim ma nastąpić 31x L i ten czas zostanie przekroczony lub w tym czasie nie wystąpi stan H to odczytam poprawie,
    tak sadzę?

    pozostałe Bajty są tak jak napisałeś rozpoczynające się od H

    rysunek poniżej

    [A32] Emulator dekodera PT2272 w Bascom - problem z wykrywaniem bajtu synchronizacji

    Właśnie skrobie jakiś program, choć zastanawia mnie czy to zwyczajnie by nie odebrał programowy RS, tylko ten zmienny czas oscylatora mnie męczy.
  • #9 10615430
    Konto nie istnieje
    Konto nie istnieje  
  • REKLAMA
  • #10 10690351
    Duch__
    Poziom 31  
    Czy autor postu rozwiązał problem i mógłby się podzielić efektami pracy?
  • #11 10709979
    PiotrEtenM500
    Poziom 19  
    Niestety problem jest nadal nierozwiązany. Chwilowo nie zajmowałem realizacją projektu z baku czasu, ale już wracam do "walki". Międzyczasie pisałem do producenta układu w Chinach i dostałem "gotowca" w Asemblerze pod 8051.
    Próbowałem to przełożyć na Basic ale opornie to idzie.
REKLAMA