Forum: Mikrocontroller und Digitale Elektronik PIC32MZ2048EFH100.Per Interrupt Timer zurücksetzen


von Jonn S. (boishi)


Angehängte Dateien:

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

von Gästchen (Gast)


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.

von Gästchen (Gast)


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.

von Gästchen (Gast)


Lesenswert?

Sorry, da bin ich statt auf "Vorschau" auf senden gekommen :-(
Kann irgendein Mod bitte den ersten post löschen, der Übersicht halber?
Das wäre nett!

von Jonn S. (boishi)


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

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.