Wróciłem do rozgrzebanego projektu i aktualnie walczę z obsługą impulsatora.
Użyty procesor to ATMEGA 16 z zewnętrznym taktowaniem 16MHz.
PD2 (INT0), PD3(INT1) są skonfigurowane jako wejścia z podciągnięciem do 1 i do nich podłączone są piny impulsatora odpowiednio PD2 A i PD3 B (patrz załączony plik pdf).
W przerwaniach chciałbym zliczać liczbę opadających zboczy na tych wejściach aby obliczać prędkość obrotową impulsatora.
Założenie programowe jest takie aby w zależności prędkości impulsatora zwiększać lub zmniejszać wartość zmiennej. Ideałem byłoby rozróżnić trzy zakresy i zmienną zmieniać np, co 1, 10, 100 na skok.
Przerwania w programie
ISR(TIMER2_COMPA_vect) //przerwanie do multipleksowania wyświetlaczy oraz wyznaczenia czasu 100ms do celów pomiarowych.
Przerwania są wyzwalane opadającym zboczem:
Obsługa impulsatora do zliczanie impulsów odbywa się w pętli głównej z wykorzystaniem udostępnionego na Elektrodzie programu, który działa bezbłędnie.
Czyli problem nie dotyczy zmiany określonej zmiennej powiedzmy "x" tylko sposobu ustalenia prędkości obrotowej impulsatora aby ta zmienną "x" zmieniać z różną krotnością.
Zamysł jest taki że jak jest wywołane przerwanie od opadającego zbocza (raz na skok) zwiększałem lub zmniejszałem zmienną w przerwaniu. Wychodziły bardzo niestabilne wyniki. Dodałem warunek który z założenia powinien wyeliminować lub przynajmniej zmniejszyć wpływ drgania styków, sprawdzając czy przerwanie następuje w momencie kiedy na drugim pinie impulsatora jest stan wysoki, ale nic to nie dało.
Próbowałem różnych kombinacji ale ostatnie wyniki są dramatyczne. Są zmiany zmiennej w przerwaniu czasem o 1, 3, czasem 10 ale i zdarza się o 10 tys. To nie mogą być drgania.
Wartość zmiennych odczytuję w pętli głównej.
Gdyby ogarnąć te przerwania to zakładałem, że ilość przerwań zliczałbym w innym przerwaniu od licznika2, gdzie odmierzam 100ms.
Załączam też pdfa z wykorzystanym impulsatorem.
Użyty procesor to ATMEGA 16 z zewnętrznym taktowaniem 16MHz.
PD2 (INT0), PD3(INT1) są skonfigurowane jako wejścia z podciągnięciem do 1 i do nich podłączone są piny impulsatora odpowiednio PD2 A i PD3 B (patrz załączony plik pdf).
W przerwaniach chciałbym zliczać liczbę opadających zboczy na tych wejściach aby obliczać prędkość obrotową impulsatora.
Założenie programowe jest takie aby w zależności prędkości impulsatora zwiększać lub zmniejszać wartość zmiennej. Ideałem byłoby rozróżnić trzy zakresy i zmienną zmieniać np, co 1, 10, 100 na skok.
Przerwania w programie
Kod: C / C++
ISR(TIMER2_COMPA_vect) //przerwanie do multipleksowania wyświetlaczy oraz wyznaczenia czasu 100ms do celów pomiarowych.
Przerwania są wyzwalane opadającym zboczem:
Kod: C / C++
Obsługa impulsatora do zliczanie impulsów odbywa się w pętli głównej z wykorzystaniem udostępnionego na Elektrodzie programu, który działa bezbłędnie.
Kod: C / C++
Czyli problem nie dotyczy zmiany określonej zmiennej powiedzmy "x" tylko sposobu ustalenia prędkości obrotowej impulsatora aby ta zmienną "x" zmieniać z różną krotnością.
Zamysł jest taki że jak jest wywołane przerwanie od opadającego zbocza (raz na skok) zwiększałem lub zmniejszałem zmienną w przerwaniu. Wychodziły bardzo niestabilne wyniki. Dodałem warunek który z założenia powinien wyeliminować lub przynajmniej zmniejszyć wpływ drgania styków, sprawdzając czy przerwanie następuje w momencie kiedy na drugim pinie impulsatora jest stan wysoki, ale nic to nie dało.
Próbowałem różnych kombinacji ale ostatnie wyniki są dramatyczne. Są zmiany zmiennej w przerwaniu czasem o 1, 3, czasem 10 ale i zdarza się o 10 tys. To nie mogą być drgania.
Wartość zmiennych odczytuję w pętli głównej.
Gdyby ogarnąć te przerwania to zakładałem, że ilość przerwań zliczałbym w innym przerwaniu od licznika2, gdzie odmierzam 100ms.
Załączam też pdfa z wykorzystanym impulsatorem.
Moderowany przez dondu:Formatowanie kodu poprawiłem.