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

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.