Hallo,
Interrupt löst nicht aus, verstehe nicht warum ...
1 .include "m328Pdef.inc"
2
3
4 .def tmp0 = r16
5 .def tmp1 = r17
6 .def tmp2 = r18
7 .def tmp3 = r19
8
9
10 .org 0x0000
11 rjmp reset ; RESET
12 sbi PORTB, 5 ; INT0
13 ; Ja ich weiß, dass hier ein rjmp hingehört, aber zum Testen
14 ; reichts auch so ...
15 reti ; INT1
16 reti ; PCINT0
17 reti ; PCINT1
18 reti ; PCINT2
19 reti ; WDT
20 reti ; TIMER2_COMPA
21 reti ; TIMER2_COMPB
22 reti ; TIMER2_OVF
23 reti ; TIMER1_CAPT
24 reti ; TIMER1_COMPA
25 reti ; TIMER1_COMPB
26 reti ; TIMER1_OVF
27 reti ; TIMER0_COMPA
28 reti ; TIMER0_COMPB
29 reti ; TIMER0_OVF
30 reti ; SPI, STC
31 reti ; USART, RX
32 reti ; USART, UDRE
33 reti ; USART, TX
34 reti ; ADC
35 reti ; EE_READY
36
37
38 reset: ldi tmp0, high(RAMEND)
39 out SPH, tmp0
40 ldi tmp0, low(RAMEND)
41 out SPL, tmp0
42
43 sbi DDRB, 5
44
45 sbi PORTD, 2
46 ldi tmp0, (1<<ISC01)
47 sts EICRA, tmp0
48 ldi tmp0, (1<<INT0)
49 out EIMSK, tmp0
50
51 ;sei
52
53 ; so geht die LED an, wenn ich PD2 auf Masse lege,
54 ; wenn ich folgende drei Zeilen auskommentiere und
55 ; das 'sei' aktiviere, geht die LED nicht mehr an
56 ; -> INTF0 bit in EIFR wird gesetzt, der Interrupt
57 ; löst aber nicht aus. Das selbe passiert auch
58 ; z.B. bei Timer-Interrupts ...
59 lp: sbic EIFR, INTF0
60 sbi PORTB, 5
61 rjmp lp
62
63 loop: rjmp loop
Wahrscheinlich wieder nur ein ganz kleiner simpler Fehler ...
Danke schon mal^^
25.10.2015 13:09 :
Bearbeitet durch User
Jonathan K. schrieb:
> Wahrscheinlich wieder nur ein ganz kleiner simpler Fehler ...
Ja, deine Interrupt-Vektor-Tabelle ist falsch. Probier mal jmp statt
rjmp als ersten Eintrag. Beim Mega328P sind die Einträge zwei Worte
lang, nicht eins.
von
spess53 (Gast)
25.10.2015 13:26
Hi
>; Ja ich weiß, dass hier ein rjmp hingehört, aber zum Testen
>; reichts auch so ...
Aber nicht beim ATMega328. Da gehört jmp rein. Und das hat eine Länge
von 2 Word. Eeti dagegen nur ein Word.
MfG Spess
Wie macht man das dann am geschicktesten? Bzw was macht mehr Sinn? Ja
klar geht beides, aber was ist "besser" ?
Nur die Interrupts hinschreiben, die man braucht also dann
1 .org 0xabcd
2 jmp interrupt_abc_vect
3 .org 0xabff
4 jmp interrupt_def_vect
oder
1 rjmp reset
2 reti
3 nop ; eigentlich egal was hier steht
4 reti
5 nop ; ...
6 jmp irgendein_interrupt
7 reti
8 nop
Hallo,
bei mir sieht es eigentlich immer so aus:
1 ;****************************** Verktor-Liste ************************
2
3 .CSEG
4 rjmp Reset
5
6 .ORG OC2addr
7 rjmp irq_sample
8
9 .ORG OC1Aaddr
10 rjmp irq_timer
11
12 ;****************************** Programm-Beginn **********************
13
14 ;*********************************************************************
15 ; Initialisierungsroutine
16 ;*********************************************************************
17
18 .ORG INT_VECTORS_SIZE
19
20 ; Hardware initialisieren
21
22 Reset:
23 ldi TEMP_0,low(RAMEND) ; Stack an das interne Ram-Ende
24 out SPL,TEMP_0
25 ldi TEMP_0,high(RAMEND)
26 out SPH,TEMP_0
Gruß aus Berlin
Michael
25.10.2015 13:45 :
Bearbeitet durch User
Hatte irgendwie fälschlicherweise im Hinterkopf, dass in meiner
m328Pdef.inc genau dies nicht definiert ist. So ists auf jeden besser!
:)
Und ich schreibe einfach die gesamten Vektoren schon mal rein und
schicke die unbenötigten auf einen RETI stub: 1 .ORG 0x0 ; note that this table is 2-byte addresses
2 jmp RESET ; Reset Handler
3 jmp EXT_INT0 ; IRQ0 Handler
4 jmp EXT_INT1 ; IRQ1 Handler
5 jmp PC_INT0 ; PCINT0 Handler
6 jmp PC_INT1 ; PCINT1 Handler
7 jmp PC_INT2 ; PCINT2 Handler
8 jmp WDT ; Watchdog Timer Handler
9 jmp TIM2_COMPA ; Timer2 Compare A Handler
10 jmp TIM2_COMPB ; Timer2 Compare B Handler
11 jmp TIM2_OVF ; Timer2 Overflow Handler
12 jmp TIM1_CAPT ; Timer1 Capture Handler
13 jmp TIM1_COMPA ; Timer1 Compare A Handler
14 jmp TIM1_COMPB ; Timer1 Compare B Handler
15 jmp TIM1_OVF ; Timer1 Overflow Handler
16 jmp TIM0_COMPA ; Timer0 Compare A Handler
17 jmp TIM0_COMPB ; Timer0 Compare B Handler
18 jmp TIM0_OVF ; Timer0 Overflow Handler
19 jmp SPI_STC ; SPI Transfer Complete Handler
20 jmp USART_RXC ; USART, RX Complete Handler
21 jmp USART_UDRE ; USART, UDR Empty Handler
22 jmp USART_TXC ; USART, TX Complete Handler
23 jmp ADC_INT ; ADC Conversion Complete Handler
24 jmp EE_RDY ; EEPROM Ready Handler
25 jmp ANA_COMP ; Analog Comparator Handler
26 jmp TWI ; 2-wire Serial Interface Handler
27 jmp SPM_RDY ; Store Program Memory Ready Handler
28 ;
29 ; IRQ stubs
30
31 PC_INT0:
32 PC_INT1:
33 WDT:
34 TIM2_COMPA:
35 TIM2_COMPB:
36 TIM2_OVF:
37 TIM1_CAPT:
38 TIM1_COMPA:
39 TIM1_COMPB:
40 TIM1_OVF:
41 TIM0_COMPA:
42 TIM0_COMPB:
43 TIM0_OVF:
44 SPI_STC:
45 USART_RXC:
46 USART_UDRE:
47 USART_TXC:
48
49 EE_RDY:
50 ANA_COMP:
51 TWI:
52 SPM_RDY: reti
53 ;*********************************************************
54 ; IRQ Routines
55 ;********************************************************
56 ; adc ready Interrupt
57 ; store the AD value in (specdata) left channel & (specdata+1) right channel
58
59 ADC_INT: in irqstor,SREG ; save SREG
60 .....
von
ProfiFrickelFritze (Gast)
25.10.2015 16:40
Für mein (c-)Veständnis ist es keine gute Idee für nicht
"abgesättigte" IRQs einfach so zu tun als wäre nichts gewesen...
GCC macht dafür meines Wissens nach aus jedem nicht benutzten
IRQ einen Reset .... wenigstens ein kleiner Hinweis dass etwas
nicht stimmen könnte ....
ProfiFrickelFritze schrieb:
> GCC macht dafür meines Wissens nach aus jedem nicht benutzten
> IRQ einen Reset
Ja, aber hier handelt es sich ja um Assembler. Und mit den ISR hatte ich
bis jetzt auch noch keine Probleme - ist ja nun wirklich keine
Raketentechnik. So sind alle IRQ schon mal da und auf den richtigen
Vektoren.
Die Technik hätte sogar die Möglichkeit, im Stub dann ein ISR
Errorhandling einzubauen.
25.10.2015 19:23 :
Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.