mikrocontroller.net

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


Autor: Jonn S. (boishi)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Gästchen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Gästchen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Gästchen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Jonn S. (boishi)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.