Witam, na forum udzielam się pierwszy raz, zazwyczaj staram się dojść do rozwiązania problemu sam, jednak tym razem proszę o wyjaśnienie pewnej kwestii.
Chcę zbudować zapłon o regulowanym kącie wyprzedzenia do mojego motocykla. Użyłem Atmegi 8 na razie nie mam jeszcze oscylatora więc całość pędzi na 1 MHz (Wyliczone na 16MHz).
Piszę w Atmel Studio.
Do wykrywania położenia wału użyłem transoptora szczelinowego, atmega mierzy czas trwania 1/4 obrotu wału. Pomiar rozpoczyna się pół obrotu przed GMP.
Program który już napisałem działa tak:
1.Zmienne deklaracje, timer 1 tryb normalny, zezwolenie na przerwania od Input Capture i przepełnienia
2.Program w pętli głównej sprawdza flagę
3.Przy wystąpieniu przerwania od ICP program uruchamia timer (preskaler 1) oraz zmienia zbocze uruchamiające kolejne przerwanie
4.Przy wystąpieniu kolejnego przerwania od ICP (koniec pomiaru) program zapisuje wartość rejestru ICR1 do zmiennej, ustawia flagę wyk. pomiaru i zmienia zbocze uruchamiające kolejne przerwanie ICP.
5.Program sprawdza flagę, zeruje ją, wykonuje obliczenia i wartość czasu którą mikrokontroler ma czekać wpisuje do rejestru porównania OCR1A. Następnie włącza przerwanie od porównania OCR1A i wyłącza przerwanie od ICP
6.W przerwaniu od porównania OCR1A program wyłącza timer, wyłącza przerwania od porównania OCR1A, włącza przerwania od ICP oraz będzie rozłączał obwód cewki, na razie tylko zmienia stan diody.
Do sedna - wyłączenie przerwania od ICP po obliczeniach i włączenie go w przerwaniu od porównania OCR1A powoduje że to przerwanie nadal nie jest włączone. Skutkiem jest to że program wykonuje się tylko jeden raz. Rozwiązaniem jest nie wyłączanie przerwania ICP. Jednak zastanawiam się dlaczego tak się dzieje. Dlaczego program nie jest w stanie odblokować przerwania ICP w przerwaniu od porównania?
Możliwe że mój tok rozumowania jest błędny i inny czynnik wpływa na taką pracę programu
Jestem początkujący, byłbym wdzięczny za wszystkie uwagi c.d. kodu i jego działania.
Zamieszczam kod:
Cytuj:
#define F_CPU 1000000L <---- skoro kolega jest z nami na forum od 2014 roku to powinien wiedzieć że TEGO NIGDY NIE PISZE SIĘ w kodzie ... a szczególnie na tym forum nie prezentujemy takich kodów z tym wpisem - tępimy to ogniem i mieczem i proszę na przyszłość o tym pamiętać ok ? Jeśli kolega chce się z tym męczyć to proszę .... ale nie wklejać tego na tym forum - mirekk36
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.