Generowanie przerwa? programowo w AVRach

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?

Reply to
slawek7
Loading thread data ...

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

Reply to
Grzegorz Kurczyk

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?

Reply to
slawek7

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

Reply to
rennes

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

Reply to
Konop

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.

Reply to
slawek7

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.