mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Timer Start in Interrupt


Autor: easy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo! Ich möchte in meinem Programm (Hardware: Atmega 32, 8MHz)
in einem externen interrupt einen Timer starten (INT0 , TIMER0) und
diesen aber im Hauptprogramm weiterlaufen lassen bis zum nächsten
Interrupt. Wenn ich die Interrupt per Software verlängere bekomm ich
werte beim Auslesen von TCNT0. Wenn nicht ständig nur 0. Kann es sein
dass der Timer beim verlassen des Interrupts sofort wieder beendet
wird? Wenn ja wäre ich für andere Lösungsvorschläge dankbar!

mfg easy

Autor: Hubert.G (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
C, Assembler, Bascom, ...
Wie wäre es mit deinem Code?
Dann kann dir eher jemand helfen.

Autor: ...HanneS... (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und so richtig nachvollziehen kann ich dein Vorhaben auch nicht...

Autor: easy (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Programmiere in C. Hier der CODE

Autor: ...HanneS... (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo...

> Ich möchte in meinem Programm (Hardware: Atmega 32, 8MHz)
> in einem externen interrupt einen Timer starten (INT0 , TIMER0) und
> diesen aber im Hauptprogramm weiterlaufen lassen bis zum nächsten
> Interrupt.

Wann willst du den Timer starten, bei der steigenden Flanke, bei der
fallenden Flanke oder bei jedem Pegelwechsel?

Wann willst du den Timer auslesen, in der steigenden Flanke, bei der
fallenden Flanke oder bei jedem Pegelwechsel?

> Wenn ich die Interrupt per Software verlängere bekomm ich
> werte beim Auslesen von TCNT0.

Was ist mit dem "Verlängern des Interrupts per Software" gemeint?
Darunter kann ich mir nix vorstellen.

> Wenn nicht ständig nur 0.

Kann es sein, dass du den Timer auf 0 setzt, ehe du ihn ausliest?
Wenn ich die Zeitspanne zwischen den Interrupts messen will, dann lese
ich zuerst den aktuellen Timerstand aus, ehe ich den Timer (für die
nächste Messung) wieder auf 0 setze.

Alternativ dazu kann man den Timer durchlaufen lassen, bei jedem Int
seinen Stand auslesen, die Differenz zum vorhergehenden Timerstand
bilden (das ist dann das gewünschte Ergebnis) und den aktuell
ausgelesenen Stand für's nächste mal merken.

Noch besser und einfacher (und vor allem genauer) geht das mit der
Input-Capture-Funktionalität des Timer1.

> Kann es sein dass der Timer beim verlassen des Interrupts sofort
> wieder beendet wird?

Nein, der Timer läuft im Hintergrund, sobald er aktiviert wurde
(Vorteiler).

> Wenn ja wäre ich für andere Lösungsvorschläge dankbar!

Was ich hiermit gemacht habe. Beispiele kann ich dir leider nur in ASM
geben, ich kann kein C.

Allerdings ist mir an deinem C-Programm aufgefallen, dass du in der
Hauptschleife den Pin für den Int stimulierst (debug), um Int-Aufrufe
auszulösen. Diese Schleife hat aber keine "Bremse". Rechne mal durch,
alle wieviel Takte diese Schleife den Port toggelt. Und dann informiere
dich mal, wieviele Takte der Aufruf eines Interrupts (incl. Rücksprung)
dauert. Ich glaube, dass hier schon der Hase im Pfeffer liegt... 8-(

...

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.