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


von friemel (Gast)


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)


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)


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)


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)


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)


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)


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)


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.

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
Noch kein Account? Hier anmelden.