Gast
#1269688
Hallo, ich möchte mit einem µC – Atmega644, 20 Mhz, in C# – einen Zweifach-Rechteckpuls ausgeben. Erst wird die Dauer des ersten Pulses vorgegeben, dann die Länge der Pause und abschließend wird noch mal die Dauer für den zweiten Puls angegeben. Die verschiedenen Zeiten sind dabei selten gleich und weichen jeweils in der Regel von einander ab. Also das Signal ist eigentlich nicht periodisch. z.B. IIII_______II, IIIII___IIIIIII, II_I Mein Problem bei der Sache ist jedoch, dass ich Zeitschritte von 50 ns will >.< Dazu kommt, dass ich nur den Timer1 zur Verfügung habe. Alle anderen Timer sind schon mit anderen Aufgaben beschäftigt. Ich hatte schon verschiedene Ansätze. z.B. versuchte ich eine Art Schrittkette zu machen, bei der der Timer in den jeweiligen Schritten immer zu abgefragt wurde bis zu einem bestimmten Zeitpunkt. Dann wurde der Timer auf 0 gesetzt, der entsprechende Port für das Ausgangssignal gesetzt, der Schritt wurde beendet und der nächste Schritt ausgeführt, der im Grunde wie der erste Schritt aufgebaut war, nur, dass er den Port wieder anders setzte … usw. Das Problem bei dieser Lösung waren die ganzen while-Schleifen und if-Abfragen, die das Ganze doch schon sehr verlängerten. Danach habe ich eine Verzögerung mit for-Schleifen versucht, bzw. einen eigenen Zähler damit zu realisieren. Nur optimierte mir der AVR Studio Compiler diese „leeren“ for-Schleifen einfach Weg. Ich konnte zwar die Optimierung runterstellen, aber diesen Zustand wollte ich für mein restliches Programm nicht haben. Das Problem konnte ich jedoch lösen, indem ich in die Schleifen eine „NOP-Anweisung“ schrieb - asm volatile ("nop"). Leider braucht ein Zählschritt bei mir 350 – 400 ns (abhängig von den Gesamtzählschritten). Ich konnte die Zählschritte auf 150 ns beschränken, indem ich in mein C-Programm die Schleife in Assembler realisierte. Mhmm, es wäre ideal, wenn genau in dem Moment wo der Timer meinen erwartete Wert erreicht hat ich den Port setzen/rücksetzen könnte. Nur fällt mir keine Lösung dazu ein – irgendwelche abfragen/Vergleiche brauchen bei mir selbst immer etwas Zeit und ein Zufallsfaktor schleicht sich dabei auch mit ein und Interrupts brauchen einfach zulange in die ISR zu springen und zurück zu kommen. Hat vielleicht einer von euch eine Idee wie ich den Zweifach-Rechteckpuls realisieren kann? Weder die Suchfunktion noch Google konnte helfen /: