Aktyw Forum

Zarejestruj się na forum.ep.com.pl i zgłoś swój akces do Aktywu Forum. Jeśli jesteś już zarejestrowany wystarczy, że się zalogujesz.

Sprawdź punkty Zarejestruj się

nazwy przerwań dla Atmeg128

Sławek5
-
-
Posty:485
Rejestracja:15 sie 2003, o 16:40
Lokalizacja:Szczecin
Kontaktowanie:
nazwy przerwań dla Atmeg128

Postautor: Sławek5 » 7 lis 2006, o 14:43

cześć.
Proszę pomóżcie bo już sie zamotałem.

Potrzebuje w AVR-GCC w programie dla Atmega 128 wykorzystać dwa przerwania ISR.
Pierwsze dla CTC Timer 1(16 bitowego), A drugie po przepełnieniu Timera 0 (8bitowego)

Popatrzyłem sobie w pliku iom128.h i są tam nr wektorów przerwan inne niz w Datasheet dla Atmeg128.
Powiedzcie mi co mam wpisać w ISR( ) dla tych dwóch przerwań i jak w przyszłości dojśc które przerwanie jest które bo po nazach to troche ciężko.

szymel
-
-
Posty:212
Rejestracja:16 sty 2005, o 16:42
Lokalizacja:Włocławek

Re: nazwy przerwań dla Atmeg128

Postautor: szymel » 7 lis 2006, o 21:21

...Popatrzyłem sobie w pliku iom128.h i są tam nr wektorów przerwan inne niz w Datasheet dla Atmeg128.
Dlaczego inne , raczej przesunięte. W dokumentacji numeracj zaczyna się od 1 , a w AVR-GCC od 0 i to cała różnica.
Powiedzcie mi co mam wpisać w ISR( ) dla tych dwóch przerwań i jak w przyszłości dojśc które przerwanie jest które bo po nazach to troche ciężko.
Jeśli chcesz wykorzystać przerwanie , którego wektor w dokumentacji to np. 13 i opisane w tabeli jako TIMER1 COMPA , to możesz ustalić wektor przez nazwę ISR(TIMER1_COMPA_vect) , lub jeśli nie lubisz symboli , to przez numer ISR(_VECTOR(12)) , bo Vector No.13-1 to właśnie 12 :D

Piotrek

PS
O który tryb CTC Ci chodzi :?: Mode 4 czy 12 :?:

Sławek5
-
-
Posty:485
Rejestracja:15 sie 2003, o 16:40
Lokalizacja:Szczecin
Kontaktowanie:

Postautor: Sławek5 » 8 lis 2006, o 06:24

A czym się różni np TIMER1_COMPA_vect od SIG_OUTPUT_COMPARE1A
wektor jest ten sam.

Miałem na myśli tryb CTC mode 4

[ Dodano: 08-11-2006, 06:57 ]
Sprawdziłem jeszcze co generuje kompilator i jak to wygląda w AvrStudio.

Kod: Zaznacz cały

