Forum: Mikrocontroller und Digitale Elektronik Externer Pin Interrupt ruft Timer ISR auf


von T. F. (n3ssaja)


Lesenswert?

Hallo zusammen,

Ich habe folgendes Problem. Ich habe auf meinem AtXmega32 einen externen 
Pin Interrupt auf Pin7 von PortD programmiert. Dazu habe ich den Treiber 
von port_driver von Atmel verwendet.

Code:
1
// Configure PD7 as input, triggered on rising edge
2
PORT_ConfigurePins( &PORTD, 0x80, false, false, PORT_OPC_TOTEM_gc, PORT_ISC_RISING_gc );
3
PORT_SetPinsAsInput( &PORTD, 0x80 ); 
4
 
5
// Configure Interrupt0 to have medium interrupt level, triggered by pin 7
6
PORT_ConfigureInterrupt0( &PORTD, PORT_INT0LVL_MED_gc, 0x80 );
7
8
// Enable medium level interrupts in the PMIC
9
PMIC.CTRL |= PMIC_MEDLVLEN_bm;

ISR:
1
// Power Switch Interrupt
2
ISR(PORTD_INT0_vect)
3
{
4
}


Die ISR wird ohne Probleme aufgerufen. Jetzt benötige ich noch einen 
Timer der bei einem gewissen compare Wert auslöst.

Code:
1
TCC0.CTRLA = 0x00;
2
TCC0.INTCTRLB = 0x03;    //Compare-Interrupts A activate as high-Level
3
TCC0.CCA = 1800;         // compare value
4
TCC0.PER = 2000;         //maximal value
5
TCC0.CTRLA = TC_CLKSEL_DIV1024_gc; //Prescaler auf 1024
6
PMIC.CTRL |= PMIC_HILVLEN_bm;
7
sei();

ISR:
1
ISR(TCC0_CCA_vect)
2
{  
3
}

Das Problem ist nun, sobald ich einen external Pin Interrupt am Port D, 
Pin7 bekomme springt mein Programm in die Timer ISR. Wodrann kann das 
liegen?

von Thomas E. (thomase)


Lesenswert?

T. F. schrieb:
> Das Problem ist nun, sobald ich einen external Pin Interrupt am Port D,
> Pin7 bekomme springt mein Programm in die Timer ISR. Wodrann kann das
> liegen?
Da in beiden ISRs ohnehin nichts drinsteht, ist es doch egal, welche 
ausgeführt wird.

Poste deinen kompletten Code. Mit diesen Codefetzten kann man nur raten 
und hellsehen.

mfg.

von T. F. (n3ssaja)


Lesenswert?

Hallo Thomas..
vielen Dank für deine Schnelle Antwort.
Die ISR´s setzen letzendlich nur ein Flag, das in der Main später 
verwendet wird. Das ist für das Problem eigentlich irrelevant.
Ich hab es vermieden den ganzen Code zu Posten da es der noch unmengen 
an überflüssigen Code enthält. Im Prinzip besteht mein derzeitiges 
Testprogramm nur aus obenstehender Initialisierung.

von Karl H. (kbuchegg)


Lesenswert?

T. F. schrieb:
> Hallo Thomas..
> vielen Dank für deine Schnelle Antwort.
> Die ISR´s setzen letzendlich nur ein Flag, das in der Main später
> verwendet wird. Das ist für das Problem eigentlich irrelevant.
> Ich hab es vermieden den ganzen Code zu Posten da es der noch unmengen
> an überflüssigen Code enthält.

Dann speck ihn ab, so dass ein in sich lauffähiges Programm entsteht, 
welches den Fehler zeigt.
Du willst Hilfe, also ist dir das auch zuzumuten.

von T. F. (n3ssaja)


Lesenswert?

Das Problem hat sich jetzt gelöst.
Ich habe mein Programm wie vorgeschlagen abgespeckt. Dort ist der Fehler 
nicht mehr aufgetreten. Im Anschluss habe ich entsprechende 
Programmteile wieder in mein ursprüngliches gebaut. Komischer ist jetzt 
das gewünschte Verhalten da. Ich vermute das es einfach ein Problem mit 
Atmel Studio gab.

Troztdem vielen Dank für Eure schnelle Hilfe! Beim nächsten Mal folgt 
direkt der Code ;-)

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.