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
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.
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.
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!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.