mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik zwei zeitkritische Funktionen, Interruptkonflikt?


Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,

mit dem Atmega 8 lasse ich über Timer 2 ein PWM Signal ausgeben, bei dem 
per Interrupt eine sinus LUT (256) ausgelesen werden soll.Deren Frequenz 
liegt zwischen 50 und 70 Hz.
"Gleichzeitig" soll mit Timer 1 per Input Capture fortlaufend ein 
Eingangssignal von 0,5 -2 Hz ausgelesen werden, Auflösung in ms.
Jeder gemessene Wert soll auch per UART ausgegeben werden.

Fosc= 3.684000

Kann mir jemand einen Tipp geben, wie ich die Interrupts verwalte, dass 
sie sich nicht gegenseitig stören? Oder habe ich da iregndwo einen 
grundsätzlichen Denkfehler?

Für Hilfe wäre ich dankbar, auch ein Tipp wo es nachzulesen wäre, wäre 
gut. Im Tutorial habe ich nix gefunden....

Gruß

Thomas

: Verschoben durch Moderator
Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Thomas schrieb:
> Kann mir jemand einen Tipp geben, wie ich die Interrupts verwalte, dass
> sie sich nicht gegenseitig stören?

Wenn ich dich recht verstanden habe, musst du weiter nichts tun als
die ISRs einfach nur kurz zu halten: beide ISRs müssen abgearbeitet
sein, bevor der jeweils nächste gleichartige Interrupt eintrifft.
Die PWM wird ja ohnehin von der Hardware erzeugt, es ist also nur
wichtig, dass in jeder Periode (also 50...70mal pro Sekunde) die
Tabelle einmal ausgelesen wird und der Wert im OCRx aktualisiert
wird.  Beim input capture zeichnet ebenfalls die Hardware den
tatsächlichen aktuellen Wert auf, du musst ihn lediglich aus dem
entsprechenden Register ausgelesen haben, bevor ein erneutes Ereignis
eintrifft (was ja vergleichsweise selten ist).

Hat nichts mit GCC zu tun, daher schiebe ich das mal.

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank für die Antwort!

Sorry, dass ich die Frage ins GCC gestellt hatte!

Wenn ich Dich recht verstanden habe, kann ich dann auch die UART,die ich 
ebenfalls mit Interrupt steuern möchte, einfach nur versuchen so kurz 
wie möglich zu halten, dann wird es eh hintereinander abgearbeitet.

Beim Input capture mit Messzeiten von 0.5 bis 2 Hz wollte ich auch mit 
Interrupt arbeiten, also ms inkrementieren. Ist das falsch? Bei fosc 
3.686400 und clk/1024 könnte ich natürlich einfach den Wert aus TNCT1 
auslesen bzw ICR. Allerdings habe ich da noch ein Verständnissproblem, 
wie ich den Time Stamp in Millisekunden umformen/ausrechnen soll, da der 
Messwert Grundlage der Berechnung zur Sinussignalsteuerung von Timer 2 
sein soll.

Gruß

Thomas

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Thomas (Gast)

>Wenn ich Dich recht verstanden habe, kann ich dann auch die UART,die ich
>ebenfalls mit Interrupt steuern möchte, einfach nur versuchen so kurz
>wie möglich zu halten,

Was denn halten? Lies mal was über Interrupts.

>Beim Input capture mit Messzeiten von 0.5 bis 2 Hz wollte ich auch mit
>Interrupt arbeiten, also ms inkrementieren. Ist das falsch?

Ja. Man berechnet einfach die Differenz zweier Messungen. Bei 2 Hz hat 
man dazu alle Zeit der Welt.

> Bei fosc
>3.686400 und clk/1024 könnte ich natürlich einfach den Wert aus TNCT1
>auslesen bzw ICR.

Genau so.

> Allerdings habe ich da noch ein Verständnissproblem,
>wie ich den Time Stamp in Millisekunden umformen/ausrechnen soll,

Kleines Einmaleins?

> da der
>Messwert Grundlage der Berechnung zur Sinussignalsteuerung von Timer 2
>sein soll.

Ja und? Das ist doch trivial. Schreibs mal aufs Papier.

MFG
Falk

Autor: Hinz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Trivial ist das, was man beherrscht, oder auch nur meint,
zu beherrschen. In zweitem Fall nennt mans aber nur so...

Interrupts so kurz wie möglich zu halten, ist die trivialste
Antwort - das liest man schließlich überall.

Also:
Wenn es darauf ankommt, dass der Sinus "sauber" sein soll,
muss die LUT 50 ... 70 x 256 = 12800 ... 17920 mal pro Sekunde
zum GENAU richtigen Zeitpunkt ausgelesen werden.

In diesem Fall wäre zu überlegen, ob es nicht reichen würde,
NUR den PWM-Interrupt zu nutzen, dort umgehend die LUT-Routine
abzuarbeiten und anschließend in diesem Interrupt die Erkennung
des 0,5-2,0 Hz Signals (und die nötigen RS232-Aktionen) per
Polling, also Abfrage des Zustands, abzuarbeiten.
Das 0,5-2,0 Hz Signal würde dabei auf < 0,1 ms genau erfasst
werden, es darf nur kein Puls kürzer als 0,1 ms sein.

Allen Schlaumeiern zum Trotz wäre in diesem Fall die Dauer der
Interruptroutine in relativ weiten Grenzen unkritisch!

@ Thomas:
Schau mal, ob das vom Programmablauf so funktionieren könnte,
für die Umformung der Zeitmesswerte kriegst du dann bestimmt
auch noch einen Tipp...

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.