Forum: Mikrocontroller und Digitale Elektronik Pin Change Interrupt wird nicht getriggert beim Microchip Studio


von 1 Punkt für Gryffindor (Gast)


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?

von Εrnst B. (ernst)


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.

: Bearbeitet durch User
von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Der INT0 ist ganz was anderes als ein PinChange Interrupt und liegt auf 
Pin PD2 beim Mega644.
Du möchtest aber PCINT0 und nicht INT0.
1
  .org PCINT0_addr
2
  jmp  PCINT0_isr
3
4
PCINT0_isr: 
5
      reti
PCMSK0 ist für Port A. Zusätzlich globale IRQ freigeben und PCIE0.

: Bearbeitet durch User
von c-hater (Gast)


Lesenswert?

Εrnst B. schrieb:

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

Hast du nicht. Ist für PortA.

von 1 Punkt für Gryffindor (Gast)


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?

von Εrnst B. (ernst)


Angehängte Dateien:

Lesenswert?

c-hater schrieb:
> Hast du nicht. Ist für PortA.

Sicher?

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


Lesenswert?

1 Punkt für Gryffindor schrieb:
> Dennoch wird kein Interrupt beim step-by Durchlauf ausgelöst

Du musst natürlich noch an einem Pin von PortA wackeln.

von Peter D. (peda)


Lesenswert?

1 Punkt für Gryffindor schrieb:
> lds r16, 0xff
>     sts PCMSK0, r16

Was ist denn an der Adresse 0xff ?

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


Lesenswert?

Peter D. schrieb:
> Was ist denn an der Adresse 0xff ?

Gut gesehen :-)
Oh Mann, ich lass lieber die Finger von Assembler, wenn ich das schon 
übersehe.

: Bearbeitet durch User
Beitrag #7100347 wurde vom Autor gelöscht.
von 1 Punkt für Gryffindor (Gast)


Lesenswert?

Peter D. schrieb:
> 1 Punkt für Gryffindor schrieb:
>> lds r16, 0xff
>>     sts PCMSK0, r16
>
> Was ist denn an der Adresse 0xff ?

AHHHH! Es soll natürlich ldi heißen. Danke!

von 1 Punkt für Gryffindor (Gast)


Lesenswert?

Problem gelöst. Jetzt klappt es auch

von c-hater (Gast)


Lesenswert?

Εrnst B. schrieb:

> c-hater schrieb:
>> Hast du nicht. Ist für PortA.
>
> Sicher?

Ähem, nö. Du hattest recht.

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.