Rechtecksignalerzeugung ATmega8

OP #3459323
Lesenswert?

Hallo Forenmitgleider,

erstmal wünsche ich Euch frohe Weihnachten.
Gleichzeitig habe ich eine Frage an Euch:

Ich möchte folgendes Protokoll auf einem AVR (ATmega8 - 16MHz) 
implementieren:
http://home.mnet-online.de/modelleisenbahn-digital/Dig-tutorial-start.html

Jedoch weiß ich noch nicht mit welchem Timer/PWM-Modus man die drei 
Zustände erzeugen kann. Soll ich den CTC-Modus nehmen, oder Fast-PWM?

Und ja, ich weiß, dass die anderen Softwareprojekte den UART mit 38400 
BAUD dazu zweckentfremden. Ich möchte mich lieber mit den Timern 
beschäftigen und den UART für spätere Kommunikationen mit einem PC 
nutzen.

Gruß Manuel
#3461324
Lesenswert?

Ich würde es vielleicht mal mit einem Timer versuchen, der alle 26µs 
einen internen Interrupt auslöst. Wenn du das trinäre Kommandowort als 
character string mit 9 Stellen betrachtest, zB "011-01011", dann kann 
deine Interruptroutine die einzelnen TriBits der Reihe nach 
durchschieben und senden.
#3461383
Lesenswert?

Kannst du machen, wie du willst. Bei 16Mhz sind 26us halt nur 61 Zyklen. 
Das reicht zwar prinzipiell, um im CTC Modus alles "zu Fuß" in einer ISR 
abzuwickeln, allerdings musst du da dann schon Zyklen zählen. Wenn du 
den Ausgang per Hardware-PWM schaltest, wird es entspannter.

Oliver
Gast #3462757
Lesenswert?

Das Signal ist eine Kombination aus 2 PWM Signalen. Einmal 26 µs H und 
182 µs L und dem Entgegengesetzten. Je 2 Perioden des PWM Signals werden 
für Zeichen (O,1, offen) genutzt.

Dafür müsste man nur einen Timer das Passende PWM Signal (208 µs Länge 
und Pulslänge von 26 bzw. 182 µs) erzeugen passen und jeweils nach jeder 
Periode anpassen.
OP #3463268
Lesenswert?

Danke für eure Tipps.
Mein erster Gedanke war den CTC-Modus zu nutzen, aber jetzt, wo Ulrich 
die simple Idee geliefert hat, werde ich wohl solch eine Lösung 
ausprobieren.

Das wird aber noch einige Zeit dauern, da ich leider kein Oszi besitze 
(ich geh dann zu Bekannten) und Anfang des nächsten Jahres weniger Zeit 
habe, wegen dem anstehendem Abitur.

Ach ja: Das ganze möchte ich eig. in C umsetzen. Falls die Performance 
bei den kleinen Timings zu schlecht ist, muss ich natürlich auf 
Assembler setzten. Ich werde aber ersteinmal ein Test mit einem C 
Programm machen (und hoffen, dass es wirklich keine 61 Zyklen sind :D ).

Gruß Manuel

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren