slawek7
Guest
Fri Jul 22, 2011 5:45 am
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?
Grzegorz Kurczyk
Guest
Fri Jul 22, 2011 5:45 am
W dniu 22.07.2011 06:09, slawek7 pisze:
Quote:
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?
A musi to być "przerwanie" ? Nie wystarczy Koledze po prostu skoczyć do
obsługi tego przerwania.
Quote:
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?
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
Lelek@
Guest
Fri Jul 22, 2011 9:21 am
"slawek7" <sholojda@wp.pl> wrote in message
news:fec7d625-b48b-42ab-b77e-9b5507c44381@c29g2000yqd.googlegroups.com...
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?
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
slawek7
Guest
Fri Jul 22, 2011 11:07 am
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?
Konop
Guest
Fri Jul 22, 2011 4:59 pm
Quote:
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?
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... .
--
Pozdrawiam
Konop
slawek7
Guest
Sat Jul 23, 2011 10:58 am
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.