Hallo, ich möchte ein Signal für einen 433 MHz-Sender generieren. Für die Generierung habe ich den Timer 1 im Fast-PWM-Mode benutzt. Die High-Zeit des Signals wird im Register OCR1B gespeichert, die Zeit bis zur nächsten High-Flanke im Register ICR1. Testweise habe ich mal die Startsequenz ausgegeben (7 kurze Impulse), die auch soweit funktioniert. Danach kommt eine längere Pause und dann die Datenpakete mit je 11 Bits (siehe Bild). Zum Testen habe ich mal alle Datenbits gleich breit gemacht (breiter als die bei der Startfrequenz). Das erste High-Signal der Daten hat dabei allerdings nicht die gewünschte Breite. Grund: der Wert des Registers OCR1B wird nicht sofort übernommen. Komischerweise wird der Wert beim "ähnlichen" Register ICR1 sofort übernommen. Man kann das auch mit dem Emulator sehen, wenn man Breakpoints setzt. Beispiel: OCR1B = TIME_LOW_STARTSEQUENZ; //=> wird nicht sofort übernommen ICR1 = TIME_T_STARTSEQUENZ; //=> wird sofort übernommen An was liegt das? Kann dan den PWM-Mode für diese Signalgenerierung nicht verwenden? Gruß Martin
Die OCR.. Register sind gepuffert: wenn du da was reinschreibst wird das erst beim nächsten 'Überlauf' vom Timer übernommen - zumindest wenn ich mich richtig erinnere, aber du könntest das ja im Datasheet nachschlagen ;) Vielleicht ist das eine Anwendung für den Modus mit OCR als Top und ICR als Compare (15?!), oder du musst nur das Beschreiben des Registers "richtig" time'n. hth. Jörg
Wo steht denn das im Datenblatt, daß die OCR-Register erst beim nächsten Überlauf vom Timer übernommen werden? Ich habe es bisher nicht gefunden. Habe wohl Tomaten auf den Augen.... Ich habe den Mode 14 für den Timer verwendet. Sollte man einen anderen nehmen? Macht man solch ein benötigtes Timing überhaupt sinnvollerweise mit dieser PWM-Funktion des Prozessors? Ich frage deshalb, weil ich selten Software mache und mich daher nicht so auskenne (im Geschäft bin ich für Hardware zuständig). Für gute Realisierungsvorschläge wäre ich daher sehr dankbar. Gruß Martin
Sehe ich das richtig, dass du da nur etwa 200Hz brauchst? Dann würde ich das in Software machen, für sowas einen Timer zu "verschwenden" lohnt sich doch nicht.
@Spess53: Danke, den Text hab ich gar nicht gesehen. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @Philipp Burch: (siehe auch Beitrag "Fragen zu 433 MHz-Signale" ) * Erst kommt eine Art Startsequenz: 7 Impulse mit ca. 470µs Dauer, T ca. 800 µs * dann eine Pause von ca. 3 ms * dann 12 Datenpakete mit je 12 Bit. Dazwischen jeweils eine Pause von ca. 3 ms. * Breite der Impulse im Datenpaket sind wie folgt: breite Impulse (High?) ca. 850µs und schmale Impulse (Low?) ca. 470µs. T ca. 1,2 ms Den Timer hatte ich eh nicht benutzt. Wie würdest Du das ohne den Timer machen? Ich muß doch die Zeit irgendwo von einem Timer ableiten? Und der müßte dann trotzdem relativ schnell laufen. Bisher benötige ich für andere Sachen je einen mit 1ms und 1 Sekunde. Die sind beide viel zu langsam für die Funksignale
Martin Müller wrote: > * Erst kommt eine Art Startsequenz: 7 Impulse mit ca. 470µs Dauer, T ca. > 800 µs > * dann eine Pause von ca. 3 ms > * dann 12 Datenpakete mit je 12 Bit. Dazwischen jeweils eine Pause von > ca. 3 ms. > * Breite der Impulse im Datenpaket sind wie folgt: breite Impulse > (High?) ca. 850µs und schmale Impulse (Low?) ca. 470µs. T ca. 1,2 ms Das schreit doch regelrecht nach einem Zustandsautomaten, der im OC-Interrupt im Hintergrund rattert. > Den Timer hatte ich eh nicht benutzt. Wie würdest Du das ohne den Timer > machen? Nicht ohne Timer, aber ohne vom Timer direkt gesteuerten PWM-Ausgang. http://www.hanneslux.de/avr/mobau/7ksend/7ksend02.html Ist zwar nur die Erzeugung eines RC-Impulstelegramms, aber das Prinzip ist erkennbar. Die (bitwertabhängigen) Daten für den jeweils nächsten Termin können ja auch aus einem Byte oder Word herausgeshiftet werden. > Ich muß doch die Zeit irgendwo von einem Timer ableiten? Und der > müßte dann trotzdem relativ schnell laufen. Kann er doch. In der ISR das erledigen, was dem Zustands-Zähler nach getan werden muss (Impuls setzen/löschen, Daten shiften...) und Zustand und Termin für nächsten Interrupt setzen. Der Timer läuft dann frei durch, mit einem Vorteiler, der für diese Aufgabe optimal erscheint, also dass die längsten und kürzesten anfallenden Schritt-Zeiten sauber in eine "Runde" passen. > Bisher benötige ich für > andere Sachen je einen mit 1ms und 1 Sekunde. Die sind beide viel zu > langsam für die Funksignale Die können doch trotzdem laufen, sollten aber sehr schlank programmiert sein, damit sie die Senderoutine nicht behindern. Also möglichst nur Semaphores für die Mainloop setzen und den Krams in der Mainloop abarbeiten. ...
Ich habe es nun mit dem Timer 1 hin bekommen. Ich habe nun 2 Interrupts dafür benutzt. Vielen Dank für Eure Unterstützung!
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.