Forum: Mikrocontroller und Digitale Elektronik SAM4S: Messung Periodendauer: Ständiger INT


von Alex (haidanai)


Lesenswert?

Hallo,
ich versuche mit SAM4S die Periodendauer auf TIOA mit TC0 Kanal 0 zu 
messen.
In dem TC0_Handler lese ich RA ein. Die Periodendauer wird auch korrekt 
gelesen. Wenn ich in diesem Handler aber einen Portpin toggle, sehe ich 
dass der Handler ständig (630 kHz) angesprungen wird, obwohl die 
Frequenz auf TIOA ganz niedrig ist.
Im Debugger-Fenster-I/O:
- TC0-TC_CMR0: External Trigger Edge Selection "Rising Edge" (0x01)
- TC0-TC_CMR0: RA Loading Edge Selection "Rising Edge of TIOA" (0x01)
Wenn ich eine von beiden Einstellungen auf 0x00 setze, wird der Handler 
gar nicht mehr angesprungen. Ich habe den Verdacht, dass der Handler den 
Interrupt nicht von selbst löscht. Ich habe aber in der Timerregistern 
keines gefunden, wo man den/das Interupt(-Flag) löschen könnte.
Wo ist mein Fehler? Wo kann ich noch schauen?

von Alex (haidanai)


Lesenswert?

Ich habe den Fehler selbst gefunden:
Man muss das Statusregister TC_SR lesen, um den Interrupt zu löschen.
Im DaBla habe ich nichts dazu gefunden - ???
Thema erledigt.

von Rolf (rolf22)


Lesenswert?

Alex schrieb:
> Ich habe den Verdacht, dass der Handler den
> Interrupt nicht von selbst löscht. Ich habe aber in der Timerregistern
> keines gefunden, wo man den/das Interupt(-Flag) löschen könnte.

Ich kenne diesen Processor nicht, normalerweise ist es aber so:
Wenn ein Interrupt immer wieder kommt, dann liegt das daran, dass er 
immer wieder neu ausgelöst wird. Ein Auslösen erfolgt nur als Reaktion 
auf die gewählte externe oder interne Interrupt-Quelle. Mit 
Interrupt-Flags kann man keine Auslösung bewirken.

Jedenfalls: Ohne Source (einschl. kompletter Initialisierung) und 
Details über die Beschaltung weiß keiner, was da überhaupt programmiert 
ist.

von Alex (haidanai)


Lesenswert?

Rolf schrieb:
> Wenn ein Interrupt immer wieder kommt, dann liegt das daran...
Danke für deine Antwort. Du hast wahrscheinlich nicht gesehen, dass ich 
das Problem selbst lösen konnte. (s.o.)
Hier wird der Interrupt nicht in Hardware durch anspringen des Handlers 
gelöscht. Man muss das Statusregister lesen um den INT zu löschen.
Da ich das nicht wusste, blieb der Status auch im Handler erhalten
und so wird der Handler ständig aufgerufen.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Angehängte Dateien:

Lesenswert?

Alex schrieb:
> Man muss das Statusregister TC_SR lesen, um den Interrupt zu löschen.
> Im DaBla habe ich nichts dazu gefunden
Das steht eigentlich schon da und sogar recht **fettgeschrieben**...

von Alex (haidanai)


Lesenswert?

UUUPs.
Tomaten sind gesund, aber vor den Augen ungeschickt ;-)
Danke.

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.