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
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.
Man könnte auch SPI oder USART benutzen ... passende Bitrate raussuchen und dann ein oder mehrere 1er-Bits rausschieben lassen.
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.
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?
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.