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

Eine eigene Frage? Dieser Thread ist über 4 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.