@000000F5: __vector_16 77: ISR(SIG_OVERFLOW0) { //.... itd //oraz @00000105: __vector_12 84: ISR(SIG_OUTPUT_COMPARE1A) { //...itd

Dlaczego tu jest Vector_12 i vector_16. To nie odpowiada numerom przerwań w karcie katalogowej?

szymel
-
-
Posty:212
Rejestracja:16 sty 2005, o 16:42
Lokalizacja:Włocławek

Postautor: szymel » 8 lis 2006, o 08:13

A czym się różni np TIMER1_COMPA_vect od SIG_OUTPUT_COMPARE1A
wektor jest ten sam.
To są nazwy symboliczne.Pierwszy z tych symboli jest zgodny z nazwami przyjętymi przez Atmela , a drugi przez twórców AVR-GCC i odnosi do "starego" SIGNAL.
Dlaczego tu jest Vector_12 i vector_16. To nie odpowiada numerom przerwań w karcie katalogowej?
Nie bardzo rozumiem co Ci się nie zgadza.Chodzi o numerki _12,_16 , czy o adresy w pamięci programu :?:
Wklejam poniżej spreparowany kod assemblera wygenerowany przez AVRStudio:
Listing

Kod: Zaznacz cały

#include <avr/io.h> #include <stdio.h> #include <stdlib.h> #include<avr/interrupt.h> ISR(TIMER1_COMPA_vect) {asm ("nop");} ISR(TIMER0_OVF_vect) {asm ("nop");asm ("nop");} int main(void) { return 0; }
Efekt

Kod: Zaznacz cały

Vector Reset and Interrupts Vectors No. +00000000: JMP 0x00000046 1 $0000 External Pin, Power-on Reset, ... +00000002: JMP 0x00000063 2 $0002 INT0 External Interrupt Request 0 +00000004: JMP 0x00000063 3 $0004 INT1 External Interrupt Request 1 +00000006: JMP 0x00000063 4 $0006 INT2 External Interrupt Request 2 +00000008: JMP 0x00000063 5 $0008 INT3 External Interrupt Request 3 +0000000A: JMP 0x00000063 6 $000A INT4 External Interrupt Request 4 +0000000C: JMP 0x00000063 7 $000C INT5 External Interrupt Request 5 +0000000E: JMP 0x00000063 8 $000E INT6 External Interrupt Request 6 +00000010: JMP 0x00000063 9 $0010 INT7 External Interrupt Request 7 +00000012: JMP 0x00000063 10 $0012 TIMER2 COMP Timer/Counter2 Compare Match +00000014: JMP 0x00000063 11 $0014 TIMER2 OVF Timer/Counter2 Overflow +00000016: JMP 0x00000063 12 $0016 TIMER1 CAPT Timer/Counter1 Capture Event +00000018: JMP 0x00000065 13 $0018 TIMER1 COMPA Timer/Counter1 Compare Match A +0000001A: JMP 0x00000063 14 $001A TIMER1 COMPB Timer/Counter1 Compare Match B +0000001C: JMP 0x00000063 15 $001C TIMER1 OVF Timer/Counter1 Overflow +0000001E: JMP 0x00000063 16 $001E TIMER0 COMP Timer/Counter0 Compare Match +00000020: JMP 0x00000070 17 $0020 TIMER0 OVF Timer/Counter0 Overflow +00000022: JMP 0x00000063 18 $0022 SPI, STC SPI Serial Transfer Complete +00000024: JMP 0x00000063 19 $0024 USART0, RX USART0, Rx Complete +00000026: JMP 0x00000063 20 $0026 USART0, UDRE USART0 Data Register Empty +00000028: JMP 0x00000063 21 $0028 USART0, TX USART0, Tx Complete +0000002A: JMP 0x00000063 22 $002A ADC ADC Conversion Complete +0000002C: JMP 0x00000063 23 $002C EE READY EEPROM Ready +0000002E: JMP 0x00000063 24 $002E ANALOG COMP Analog Comparator +00000030: JMP 0x00000063 25 $0030 TIMER1 COMPC Timer/Countre1 Compare Match C +00000032: JMP 0x00000063 26 $0032 TIMER3 CAPT Timer/Counter3 Capture Event +00000034: JMP 0x00000063 27 $0034 TIMER3 COMPA Timer/Counter3 Compare Match A +00000036: JMP 0x00000063 28 $0036 TIMER3 COMPB Timer/Counter3 Compare Match +00000038: JMP 0x00000063 29 $0038 TIMER3 COMPC Timer/Counter3 Compare Match C +0000003A: JMP 0x00000063 30 $003A TIMER3 OVF Timer/Counter3 Overflow +0000003C: JMP 0x00000063 31 $003C USART1, RX USART1, Rx Complet +0000003E: JMP 0x00000063 32 $003E USART1, UDRE USART1 Data Register Empty +00000040: JMP 0x00000063 33 $0040 USART1, TX USART1, Tx Complete +00000042: JMP 0x00000063 34 $0042 TWI Two-wire Serial Interface +00000044: JMP 0x00000063 35 $0044 SPM READY Store Program Memory Ready +00000046: CLR R1 +00000047: OUT 0x3F,R1 +00000048: SER R28 +00000049: LDI R29,0x10 +0000004A: OUT 0x3E,R29 +0000004B: OUT 0x3D,R28 +0000004C: LDI R17,0x01 +0000004D: LDI R26,0x00 +0000004E: LDI R27,0x01 +0000004F: LDI R30,0x0A +00000050: LDI R31,0x01 +00000051: LDI R16,0x00 +00000052: OUT 0x3B,R16 +00000053: RJMP PC+0x0003 +00000054: ELPM R0,Z+ +00000055: ST X+,R0 +00000056: CPI R26,0x00 +00000057: CPC R27,R17 +00000058: BRNE PC-0x04 +00000059: LDI R17,0x01 +0000005A: LDI R26,0x00 +0000005B: LDI R27,0x01 +0000005C: RJMP PC+0x0002 +0000005D: ST X+,R1 +0000005E: CPI R26,0x00 +0000005F: CPC R27,R17 +00000060: BRNE PC-0x03 +00000061: JMP 0x0000007C ;Main +00000063: JMP 0x00000000 ;Bad interrupt @00000065: __vector_12 ---- PetleXY.c ------------------------------------------------------------------------------------ 7: ISR(TIMER1_COMPA_vect) {asm ("nop");} +00000065: PUSH R1 +00000066: PUSH R0 +00000067: IN R0,0x3F +00000068: PUSH R0 +00000069: CLR R1 +0000006A: NOP +0000006B: POP R0 +0000006C: OUT 0x3F,R0 +0000006D: POP R0 +0000006E: POP R1 +0000006F: RETI @00000070: __vector_16 8: ISR(TIMER0_OVF_vect) {asm ("nop");asm ("nop");} +00000070: PUSH R1 +00000071: PUSH R0 +00000072: IN R0,0x3F +00000073: PUSH R0 +00000074: CLR R1 +00000075: NOP +00000076: NOP +00000077: POP R0 +00000078: OUT 0x3F,R0 +00000079: POP R0 +0000007A: POP R1 +0000007B: RETI @0000007C: main 12: { +0000007C: SER R28 +0000007D: LDI R29,0x10 +0000007E: OUT 0x3E,R29 +0000007F: OUT 0x3D,R28 14: } +00000080: LDI R24,0x00 +00000081: LDI R25,0x00 +00000082: JMP 0x00000084 +00000084: RJMP PC-0x0000
Od góry po lewej tablica wektorów wygenerowana przez kompilator , a na prawo żywzem wklejona tablica z dokumentacji.Przypatrz się szczególnie kolumnom z adresami w pamięci programu(+00000000 i $0000) .Czy teraz zrobiło sie jaśniej :D

Piotrek

Sławek5
-
-
Posty:485
Rejestracja:15 sie 2003, o 16:40
Lokalizacja:Szczecin
Kontaktowanie:

Postautor: Sławek5 » 8 lis 2006, o 08:36

No dobrze.
Tak przy okazji chciałem się spytac tylko dlaczego W symulacji jest taki zapis

Kod: Zaznacz cały

@00000070: __vector_16 8: ISR(TIMER0_OVF_vect) {asm ("nop");asm
Po prostu skąd bierze się u nich ta liczba 16.

szymel
-
-
Posty:212
Rejestracja:16 sty 2005, o 16:42
Lokalizacja:Włocławek

Postautor: szymel » 8 lis 2006, o 08:50

No dobrze.
Tak przy okazji chciałem się spytac tylko dlaczego W symulacji jest taki zapis

Kod: Zaznacz cały

@00000070: __vector_16 8: ISR(TIMER0_OVF_vect) {asm ("nop");asm
Po prostu skąd bierze się u nich ta liczba 16.
Ta liczba , to kolejna pozycja w tablicy wektorów , a __vector_16 , to poprostu etykieta dla assemblera.Jeśli teraz zaczniesz liczyć od początku tablicy wektorów zaczynając od zera , to po doliczeniu do 16-go JMP-a , natrafisz na rozkaz skoku do tej właśnie etykiety (w pliku *.lss jest JMP __vector_16).

Piotrek

Jurek Szczesiul
-
-
Posty:175
Rejestracja:10 paź 2003, o 20:44
Lokalizacja:Białystok
Kontaktowanie:

Postautor: Jurek Szczesiul » 8 lis 2006, o 09:03

A czym się różni np TIMER1_COMPA_vect od SIG_OUTPUT_COMPARE1A
wektor jest ten sam.
Dlaczego tu jest Vector_12 i vector_16. To nie odpowiada numerom przerwań w karcie katalogowej?
Porównaj :
Datasheet :

Kod: Zaznacz cały

Table 23. Reset and Interrupt Vectors Vector No. Program Address(2) Source Interrupt Definition 1 $0000(1) RESET External Pin, Power-on Reset, Brown-out Reset, Watchdog Reset, and JTAG AVR Reset 2 $0002 INT0 External Interrupt Request 0 3 $0004 INT1 External Interrupt Request 1 4 $0006 INT2 External Interrupt Request 2 5 $0008 INT3 External Interrupt Request 3 6 $000A INT4 External Interrupt Request 4 7 $000C INT5 External Interrupt Request 5 8 $000E INT6 External Interrupt Request 6 9 $0010 INT7 External Interrupt Request 7 10 $0012 TIMER2 COMP Timer/Counter2 Compare Match 11 $0014 TIMER2 OVF Timer/Counter2 Overflow 12 $0016 TIMER1 CAPT Timer/Counter1 Capture Event 13 $0018 TIMER1 COMPA Timer/Counter1 Compare Match A 14 $001A TIMER1 COMPB Timer/Counter1 Compare Match B 15 $001C TIMER1 OVF Timer/Counter1 Overflow 16 $001E TIMER0 COMP Timer/Counter0 Compare Match 17 $0020 TIMER0 OVF Timer/Counter0 Overflow 18 $0022 SPI, STC SPI Serial Transfer Complete 19 $0024 USART0, RX USART0, Rx Complete 20 $0026 USART0, UDRE USART0 Data Register Empty 21 $0028 USART0, TX USART0, Tx Complete 22 $002A ADC ADC Conversion Complete 23 $002C EE READY EEPROM Ready 24 $002E ANALOG COMP Analog Comparator 25 $0030(3) TIMER1 COMPC Timer/Countre1 Compare Match C 26 $0032(3) TIMER3 CAPT Timer/Counter3 Capture Event 27 $0034(3) TIMER3 COMPA Timer/Counter3 Compare Match A 28 $0036(3) TIMER3 COMPB Timer/Counter3 Compare Match B 29 $0038(3) TIMER3 COMPC Timer/Counter3 Compare Match C 30 $003A(3) TIMER3 OVF Timer/Counter3 Overflow 31 $003C(3) USART1, RX USART1, Rx Complete 32 $003E(3) USART1, UDRE USART1 Data Register Empty 33 $0040(3) USART1, TX USART1, Tx Complete 34 $0042(3) TWI Two-wire Serial Interface 35 $0044(3) SPM READY Store Program Memory Ready
iom128.h

Kod: Zaznacz cały

/* Interrupt vectors */ /* External Interrupt Request 0 */ #define INT0_vect _VECTOR(1) #define SIG_INTERRUPT0 _VECTOR(1) /* External Interrupt Request 1 */ #define INT1_vect _VECTOR(2) #define SIG_INTERRUPT1 _VECTOR(2) /* External Interrupt Request 2 */ #define INT2_vect _VECTOR(3) #define SIG_INTERRUPT2 _VECTOR(3) /* External Interrupt Request 3 */ #define INT3_vect _VECTOR(4) #define SIG_INTERRUPT3 _VECTOR(4) /* External Interrupt Request 4 */ #define INT4_vect _VECTOR(5) #define SIG_INTERRUPT4 _VECTOR(5) /* External Interrupt Request 5 */ #define INT5_vect _VECTOR(6) #define SIG_INTERRUPT5 _VECTOR(6) /* External Interrupt Request 6 */ #define INT6_vect _VECTOR(7) #define SIG_INTERRUPT6 _VECTOR(7) /* External Interrupt Request 7 */ #define INT7_vect _VECTOR(8) #define SIG_INTERRUPT7 _VECTOR(8) /* Timer/Counter2 Compare Match */ #define TIMER2_COMP_vect _VECTOR(9) #define SIG_OUTPUT_COMPARE2 _VECTOR(9) /* Timer/Counter2 Overflow */ #define TIMER2_OVF_vect _VECTOR(10) #define SIG_OVERFLOW2 _VECTOR(10) /* Timer/Counter1 Capture Event */ #define TIMER1_CAPT_vect _VECTOR(11) #define SIG_INPUT_CAPTURE1 _VECTOR(11) /* Timer/Counter1 Compare Match A */ #define TIMER1_COMPA_vect _VECTOR(12) #define SIG_OUTPUT_COMPARE1A _VECTOR(12) /* Timer/Counter Compare Match B */ #define TIMER1_COMPB_vect _VECTOR(13) #define SIG_OUTPUT_COMPARE1B _VECTOR(13) /* Timer/Counter1 Overflow */ #define TIMER1_OVF_vect _VECTOR(14) #define SIG_OVERFLOW1 _VECTOR(14) /* Timer/Counter0 Compare Match */ #define TIMER0_COMP_vect _VECTOR(15) #define SIG_OUTPUT_COMPARE0 _VECTOR(15) /* Timer/Counter0 Overflow */ #define TIMER0_OVF_vect _VECTOR(16) #define SIG_OVERFLOW0 _VECTOR(16) /* SPI Serial Transfer Complete */ #define SPI_STC_vect _VECTOR(17) #define SIG_SPI _VECTOR(17) /* USART0, Rx Complete */ #define USART0_RX_vect _VECTOR(18) #define SIG_USART0_RECV _VECTOR(18) #define SIG_UART0_RECV _VECTOR(18) /* USART0 Data Register Empty */ #define USART0_UDRE_vect _VECTOR(19) #define SIG_USART0_DATA _VECTOR(19) #define SIG_UART0_DATA _VECTOR(19) /* USART0, Tx Complete */ #define USART0_TX_vect _VECTOR(20) #define SIG_USART0_TRANS _VECTOR(20) #define SIG_UART0_TRANS _VECTOR(20) /* ADC Conversion Complete */ #define ADC_vect _VECTOR(21) #define SIG_ADC _VECTOR(21) /* EEPROM Ready */ #define EE_READY_vect _VECTOR(22) #define SIG_EEPROM_READY _VECTOR(22) /* Analog Comparator */ #define ANALOG_COMP_vect _VECTOR(23) #define SIG_COMPARATOR _VECTOR(23) /* Timer/Counter1 Compare Match C */ #define TIMER1_COMPC_vect _VECTOR(24) #define SIG_OUTPUT_COMPARE1C _VECTOR(24) /* Timer/Counter3 Capture Event */ #define TIMER3_CAPT_vect _VECTOR(25) #define SIG_INPUT_CAPTURE3 _VECTOR(25) /* Timer/Counter3 Compare Match A */ #define TIMER3_COMPA_vect _VECTOR(26) #define SIG_OUTPUT_COMPARE3A _VECTOR(26) /* Timer/Counter3 Compare Match B */ #define TIMER3_COMPB_vect _VECTOR(27) #define SIG_OUTPUT_COMPARE3B _VECTOR(27) /* Timer/Counter3 Compare Match C */ #define TIMER3_COMPC_vect _VECTOR(28) #define SIG_OUTPUT_COMPARE3C _VECTOR(28) /* Timer/Counter3 Overflow */ #define TIMER3_OVF_vect _VECTOR(29) #define SIG_OVERFLOW3 _VECTOR(29) /* USART1, Rx Complete */ #define USART1_RX_vect _VECTOR(30) #define SIG_USART1_RECV _VECTOR(30) #define SIG_UART1_RECV _VECTOR(30) /* USART1, Data Register Empty */ #define USART1_UDRE_vect _VECTOR(31) #define SIG_USART1_DATA _VECTOR(31) #define SIG_UART1_DATA _VECTOR(31) /* USART1, Tx Complete */ #define USART1_TX_vect _VECTOR(32) #define SIG_USART1_TRANS _VECTOR(32) #define SIG_UART1_TRANS _VECTOR(32) /* 2-wire Serial Interface */ #define TWI_vect _VECTOR(33) #define SIG_2WIRE_SERIAL _VECTOR(33) /* Store Program Memory Read */ #define SPM_READY_vect _VECTOR(34) #define SIG_SPM_READY _VECTOR(34)

Tak jak już było objaśniane : Atmel numeruje przerwania od 1 a avr-libc
od 0 i stąd przesunięcie o 1 ( porównanie 1A to u Atmela przerwanie numer 13
a w avr-gcc _VECTOR(12) - to oczywiście tylko umowa co do nazw, adres
wektora jest cały czas ten sam, ustalony sprzętowo( możesz w podglądzie kodu asm
sprawdzić, że wynosi 0x30 ).

Nowsze wersje avr-libc przechodzą na nową technikę obsługi przerwań.
Dawniej istniały dwa makra obsługi : SIGNAL ( z następnymi przerwaniami
zablokowanymi na czas obsługi - tak jak jest to sprzętowo zorganizowane
w AVR ) oraz INTERRUPT ( z odblokowaniem na samym początku dalszych
przerwań co czasem bywa przydatne ). Argumentami makr były umowne
nazwy wektorów typu SIG_xxxx.
To jednak prowadziło do ciągłych nieporozumień - ludzie nagminnie
nie doczytali o tym rozróżnieniu i stosowali INTERRUPT nie wiedząc o
odblokowaniu - a to potrafiło wywrócić program ( przy fladze przerwania
kasowanej programowo w obsłudze - jak np. odbiór znaku wszystko
natychmiast się zapętla ).
Konieczność zmiany była więc dyskutowana od dawna - i obecnie to
zrealizowano : makro obsługi jest jedno : ISR i funkcjonalnie odpowiada
poprzedniemu SIGNAL ( na czas obsługi przerwania wyłączone ).
Makro włączające przerwania wyrzucono całkowicie - jeśli chcemy je mieć
samodzielnie wyposażamy funkcję obsługi w atrybut interrupt,
to zapewnia, że programista wie co robi.
Przy okazji zmieniono nazwy wektorów wg schematu :
nazwa katalogowa ( _ zamiast spacji ) z przyrostkiem _vect

Dla zgodności wstecz pozostawiono na razie makro SIGNAL oraz
poprzednie nazwy SIG, tak więc
SIG_OUTPUT_COMPARE1A i TIMER1_COMPA_vect oznaczają
dokładnie to samo - jest to po prostu podwójna definicja.

Pozdrowienia Jurek S.[/i]

Sławek5
-
-
Posty:485
Rejestracja:15 sie 2003, o 16:40
Lokalizacja:Szczecin
Kontaktowanie:

Postautor: Sławek5 » 8 lis 2006, o 10:22

DZiękuję :-)

I przy okazji został rozgrzebany temat przerwań.
Czy mogę prosić o jakiś przykład z odblokowaniem przerwań tzn w czasie obsługi przerwania niższego wykonuje się przerwanie o wyższym piorytecie. Mam na myśli ten atrybut inerrupt

Jurek Szczesiul
-
-
Posty:175
Rejestracja:10 paź 2003, o 20:44
Lokalizacja:Białystok
Kontaktowanie:

Postautor: Jurek Szczesiul » 8 lis 2006, o 21:16

Czy mogę prosić o jakiś przykład z odblokowaniem przerwań tzn w czasie obsługi przerwania niższego wykonuje się przerwanie o wyższym piorytecie. Mam na myśli ten atrybut inerrupt
AVR nie mają priorytetów przerwań. Po odblokowaniu mogą się wykonać
wszystkie inne jakie wystąpią. To często komplikuje sprawy zwłaszcza
przy wielu aktywnych źródłach przerwań. Dlatego na ogół zalecany
jest zwykły sposób z ISR - przerwania z odblokowaniem pozostawione są
dla szczególnych przypadków zaś programista musi dokładnie wiedzieć co
chce przez to uzyskać.

Składnia opisana jest w manualu :
deklarujesz prototyp funkcji bez argumentów i nie zwracającej wyniku
o nazwie takiej jak wektor przerwania i opisanej atrybutem interrupt, np.

Kod: Zaznacz cały

void TIMER1_COMPB_vect(void) __attribute__((interrupt));
i dopisujesz potem potrzebną treść :

Kod: Zaznacz cały

void TIMER1_COMPB_vect(void) { }
Dla porównania niech obok będzie makro ISR :

Kod: Zaznacz cały

ISR(TIMER1_COMPA_vect) { }
i zobaczmy wygenerowany kod :

Kod: Zaznacz cały

000002e6 <__vector_12>: } ISR(TIMER1_COMPA_vect) { 2e6: 1f 92 push r1 2e8: 0f 92 push r0 2ea: 0f b6 in r0, 0x3f ; 63 2ec: 0f 92 push r0 2ee: 11 24 eor r1, r1 2f0: 0f 90 pop r0 2f2: 0f be out 0x3f, r0 ; 63 2f4: 0f 90 pop r0 2f6: 1f 90 pop r1 2f8: 18 95 reti 000002fa <__vector_13>: } void TIMER1_COMPB_vect(void) __attribute__((interrupt)); void TIMER1_COMPB_vect(void) { 2fa: 78 94 sei 2fc: 1f 92 push r1 2fe: 0f 92 push r0 300: 0f b6 in r0, 0x3f ; 63 302: 0f 92 push r0 304: 11 24 eor r1, r1 306: 0f 90 pop r0 308: 0f be out 0x3f, r0 ; 63 30a: 0f 90 pop r0 30c: 1f 90 pop r1 30e: 18 95 reti
Oba sposoby tworzą podstawowy szkielet procedury obsługi i jedyna
różnica w interrupt to ponowne - najwcześniej jak to możliwe - włączenie ( sei )
przerwań blokowanych sprzętowo przez mikrokontroler podczas skoku do
obsługi przerwania.

Pozdrowienia Jurek S.

szymel
-
-
Posty:212
Rejestracja:16 sty 2005, o 16:42
Lokalizacja:Włocławek

Postautor: szymel » 8 lis 2006, o 22:21

...AVR nie mają priorytetów przerwań.
To prawda , ale nie cała.Prawdą jest , że żadne przerwanie nie może być przerwane przez inne , jeśli programista nie zezwoli na to świadomie , ale ... .Wyobraźmy sobie taką sytuację , że w systemie są aktywne np. 2 przerwania , ale z jakiś względów , w programie musimy zablokować system przerwań na czas wykonania "ważnej" czynności , która nie może być przerwana.W tym czasie zostają ustawione flagi naszych 2 przerwań , a program po skończeniu "ważnej roboty" włącza ponownie globalny system przerwań i ... co na to AVR-ek :?: Przecież jedno z tych dwóch aktywnych przerwań , musi wykonać się jako pierwsze.Więc to jest chyba jedyny przypadek , kiedy możemy mówić o swego rodzaju priorytecie :)

Piotrek

Jurek Szczesiul
-
-
Posty:175
Rejestracja:10 paź 2003, o 20:44
Lokalizacja:Białystok
Kontaktowanie:

Postautor: Jurek Szczesiul » 8 lis 2006, o 23:17

kiedy możemy mówić o swego rodzaju priorytecie
Prawda ! Tylko samo pojęcie priorytetu tu się cokolwiek rozmywa.
W innych kostkach priorytet oznacza twardo, że niższy może być
przerwany przez wyższy - w AVR mamy raczej tylko zwykłą
kolejność wykonywania obsług ( Ty to wiesz - ale może komuś
czytającemu przydadzą się takie szczegóły ).

Pozdrowienia Jurek S.

Wróć do „AVR/AVR32”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 8 gości