Przerwania generowane programowo w AVRach
Przerwania generowane programowo w AVRach
Cześć.
Czy spotkał się ktoś z Was z możliwością programowego generowania przerwań?
Na przykład mamy przerwanie od opadającego zbocza INT0 oraz Przepełninia licznika T1.
Czy można w AVRach wygenerować oprócz sprzętowego czyli fizycznego przepełnienia licznika lub pojawienia się na pinie zbocza także tego samego ale czysto porgramowo?
Wiadomo że flagi przerwań w AVRach zerowane są poprzez wpisanie 1. A czy jeśli flaga ma wartośc 0 a wpisze się 1 to wywoła to przerwanie?
Czy spotkał się ktoś z Was z możliwością programowego generowania przerwań?
Na przykład mamy przerwanie od opadającego zbocza INT0 oraz Przepełninia licznika T1.
Czy można w AVRach wygenerować oprócz sprzętowego czyli fizycznego przepełnienia licznika lub pojawienia się na pinie zbocza także tego samego ale czysto porgramowo?
Wiadomo że flagi przerwań w AVRach zerowane są poprzez wpisanie 1. A czy jeśli flaga ma wartośc 0 a wpisze się 1 to wywoła to przerwanie?
-
rezasurmar
- Użytkownik
- Posty: 626
- Rejestracja: 19 kwie 2009, 15:59
- Lokalizacja: Tychy
- Kontakt:
Flagi służą tylko do ustawienia czy zezwalasz na dane przerywanie, nie uzyskasz za ich pomocą samego przerywania.
Z tego co czytałem w dokumentacji atmega nie posiada "programowych" przerywań. Mogę się mylić.
Swoją drogą ciekawe czy nie dało by się wykorzystać którejś z flag procesora, flagi przeniesienia np.
Z tego co czytałem w dokumentacji atmega nie posiada "programowych" przerywań. Mogę się mylić.
Swoją drogą ciekawe czy nie dało by się wykorzystać którejś z flag procesora, flagi przeniesienia np.
-
rezasurmar
- Użytkownik
- Posty: 626
- Rejestracja: 19 kwie 2009, 15:59
- Lokalizacja: Tychy
- Kontakt:
Biorąc na logikę, tak, ale przecież AVR to nie system operacyjny, który zrobi ci wszystko co mu w funkcjach wpiszesz. Zresztą spróbuj, jeżeli jest tak jak mi się wydaje wywali się przy kompilacji.
Z tym zerowaniem teraz ci nie odpowiem, musiał bym doczytać, a nie chcę cię wprowadzić w błąd. W pracy nie mam moich książek, a na lapie mam tylko Atmege w praktyce Dolińskiego.
Z tym zerowaniem teraz ci nie odpowiem, musiał bym doczytać, a nie chcę cię wprowadzić w błąd. W pracy nie mam moich książek, a na lapie mam tylko Atmege w praktyce Dolińskiego.
-
rezasurmar
- Użytkownik
- Posty: 626
- Rejestracja: 19 kwie 2009, 15:59
- Lokalizacja: Tychy
- Kontakt:
Jako programowych przerwań można użyć przerwań INTx.Włączasz przerwania ,konfigurujesz, ustawiasz pin jako wyjście i zmiana stanu pinu wywołuje przerwanie.Jak z reszta przerwań nie wiem z ciekawości sprawdzę.
Sorki teraz dopiero się doczytałem ze chodzi ci o całkowicie programowe.
Sorki teraz dopiero się doczytałem ze chodzi ci o całkowicie programowe.
Ostatnio zmieniony 22 lip 2011, 10:35 przez kaliska5, łącznie zmieniany 1 raz.
Wiesz jest to jakies wyjście, ale pojawia się małe ale...
Jak masz do pinu podpięte wyjście z innego układu, a na uC wystwisz np 0 to możesz w tym zewnętrzym układzie zrobić małe zwracie. Oczywiście mozna jakoś to obejśc np rezystor, ale czasami może byc niepraktyczne.
Jak być sprawdził to proszę, daj znać, ja też spróbuje i napiszę
Jak masz do pinu podpięte wyjście z innego układu, a na uC wystwisz np 0 to możesz w tym zewnętrzym układzie zrobić małe zwracie. Oczywiście mozna jakoś to obejśc np rezystor, ale czasami może byc niepraktyczne.
Jak być sprawdził to proszę, daj znać, ja też spróbuje i napiszę
W każdym procesorze można wykonać programowo dowolne przerwanie sprzętowe, wystarczy wykonać skok pod wektor (adres) danego przerwania.
W przypadku AVRa można to zrobić np. tak:
Użyć instrukcji asemblerowej icall lub rcall z których powraca się instrukcją ret. Zawartość licznika rozkazów jest odkładana na Stos tak jak by nadeszło autentycznie przerwanie sprzętowe.np.
PS. Takie rzeczy robi się zasadniczo bardzo rzadko, wiec nie dam głowy czy lepiej użyć instrukcji icall/rcall czy ijmp/rjmp., różnica między nimi jest takie że jedne instrukcje odkładają stan licznika programu na stos, a drugie nie.
W przypadku AVRa można to zrobić np. tak:
Użyć instrukcji asemblerowej icall lub rcall z których powraca się instrukcją ret. Zawartość licznika rozkazów jest odkładana na Stos tak jak by nadeszło autentycznie przerwanie sprzętowe.np.
Kod: Zaznacz cały
ldi ZH, 0x00
ldi ZL, 0x03 'Załaduj do rejestru Z adres wektora przerwania INT0.
icall ' wywołaj procedurę obsługi przerwania INT0
Ostatnio zmieniony 22 lip 2011, 13:54 przez kayron, łącznie zmieniany 1 raz.
-
rezasurmar
- Użytkownik
- Posty: 626
- Rejestracja: 19 kwie 2009, 15:59
- Lokalizacja: Tychy
- Kontakt:
Tylko czy w tym przypadku nie jesteśmy zobligowani to korzystania z procedury obsługi przerywania sprzętowego. Dokładniej chodzi mi o to, czy za pomocą tego "hacka" blokujemy jakieś wybrane przerywanie sprzętowe, tj. wrzucamy obsługę quasi-programowej obsługi przerywania, tracąc możliwość obsługi tego przerywania od strony sprzętowej.
Nie wiem czy wystarczająco jasno nakreśliłem moje wątpliwości.
Chociaż w zasadzie można by w obsłudze przerywania wrzucić jakiś warunek, który by sprawdzał wybrany bit, jeżeli jest ustawiony to wywołujemy obsługę przerywania programowego, jeżeli jest zero, to domyślnie wykonuje się obsługa przerywania sprzętowego.
Nie wiem czy wystarczająco jasno nakreśliłem moje wątpliwości.
Chociaż w zasadzie można by w obsłudze przerywania wrzucić jakiś warunek, który by sprawdzał wybrany bit, jeżeli jest ustawiony to wywołujemy obsługę przerywania programowego, jeżeli jest zero, to domyślnie wykonuje się obsługa przerywania sprzętowego.
A... wy chcecie sobie stworzyć dodatkowe wektory przerwań, tylko że programowe, tak jak w 8086. Też by dało rady, tylko że, to będzie takie wywoływanie procedur, przez wywoływanie procedury skoku do tablicy wektorów skoków. Trochę to zawile napisałem, ale ogólnie to by była niezbyt praktyczna metoda, zajmowała by zbyt wiele czasu procesorowi, no marnowała trochę jego zasoby, głównie Stos. Ale na upartego da się to zrobić.
-
rezasurmar
- Użytkownik
- Posty: 626
- Rejestracja: 19 kwie 2009, 15:59
- Lokalizacja: Tychy
- Kontakt:
slawek55 chce, ja to traktuje jako zagwozdkę
.
Właśnie w 8085 (chyba dobrze pamiętam), była możliwość ustawienia przerywań, bo np, nastąpiła zmiana jakiegoś znacznika przeniesienia, albo coś w tym stylu. Lata się już tym nie zajmowałem więc nie pamiętam. Wydaję mi się, że ta metoda którą podałeś wcześniej będzie wystarczająco skuteczna, przecież i tak rzadko wykorzystujemy w 100% sprzętowe zasoby mikrokontrolera.
Swoją drogą slawek55 nie powiedział dokładnie do czego to potrzebuje, wiele by to wyjaśniło.
Właśnie w 8085 (chyba dobrze pamiętam), była możliwość ustawienia przerywań, bo np, nastąpiła zmiana jakiegoś znacznika przeniesienia, albo coś w tym stylu. Lata się już tym nie zajmowałem więc nie pamiętam. Wydaję mi się, że ta metoda którą podałeś wcześniej będzie wystarczająco skuteczna, przecież i tak rzadko wykorzystujemy w 100% sprzętowe zasoby mikrokontrolera.
Swoją drogą slawek55 nie powiedział dokładnie do czego to potrzebuje, wiele by to wyjaśniło.
Tzn. z tego co ja wiem to przerwania programowe, takie klasyczne jak w x86 to raczej używa się przy pisaniu systemów operacyjnych. Teraz pytanie brzmi czy na AVRa ma sens pisać system operacyjny ? No cóż na taka XMegę czy AVR32 można by się pokusić o taka próbę napisania systemu operacyjnego, z wirtualną maszyną JAVA, aby można było odpalać na tym aplikacje, ale nie wiem jak by to chodziło, znaczy się wydajność takiego systemu operacyjnego.
-
rezasurmar
- Użytkownik
- Posty: 626
- Rejestracja: 19 kwie 2009, 15:59
- Lokalizacja: Tychy
- Kontakt: