Generowanie przerwa? programowo w AVRach

Jul 22, 2011 5 Replies

Z góry przepraszam za nowy temat a nie kontynuację poprzedniego, ale łatwiej dostrzec.



Czy jet możliwośc w AVR'ach wygenerowania przerwań programowo? Np mamy przewranie od poadajacego zbocza INT0. Zostanie obsluzone jak pojawi sie zbocze na wejsciu, ale czy można wygenerować takie przerwanie programowo? Myślałem o programowym zerowaniu linii INT0, ale potem trzeba powrocic do stanu jako wejscie a dodatkowo do tego pinu moga byc podlaczone uklady ktore moga nie zniesc podania z zewnatrz sygnalu L. A co z przerwaniami od Timerow?



I jeszcze jedno. Flage przerwania zeruje sie wpisujac 1 do niej. A co jesli flaga nie byla ustawiona a wpisze sie 1? Czy to moze generować przerwanie?


W dniu 22.07.2011 06:09, slawek7 pisze:

A musi to być "przerwanie" ? Nie wystarczy Koledze po prostu skoczyć do obsługi tego przerwania.

Jeśli ma Kolega na myśli główną flagę przerwań (sei/cli) to nie. Ale o ile mnie pamięć nie myli, to np. ustawienie w rejestrze ADCSRA bitu ADIF przy ustawionym wcześniej ADIE spowoduje wygenerowanie przerwania.

Pozdrawiam Grzegorz

Skoczyć może i można ale jak to sie robi w WinAvr?

W drugiej czesci chodzilo mi raczej o flagi przyporzadkowane do konkretnego układu jak TOV1 lub ICF1, INTF1. Czy ustawienie ktorejs z nich spowoduje przerwanie i skok do jego obslugi?

Czy jet możliwośc w AVR'ach wygenerowania przerwań programowo? Np mamy przewranie od poadajacego zbocza INT0. Zostanie obsluzone jak pojawi sie zbocze na wejsciu, ale czy można wygenerować takie przerwanie programowo?

No jasne. W PDF-ie jest gdzieś to opisane. Chyba wystarczy przestawić pin na out i wpisać mu tam zero przy pomocy sbi/cbi to załatwisz, po czym w przerwaniu sprawdzisz czy ustawiłeś pin na "out" i go ustawisz ponownie na "in"

sbi DDRA,1 cbi PORTA,0

a w c

DDRA |= 0b00000010; PORTA &= (~PORTA) & 0x02;

one ci wygenerują sbi i cbi

A jak nazywa się funkcja, która to przerwanie obsługuje?? Zapewne deklarujesz coś takiego (przykład dla TIMERA2):

SIGNAL(TIMER2_OVF_vect)

No i jeden rzut oka na plik avr/interrupt.h i już widzisz, co oznacza SIGNAL i że deklaruje on funkcję:

TIMER2_OVF_vect (void)...

No i wystarczy wywołać tą funkcję: TIMER2_OVF_vect();

Zwróć tylko uwagę na jedną rzecz. Normalnie przy wywołaniu przerwania następuje zablokowanie wszystkich przerwań (tak jakby wywołanie cli()). Po wykonaniu przerwania obsługa ta jest włączana (sei()). W przypadku ręcznego wywołania funkcji przerwania nie będą blokowane, ale będą właczane przy wyjściu... .

Dziękuję, działa. Nie wiem jak na to wpadłeś.

Przy okazji zapytam się o cos co mnie zaskoczyło. Spotkałem taką deklaracje funkcji memcopy(void *, const void *, size_t) : void *;

Dlaczego tam jest na końcy dwukropek? Szukałem w opisie standardu C i nie znalazłem takiego opisu.

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required