PIC32MZ2048EFH100.Per Interrupt Timer zurücksetzen

OP #4693265
Lesenswert?
• ▲
▼
Hallo,

als Übung wollte ich mit meinem PIC und Eval Board PIC32MZ EF PIM 
folgendes Programm machen:
Durch die Betätigung von S4 geht LED4 aus, Timer wird gestartet und 
zählt bis 8 Sekunden. Während der Timer Zählt, ist LED5 an. Hat Timer 
fertig gezählt, geht LED5 aus und LED4 wieder an. Aber wenn S4 betätigt 
wird, während der Timer zählt, soll er zurückgesetzt werden bzw. 
anfangen wieder von Null zu zählen.

Mein Problem:
Während der Timer zählt und wird S4 betätigt, wird er nicht 
zurückgesetzt, sondern macht er einfach weiter bis er fertig gezählt 
hat.

Kann mir jemand sagen, was ich falsch gemacht habe?
Wenn Ihr mir weiter helfen könntet, wäre ich sehr dankbar!

Grüße
Jonn
Angehängte Dateien:
Gast #4693848
Lesenswert?
• ▲
▼
Naja, du hast schon mal eine Warteschleife in der Timer-ISR.

Die Sache ist schräg. Sehr schräg. Man wartet nicht in einer ISR auf 
einen Timer. In eine ISR darf NIE Code, in dem gewartet wird. Die ISR 
unterbricht anderen Code, du willst sicher nicht, dass irgendeine 
Funktion eine zufällig verteilte Wartezeit von vielen ms drin hat, oder?

Dein Fehler ist, dass der code genau tut was er soll. In der ISR wartet 
er, bis der Timer abgelaufen ist (while-schleife) und setzt dann die 
Led.

[C]
   while(IFS0bits.T1IF == 0)   //WHILE TIMER IS COUNTING
    {

    }

        LATAbits.LATA2 = 0;    //LED 5 Off <-- hier kommt er hin, 
nachdem T1IF auf 1 gegangen ist...
[\c]

Für deine Anwendung solltest du dir input capture ansehen, das ist 
ideal, um den Abstand zwischen zwei Tastendrücken zu messen.
Dein PIC hat dafür eigene Timer.
Gast #4693852
Lesenswert?
• ▲
▼
Die Sache ist schräg gelöst ;-)
Man wartet nie in einer ISR Interrupt auf einen Timer. In eine ISR darf 
NIE Code, in dem gewartet wird. Die ISR unterbricht anderen Code, du 
willst sicher nicht, dass irgendeine Funktion eine zufällig verteilte 
Wartezeit von vielen ms drin hat, oder?

Dein Fehler ist: In der ISR wartet er, bis der Timer abgelaufen ist 
(while-schleife) und setzt dann die Led zurück, da kannst du drücken was 
du willst:
[C]
   while(IFS0bits.T1IF == 0)   //WHILE TIMER IS COUNTING
    {

    }

        LATAbits.LATA2 = 0;
//--> um hierher zu kommen, muss T1IF auf 1 gehen (der Timer ablaufen..)
[\c]

Für deine Anwendung solltest du dir input capture ansehen. Das ist 
gemacht dafür, um die Abstände zwichen Flanken an den Pins zu messen und 
hat eigene Timer. Das hält die Timer für andere Sachen frei.

PS:
Jeder Pin taugt für deine Anwendung, nicht nur der Ext-Interrupt. Change 
notification.
OP #4695847
Lesenswert?
• ▲
▼
Gästchen schrieb:


> Für deine Anwendung solltest du dir input capture ansehen. Das ist
> gemacht dafür, um die Abstände zwichen Flanken an den Pins zu messen und
> hat eigene Timer. Das hält die Timer für andere Sachen frei.
>

Hi, danke für deine Antwort.
Das habe ich auch gedacht Input Capture zu benutzen.
Aber da ich mich nicht so gut auskenne, komme ich leider mit Input 
Capture auch nicht weiter.

Weiß jemand, wo ich Beispielprogramme mit Input Capture für PIC32MZ 
finden kann?

Danke im Voraus

Grüße
Jonn

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.