Operacje na sygnale PWM.
- Oldman
- Posty: 61
- Rejestracja: 19 cze 2019, 11:15
Operacje na sygnale PWM.
Zanim przejdę do sedna to chciałbym się z Wami przywitać bo to mój pierwszy post na tym forum. Zarejestrowałem się tu bo jesteście chyba ostatnim żywym forum poświęconym Bascomowi. No może jest jeszcze Elektroda ale sami wiecie...
Ale do rzeczy:
Projekt jest związany z modelarstwem RC, które jest moim drugim hobby zaraz za elektroniką.
Na dowolne wejście 8-nóżkowca (np. Attiny25) podaję sygnał RC, czyli impulsy o długości od 1ms do 2ms powtarzane co ok. 20ms. Nazwijmy go KanałA.
Na drugie wejście (najlepiej INT0) podaję podobny sygnał ale z innego kanału. Niech to będzie KanałB. Długość tego sygnału muszę zmierzyć ale z tym nie mam problemu.
Jeżeli długość impulsu w KanałB jest większa od 1,5ms to KanalA jest przekazywany do wyjścia bez zmian. Ale jeśli impuls będzie krótszy od 1,5ms to na wyjściu ma się pojawić sygnał "Neutrum" (1,5ms).
Krótko mówiąc: chcę mieć możliwość wyłączenia silnika za pomocą pstryczka niezależnie od wychylenia drążka gazu.
Poradźcie jak najprościej przekazać sygnał z wejścia do wyjścia bez zniekształceń mając na uwadze, że w przerwaniu INT0 układ będzie mierzył KanałB.
Rozpatruję też zastosowanie zewnętrznego klucza z bramek NAND (4011) a wtedy Attiny by tylko otwierał i zamykał przejście i dołączał sygnał "Neutrum".
Uprzedzam, że stosowanie mikserów w nadajniku odpada bo ja ten sygnał z drążka gazu (KanałA) potrzebuję w modelu jeszcze do czegoś innego
Ale do rzeczy:
Projekt jest związany z modelarstwem RC, które jest moim drugim hobby zaraz za elektroniką.
Na dowolne wejście 8-nóżkowca (np. Attiny25) podaję sygnał RC, czyli impulsy o długości od 1ms do 2ms powtarzane co ok. 20ms. Nazwijmy go KanałA.
Na drugie wejście (najlepiej INT0) podaję podobny sygnał ale z innego kanału. Niech to będzie KanałB. Długość tego sygnału muszę zmierzyć ale z tym nie mam problemu.
Jeżeli długość impulsu w KanałB jest większa od 1,5ms to KanalA jest przekazywany do wyjścia bez zmian. Ale jeśli impuls będzie krótszy od 1,5ms to na wyjściu ma się pojawić sygnał "Neutrum" (1,5ms).
Krótko mówiąc: chcę mieć możliwość wyłączenia silnika za pomocą pstryczka niezależnie od wychylenia drążka gazu.
Poradźcie jak najprościej przekazać sygnał z wejścia do wyjścia bez zniekształceń mając na uwadze, że w przerwaniu INT0 układ będzie mierzył KanałB.
Rozpatruję też zastosowanie zewnętrznego klucza z bramek NAND (4011) a wtedy Attiny by tylko otwierał i zamykał przejście i dołączał sygnał "Neutrum".
Uprzedzam, że stosowanie mikserów w nadajniku odpada bo ja ten sygnał z drążka gazu (KanałA) potrzebuję w modelu jeszcze do czegoś innego
- niveasoft
- Posty: 1221
- Rejestracja: 17 sie 2015, 12:13
- Kontakt:
Re: Operacje na sygnale PWM.
Po krótkim zastanowieniu...Tiny25, Tiny45 i Tiny85 mają dwa Timery, oraz PCINT na każdym pinie.
Jeden Timer ustawiłbym na generowanie sygnału PWM a drugim, po dobraniu jakiegoś preskalera mierzyłbym obydwa sygnały A i B w przerwaniach od PCINT.
Chodzi o to, że PCINT generuje się od każdej zmiany stanu na pinie. Czyli zawsze będziesz wiedział że akurat zmienił się stan na którymś z dwóch pinów wejściowych. Wystarczy odjąć od odczytanej poprzednio wartości Timera nowa wartość i już masz pomiar długości impulsu. Nie mierzyłbym impulsu w przerwaniu INT0. Szkoda czasu i można zgubić inny impuls.
Jeden Timer ustawiłbym na generowanie sygnału PWM a drugim, po dobraniu jakiegoś preskalera mierzyłbym obydwa sygnały A i B w przerwaniach od PCINT.
Chodzi o to, że PCINT generuje się od każdej zmiany stanu na pinie. Czyli zawsze będziesz wiedział że akurat zmienił się stan na którymś z dwóch pinów wejściowych. Wystarczy odjąć od odczytanej poprzednio wartości Timera nowa wartość i już masz pomiar długości impulsu. Nie mierzyłbym impulsu w przerwaniu INT0. Szkoda czasu i można zgubić inny impuls.
- Oldman
- Posty: 61
- Rejestracja: 19 cze 2019, 11:15
Re: Operacje na sygnale PWM.
Dziękuję za szybką odpowiedź. To forum rzeczywiście żyje!
Ciekawa sugestia z tym PCINT. Zawsze stosowałem z rozbiegu i przyzwyczajenia przerwania INT. Przyjrzę się bliżej tej opcji.
Wiem, że Attiny25 (45, 85) ma dwa Timery 8-bitowe ale chciałem uniknąć wykrywania zbocza , pomiarów itd. dla sygnału KanałA. Nie interesuje mnie jego wartość tylko muszę go najwierniej przesłać z wejścia do wyjścia. Chyba jednak zastosuję dodatkowo 4011. Jest to jedna kość więcej ale chyba mniejsza szansa na błędy w głównym sygnale i znaczne odciążenie mikroprocesora. Sygnał "Neutrum" chyba wygeneruję programowo, z tym nie powinno być problemu.
Ciekawa sugestia z tym PCINT. Zawsze stosowałem z rozbiegu i przyzwyczajenia przerwania INT. Przyjrzę się bliżej tej opcji.
Wiem, że Attiny25 (45, 85) ma dwa Timery 8-bitowe ale chciałem uniknąć wykrywania zbocza , pomiarów itd. dla sygnału KanałA. Nie interesuje mnie jego wartość tylko muszę go najwierniej przesłać z wejścia do wyjścia. Chyba jednak zastosuję dodatkowo 4011. Jest to jedna kość więcej ale chyba mniejsza szansa na błędy w głównym sygnale i znaczne odciążenie mikroprocesora. Sygnał "Neutrum" chyba wygeneruję programowo, z tym nie powinno być problemu.
- niveasoft
- Posty: 1221
- Rejestracja: 17 sie 2015, 12:13
- Kontakt:
Re: Operacje na sygnale PWM.
Wierne przekazanie jest dość proste. Piszesz:
i gotowe...
Teraz możesz to zawrzeć w warunku, że ma tak robić tylko kiedy Neutrum niepotrzebne ->Else Generuj Neutrum programowo.
Code: [Zaznacz cały] [Rozwiń/Zwiń]
- Do
- PORTB.0 = PINB.1
- Loop
Teraz możesz to zawrzeć w warunku, że ma tak robić tylko kiedy Neutrum niepotrzebne ->Else Generuj Neutrum programowo.
- Oldman
- Posty: 61
- Rejestracja: 19 cze 2019, 11:15
Re: Operacje na sygnale PWM.
Proste jak budowa cepa
Muszę teraz pokombinować z tym PCINT żeby przerwanie od INT0 nie zakłóciło kręcenia się tej pętelki. A podprogram z obliczeniami i całą resztą umieścić w czasowej "martwej strefie".
Muszę teraz pokombinować z tym PCINT żeby przerwanie od INT0 nie zakłóciło kręcenia się tej pętelki. A podprogram z obliczeniami i całą resztą umieścić w czasowej "martwej strefie".
- niveasoft
- Posty: 1221
- Rejestracja: 17 sie 2015, 12:13
- Kontakt:
Re: Operacje na sygnale PWM.
Pobawiłem się chwilę bo takie małe zadanka to lubię jak krzyżówki
U mnie generuje 1.5ms w odstępach 20ms jeśli w ciągu 20ms nie zobaczy impulsu dłuższego od 1.5ms na drugim pinie.
Pomyślałem że tu przerwań nie potrzeba. Może się przyda
Tymczasem wracam do swoich zajęć.
W zależności od tego jak skalibrowany będzie OSCCAL to może trzeba będzie doregulować te "19" przy Divider na inna wartość.
U mnie generuje 1.5ms w odstępach 20ms jeśli w ciągu 20ms nie zobaczy impulsu dłuższego od 1.5ms na drugim pinie.
Pomyślałem że tu przerwań nie potrzeba. Może się przyda
Tymczasem wracam do swoich zajęć.
W zależności od tego jak skalibrowany będzie OSCCAL to może trzeba będzie doregulować te "19" przy Divider na inna wartość.
Code: [Zaznacz cały] [Rozwiń/Zwiń]
- $regfile = "attiny85.dat"
- $crystal = 8000000
- $hwstack = 40
- $swstack = 4
- $framesize = 32
- Config Portb = &B001000 'PB3 wyjście
- Portb = &B110111
- Sig_out Alias Portb.3
- Sig_a Alias Pinb.2
- Sig_b Alias Pinb.4
- Dim Divider As Word
- Dim 20ms As Byte , Pulse_out As Byte
- Dim Puls_b As Byte , Pulse_timeout As Byte
- Dim Mode_op As Byte
- Do
- If Divider < 19 Then
- Incr Divider
- Else 'ok 0.1ms
- Divider = 0
- If Sig_b = 1 Then
- If Puls_b < 15 Then
- Incr Puls_b
- Else
- Pulse_timeout = 0
- Mode_op = 0
- End If
- Else
- If Pulse_timeout < 190 Then
- Incr Pulse_timeout
- Puls_b = 0
- Else
- Mode_op = 1
- End If
- End If
- If Mode_op = 1 Then
- 'software 1.5ms every 20ms
- '---------------------------
- If 20ms = 0 Then
- 20ms = 200
- Pulse_out = 15
- Set Sig_out
- Else
- Decr 20ms
- If Pulse_out > 0 Then
- Decr Pulse_out
- If Pulse_out = 0 Then Reset Sig_out
- End If
- End If
- '---------------------------
- End If
- End If
- If Mode_op = 0 Then Sig_out = Sig_a
- Loop
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
- Oldman
- Posty: 61
- Rejestracja: 19 cze 2019, 11:15
Re: Operacje na sygnale PWM.
Ciekawe podejście do tematu. Wszystko w pętli głównej
Przetestuję to jak tylko skończę inny projekt. Też w temacie RC
Przetestuję to jak tylko skończę inny projekt. Też w temacie RC
- Oldman
- Posty: 61
- Rejestracja: 19 cze 2019, 11:15
Re: Operacje na sygnale PWM.
Przedstawiam moje rozwiązanie tego zadania. Na razie z przerwaniem od INT0 i prymitywnym generowaniem impulsu "Neutrum" 1500us. Chciałem przetestować samą ideę, teraz czas na dopieszczanie. Muszę np. dołożyć ręczną korektę długości "Neutrum". Jako, że myślę o dołożeniu jeszcze jednego podprogramu (też z pomiarem długości impulsu) chcę wykorzystać PCINT, choć na razie nie wiem jak to ogarnąć z Timerem 8-bitowym.
I jeszcze taka ciekawostka:
Da się użyć polecenia np. "Waitus T" gdzie T to zmienna typu Byte lub Word, ale nie wiem dlaczego uzyskujemy impuls 4 razy dłuższy niż wartość tej zmiennej. Może ktoś mnie oświeci dlaczego tak się dzieje.
Code: [Zaznacz cały] [Rozwiń/Zwiń]
- $regfile = "attiny25.dat"
- $crystal = 1000000
- Dim A As Bit
- Dim P As Byte
- Config Portb = &B11110011 'PB0 wyj , PB2 to wejście A(INT0), PB3 to wej B
- Portb = &B11100000
- 'Config Watchdog = 256
- 'Start Watchdog
- Config Timer1 = Timer , Prescale = 8 'krok 8us, przepełnienie co 2,0480ms
- Enable Interrupts
- Enable Int0
- Config Int0 = Rising
- On Int0 Pomiar Nosave
- Do
- 'Reset Watchdog
- If A = 0 Then
- Portb.0 = Pinb.3
- End If
- Loop
- End
- Pomiar:
- $asm 'to efekt działania "NoSaveTool"
- !PUSH R16
- !PUSH R17
- !PUSH R21
- !PUSH R23
- !PUSH R24
- !PUSH R26
- !PUSH R30
- !PUSH R31
- !IN R24, SREG
- !PUSH R24
- $end Asm
- Timer1 = 0 ' pomiar długości impulsu wejściowego
- Waitus 200 'te 200us to bufor czasowy żeby wystarczyło Timera
- Start Timer1
- While Pinb.2 = 1
- Wend
- Stop Timer1
- P = Timer1
- If P < 190 Then 'gdy pstryczek w nadajniku wyłączony
- A = 1
- Portb.0 = 1
- Waitus 1500 'to generuj sygnał neutrum
- Portb.0 = 0
- Else
- A = 0 'gdy pstryczek włączony to przekazuj sygnał z wejścia do wyjścia
- End If
- $asm
- !POP R24
- !OUT SREG, R24
- !POP R31
- !POP R30
- !POP R26
- !POP R24
- !POP R23
- !POP R21
- !POP R17
- !POP R16
- $end Asm
- Return
Da się użyć polecenia np. "Waitus T" gdzie T to zmienna typu Byte lub Word, ale nie wiem dlaczego uzyskujemy impuls 4 razy dłuższy niż wartość tej zmiennej. Może ktoś mnie oświeci dlaczego tak się dzieje.
- niveasoft
- Posty: 1221
- Rejestracja: 17 sie 2015, 12:13
- Kontakt:
Re: Operacje na sygnale PWM.
Hmmm. Dotknij klawiatury F1 ->Help w Bascom. Wybierz temat "Waitus" ...ale dobrze, przytaczam wycinek, proszę
When the loop is set to 1, the minimum delay is 21 uS. In this case you can better use a NOP that generates 1 clock cycle delay.
At 4 MHz the minimum delay is 5 uS. So a waitus 3 will also generate 5 uS delay.
Above these values the delay will become accurate.
- Oldman
- Posty: 61
- Rejestracja: 19 cze 2019, 11:15
Re: Operacje na sygnale PWM.
Dzięki za odzew ale to co przytoczyłeś to oczywiście znam. I nie wyjaśnia tej "ciekawostki". Ja mówię o dużo większych wartościach. Weź przetestuj sobie co wygeneruje Waitus dla T = 300, albo T = 800. Fusebity fabryczne.
Aktualizacja: Tak jak przy problemach z taktowaniem (mój drugi wątek) tak i w tym przypadku za dziwne działanie Waitms odpowiedzialny był uszkodzony procesor. Teraz wszystko śmiga jak należy.
Aktualizacja: Tak jak przy problemach z taktowaniem (mój drugi wątek) tak i w tym przypadku za dziwne działanie Waitms odpowiedzialny był uszkodzony procesor. Teraz wszystko śmiga jak należy.