Przerwania generowane programowo w AVRach

To forum jest dla wszystkich pasjonatów mikrokontrolerów AVR Atmela. Wymiana doświadczeń i pomoc dla początkujących w pisaniu programów zarówno w C, Asemblerze jak i BASCOM. Zapraszam znawców tematu, aby pomogli wszystkim początkującym!
slawek55
Użytkownik
Posty: 484
Rejestracja: 16 sie 2005, 11:47
Lokalizacja: Szczecin

Przerwania generowane programowo w AVRach

Post autor: slawek55 » 22 lip 2011, 6:25

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?

rezasurmar
Użytkownik
Posty: 626
Rejestracja: 19 kwie 2009, 15:59
Lokalizacja: Tychy
Kontakt:

Post autor: rezasurmar » 22 lip 2011, 7:49

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.

slawek55
Użytkownik
Posty: 484
Rejestracja: 16 sie 2005, 11:47
Lokalizacja: Szczecin

Post autor: slawek55 » 22 lip 2011, 7:53

Tak się zastanawiałem, skoro w C przerwania wyglądaja jak zwykłe funkcje, to czy mozna je po prostu wywołać?

A z tego co piszesz, to wpisanie 1 do rejestru przechowującego flagi przerwań nic nie spowoduje jak jest 0, natomiast jak jest 1 to wpisanie 1 zeruje daną flagę. Czy tak?

rezasurmar
Użytkownik
Posty: 626
Rejestracja: 19 kwie 2009, 15:59
Lokalizacja: Tychy
Kontakt:

Post autor: rezasurmar » 22 lip 2011, 8:27

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.

slawek55
Użytkownik
Posty: 484
Rejestracja: 16 sie 2005, 11:47
Lokalizacja: Szczecin

Post autor: slawek55 » 22 lip 2011, 10:00

Jakbyś mógł zobaczyć to będę wdzięczny, poczekam.

rezasurmar
Użytkownik
Posty: 626
Rejestracja: 19 kwie 2009, 15:59
Lokalizacja: Tychy
Kontakt:

Post autor: rezasurmar » 22 lip 2011, 10:10

Przypomnij mi wieczorem na gg 1870122 :).

slawek55
Użytkownik
Posty: 484
Rejestracja: 16 sie 2005, 11:47
Lokalizacja: Szczecin

Post autor: slawek55 » 22 lip 2011, 10:20

W tych sprawch jestem daleko w epoce kamienia, nie używam gg, więc jak mogę, to tak normalnie napiszę? Zgoda?

kaliska5
Użytkownik
Posty: 348
Rejestracja: 01 maja 2008, 8:24
Lokalizacja: z nienacka
Kontakt:

Post autor: kaliska5 » 22 lip 2011, 10:27

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.
Ostatnio zmieniony 22 lip 2011, 10:35 przez kaliska5, łącznie zmieniany 1 raz.

slawek55
Użytkownik
Posty: 484
Rejestracja: 16 sie 2005, 11:47
Lokalizacja: Szczecin

Post autor: slawek55 » 22 lip 2011, 10:34

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ę

Awatar użytkownika
kayron
Użytkownik
Posty: 2090
Rejestracja: 21 wrz 2008, 12:53
Lokalizacja: Poland
Kontakt:

Post autor: kayron » 22 lip 2011, 13:46

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.

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

Post autor: rezasurmar » 22 lip 2011, 13:52

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.

Awatar użytkownika
kayron
Użytkownik
Posty: 2090
Rejestracja: 21 wrz 2008, 12:53
Lokalizacja: Poland
Kontakt:

Post autor: kayron » 22 lip 2011, 14:00

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:

Post autor: rezasurmar » 22 lip 2011, 14:09

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.

Awatar użytkownika
kayron
Użytkownik
Posty: 2090
Rejestracja: 21 wrz 2008, 12:53
Lokalizacja: Poland
Kontakt:

Post autor: kayron » 22 lip 2011, 14:23

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:

Post autor: rezasurmar » 22 lip 2011, 14:41

Przecież są RTOSy na AVRy. Ale fakt jak chcemy pisać tego typu rzeczy, to już lepiej na freescale się przenieść.

ODPOWIEDZ