Witam. Mam taki problem. Mam program, w którym używam dwóch przerwań, z timera 0 i timera 1. Przerwanie z timera 0 jest wywoływane co kilka ms zaś przerwanie z timera 1 co 10 s. Chciałbym aby podczas trwania przerwania 1 (może trwać do kilkudziesięciu sekund) było wywoływane przerwanie z timer 0. Niestety tak się nie dzieje, przerwanie z timer 0 jest wykonywane dopiero po zakończeniu obsługi przerwania z timer 1
$regfile = "m128def.dat"
$crystal = 4000000
Config Timer0 = Timer , Prescale = 1024
Config Timer1 = Timer , Prescale = 1024
Enable Interrupts
Enable Timer0
Enable Timer1
On Timer0 Przerwanie_timer0
On Timer1 Przerwanie_timer1
Timer0 = 10
Timer1 = 26477
Start Timer0
Start Timer1
Do
'pętla główna programu
Loop
Przerwanie_timer1:
Stop Timer1
' Przerwanie z Timera 1 wywoływane co 10s. może potrwać długo, do kilkudziesięciu
' sekund. Chciałbym aby operacej te były przerywane przerwaniem od Timera 0.
Timer1 = 26477
Start Timer1
Return
Przerwanie_timer0:
Stop Timer0
' Przerwanie z Timera 0 wywoływano ok 20 razy na sekundę (dokładność nie istotna),
' trwa bardzo krótko, tylko odczytuje czy coś przyszło na UART.
Timer0 = 10
Start Timer0
Return
Czy istnieje możliwość wykonania przerwania przerwania w bascomie?
Aktyw Forum
Zarejestruj się na forum.ep.com.pl i zgłoś swój akces do Aktywu Forum. Jeśli jesteś już zarejestrowany wystarczy, że się zalogujesz.
Sprawdź punkty Zarejestruj sięPrzerwanie w przerwaniu...??
Moderatorzy:Jacek Bogusz, robertw, k.pawliczak, Moderatorzy
-
- -
- Posty:32
- Rejestracja:2 mar 2005, o 11:07
- Lokalizacja:Hajnówka
- Kontaktowanie:
IMHO przerwanie o czasie wykonania 10s to przesada. Co to będzie jeżeli można wiedzieć?
Proponuję umieścić planowaną procedurę przerwania (od Timera1) w pętli głównej, natomiast w samym przerwaniu od T1 ustawaić jakąś flagę, która decydowałaby o wykonaniu procedury zamieszczonej w pętli głównej. Ten sposób pozwoli na wykonywanie przerwań od T0.
Ważne: należy zadbać o to, żeby przerwanie od T0 nie zaburzało pracy tej drugiej procedury, tj. nie zmieniało np. zawartości zmiennych, na których obecnie przeprowadzane są obliczenia etc...
Proponuję umieścić planowaną procedurę przerwania (od Timera1) w pętli głównej, natomiast w samym przerwaniu od T1 ustawaić jakąś flagę, która decydowałaby o wykonaniu procedury zamieszczonej w pętli głównej. Ten sposób pozwoli na wykonywanie przerwań od T0.
Ważne: należy zadbać o to, żeby przerwanie od T0 nie zaburzało pracy tej drugiej procedury, tj. nie zmieniało np. zawartości zmiennych, na których obecnie przeprowadzane są obliczenia etc...
- Darlington
- -
- Posty:574
- Rejestracja:12 lis 2007, o 18:18
- Lokalizacja:stąd!
Nie wiem jak to jest w 8051, ale w AVRach priorytet ma znaczenie tylko podczas pojawienia się co najmniej dwóch przerwań w tym samym czasie (takcie zegara stystemowego). Wywołanie przerwania x zeruje znacznik I w rejestrze SREG, co uniemożliwia wywołanie w tym czasie innego przerwania. Można wykonać przerwanie w przerwaniu ustawaiając na początku znacznik globalnego zezwolenia na przerwania.Przerwanie może być przerwane innym przerwaniem pod warunkiem że przerwanie oczekujące ma równy lub wyższy priorytet od przerwania aktualnie wykonywanego.
Pamiętam to z układów mikroprocesorowych z 8051.
Tak jak napisał Ddevil... w AVRach można wywoływać przerwanie w przerwaniu potem znou kolejne aż do momentu kiedy skończy nam sie stos na zapamietanie adresu powrotnego... wystarczy odblokować blagę globalnego zezwolenia na przerwania. Trzeba też pamiętać że powrót z jakby to ująć podprzerwania powinien być zrealizowany tak aby nie odblokowywać flagi przerwań... bo jeżeli ją odblokujemy to zamiast wrocić do nadprzerwania to zaczniemy sprawdzać czy w miedzy czasie wykonywania podprzerwania nie przyszło jakieś inne przerwanie i dopiero jak nie przyszło to wrócimy do nadprzerwania. Innymi słowy w momencie wywołania podprzerwania nadprzerwanie stanie się czymś w rodzaju pętli głównej wykonanej tylko raz.... mam nadzieje ze opis zrozumiały.
Kto jest online
Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 26 gości