mikrocontroller.net

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


Autor: Martin M. (martin69)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Martin M. (martin69)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
und im Anhang Auszüge aus dem Quelltext...

Autor: Jörg X. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Martin M. (martin69)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

S.125 Diagramm

MfG Spess

Autor: Philipp Burch (philipp_burch)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Martin M. (martin69)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht 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.

...

Autor: Martin M. (martin69)
Datum:

Bewertung
0 lesenswert
nicht 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!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.