Interrupts auf CMSIS-kompatiblen ARMs

Programmierung und Hardwaredesign mit Arduino, AVR, PIC und Konsorten.

Moderatoren: MaxZ, ebastler, SeriousD

Antworten

Thread-Ersteller
Physikant
Beiträge: 503
Registriert: Di 28. Apr 2009, 00:03
Danksagung erhalten: 3 Mal

Interrupts auf CMSIS-kompatiblen ARMs

Beitrag von Physikant »

Hallo Leute,

ich bin gerade dabei, mich in die Grundlagen von SAM-GCC anhand des ATSAM4N8A einzuarbeiten.
Es ist mir inzwischen gelungen, den Timer/Counter0 zu aktivieren und eine PWM an einem Pin auszugeben.
Jetzt möchte ich bei einem Compare-Match des Timers einen Interrupt auslösen.

Folgendes habe ich getan:
- den Compare-Match-Interrupt im TC0 aktiviert
- den Interrupt des TC0 im NVIC aktiviert
- den Interrupt-Handler neu definiert, so dass er tut, was ich will (in dem Fall eine LED toggeln)
- im Interupt rufe ich (aus Vorsicht) die "clear pending"-Funktion aus CMSIS auf, um sicher zu gehen, dass der Interrupt gelöscht wird

Wenn ich nun den Output an der LED ansehe, messe ich ein Rechteck mit 50% Tastverhältnis und einer Periodendauer von 1,6µs. Das passt allerdings garnicht zu den Einstellungen des Timers. Die Masterclock beträgt 100MHz. Ich habe den Clock-Prescaler des Timers mal geändert, die 1,6µs bleiben gleich.
Wenn ich raten müsste, würde ich vermuten, dass der Interrupt dauerhaft bestehen bleibt und ständig erneut ausgelöst wird, und dass die 1,6µs einfach die Zeit für einen Interrupt-Durchgang sind.
Ich habe versucht, im TC0 andere Interrupt-Sources zu wählen. Hier hat sich gezeigt: wenn der Interrupt überhaupt eintritt, dann bleibt es bei den 1,6µs, tritt er nie ein, so bleibt der Pin low. Daraus schließe ich: der Interrupt wird korrekt erkannt und ausgelöst und ich habe im NVIC die richtige Interrupt-Quelle rausgesucht. Warum zur Hölle wird der Interrupt dann nicht zurückgesetzt?

Hoffe irgendwer hat sich schon in die hässliche Arm-Welt reingequält und kann mir hier nen Hinweis geben.
Danke schonmal!

Niko

playOvation
Beiträge: 777
Registriert: Di 8. Jun 2010, 18:55
Spezialgebiet: Normen
Schule/Uni/Arbeit: F&E Elektronik
Hat sich bedankt: 3 Mal

Re: Interrupts auf CMSIS-kompatiblen ARMs

Beitrag von playOvation »

Ich meine, bei einer bestimmten Architektur gelesen zu haben, dass manche oder gar alle Interrupts aktiv zurückgesetzt werden müssen.
Das würde das Verhalten erklären, wenn du nicht zurückgesetzt hast.

MfG
Benutzeravatar

hustensaft
Beiträge: 1006
Registriert: Sa 19. Mär 2011, 19:10
Danksagung erhalten: 1 Mal
Kontaktdaten:

Re: Interrupts auf CMSIS-kompatiblen ARMs

Beitrag von hustensaft »

playOvation: Ich denke, das hat er bereits eingebaut:
Physikant hat geschrieben:im Interupt rufe ich (aus Vorsicht) die "clear pending"-Funktion aus CMSIS auf, um sicher zu gehen, dass der Interrupt gelöscht wird
Ich habe leider nur Erfahrungen mit den STM32 (dort muss man Interrupt-Flags ebenfalls per Hand löschen). Zum beschriebenen Fehler fällt mir leider keine Ursache ein. Kannst du ein wenig Code posten?

Thread-Ersteller
Physikant
Beiträge: 503
Registriert: Di 28. Apr 2009, 00:03
Danksagung erhalten: 3 Mal

Re: Interrupts auf CMSIS-kompatiblen ARMs

Beitrag von Physikant »

Klar :)

Code: Alles auswählen

//configure PA0 as TC0-Output
PIOA->PIO_PDR = PIO_PDR_P0;
PIOA->PIO_PUDR = PIO_PUDR_P0;
PIOA->PIO_PPDDR = PIO_PPDDR_P0;
PIOA->PIO_MDDR = PIO_MDDR_P0;
PIOA->PIO_ABCDSR[0] = PIO_ABCDSR_P0;
//done

PMC->PMC_PCER0 = PMC_PCER0_PID23; //activate TC0
REG_TC0_CCR0 =  TC_CCR_CLKEN     //enable the clock
   |TC_CCR_SWTRG   //software trigger: perform restart
   ;
REG_TC0_CMR0 =  TC_CMR_WAVE  //activate waveform mode
   |TC_CMR_TCCLKS_TIMER_CLOCK4 //use MCK/128
   |TC_CMR_WAVSEL_UP_RC    //count up to RC and reset
   |TC_CMR_ACPA_SET     //set output pin with compare A
   |TC_CMR_ACPC_CLEAR     //clear output pin with compare C
   ;
REG_TC0_RA0 = 1024; //compare A: 1024
REG_TC0_RC0 = 4096; //compare C: 4096

REG_TC0_IER0 =  TC_IER_CPAS;   //enable RA Compare Interrupt

NVIC_EnableIRQ(23); //enable NVIC for TC0

void TC0_Handler( void )
{
   NVIC_ClearPendingIRQ(23); //that was just a test
   toggle_led();
}
An PA0 kommt denn die zu den Einstellungen passende "PWM" raus. Lediglich das Problem mit dem Interrupt besteht.
Grüße,
Niko
Benutzeravatar

hustensaft
Beiträge: 1006
Registriert: Sa 19. Mär 2011, 19:10
Danksagung erhalten: 1 Mal
Kontaktdaten:

Re: Interrupts auf CMSIS-kompatiblen ARMs

Beitrag von hustensaft »

Hab leider keine Idee. Sorry :/
Antworten