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