Forum: Mikrocontroller und Digitale Elektronik usec Delay für IO pin schalten mit timern?


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von friemel (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hallo,

folgende Situation: Auf einem atmega16A läuft ein Programm, welches 
einen Port pin für eine exakte Zeit ein- oder ausschalten soll. Das Zeit 
intervall ist ca. 10-400usec.
Ich suche eine Möglichkeit, dieses Verhalten möglich mit timern zu 
erreichen, sodaß das timing eben auch im Interruptfall etc. eingehalten 
werden kann. Die Hardware selbst, soll also den io pin schalten.
Ist das machbar?

Vielen Dank
F

von Axel S. (a-za-z0-9)


Bewertung
0 lesenswert
nicht lesenswert
friemel schrieb:
> folgende Situation: Auf einem atmega16A läuft ein Programm, welches
> einen Port pin für eine exakte Zeit ein- oder ausschalten soll. Das Zeit
> intervall ist ca. 10-400usec.

> Ich suche eine Möglichkeit, dieses Verhalten möglich mit timern zu
> erreichen, sodaß das timing eben auch im Interruptfall etc. eingehalten
> werden kann. Die Hardware selbst, soll also den io pin schalten.
> Ist das machbar?

Dafür gibt es die OUTPUT COMPARE Funktionalität. Funktioniert allerdings 
nur mit einigen Pins. Und es gibt nur ein Compare Event pro Pin, du mußt 
das Compare-Register also während des Impulses umprogrammieren.

Pseudocode:
1
config_compare_unitA(set_pin_on_match);
2
compare_regA=startzeit;
3
(warte auf compare match, evtl. im Interrupt)
4
config_compare_unitA(reset_pin_on_match);
5
compare_regA=endzeit;

Für sehr kurze Impulse ist es besser, einen PWM-Modus der Compare Unit 
zu verwenden und den Timer für genau einen Impuls laufen zu lassen.

von foobar (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Man könnte auch SPI oder USART benutzen ... passende Bitrate raussuchen 
und dann ein oder mehrere 1er-Bits rausschieben lassen.

von Alex D. (daum)


Bewertung
0 lesenswert
nicht lesenswert
Am besten verwendest du dafür den CTC Mode des Timers. Dabei kann aber 
nur der für diesen Timer spezifizierte Pin verwendet werden, bei Timer 0 
wäre das OC0 (PB3), bei Timer 1 entweder OC1A (PD5) oder OC1B (PD4).
Beim CTC mode kannst du die gewünschte Periodendauer mit dem OCRx 
Register einstellen, der Pin wechselt jedes mal den Zustand wenn der 
Timer OCRx erreicht, und der Timer wird dabei wieder auf 0 gesetzt.

von friemel (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Danke für die Tipps... :D

Habt ihr das schon einmal so verwendet, oder ist das eher eine 
theoretische Fähigkeit der OUTPUT COMPARE Funktionalität?

von Axel S. (a-za-z0-9)


Bewertung
0 lesenswert
nicht lesenswert
friemel schrieb:
>
> Habt ihr das schon einmal so verwendet, oder ist das eher eine
> theoretische Fähigkeit der OUTPUT COMPARE Funktionalität?

Das ist die vorgesehe Funktionalität. Wobei die Fähigkeiten der AVR 
Timer immer noch zu wünschen übrig lassen. Für periodische Vorgänge sind 
sie Klasse, aber für Einzelimpulse fehlt ein singleshot-Modus.

Ich verwende sie haupsächlich für PWM oder um einen Pin beim 
Timerüberlauf toggeln zu lassen. Periodisch eben. Für Einzelimpulse muß 
man immer in Software nachhelfen

von friemel (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Ja, danke nochmals.
Ich habe ein wenig rumprobiert, aber da man ja - wie du sagtest - für 
den single shot immer mit Software eingreifen muss, kann ich dann auch 
direkt den Pin mit Software schalten. Konkret mache ich jetzt: Timer1 
mit höchster Frequenz einstellen, mit einem Startwert laden, den pin 
einscshalten , und dann mit einer overflow irq Funktion den pin wieder 
abschalten und timer aus.
Muss mal sehen, ob das so verwendbar ist.

von Peter D. (peda)


Bewertung
0 lesenswert
nicht lesenswert
friemel schrieb:
> für
> den single shot immer mit Software eingreifen muss, kann ich dann auch
> direkt den Pin mit Software schalten.

Der große Unterschied ist aber, im PWM-Mode hast Du keinen Jitter.
Z.B. für 1µs schaltet die Fast-PWM im Nulldurchgang ein und beim 
Comparewert (7 für 1µs bei 8MHz) aus. Und dann hast Du noch 65529 Zyklen 
Zeit, in den Interrupt zu springen und die Fast-PWM abzuschalten. Andere 
Interrupts stören das Timing also nicht.

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]
  • [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.