Pin Change Interrupt wird nicht getriggert beim Microchip Studio

Gast #7100318
Lesenswert?

Hallo! Einmal vorab, es geht um den Atmega644. Ich möchte über den 
Microchip Studio Simulator einmal den Pin Change Interrupt für PORTA 
testen. Dazu habe ich folgenden Code (gekürzt):
1
+--------------------------------+
2
|.org INT0addr                   |
3
|    jmp INT0_isr                |
4
|                                |         
5
|.org INT_VECTORS_SIZE           |    
6
|                                |         
7
|INT0_isr:                       |      
8
|    nop ; * Breakpoint          |      
9
|    reti                        |
10
+--------------------------------+
11

12
+--------------------------------+
13
|; Initialisierung               |
14
|  lds r16, PCICR                |
15
|  ori r16, 2                    |
16
|  sts PCICR, r16                |
17
|  lds r16, 0xff                 |
18
|  sts PCMSK1, r16               |
19
|  sei                           |
20
|                                |
21
|end:                            |
22
|    rjmp end  ; * Breakpoint    | 
23
+--------------------------------+

Wenn ich das Programm laufen lasse und im PINA einen beliebigen Pin 
anschalte, sollte sich nach meinem Verständnis ein Int. entstehen. Tut 
es aber nicht. Jemand eine Idee wieso?
#7100324
Lesenswert?

1 Punkt für Gryffindor schrieb:
> |INT0_isr:

das ist der Vektor für den INT0, nicht der für den PinChangeInterrupt.
Du brauchst eine ISR für PCI1

Und dann solltest du nochmal die Pins kontrollieren, PINA passt nicht 
zum Flag, was du im PCICR setzt:

1 Punkt für Gryffindor schrieb:
> |  ori r16, 2                    |
> |  sts PCICR, r16

das wär für PORTB, wenn ich das DB richtig überflogen habe.
Gast #7100337
Lesenswert?

Εrnst B. schrieb:
> 1 Punkt für Gryffindor schrieb:
>> |INT0_isr:
>
> das ist der Vektor für den INT0, nicht der für den PinChangeInterrupt.
> Du brauchst eine ISR für PCI1
>
> Und dann solltest du nochmal die Pins kontrollieren, PINA passt nicht
> zum Flag, was du im PCICR setzt:
>
> 1 Punkt für Gryffindor schrieb:
>> |  ori r16, 2                    |
>> |  sts PCICR, r16
>
> das wär für PORTB, wenn ich das DB richtig überflogen habe.

Danke für den Hinweis! Ich habe den Code jetzt entsprechend angepasst. 
So sieht das ganze dann aus (gekürzt):
1
.org PCI0addr
2
    jmp PCINT0_isr
3

4
.org INT_VECTORS_SIZE*2
5

6
PCINT0_isr:
7
    nop ; * Breakpoint
8
    reti
9

10
; ...
11
    lds r16, PCICR
12
    ori r16, 0b00001111 ; Einfach mal testweise alle PCINT anschalten
13
    sts PCICR, r16
14
    lds r16, 0xff
15
    sts PCMSK0, r16
16
    sei
17
end:
18
  jmp end ; * Breakpoint
Dennoch wird kein Interrupt beim step-by Durchlauf ausgelöst. "Mask 
Interrupts while stepping" ist bei mir auf False somit sollte man das 
doch so ein Int. eigentlich mitbekommen oder?
Beitrag #7100347 wurde von einem Moderator gelöscht.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren