Forum: Mikrocontroller und Digitale Elektronik ATMEGA128: Signalerzeugung mit Fast-PWM


von Martin M. (martin69)


Angehängte Dateien:

Lesenswert?

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

von Martin M. (martin69)


Angehängte Dateien:

Lesenswert?

und im Anhang Auszüge aus dem Quelltext...

von Jörg X. (Gast)


Lesenswert?

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

von Martin M. (martin69)


Lesenswert?

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

von Spess53 (Gast)


Lesenswert?

Hi

S.125 Diagramm

MfG Spess

von Philipp B. (philipp_burch)


Lesenswert?

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.

von Martin M. (martin69)


Lesenswert?

@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

von Hannes L. (hannes)


Lesenswert?

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.

...

von Martin M. (martin69)


Lesenswert?

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
Noch kein Account? Hier anmelden.