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

tomaszwiewiorka
-
-
Posty: 32
Rejestracja: 2 mar 2005, o 11:07
Lokalizacja: Hajnówka
Kontaktowanie:

Przerwanie w przerwaniu...??

Postautor: tomaszwiewiorka » 2 cze 2008, o 17:44

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?

RcTomek
-
-
Posty: 357
Rejestracja: 18 lip 2005, o 17:28
Lokalizacja: Głogów / Wrocław

Postautor: RcTomek » 2 cze 2008, o 21:11

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

Awatar użytkownika
ZbeeGin
-
-
Posty: 170
Rejestracja: 3 kwie 2003, o 10:10
Lokalizacja: Metropolia Katowice

Postautor: ZbeeGin » 13 cze 2008, o 16:57

Czy istnieje możliwość wykonania przerwania przerwania w bascomie?
Krótko: Jest. Wystarczy w przerwaniu włączyć... przerwania.

Awatar użytkownika
Darlington
-
-
Posty: 574
Rejestracja: 12 lis 2007, o 18:18
Lokalizacja: stąd!

Postautor: Darlington » 13 cze 2008, o 23:19

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. :)

RcTomek
-
-
Posty: 357
Rejestracja: 18 lip 2005, o 17:28
Lokalizacja: Głogów / Wrocław

Postautor: RcTomek » 13 cze 2008, o 23:32

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. :)
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.

Czajnik
-
-
Posty: 264
Rejestracja: 17 cze 2004, o 15:40
Lokalizacja: Kraków
Kontaktowanie:

Postautor: Czajnik » 9 lip 2008, o 07:59

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.

Wróć do „Projektowanie PCB, programy EDA, CAD, narzędziowe”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 34 gości