Forum: Mikrocontroller und Digitale Elektronik Interrupt löst nicht aus


von Jonathan K. (burgerohnealles)


Lesenswert?

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

: Bearbeitet durch User
von Rolf M. (rmagnus)


Lesenswert?

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)


Lesenswert?

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

von Jonathan K. (burgerohnealles)


Lesenswert?

Danke jetzt klappts!

von Jonathan K. (burgerohnealles)


Lesenswert?

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

von Michael U. (amiga)


Lesenswert?

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

: Bearbeitet durch User
von Jonathan K. (burgerohnealles)


Lesenswert?

Hatte irgendwie fälschlicherweise im Hinterkopf, dass in meiner 
m328Pdef.inc genau dies nicht definiert ist. So ists auf jeden besser! 
:)

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

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)


Lesenswert?

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

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

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.

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.