<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://www.mikrocontroller.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Gregor54321</id>
	<title>Mikrocontroller.net - Benutzerbeiträge [de]</title>
	<link rel="self" type="application/atom+xml" href="https://www.mikrocontroller.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Gregor54321"/>
	<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/articles/Spezial:Beitr%C3%A4ge/Gregor54321"/>
	<updated>2026-04-21T16:23:31Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.39.7</generator>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=AVR-Tutorial:_Watchdog&amp;diff=40517</id>
		<title>AVR-Tutorial: Watchdog</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=AVR-Tutorial:_Watchdog&amp;diff=40517"/>
		<updated>2009-11-06T23:31:42Z</updated>

		<summary type="html">&lt;p&gt;Gregor54321: /* Weblinks */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dieser Artikel ist im Entstehen: Die Diskussion wird in [http://www.mikrocontroller.net/topic/131121] geführt.&lt;br /&gt;
&lt;br /&gt;
Der [[Watchdog]] im AVR (WDT) ist ein spezieller Timer, der nach Ablauf (typisch ein paar ms) automatisch einen RESET auslöst. Im Normalbetrieb wird der Watchdog in der Hauptschleife des Programms regelmäßig zurückgesetzt. Wenn durch einen Fehler dieses Zurücksetzen nicht mehr stattfindet, läuft der Watchdog-Timer ab und löst einen RESET aus, um das Programm neu zu starten.&lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
(nach Ganssle-03)&lt;br /&gt;
&lt;br /&gt;
Der Watchdog ist im Prinzip zur Stelle, wenn kein Anwender da ist, um den Resetknopf zu drücken. &lt;br /&gt;
&lt;br /&gt;
Der Watchdog bringt dabei das System aus einem unvorhergesehenen Fehlerzustand wieder in einen betriebsbereiten Zustand.&lt;br /&gt;
&lt;br /&gt;
Dieser Zustand nach einem WDT Reset kann je nach Implementierung im Programm sein:&lt;br /&gt;
&lt;br /&gt;
* Debugzustand&lt;br /&gt;
* Sicherheitszustand&lt;br /&gt;
* Betriebszustand &lt;br /&gt;
&lt;br /&gt;
Den Debugzustand kann man während der Entwicklung nutzen, um unvorhergesehene Ereignisse herauszufinden. Im fertigen System sollten diese durch das Debuggen bekannten Ereignisse korrekt, d.h. nicht über WDT behandelt werden.&lt;br /&gt;
&lt;br /&gt;
Den Sicherheitszustand kann man verwenden, wenn das System aufgrund von Hardwareproblemen den WDT ausgelöst hat. Nach dem Reset durch den WDT wird die Resetquelle (normaler Reset oder WDT Reset?) ausgewertet und das System/die Hardware geprüft und ggf. in eine sichere Konfiguration statt in den normalen Betrieb gebracht.&lt;br /&gt;
&lt;br /&gt;
Der normale Betriebszustand ist im Prinzip ein Sonderfall des Sicherheitszustands. Es ist zwar ein unerwartetes Ereignis eingetreten (z.B. einzelner zufälliger Speicherlesefehler), aber ein Neustart des Programms scheint nach einer Neuinitialisierung möglich. Ein Sonderfall ist die Anwendung des WDT zum bewussten Reset (s. Tipps &amp;amp; Tricks).&lt;br /&gt;
&lt;br /&gt;
== Steuerung ==&lt;br /&gt;
&lt;br /&gt;
Der WDT wird durch das Watchdog Timer Control Register WDTCR gesteuert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
BIT  7  6  5  4    3   2    1    0&lt;br /&gt;
     -  -  -  WDCE WDE WDP2 WDP1 WDP0&lt;br /&gt;
&lt;br /&gt;
BIT 4 : Watchdog Change Enable&lt;br /&gt;
BIT 3 : Watchdog Enable&lt;br /&gt;
&lt;br /&gt;
BIT   2  1  0  Time-out nach ms&lt;br /&gt;
-------------------------------&lt;br /&gt;
      0  0  0  16,3&lt;br /&gt;
      0  0  1  32,5&lt;br /&gt;
      0  1  0  65&lt;br /&gt;
      0  1  1  130&lt;br /&gt;
      1  0  0  260&lt;br /&gt;
      1  0  1  520&lt;br /&gt;
      1  1  0  1100&lt;br /&gt;
      1  1  1  2100&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ACHTUNG: die Zeiten sind Betriebspannungsabhängig und sollte aus dem jeweiligen Datenblatt des µCs entnommen werden.&lt;br /&gt;
&lt;br /&gt;
WDCE heißt beim Atmega16 WDTOE (Watchdog Turn-off Enable).&lt;br /&gt;
&lt;br /&gt;
== Beispiel ==&lt;br /&gt;
=== WDT durch WDTON-Fuse aktivieren ===&lt;br /&gt;
&lt;br /&gt;
Am Einfachsten läßt es sich durch ein kleines Programmbeispiel demonstrieren.&lt;br /&gt;
&lt;br /&gt;
Ein ATmega8 wird mit 4 MHz des internen Taktgenerators mit einer Startup-Zeit von 64 ms getaktet. Die WDTON-Fuse ist gesetzt (WDT aktiviert). An Port B ist eine LED angschlossen (Pin egal).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;avrasm&amp;gt;&lt;br /&gt;
.include &amp;quot;m8def.inc&amp;quot;&lt;br /&gt;
&lt;br /&gt;
; ATMega8L mit internen 4 MHz getaktet + 64 ms Startuptime&lt;br /&gt;
; WDTON aktiviert!&lt;br /&gt;
&lt;br /&gt;
.def Temp1 = R16&lt;br /&gt;
.def SubCount = R17&lt;br /&gt;
&lt;br /&gt;
.org 0x0000&lt;br /&gt;
        rjmp    Reset               ; Reset Handler&lt;br /&gt;
.org OC1Aaddr&lt;br /&gt;
        rjmp    timer1_compare      ; Timer Compare Handler&lt;br /&gt;
&lt;br /&gt;
Reset:&lt;br /&gt;
        ldi     Temp1, LOW(RAMEND)  ; Stackpointer initialisieren&lt;br /&gt;
        out     SPL, Temp1&lt;br /&gt;
        ldi     Temp1, HIGH(RAMEND)&lt;br /&gt;
        out     SPH, Temp1&lt;br /&gt;
&lt;br /&gt;
        ldi     Temp1, 0xFF         ; Port B auf Ausgang&lt;br /&gt;
        out     DDRB, Temp1&lt;br /&gt;
&lt;br /&gt;
        ldi     Temp1, high(40000 - 1)&lt;br /&gt;
        out     OCR1AH, temp1&lt;br /&gt;
        ldi     Temp1, low(40000 - 1)&lt;br /&gt;
        out     OCR1AL, temp1&lt;br /&gt;
                                    ; CTC Modus einschalten&lt;br /&gt;
                                    ; Vorteiler auf 1&lt;br /&gt;
        ldi     Temp1, ( 1 &amp;lt;&amp;lt; WGM12 ) | ( 1 &amp;lt;&amp;lt; CS10 )&lt;br /&gt;
        out     TCCR1B, temp1&lt;br /&gt;
&lt;br /&gt;
        ldi     Temp1, 1 &amp;lt;&amp;lt; OCIE1A  ; OCIE1A: Interrupt bei Timer Compare&lt;br /&gt;
        out     TIMSK, temp1&lt;br /&gt;
&lt;br /&gt;
        ; kann auch weggelasen werden, da nach einem Reset das Register&lt;br /&gt;
        ; auf 0x00 steht, WDT Reset nach 16ms&lt;br /&gt;
        ldi Temp1, (0&amp;lt;&amp;lt;WDCE)|(0&amp;lt;&amp;lt;WDE)|(0&amp;lt;&amp;lt;WDP2)|(0&amp;lt;&amp;lt;WDP1)|(0&amp;lt;&amp;lt;WDP0)&lt;br /&gt;
        out WDTCR, Temp1&lt;br /&gt;
&lt;br /&gt;
        sei&lt;br /&gt;
&lt;br /&gt;
Mainloop:&lt;br /&gt;
        rjmp    Mainloop&lt;br /&gt;
&lt;br /&gt;
timer1_compare:                     ; Timer 1 Output Compare Handler&lt;br /&gt;
&lt;br /&gt;
        ;** findet 100 x pro  Sekunde statt (10 ms)&lt;br /&gt;
        wdr                         ; Watch-Dog-Reset&lt;br /&gt;
&lt;br /&gt;
        inc     SubCount            ; Wenn dies nicht der 50. Interrupt&lt;br /&gt;
        cpi     SubCount, 50        ; ist, dann passiert gar nichts&lt;br /&gt;
        brne    exit_isr&lt;br /&gt;
&lt;br /&gt;
        ;** findet 2 x pro  Sekunde statt (500ms)&lt;br /&gt;
        clr     SubCount&lt;br /&gt;
&lt;br /&gt;
        ;** Port B negieren&lt;br /&gt;
        in      Temp1, PinB&lt;br /&gt;
        com     Temp1&lt;br /&gt;
        out     PortB, Temp1&lt;br /&gt;
&lt;br /&gt;
exit_isr:&lt;br /&gt;
        reti                        ; das wars. Interrupt ist fertig&lt;br /&gt;
&amp;lt;/avrasm&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Timer 1 läuft im CTC-Modus mit einer Frequenz von 100 Hz (10 ms).&lt;br /&gt;
Durch den Soft-Subcounter wird die Frequenz auf 2 Hz geteilt und jeweils nach 500 ms das Port B negiert. &lt;br /&gt;
&lt;br /&gt;
Da die LED in diesem Beispiel nach 500 ms jeweils ein- und ausgeschalten wird, blinkt sie mit einer Frequenz von 1 Hz. Der WDT wird nach 10 ms zurückgesetzt, so dass er keinen RESET auslösen kann.&lt;br /&gt;
&lt;br /&gt;
Wird jetzt der Befehl WDR auskommentiert, führt der WDT nach 16 ms&lt;br /&gt;
einen RESET aus. Die LED blinkt nun, bedingt durch die Startup-Zeit&lt;br /&gt;
von 64 ms und einem Time-out von 16ms mit rund 6 Hz.&lt;br /&gt;
1/(64ms + 16ms) ~ 12 Hz (halbe Periode)&lt;br /&gt;
&lt;br /&gt;
=== WDT durch Software aktivieren/deaktivieren ===&lt;br /&gt;
&lt;br /&gt;
Der WDT läßt sich auch softwaremäßig durch Setzen des WDE-Bits im WDTCR Register aktivieren.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;avrasm&amp;gt;&lt;br /&gt;
WDT_on:&lt;br /&gt;
&lt;br /&gt;
  in Temp1, WDTCR      ; Write logical one to WDE&lt;br /&gt;
  ori Temp1, (1&amp;lt;&amp;lt;WDE)&lt;br /&gt;
  out WDTCR, Temp1&lt;br /&gt;
  ret&lt;br /&gt;
&amp;lt;/avrasm&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dieses hat den Vorteil, dass man den WDT auch softwaremäßig wieder deaktivieren kann.&lt;br /&gt;
&lt;br /&gt;
Ein Deaktivieren des WDTs ist nicht möglich, wenn die WDTON - Fuse&lt;br /&gt;
gesetzt ist!&lt;br /&gt;
&lt;br /&gt;
Das softwaremäßige Deaktivieren verlangt allerdings eine besondere&lt;br /&gt;
Deaktivierungssequenz. (in drei Phasen)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;avrasm&amp;gt;&lt;br /&gt;
WDT_off:&lt;br /&gt;
&lt;br /&gt;
  ;** 1. Phase&lt;br /&gt;
  wdr                   ; reset WDT&lt;br /&gt;
&lt;br /&gt;
  ;** 2. Phase&lt;br /&gt;
  in  Temp1, WDTCR      ; Write logical one to WDCE and WDE&lt;br /&gt;
  ori Temp1, (1&amp;lt;&amp;lt;WDCE)|(1&amp;lt;&amp;lt;WDE)&lt;br /&gt;
&lt;br /&gt;
  in  Temp2, SREG       ; save I Flag&lt;br /&gt;
  cli                   ; we have only 5 cycles to reset WDE &lt;br /&gt;
&lt;br /&gt;
  out WDTCR, Temp1&lt;br /&gt;
&lt;br /&gt;
  ;** 3. Phase&lt;br /&gt;
  ldi Temp1, (0&amp;lt;&amp;lt;WDE)   ; Turn off WDT&lt;br /&gt;
  out WDTCR, Temp1&lt;br /&gt;
  &lt;br /&gt;
  out SREG, Temp2       ; restore I Flag   &lt;br /&gt;
  ret&lt;br /&gt;
&amp;lt;/avrasm&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn WDCE und WDE nicht in einem Zug vor dem Deaktivieren auf 1 gesetzt werden, hat das Rücksetzen des WDE-Bits keine Wirkung und der WDT läuft munter weiter!&lt;br /&gt;
&lt;br /&gt;
Dazu hat man maximal 5 Takte Zeit. Diese Sequenz darf auch nicht durch einen Interrupt unterbrochen werden.&lt;br /&gt;
&lt;br /&gt;
== Tipps &amp;amp; Tricks ==&lt;br /&gt;
&lt;br /&gt;
=== WDT nach einem Reset ===&lt;br /&gt;
&lt;br /&gt;
Der WDT bleibt nach einem Reset (ob durch den Watchdog, extern oder aus sonstigen Gründen, also auch über das Flashen einer neuen Software hinweg!) aktiv,&lt;br /&gt;
wenn er einmal an war. Er läuft danach mit der kürzesten Zeit weiter, da die Prescaler Bits beim Reset gelöscht werden und somit die Watchdog Zeit auf die kürzeste Zeit gesetzt wird. Das kann zu unerwarteten Problemen führen ([http://www.mikrocontroller.net/topic/131137])&lt;br /&gt;
&lt;br /&gt;
Dies steht nicht explizit im Datenblatt, sondern man kann es nur&lt;br /&gt;
anhand der Defaultwerte der Bits entnehmen, was viele übersehen.&lt;br /&gt;
Dies ist vor allem beim Programmieren in einer Hochsprache wie C wichtig, denn da verwendet man meist Makros für den Watchdog und kommt somit nicht direkt mit den Registern aus dem Datenblatt in Berührung. Weiterhin dauert die Initialisierung der globalen Variablen vor dem Start der main Funktion oft länger als als die Watchdog Periode, was dazu führt, dass die main Funktion nie erreicht wird.&lt;br /&gt;
Der Watchdog Timer muss daher vorher abgeschaltet werden, was beim gcc über Code in einer speziellen Section geschieht, die unmittelbar nach dem Reset ausgeführt wird.&lt;br /&gt;
Ein Beispiel findet sich dazu in folgendem Thread:&lt;br /&gt;
[http://www.mikrocontroller.net/topic/130969#1195920]&lt;br /&gt;
&lt;br /&gt;
=== WDT gezielt zum Reset verwenden ===&lt;br /&gt;
&lt;br /&gt;
Man kann den WDT auch verwenden, um gezielt per Software einen Reset des AVR auszulösen. Das wird z.B. im [[AVR Bootloader FastBoot von Peter Dannegger]] gemacht.&lt;br /&gt;
&lt;br /&gt;
Variante1: Ohne Unterbrechung des Programmablaufs über eine Statusvariable oder Statusflag, z.B:&lt;br /&gt;
&amp;lt;avrasm&amp;gt;&lt;br /&gt;
	tst rFlag&lt;br /&gt;
	brne PC+2&lt;br /&gt;
	wdr&lt;br /&gt;
&amp;lt;/avrasm&amp;gt;&lt;br /&gt;
Um ein WDT-Reset auszulösen wird das Register rFlag an beliebiger Stelle auf ein Wert ungleich Null gesetzt. &lt;br /&gt;
&lt;br /&gt;
Variante 2: Programm anhalten und auf WDT-Reset warten&lt;br /&gt;
&amp;lt;avrasm&amp;gt;&lt;br /&gt;
	rjmp PC&lt;br /&gt;
&amp;lt;/avrasm&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Resetquelle auswerten ===&lt;br /&gt;
&lt;br /&gt;
Nach einem WDT-Reset wird die gleiche Adresse (0x0000) angesprungen, wie nach einem normalen Reset. Zur Unterscheidung der Reset-Quelle ist eine Auswertung des WDRF-Flags im MCU Control -und Statusregister erforderlich.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;avrasm&amp;gt;&lt;br /&gt;
	in Temp1,MCUCSR		        ;MCU Control- und Statusregister lesen&lt;br /&gt;
	sbrs Temp1,WDRF		        ;Prüfen ob Watchdog-Restart erfolgte&lt;br /&gt;
	rjmp normalReset		;nein: Normalstart&lt;br /&gt;
	cbr Temp1,1&amp;lt;&amp;lt;WDRF		;Watchdog-Resetflag zurücksetzen&lt;br /&gt;
	out MCUCSR, Temp1&lt;br /&gt;
	rjmp watchDogReset		;WDRStart&lt;br /&gt;
&amp;lt;/avrasm&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Aufwecken aus einem Sleep Mode ===&lt;br /&gt;
Der WDT kann auch verwendet werden, um einen AVR im Rahmen der möglichen WDT-Zeiten zeitgesteuert aus einem [[Sleep Mode]] aufzuwecken. Allerdings verbraucht der eingeschaltete WDT einen gewissen Strom [http://www.mikrocontroller.net/topic/152298].&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.embedded.com/columns/breakpoint/9900931?_requestid=140114 Li&#039;l Bow Wow] By Jack Ganssle, Embedded Systems Design (engl.)&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/95973 Watchdog Reset Flag auswerten] Erklärung, wie das WDRF unter C abgefragt wird&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Navigation_zurückhoch|&lt;br /&gt;
zurücktext=7-Segment-Anzeige|&lt;br /&gt;
zurücklink=AVR-Tutorial: 7-Segment-Anzeige|&lt;br /&gt;
hochtext=Inhaltsverzeichnis|&lt;br /&gt;
hochlink=AVR-Tutorial}}&lt;br /&gt;
&lt;br /&gt;
[[Category:AVR-Tutorial]]&lt;br /&gt;
[[Category:Timer und Uhren]]&lt;/div&gt;</summary>
		<author><name>Gregor54321</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=RFM12&amp;diff=34403</id>
		<title>RFM12</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=RFM12&amp;diff=34403"/>
		<updated>2009-02-14T16:34:17Z</updated>

		<summary type="html">&lt;p&gt;Gregor54321: /* RFM hängt sich auf */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Beschreibung der Funkmodule RFM01, RFM02 und RFM12.&lt;br /&gt;
&lt;br /&gt;
Benötigt werden in der Minimal-Version im FIFO-Modus nur die Anschlüsse nSEL, SDO, SDI und SCK, eben das komplette SPI-Interface. Der Zugriff auf das Sende- und Empfangs-FIFO ist per Software möglich, ebenso die Abfrage der Statusbits. Deshalb werden z.B. nIRQ und nFFS nicht unbedingt benötigt. nIRQ signalisiert unter anderem, dass das Modul bereit ist Daten zu empfangen. Wenn Daten empfangen wurden, kann dies über den FFIT-Pin abgefragt werden (falls die Füllschwelle eingestellt wurde). nFFS dient dazu das FIFO direkt anzusprechen (es ist quasi der Chipselect für das FIFO), davon wird in der Minimalversion aber kein Gebrauch gemacht. Der Pin muss daher auf high-Pegel gelegt werden!&lt;br /&gt;
An CLK kann eine Frequenz von 1MHz bis 10MHz eingestellt werden. Hiermit kann dann z.B. der Mikrocontroller versorgt werden.&lt;br /&gt;
Reset ist ein Open-Collector-Ausgang und gleichzeitig der Reset-Eingang. Er sollte daher entweder gar nicht, oder aber hochohmig angeschlossen werden.&lt;br /&gt;
&lt;br /&gt;
Im FIFO-Mode kann das Modul konfiguriert werden mit dem Empfang zu warten, bis die Daten 0x2DD4 empfangen wurden. Sobald dieses Bitmuster empfangen wurde, werden Daten in das FIFO geschrieben, bis man das FIFO abschaltet und die Mustererkennung neu startet.&lt;br /&gt;
&lt;br /&gt;
Als weitere Modi stehen unter anderem ein synchroner Modus zur Verfügung (no FIFO mode), in dem der Sender/Empfänger den Bittakt ausgibt, und synchron dazu die zu sendenden Daten einliest bzw. die empfangenen Daten ausgibt. Der SPI Bus ist trotzdem zur Initialisierung des Moduls notwendig.&lt;br /&gt;
&lt;br /&gt;
== FAQ ==&lt;br /&gt;
&lt;br /&gt;
=== SPI Interface ===&lt;br /&gt;
&lt;br /&gt;
* Maximale Datenrate: 2,5MHz (10MHz Quarz / 4)&lt;br /&gt;
&lt;br /&gt;
=== CLK-Ausgang bleibt bei 1 MHz ===&lt;br /&gt;
&lt;br /&gt;
* Vor dem Umschalten (mit 0xC0E0) länger warten.&lt;br /&gt;
&lt;br /&gt;
=== RFM12 empfängt ein paar Bytes, dann nur Müll ===&lt;br /&gt;
&lt;br /&gt;
* Es wird zu langsam gesendet (TX FIFO underrun)&lt;br /&gt;
* Es wird zu langsam empfangen (RX FIFO overrun)&lt;br /&gt;
&lt;br /&gt;
Die Status-Bits helfen hier beim Debuggen. SPI sollte auf maximaler Transferrate stehen.&lt;br /&gt;
&lt;br /&gt;
=== RFM empfängt nur Müll ===&lt;br /&gt;
&lt;br /&gt;
http://www.mikrocontroller.net/topic/73560#605528&lt;br /&gt;
&lt;br /&gt;
Deine Module verhalten sich normal. Man muß mit den Gain- und AFC-Bits&lt;br /&gt;
eine ganze Weile spielen, bis die Module korrekt laufen (kommt auf die&lt;br /&gt;
Anwendung an). Fakt ist: der Empfänger empfängt ständig Datenmüll als&lt;br /&gt;
Rauschen. Wenn der FIFO durch die Präambel getriggert wird, sind die&lt;br /&gt;
Daten im FIFO ziemlich korrekt, wenn alles &amp;quot;gut&amp;quot; eingestellt ist. Der&lt;br /&gt;
FIFO sollte per Interrupt dann auch sofort abgeholt werden, da sonst das&lt;br /&gt;
nächste Byte das alte direkt überschreibt. Jeder zusammenhängende&lt;br /&gt;
Datensatz (mehrere Bytes an einem Stück) muß von einer Präambel&lt;br /&gt;
eingeleitet werden. Nach dem kompletten Einlesen eines Datensatzes muß&lt;br /&gt;
der FIFO abgeschaltet, wieder eingeschaltet und für den Empfang der&lt;br /&gt;
nächsten Präambel neu scharf gemacht werden.&lt;br /&gt;
&lt;br /&gt;
=== RFM hängt sich auf ===&lt;br /&gt;
&lt;br /&gt;
Wenn man die AFC nicht begrenzt, also keinen Wertebereich vorgibt, die eine maximale Abweichung korrigiert wird passiert es nach einer Weile, dass sich der Empfänger aufhängt, die Offsetbits im Status werden maximal und dann geht gar nichts mehr, er hängt fest.&lt;br /&gt;
&lt;br /&gt;
edit: Leider bringt die Beschränkung der AFC auf Minimum bei mir keine Verbesserung. Zumindest ist obige Aussage nicht allgemein gültig.&lt;br /&gt;
&lt;br /&gt;
Siehe auch &lt;br /&gt;
* Forenbeitrag [http://www.mikrocontroller.net/topic/82456#689660 RFM12: Erfahrungen ]&lt;br /&gt;
&lt;br /&gt;
=== Kommunikation mit RFM funktioniert nur sporadisch ===&lt;br /&gt;
&lt;br /&gt;
* Ist die Versorgungsspannung stabil? (evtl. Kondensator einbauen)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Register ==&lt;br /&gt;
&lt;br /&gt;
Von https://www.mikrocontroller.net/attachment/24947/RFM12.txt&lt;br /&gt;
&lt;br /&gt;
Dieses Dokument beschreibt die Nutzung des RFM12 TRX Moduls!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; WICHTIG &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Dieses Dokument wurde aus mehreren Quellen zusammengestellt, und kann Fehler enthalten!&lt;br /&gt;
Es können Abweichungen in Bezug auf RF01 / RF02 / RF12 / RFM01 / RFM02 und andere Module auftreten!&lt;br /&gt;
Es wurde das Datenblatt vom RFM12B und RF12 von www.hoperf.com als Basis genuzt. Zusätzlich wurden diese Informationen mit Hilfe von Forums-Nutzern (https://www.mikrocontroller.net/topic/71682) weiter vervollständigt!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; WICHTIG &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hinweis:&#039;&#039;&#039; Die LNA-Eingangsimpedanz beträgt 250 Ohm, und muss beim Anschluss einer 50-Ohm-Antenne entsprechend angepasst werden, um das Rauschen zu minimieren! &#039;&#039; -- (Auf den Pollin-Modulen bereits vorhanden)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Configuration Setting ===&lt;br /&gt;
 Hex = 80 &amp;amp; xx&lt;br /&gt;
 Bit-Syntax: &lt;br /&gt;
{| cellpadding=&amp;quot;2&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;| Byte ||width=&amp;quot;40%&amp;quot;| 1 || 2&lt;br /&gt;
|-&lt;br /&gt;
!Bits&lt;br /&gt;
|{{8Bit|width=100%| 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 }}||{{8Bit|width=100%| el | ef | b1 | b0 | x3 | x2 | x1 | x0}}|}&lt;br /&gt;
 el (TX FIFO) = Sendepuffer für Datentransfer nutzen (1 = An / 0 = Aus)&lt;br /&gt;
 ef (RX FIFO) = Empfangspuffer für Datenspeicherung nutzen (1 = An / 0 = Aus)&lt;br /&gt;
 b... = Zu nutzende Basisfrequenz (00=315MHz / 01=433MHz / 10=868MHz / 11=915MHz)&lt;br /&gt;
 x... = Interner Clock des Chips kann durch verschieben einer Kondensator-Anpass-Stufe bestimmt werden.&lt;br /&gt;
        0,5pF pro Schritt. Basis ist 8,5pF -&amp;gt; (0000=8,5 / 0001=9,0 / 0010=9,5 / ...)&lt;br /&gt;
&lt;br /&gt;
=== Power-Managment ===&lt;br /&gt;
 Hex = 82 &amp;amp; xx&lt;br /&gt;
 Bit-Syntax: 10000010 | er | ebb | et | es | ex | eb | ew | dc&lt;br /&gt;
 er = Empfänger einschalten (1 = an / 0 = Aus)&lt;br /&gt;
 ebb = ... (Synthesizer muss aktiv sein!) (1 = an / 0 = aus)&lt;br /&gt;
 et = Sender einschalten (1 = an / 0 = Aus) (Wenn das TX-Register aktiv und mit Daten gefüllt ist/wurde,&lt;br /&gt;
      werden diese Daten sofort gesendet) (1 = an / 0 = aus)&lt;br /&gt;
 es = Schaltet den Synthesizer ein. (1 = an / 0 = aus)&lt;br /&gt;
 ex = Schaltet den Quarz-Oszilator ein. (1 = an / 0 = aus)&lt;br /&gt;
 eb = Vergleichbar mit BrownOutDetection -&amp;gt; Erkennt eine zu geringe Betriebsspannung und erzeugt einen Interrupt,&lt;br /&gt;
      um einen drohenden Spannungsaufall anzukündigen (1 = An / 0 = Aus)&lt;br /&gt;
 ew = Aktiviert den WakeUpTimer des Prozessors. (1 = an / 0 = aus)&lt;br /&gt;
 dc = Deaktiviert die Ausgabe des SystemClocks auf dem CLK Pin am Chip (1 = Keine ClockAusgabe / 0 = Clock ausgeben)&lt;br /&gt;
&lt;br /&gt;
=== PLL Setting ===&lt;br /&gt;
 Hex = 198 + y&lt;br /&gt;
 Bit-Syntax: 110011000 | ob1 | ob0 | lpx | ddy | ddit | bw1 | bw0&lt;br /&gt;
 ob... = ... (00= 5 oder 10MHz [standard] / 01=3.3MHz / 1x=2.5MHz oder weniger)&lt;br /&gt;
 lpx = Wählt den Low-Power-Mode für den Quarz-Oszilator aus. (0=1ms [620µA] / 1=2ms [460µA])&lt;br /&gt;
 ddy = ...&lt;br /&gt;
 ddi = Schaltet das Dithering in PLL-Schleife ab. (1=abgeschaltet / 0=eingeschaltet)&lt;br /&gt;
 bw... = Wählt die Bandbreite des PLL-Signals aus. (00=86.2kbps [-107dBc/Hz] / 01=256kbps [-102dBc/Hz]) Bei 1MHz Offset Phasenrauschen.&lt;br /&gt;
&lt;br /&gt;
=== LowBatt / µC Clock Control ===&lt;br /&gt;
 Hex = c0 &amp;amp; xx&lt;br /&gt;
 Bit-Syntax: 11000000 | d2 | d1 | d0 | v4 | v3 | v2 | v1 | v0&lt;br /&gt;
 d... = Bestimmt den Teilungsfaktor für die Clockausgabe am CLK-Pin in Abhängigkeit des Internen SystemTakts.&lt;br /&gt;
        (000=1 / 001=1.25 / 010=1.66 / 011=2 / 100=2.5 / 101=3.33 / 110=5 / 111=10)&lt;br /&gt;
 v... = Bestimmt die Minimalspannung, ab der ein Interrupt durchgeführt werden&lt;br /&gt;
 muss. (Ähnlich einer BrownOutDetection). Im Power-Managment muss das eb-Bit&lt;br /&gt;
 aktiv sein, damit dies funktioniert.&lt;br /&gt;
&lt;br /&gt;
=== Frequency-setting ===&lt;br /&gt;
Bestimmt den Offset der Sende- und Empfangsfrequenz. Dieser Offset wird auf das Basisband im Configuration Setting hinzu gerechnet.&lt;br /&gt;
 Hex = a &amp;amp; xxx&lt;br /&gt;
 Bit-Syntax:&lt;br /&gt;
{| cellpadding=&amp;quot;2&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;| Byte ||width=&amp;quot;40%&amp;quot;| 1 || 2&lt;br /&gt;
|-&lt;br /&gt;
!Bits&lt;br /&gt;
|{{8Bit|width=100%| 1 | 0 | 1 | 0 | f11 | f10 | f9 | f8 }}||{{8Bit|width=100%| f7 | f6 | f5 | f4 | f3 | f2 | f1 | f0}}|}&lt;br /&gt;
&lt;br /&gt;
 f... = Bestimmt den Offsetwert der Frequenz.&lt;br /&gt;
        Als Basis gilt das eingestellte Band im Configuration-Settings-Kommando&lt;br /&gt;
&lt;br /&gt;
freq = 10 * C1 * (C2 + f/4000) [MHz]&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;text-align:center;&amp;quot;&lt;br /&gt;
! Band || C1 || C2&lt;br /&gt;
|-&lt;br /&gt;
| 315 || 1 || 31&lt;br /&gt;
|-&lt;br /&gt;
| 433 || 1 || 43&lt;br /&gt;
|-&lt;br /&gt;
| 868 || 2 || 43&lt;br /&gt;
|-&lt;br /&gt;
| 915 || 3 || 30&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Data-Rate ===&lt;br /&gt;
 Hex = c6 &amp;amp; xx&lt;br /&gt;
 Bit-Syntax: 11000110 | cs | r6 | r5 | r4 | r3 | r2 | r1 | r0&lt;br /&gt;
 cs =  Vorteiler, Faktor 7. Hiermit kann ein Vorteiler aktiviert werden,&lt;br /&gt;
       der die errechnete Baudrate (r...) durch 7 teilt.&lt;br /&gt;
 r... = Baudratenteilerfaktor&lt;br /&gt;
&lt;br /&gt;
=== RX Control ===&lt;br /&gt;
 Hex = 94 &amp;amp; xx&lt;br /&gt;
 Bit-Syntax: 10010 | p20 | d1 | d2 | i2 | i1 | i0 | g1 | g0 | r2 | r1 | r0&lt;br /&gt;
 p20 = Bestimmt die Funktion des Pin20 (nINT / VDI) am RFM12 Chip (1 = VDI-Ausgang / 0 = Interrupt-Eingang)&lt;br /&gt;
 d... = (Valid Data Indicator). Definiert die Geschwindigkeit, mit der bestimmt wird, ob ein Signal korrekt ist, oder nicht.&lt;br /&gt;
        (00=schnell / 01=mittel / 10=langsam / 11=immer an). Je nach eingestellter Variante werden&lt;br /&gt;
        unterschiedliche Hardware- und Software-Kombinationen genuzt.&lt;br /&gt;
        Fast:  CR_Lock  OR  DQD  ... Medium:  CR_Lock  AND ( DRSSI  OR  DQD ) ... &lt;br /&gt;
        SLOW: R/S FlipFlop aus (SET)  DRSSI  OR  DQD  OR  CR_Lock  und (CLR)  DRSSI  AND  DQD  AND  CR_Lock .&lt;br /&gt;
 i... = Bestimmt die Bandbreite des Empfängers in KHz (KiloHertz).&lt;br /&gt;
        (000=Reserviert / 001=400 / 010=340 / 011=270 / 100=200 / 101=134 / 110=67 / 111=Reserviert)&lt;br /&gt;
 g... = (LNA-Gain) Verstärkungsfaktor des Rauscharmen-Eingangs-Signal-Verstärkers (LNA Low Noise Amplifier).&lt;br /&gt;
        Werte in dBm (Dezibel [Grösse: Milliwatt]) Mögliche Werte sind: 0 / -6 / -14 / -20&lt;br /&gt;
 r... = (DRSSI = Digital Received Signal Strength Indication) Minimale Empfangssignalfeldstärke.&lt;br /&gt;
        6 dBm pro Schritt: (000=-103 / 001=-97 / 010=-91 / ...)&lt;br /&gt;
&lt;br /&gt;
=== Synchron Pattern ===&lt;br /&gt;
 Hex = ce &amp;amp; xx&lt;br /&gt;
 Bit-Syntax: 11001110 | b7 | b6 | b5 | b4 | b3 | b2 | b1 | b0&lt;br /&gt;
 b... = Legt den Wert fest, der als Synchronisations-Byte für die Datenfilterung verwendet werden soll.&lt;br /&gt;
&lt;br /&gt;
=== Data Filter ===&lt;br /&gt;
 Hex = c2 &amp;amp; xx&lt;br /&gt;
 Bit-Syntax: 11000010 | al | ml | -unknow- (1) | s | -unknow- (1) | f2 | f1 | f0&lt;br /&gt;
 al = Baudratenregenerator schaltet automatisch in den langsamen Modus, &lt;br /&gt;
      sobald er einen Takt erkannt hat.&lt;br /&gt;
 ml = schneller/langsamer Modus&lt;br /&gt;
 -unknown- (1) = ??? (Standard = 1) (Auch im Datenblatt von IA4420 so beschrieben)&lt;br /&gt;
 s = (DataFilter) Typ des Datenfilters (0=DigitalFilter / 1=AnalogFilter).&lt;br /&gt;
     Bei Nutzung des Analog-Filters kann kein FIFO sowie kein ClockRecovery genuzt werden.&lt;br /&gt;
 -unknown- (1) = ??? (Standard = 1) (Auch im Datenblatt von IA4420 so beschrieben)&lt;br /&gt;
 f... = (DQD Threshold) Bestimmt den Schwellwert, ab dem ein Signal als gut empfunden wird,&lt;br /&gt;
         und der Empfänger dieses weiterverarbeiten soll.&lt;br /&gt;
         DQD (data quality detection) zählt die &amp;quot;Spikes&amp;quot; des ungefilterten Signals, und bestimmt darüber die Qualität der Daten.&lt;br /&gt;
&lt;br /&gt;
=== FIFO und RESET-Mode ===&lt;br /&gt;
 Hex = ca &amp;amp; xx&lt;br /&gt;
 Bit-Syntax: 11001010 | f3 | f2 | f1 | f0 | sp | al | ff | dr&lt;br /&gt;
 f... = (FIFO interrupt Level)&lt;br /&gt;
 sp = (Sync-Pattern length) Legt die Länge des Synchron-Patterns fest&lt;br /&gt;
      (0 = 2Byte / 1 = 1Byte)&lt;br /&gt;
 al = (FIFO Fill Condition) Legt den Wert fest, ab dem das Füllen des FIFOs beginnt.&lt;br /&gt;
      (0=Synchron / 1=Ständig). Bei Nutzung des Synchron-Modus, werden erst dann Daten in den FIFO geschrieben,&lt;br /&gt;
      wenn eine definierte 8-Bit od. 16-Bit lange Datenfolge empfangen wurde (Standard ist Hex: 2dd4,&lt;br /&gt;
      das LSB kann geändert werden und stellt das 8-Bit Synchron-Pattern dar).&lt;br /&gt;
 ff = (FIFO Fill) Startet das Einlesen der empfangenen Daten in den FIFO-Puffer.&lt;br /&gt;
      Wenn al (FIFO Fill Condition) auf synchron steht, dann startet das Setzen dieses Bits die Synchronisation-Bit-Erkennung.&lt;br /&gt;
 dr = (Sens Reset Mode) Wenn dieses Bit auf 0 steht, wird bei einer Schwankung von 200mV auf&lt;br /&gt;
      der VCC-Leitung (Spannungsversorgung des Chips), ein System-Reset ausgelöst.&lt;br /&gt;
&lt;br /&gt;
=== Automatic Frequency Control ===&lt;br /&gt;
 Hex = c4 &amp;amp; xx&lt;br /&gt;
 Bit-Syntax: 11000100 | a1 | a0 | rl1 | rl0 | st | fi | oe | en&lt;br /&gt;
 a... = Modus der AFC-Schaltung, 0=Auto, 1=einmalig nach Einschalten, 2=Solange VDI low ist, 3=unabhängig von VDI&lt;br /&gt;
 r... = (Range Limit) Frequenzraster (00=KeineBegrenzung / 01=+15 &amp;gt; -16 / 10=+7 &amp;gt; -8 / 11=+3 &amp;gt; -4)&lt;br /&gt;
 st = Berechneten Offset-Wert übernehmen&lt;br /&gt;
 fi = Genauer Berechnungsmodus (besser aber lansgamer)&lt;br /&gt;
 oe = AFC-Offset freischalten&lt;br /&gt;
 en = AFC-Berechnung aktivieren&lt;br /&gt;
&lt;br /&gt;
=== TX Configuration Control ===&lt;br /&gt;
 Hex = 98 &amp;amp; xx&lt;br /&gt;
 Bit-Syntax: 1001100 | mp | m3 | m2 | m1 | m0 | -unknow- (0) | p2 | p1 | p0&lt;br /&gt;
 mp = (Modulation Polarity) Bestimmt die Richtung der FSK-Erzeugung (invertiert das Spektrum).&lt;br /&gt;
 m... = (fDeviation) Bestimmt den Frequenzabstand des High- und Low-Wertes bei der Ubertragung im FSK-Betrieb. Basis ist der mp-Wert.&lt;br /&gt;
 -unknown- (0) = ??? (Standard = 0) (Auch im Datenblatt von IA4420 so beschrieben)&lt;br /&gt;
 p... = Bestimmt die relative Ausgangsleistung des Senders anhand des dBm-Wertes (Dezibel [Grösse: Milliwat]) 3-dBm-Schritte.&lt;br /&gt;
        (000=0 / 001=-3 / 010=-6 / ...). Der Wert steht im Zusammenhang mit der angeschlossenen Antennen-Impedanz.&lt;br /&gt;
&lt;br /&gt;
=== Wake-Up Timer ===&lt;br /&gt;
 Bestimmt die Zeitperiode der zyklischen Einschaltung des WakeUp-Timers&lt;br /&gt;
 Hex = e &amp;amp; xxx&lt;br /&gt;
 Bit-Syntax: 111 | R4 | R3 | R2 | R1 | R0 | M7 | M6 | M5 | M4 | M3 | M2 | M1 | M0&lt;br /&gt;
 R = Exponent der Zeit&lt;br /&gt;
 M = Zeit&lt;br /&gt;
&lt;br /&gt;
=== Low Duty-Cycle ===&lt;br /&gt;
&lt;br /&gt;
Bestimmt die maximale Sendezeit pro Stunde. Dies ist wichtig, um sich an gesetzliche Frequenzzuteilungsrichtlinien zu halten, die bestimmen, wie lang jemand mit einer definierten Sendeleistung auf einer bestimmten Frequenz (mit eventuell definierter Betriebsart [Modulationstyp]) senden darf.)&lt;br /&gt;
&lt;br /&gt;
 hex = 6400 + Bits&lt;br /&gt;
 Bit-Syntax: 1100100 | r| d6 | d5 | d4 | d3 | d2 | d1 | d0 | en&lt;br /&gt;
 r =  ??????????????????&lt;br /&gt;
 d... = Einschaltdauer während der zyklischen Einschaltung&lt;br /&gt;
 en = zyklische Einschaltung aktivieren&lt;br /&gt;
&lt;br /&gt;
=== RX FIFO Read ===&lt;br /&gt;
 Hex = b000&lt;br /&gt;
 Bit-Syntax: 1011000000000000&lt;br /&gt;
&lt;br /&gt;
Dieses Kommando löst die Rückgabe eines Datenbytes (synchron mit dem 8. Bit) aus. Es ist nötig, dass das ef-Bit (RX-FIFO) im Configuration Setting gesetzt wurde, um diese Funktion nutzen zu können!&lt;br /&gt;
&lt;br /&gt;
=== TX Register Write ===&lt;br /&gt;
Dieses Kommando schreibt Daten in den TX-Puffer. Wenn der Sender aktiv ist, wird dieses sofort gesendet. el (TX-Register) muss im Configuration-Setting-Kommando aktiv sein.&lt;br /&gt;
 Hex = b8 &amp;amp; xx&lt;br /&gt;
 Bit-Syntax: 10111000 | DataByteToSend&lt;br /&gt;
 DataByteToSend = Das Datenbyte, welches gesendet werden soll.&lt;br /&gt;
&lt;br /&gt;
(Senden Funktioniert nur wenn zuvor der Status abgefragt wurde)&lt;br /&gt;
&lt;br /&gt;
=== Status Read ===&lt;br /&gt;
Dieses Kommando löst die Rückgabe des Statusregisters aus, welches nach der ersten 0 im ersten Bit synchron übertragen wird.&lt;br /&gt;
 Hex = 0000&lt;br /&gt;
 Bit-Syntax: 0000000000000000&amp;lt;000&amp;gt;&lt;br /&gt;
 Rückgabe-Syntax: x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | x10 | x11 | x12 | x13 | x14 | x15 | x16 | x17 | x18&lt;br /&gt;
 x0 -&amp;gt; x5 = Interrupt bits&lt;br /&gt;
 x6 -&amp;gt; x15 = Status Bits&lt;br /&gt;
 x16 -&amp;gt; x18 = FIFO&lt;br /&gt;
 x0 = FFIT / RGIT (RGIT = TX-Register ist bereit neue Daten zu senden ... kann mit dem TX-Register gelöscht werden)&lt;br /&gt;
     (FFIT = Die Anzahl der Datenbits im FIFO-Puffer hat das eingestellte Limit erreicht.&lt;br /&gt;
      Kann mit einer der FIFO-Lesemethoden gelöscht werden)&lt;br /&gt;
 x1 = POR (PowerOnReset)&lt;br /&gt;
 x2 = FFOV / RGUR (RGUR = Der Datenstrom beim Senden ist abgerissen, da nicht schnell genug Daten nachgeladen wurden)&lt;br /&gt;
      (FFOV = Der RX-FIFO ist übergelaufen)&lt;br /&gt;
 x3 = WKUP&lt;br /&gt;
 x4 = EXT (Externer IRq vom nINT-Pin)&lt;br /&gt;
 x5 = LBD (Low Battery Detected)&lt;br /&gt;
 x6 = FFEM (Der FIFO-Puffer ist leer/EMpty)&lt;br /&gt;
 x7 = RSSI/ATS (ATS = )(RSSI = Die Signalstärke ist über dem eingestelltem Limit)&lt;br /&gt;
 x8 = DQD&lt;br /&gt;
 x9 = CRL&lt;br /&gt;
 x10 = ATGL&lt;br /&gt;
 x11 = OFFS_6 (sign of offset)&lt;br /&gt;
 x12 = OFFS_3&lt;br /&gt;
 x13 = OFFS_2&lt;br /&gt;
 x14 = OFFS_1&lt;br /&gt;
 x15 = OFFS_0&lt;br /&gt;
 x16 = FO&lt;br /&gt;
 x17 = FO+1&lt;br /&gt;
 x18 = FO+2&lt;br /&gt;
&lt;br /&gt;
== Einstellungen für maximale Reichweite ==&lt;br /&gt;
&lt;br /&gt;
Für eine maximale Reichweite eignen sich folgende Einstellungen:&lt;br /&gt;
* Bitrate: 2k - 10kBit/s.&lt;br /&gt;
* Receiver Baseband Bandwidth: 134kHz&lt;br /&gt;
* RSSI Threshold: -97dBm&lt;br /&gt;
* LNA gain: 0dB. Falls in der Gegend Störer im gleichen Frequenzbereich sind, dann -6dB, ansonsten kann die Eingangsstufe übersteuern.&lt;br /&gt;
* FSK frequency deviation: +/-90kHz&lt;br /&gt;
* Output Power: 0dB&lt;br /&gt;
&lt;br /&gt;
Und vor allem: Eine gute (Richt-) Antenne.&lt;br /&gt;
&lt;br /&gt;
== Quarzfrequenz ändern==&lt;br /&gt;
Im Datenblatt wird die Verwendung eines 10 MHz-Quarzes empfohlen. Durch Einbau eines Quarzes niedrigerer Frequenz kann man aber auch andere Frequenzbereiche und vor allem einen kleineren Frequenzhub erreichen. Eine [[Media:RFM12Quarz.pdf|Quarztabelle]] zeigt, dass man beispielsweise im 433MHz-Modul mit einem Quarz von 4,8 MHz und Programmierung des 915-MHz-Bandes die PLL-Frequenz zwischen 432 und 448 MHz einstellen kann. Der Frequenzhub beträgt dann minimal weniger als +/-8 kHz statt +/- 15 kHz. &lt;br /&gt;
Mit einem externen Oszillator und Frequenzteiler sind auch andere Standardquarze möglich, so bringt z.B. ein NTSC-Quarz 14,31818 MHz geteilt durch drei = 4,772 MHz  den Bereich 429,9-443,5 MHz.&lt;br /&gt;
&lt;br /&gt;
== Betriebsspannung==&lt;br /&gt;
Achtung nicht alle Module sind für 5V geeignet, alle Typen mit &amp;quot;B&amp;quot; am Ende sind nur für 3,3V. Man muß dann entweder den Mikrocontroller ebenfalls mit 3,3V betreiben, oder [http://www.mikrocontroller.net/articles/Pegelwandler Pegelwandler] verwenden.&lt;br /&gt;
&lt;br /&gt;
== Bezugsquellen ==&lt;br /&gt;
* [[Elektronikversender#csd-electronics|csd-electronics]]&lt;br /&gt;
* [[Elektronikversender#IT-WNS|IT-WNS]]&lt;br /&gt;
* [[Elektronikversender#Pollin_Electronic|Pollin Electronic]]&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
* [[AVR RFM12]]&lt;br /&gt;
* [[RFM12 Protokoll Stack]]&lt;br /&gt;
* [[ Pollin_Funk-AVR-Evaluationsboard]]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/93801 Bezugsquellen]&lt;br /&gt;
* [http://roulette.das-labor.org/trac/browser/microcontroller/src-atmel/lib/rfm12 Library zur Ansteuerung des RFM12]&lt;br /&gt;
* [http://www.compotron.com/daten/any/IA4420.pdf Datenblatt des Chipherstellers Integration IA4420.pdf]&lt;br /&gt;
* [https://www.silabs.com/Support%20Documents/TechnicalDocs/Si4420.pdf Silabs hat Integration im Juni 2008 gekauft, Chipbezeichnung jetzt Si4420]&lt;br /&gt;
Folgende Links sind mit Vorsicht zu genießen, da die Datenblätter teilweise  fehlerbehaftet sind. Es empfiehlt sich, direkt mit dem Datenblatt des RF12 (das ist das IC auf dem Modul) zu arbeiten. Dieses ist so gut wie fehlerfrei.&lt;br /&gt;
&lt;br /&gt;
* [http://www.hoperf.com/pdf/RF12.pdf Datenblatt des ICs RF12] (PDF)&lt;br /&gt;
* [http://www.hoperf.com/pdf/RFM12.pdf Datenblatt des Moduls RFM12] (PDF)&lt;br /&gt;
* [http://www.hoperf.com/pdf/RF12_code.pdf Programming Guide] (PDF)&lt;br /&gt;
* [http://www.hoperf.com/pdf/RF12TOOLS.pdf Demo Kit User Manual] (PDF)&lt;br /&gt;
* [http://www.pollin.de/shop/downloads/D810047S.ZIP Beispielprogramm von Pollin] (ZIP)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Bauteile]]&lt;br /&gt;
[[Kategorie:Funk]]&lt;/div&gt;</summary>
		<author><name>Gregor54321</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=RFM12&amp;diff=33785</id>
		<title>RFM12</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=RFM12&amp;diff=33785"/>
		<updated>2009-01-12T19:42:44Z</updated>

		<summary type="html">&lt;p&gt;Gregor54321: /* Status Read */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Beschreibung der Funkmodule RFM01, RFM02 und RFM12.&lt;br /&gt;
&lt;br /&gt;
Benötigt werden in der Minimal-Version im FIFO-Modus nur die Anschlüsse nSEL, SDO, SDI und SCK, eben das komplette SPI-Interface. Der Zugriff auf das Sende- und Empfangs-FIFO ist per Software möglich, ebenso die Abfrage der Statusbits. Deshalb werden z.B. nIRQ und nFFS nicht unbedingt benötigt. nIRQ signalisiert unter anderem, dass das Modul bereit ist Daten zu empfangen. Wenn Daten empfangen wurden, kann dies über den FFIT-Pin abgefragt werden (falls die Füllschwelle eingestellt wurde). nFFS dient dazu das FIFO direkt anzusprechen (es ist quasi der Chipselect für das FIFO), davon wird in der Minimalversion aber kein Gebrauch gemacht. Der Pin muss daher auf high-Pegel gelegt werden!&lt;br /&gt;
An CLK kann eine Frequenz von 1MHz bis 10MHz eingestellt werden. Hiermit kann dann z.B. der Mikrocontroller versorgt werden.&lt;br /&gt;
Reset ist ein Open-Collector-Ausgang und gleichzeitig der Reset-Eingang. Er sollte daher entweder gar nicht, oder aber hochohmig angeschlossen werden.&lt;br /&gt;
&lt;br /&gt;
Im FIFO-Mode kann das Modul konfiguriert werden mit dem Empfang zu warten, bis die Daten 0x2DD4 empfangen wurden. Sobald dieses Bitmuster empfangen wurde, werden Daten in das FIFO geschrieben, bis man das FIFO abschaltet und die Mustererkennung neu startet.&lt;br /&gt;
&lt;br /&gt;
Als weitere Modi stehen unter anderem ein synchroner Modus zur Verfügung (no FIFO mode), in dem der Sender/Empfänger den Bittakt ausgibt, und synchron dazu die zu sendenden Daten einliest bzw. die empfangenen Daten ausgibt. Der SPI Bus ist trotzdem zur Initialisierung des Moduls notwendig.&lt;br /&gt;
&lt;br /&gt;
== FAQ ==&lt;br /&gt;
&lt;br /&gt;
=== SPI Interface ===&lt;br /&gt;
&lt;br /&gt;
* Maximale Datenrate: 2,5MHz (10MHz Quarz / 4)&lt;br /&gt;
&lt;br /&gt;
=== CLK-Ausgang bleibt bei 1 MHz ===&lt;br /&gt;
&lt;br /&gt;
* Vor dem Umschalten (mit 0xC0E0) länger warten.&lt;br /&gt;
&lt;br /&gt;
=== RFM12 empfängt ein paar Bytes, dann nur Müll ===&lt;br /&gt;
&lt;br /&gt;
* Es wird zu langsam gesendet (TX FIFO underrun)&lt;br /&gt;
* Es wird zu langsam empfangen (RX FIFO overrun)&lt;br /&gt;
&lt;br /&gt;
Die Status-Bits helfen hier beim Debuggen. SPI sollte auf maximaler Transferrate stehen.&lt;br /&gt;
&lt;br /&gt;
=== RFM empfängt nur Müll ===&lt;br /&gt;
&lt;br /&gt;
http://www.mikrocontroller.net/topic/73560#605528&lt;br /&gt;
&lt;br /&gt;
Deine Module verhalten sich normal. Man muß mit den Gain- und AFC-Bits&lt;br /&gt;
eine ganze Weile spielen, bis die Module korrekt laufen (kommt auf die&lt;br /&gt;
Anwendung an). Fakt ist: der Empfänger empfängt ständig Datenmüll als&lt;br /&gt;
Rauschen. Wenn der FIFO durch die Präambel getriggert wird, sind die&lt;br /&gt;
Daten im FIFO ziemlich korrekt, wenn alles &amp;quot;gut&amp;quot; eingestellt ist. Der&lt;br /&gt;
FIFO sollte per Interrupt dann auch sofort abgeholt werden, da sonst das&lt;br /&gt;
nächste Byte das alte direkt überschreibt. Jeder zusammenhängende&lt;br /&gt;
Datensatz (mehrere Bytes an einem Stück) muß von einer Präambel&lt;br /&gt;
eingeleitet werden. Nach dem kompletten Einlesen eines Datensatzes muß&lt;br /&gt;
der FIFO abgeschaltet, wieder eingeschaltet und für den Empfang der&lt;br /&gt;
nächsten Präambel neu scharf gemacht werden.&lt;br /&gt;
&lt;br /&gt;
=== RFM hängt sich auf ===&lt;br /&gt;
&lt;br /&gt;
Wenn man die AFC nicht begrenzt, also keinen Wertebereich vorgibt, die eine maximale Abweichung korrigiert wird passiert es nach einer Weile, dass sich der Empfänger aufhängt, die Offsetbits im Status werden maximal und dann geht gar nichts mehr, er hängt fest.&lt;br /&gt;
&lt;br /&gt;
Siehe auch &lt;br /&gt;
* Forenbeitrag [http://www.mikrocontroller.net/topic/82456#689660 RFM12: Erfahrungen ]&lt;br /&gt;
&lt;br /&gt;
=== Kommunikation mit RFM funktioniert nur sporadisch ===&lt;br /&gt;
&lt;br /&gt;
* Ist die Versorgungsspannung stabil? (evtl. Kondensator einbauen)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Register ==&lt;br /&gt;
&lt;br /&gt;
Von https://www.mikrocontroller.net/attachment/24947/RFM12.txt&lt;br /&gt;
&lt;br /&gt;
Dieses Dokument beschreibt die Nutzung des RFM12 TRX Moduls!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; WICHTIG &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Dieses Dokument wurde aus mehreren Quellen zusammengestellt, und kann Fehler enthalten!&lt;br /&gt;
Es können Abweichungen in Bezug auf RF01 / RF02 / RF12 / RFM01 / RFM02 und andere Module auftreten!&lt;br /&gt;
Es wurde das Datenblatt vom RFM12B und RF12 von www.hoperf.com als Basis genuzt. Zusätzlich wurden diese Informationen mit Hilfe von Forums-Nutzern (https://www.mikrocontroller.net/topic/71682) weiter vervollständigt!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; WICHTIG &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hinweis:&#039;&#039;&#039; Die LNA-Eingangsimpedanz beträgt 250 Ohm, und muss beim Anschluss einer 50-Ohm-Antenne entsprechend angepasst werden, um das Rauschen zu minimieren! &#039;&#039; -- (Auf den Pollin-Modulen bereits vorhanden)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Configuration Setting ===&lt;br /&gt;
 Hex = 80 &amp;amp; xx&lt;br /&gt;
 Bit-Syntax: &lt;br /&gt;
{| cellpadding=&amp;quot;2&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;| Byte ||width=&amp;quot;40%&amp;quot;| 1 || 2&lt;br /&gt;
|-&lt;br /&gt;
!Bits&lt;br /&gt;
|{{8Bit|width=100%| 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 }}||{{8Bit|width=100%| el | ef | b1 | b0 | x3 | x2 | x1 | x0}}|}&lt;br /&gt;
 el (TX FIFO) = Sendepuffer für Datentransfer nutzen (1 = An / 0 = Aus)&lt;br /&gt;
 ef (RX FIFO) = Empfangspuffer für Datenspeicherung nutzen (1 = An / 0 = Aus)&lt;br /&gt;
 b... = Zu nutzende Basisfrequenz (00=315MHz / 01=433MHz / 10=868MHz / 11=915MHz)&lt;br /&gt;
 x... = Interner Clock des Chips kann durch verschieben einer Kondensator-Anpass-Stufe bestimmt werden.&lt;br /&gt;
        0,5pF pro Schritt. Basis ist 8,5pF -&amp;gt; (0000=8,5 / 0001=9,0 / 0010=9,5 / ...)&lt;br /&gt;
&lt;br /&gt;
=== Power-Managment ===&lt;br /&gt;
 Hex = 82 &amp;amp; xx&lt;br /&gt;
 Bit-Syntax: 10000010 | er | ebb | et | es | ex | eb | ew | dc&lt;br /&gt;
 er = Empfänger einschalten (1 = an / 0 = Aus)&lt;br /&gt;
 ebb = ... (Synthesizer muss aktiv sein!) (1 = an / 0 = aus)&lt;br /&gt;
 et = Sender einschalten (1 = an / 0 = Aus) (Wenn das TX-Register aktiv und mit Daten gefüllt ist/wurde,&lt;br /&gt;
      werden diese Daten sofort gesendet) (1 = an / 0 = aus)&lt;br /&gt;
 es = Schaltet den Synthesizer ein. (1 = an / 0 = aus)&lt;br /&gt;
 ex = Schaltet den Quarz-Oszilator ein. (1 = an / 0 = aus)&lt;br /&gt;
 eb = Vergleichbar mit BrownOutDetection -&amp;gt; Erkennt eine zu geringe Betriebsspannung und erzeugt einen Interrupt,&lt;br /&gt;
      um einen drohenden Spannungsaufall anzukündigen (1 = An / 0 = Aus)&lt;br /&gt;
 ew = Aktiviert den WakeUpTimer des Prozessors. (1 = an / 0 = aus)&lt;br /&gt;
 dc = Deaktiviert die Ausgabe des SystemClocks auf dem CLK Pin am Chip (1 = Keine ClockAusgabe / 0 = Clock ausgeben)&lt;br /&gt;
&lt;br /&gt;
=== PLL Setting ===&lt;br /&gt;
 Hex = 198 + y&lt;br /&gt;
 Bit-Syntax: 110011000 | ob1 | ob0 | lpx | ddy | ddit | bw1 | bw0&lt;br /&gt;
 ob... = ... (00= 5 oder 10MHz [standard] / 01=3.3MHz / 1x=2.5MHz oder weniger)&lt;br /&gt;
 lpx = Wählt den Low-Power-Mode für den Quarz-Oszilator aus. (0=1ms [620µA] / 1=2ms [460µA])&lt;br /&gt;
 ddy = ...&lt;br /&gt;
 ddi = Schaltet das Dithering in PLL-Schleife ab. (1=abgeschaltet / 0=eingeschaltet)&lt;br /&gt;
 bw... = Wählt die Bandbreite des PLL-Signals aus. (00=86.2kbps [-107dBc/Hz] / 01=256kbps [-102dBc/Hz]) Bei 1MHz Offset Phasenrauschen.&lt;br /&gt;
&lt;br /&gt;
=== LowBatt / µC Clock Control ===&lt;br /&gt;
 Hex = c0 &amp;amp; xx&lt;br /&gt;
 Bit-Syntax: 11000000 | d2 | d1 | d0 | v4 | v3 | v2 | v1 | v0&lt;br /&gt;
 d... = Bestimmt den Teilungsfaktor für die Clockausgabe am CLK-Pin in Abhängigkeit des Internen SystemTakts.&lt;br /&gt;
        (000=1 / 001=1.25 / 010=1.66 / 011=2 / 100=2.5 / 101=3.33 / 110=5 / 111=10)&lt;br /&gt;
 v... = Bestimmt die Minimalspannung, ab der ein Interrupt durchgeführt werden&lt;br /&gt;
 muss. (Ähnlich einer BrownOutDetection). Im Power-Managment muss das eb-Bit&lt;br /&gt;
 aktiv sein, damit dies funktioniert.&lt;br /&gt;
&lt;br /&gt;
=== Frequency-setting ===&lt;br /&gt;
Bestimmt den Offset der Sende- und Empfangsfrequenz. Dieser Offset wird auf das Basisband im Configuration Setting hinzu gerechnet.&lt;br /&gt;
 Hex = a &amp;amp; xxx&lt;br /&gt;
 Bit-Syntax:&lt;br /&gt;
{| cellpadding=&amp;quot;2&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!width=&amp;quot;20%&amp;quot;| Byte ||width=&amp;quot;40%&amp;quot;| 1 || 2&lt;br /&gt;
|-&lt;br /&gt;
!Bits&lt;br /&gt;
|{{8Bit|width=100%| 1 | 0 | 1 | 0 | f11 | f10 | f9 | f8 }}||{{8Bit|width=100%| f7 | f6 | f5 | f4 | f3 | f2 | f1 | f0}}|}&lt;br /&gt;
&lt;br /&gt;
 f... = Bestimmt den Offsetwert der Frequenz.&lt;br /&gt;
        Als Basis gilt das eingestellte Band im Configuration-Settings-Kommando&lt;br /&gt;
&lt;br /&gt;
freq = 10 * C1 * (C2 + f/4000) [MHz]&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;text-align:center;&amp;quot;&lt;br /&gt;
! Band || C1 || C2&lt;br /&gt;
|-&lt;br /&gt;
| 315 || 1 || 31&lt;br /&gt;
|-&lt;br /&gt;
| 433 || 1 || 43&lt;br /&gt;
|-&lt;br /&gt;
| 868 || 2 || 43&lt;br /&gt;
|-&lt;br /&gt;
| 915 || 3 || 30&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Data-Rate ===&lt;br /&gt;
 Hex = c6 &amp;amp; xx&lt;br /&gt;
 Bit-Syntax: 11000110 | cs | r6 | r5 | r4 | r3 | r2 | r1 | r0&lt;br /&gt;
 cs =  Vorteiler, Faktor 7. Hiermit kann ein Vorteiler aktiviert werden,&lt;br /&gt;
       der die errechnete Baudrate (r...) durch 7 teilt.&lt;br /&gt;
 r... = Baudratenteilerfaktor&lt;br /&gt;
&lt;br /&gt;
=== RX Control ===&lt;br /&gt;
 Hex = 94 &amp;amp; xx&lt;br /&gt;
 Bit-Syntax: 10010 | p20 | d1 | d2 | i2 | i1 | i0 | g1 | g0 | r2 | r1 | r0&lt;br /&gt;
 p20 = Bestimmt die Funktion des Pin20 (nINT / VDI) am RFM12 Chip (1 = VDI-Ausgang / 0 = Interrupt-Eingang)&lt;br /&gt;
 d... = (Valid Data Indicator). Definiert die Geschwindigkeit, mit der bestimmt wird, ob ein Signal korrekt ist, oder nicht.&lt;br /&gt;
        (00=schnell / 01=mittel / 10=langsam / 11=immer an). Je nach eingestellter Variante werden&lt;br /&gt;
        unterschiedliche Hardware- und Software-Kombinationen genuzt.&lt;br /&gt;
        Fast:  CR_Lock  OR  DQD  ... Medium:  CR_Lock  AND ( DRSSI  OR  DQD ) ... &lt;br /&gt;
        SLOW: R/S FlipFlop aus (SET)  DRSSI  OR  DQD  OR  CR_Lock  und (CLR)  DRSSI  AND  DQD  AND  CR_Lock .&lt;br /&gt;
 i... = Bestimmt die Bandbreite des Empfängers in KHz (KiloHertz).&lt;br /&gt;
        (000=Reserviert / 001=400 / 010=340 / 011=270 / 100=200 / 101=134 / 110=67 / 111=Reserviert)&lt;br /&gt;
 g... = (LNA-Gain) Verstärkungsfaktor des Rauscharmen-Eingangs-Signal-Verstärkers (LNA Low Noise Amplifier).&lt;br /&gt;
        Werte in dBm (Dezibel [Grösse: Milliwatt]) Mögliche Werte sind: 0 / -6 / -14 / -20&lt;br /&gt;
 r... = (DRSSI = Digital Received Signal Strength Indication) Minimale Empfangssignalfeldstärke.&lt;br /&gt;
        6 dBm pro Schritt: (000=-103 / 001=-97 / 010=-91 / ...)&lt;br /&gt;
&lt;br /&gt;
=== Synchron Pattern ===&lt;br /&gt;
 Hex = ce &amp;amp; xx&lt;br /&gt;
 Bit-Syntax: 11001110 | b7 | b6 | b5 | b4 | b3 | b2 | b1 | b0&lt;br /&gt;
 b... = Legt den Wert fest, der als Synchronisations-Byte für die Datenfilterung verwendet werden soll.&lt;br /&gt;
&lt;br /&gt;
=== Data Filter ===&lt;br /&gt;
 Hex = c2 &amp;amp; xx&lt;br /&gt;
 Bit-Syntax: 11000010 | al | ml | -unknow- (1) | s | -unknow- (1) | f2 | f1 | f0&lt;br /&gt;
 al = Baudratenregenerator schaltet automatisch in den langsamen Modus, &lt;br /&gt;
      sobald er einen Takt erkannt hat.&lt;br /&gt;
 ml = schneller/langsamer Modus&lt;br /&gt;
 -unknown- (1) = ??? (Standard = 1) (Auch im Datenblatt von IA4420 so beschrieben)&lt;br /&gt;
 s = (DataFilter) Typ des Datenfilters (0=DigitalFilter / 1=AnalogFilter).&lt;br /&gt;
     Bei Nutzung des Analog-Filters kann kein FIFO sowie kein ClockRecovery genuzt werden.&lt;br /&gt;
 -unknown- (1) = ??? (Standard = 1) (Auch im Datenblatt von IA4420 so beschrieben)&lt;br /&gt;
 f... = (DQD Threshold) Bestimmt den Schwellwert, ab dem ein Signal als gut empfunden wird,&lt;br /&gt;
         und der Empfänger dieses weiterverarbeiten soll.&lt;br /&gt;
         DQD (data quality detection) zählt die &amp;quot;Spikes&amp;quot; des ungefilterten Signals, und bestimmt darüber die Qualität der Daten.&lt;br /&gt;
&lt;br /&gt;
=== FIFO und RESET-Mode ===&lt;br /&gt;
 Hex = ca &amp;amp; xx&lt;br /&gt;
 Bit-Syntax: 11001010 | f3 | f2 | f1 | f0 | sp | al | ff | dr&lt;br /&gt;
 f... = (FIFO interrupt Level)&lt;br /&gt;
 sp = (Sync-Pattern length) Legt die Länge des Synchron-Patterns fest&lt;br /&gt;
      (0 = 2Byte / 1 = 1Byte)&lt;br /&gt;
 al = (FIFO Fill Condition) Legt den Wert fest, ab dem das Füllen des FIFOs beginnt.&lt;br /&gt;
      (0=Synchron / 1=Ständig). Bei Nutzung des Synchron-Modus, werden erst dann Daten in den FIFO geschrieben,&lt;br /&gt;
      wenn eine definierte 8-Bit od. 16-Bit lange Datenfolge empfangen wurde (Standard ist Hex: 2dd4,&lt;br /&gt;
      das LSB kann geändert werden und stellt das 8-Bit Synchron-Pattern dar).&lt;br /&gt;
 ff = (FIFO Fill) Startet das Einlesen der empfangenen Daten in den FIFO-Puffer.&lt;br /&gt;
      Wenn al (FIFO Fill Condition) auf synchron steht, dann startet das Setzen dieses Bits die Synchronisation-Bit-Erkennung.&lt;br /&gt;
 dr = (Sens Reset Mode) Wenn dieses Bit auf 0 steht, wird bei einer Schwankung von 200mV auf&lt;br /&gt;
      der VCC-Leitung (Spannungsversorgung des Chips), ein System-Reset ausgelöst.&lt;br /&gt;
&lt;br /&gt;
=== Automatic Frequency Control ===&lt;br /&gt;
 Hex = c4 &amp;amp; xx&lt;br /&gt;
 Bit-Syntax: 11000100 | a1 | a0 | rl1 | rl0 | st | fi | oe | en&lt;br /&gt;
 a... = Modus der AFC-Schaltung, 0=Auto, 1=einmalig nach Einschalten, 2=Solange VDI low ist, 3=unabhängig von VDI&lt;br /&gt;
 r... = (Range Limit) Frequenzraster (00=KeineBegrenzung / 01=+15 &amp;gt; -16 / 10=+7 &amp;gt; -8 / 11=+3 &amp;gt; -4)&lt;br /&gt;
 st = Berechneten Offset-Wert übernehmen&lt;br /&gt;
 fi = Genauer Berechnungsmodus (besser aber lansgamer)&lt;br /&gt;
 oe = AFC-Offset freischalten&lt;br /&gt;
 en = AFC-Berechnung aktivieren&lt;br /&gt;
&lt;br /&gt;
=== TX Configuration Control ===&lt;br /&gt;
 Hex = 98 &amp;amp; xx&lt;br /&gt;
 Bit-Syntax: 1001100 | mp | m3 | m2 | m1 | m0 | -unknow- (0) | p2 | p1 | p0&lt;br /&gt;
 mp = (Modulation Polarity) Bestimmt die Richtung der FSK-Erzeugung (invertiert das Spektrum).&lt;br /&gt;
 m... = (fDeviation) Bestimmt den Frequenzabstand des High- und Low-Wertes bei der Ubertragung im FSK-Betrieb. Basis ist der mp-Wert.&lt;br /&gt;
 -unknown- (0) = ??? (Standard = 0) (Auch im Datenblatt von IA4420 so beschrieben)&lt;br /&gt;
 p... = Bestimmt die relative Ausgangsleistung des Senders anhand des dBm-Wertes (Dezibel [Grösse: Milliwat]) 3-dBm-Schritte.&lt;br /&gt;
        (000=0 / 001=-3 / 010=-6 / ...). Der Wert steht im Zusammenhang mit der angeschlossenen Antennen-Impedanz.&lt;br /&gt;
&lt;br /&gt;
=== Wake-Up Timer ===&lt;br /&gt;
 Bestimmt die Zeitperiode der zyklischen Einschaltung des WakeUp-Timers&lt;br /&gt;
 Hex = e &amp;amp; xxx&lt;br /&gt;
 Bit-Syntax: 111 | R4 | R3 | R2 | R1 | R0 | M7 | M6 | M5 | M4 | M3 | M2 | M1 | M0&lt;br /&gt;
 R = Exponent der Zeit&lt;br /&gt;
 M = Zeit&lt;br /&gt;
&lt;br /&gt;
=== Low Duty-Cycle ===&lt;br /&gt;
&lt;br /&gt;
Bestimmt die maximale Sendezeit pro Stunde. Dies ist wichtig, um sich an gesetzliche Frequenzzuteilungsrichtlinien zu halten, die bestimmen, wie lang jemand mit einer definierten Sendeleistung auf einer bestimmten Frequenz (mit eventuell definierter Betriebsart [Modulationstyp]) senden darf.)&lt;br /&gt;
&lt;br /&gt;
 hex = 6400 + Bits&lt;br /&gt;
 Bit-Syntax: 1100100 | r| d6 | d5 | d4 | d3 | d2 | d1 | d0 | en&lt;br /&gt;
 r =  ??????????????????&lt;br /&gt;
 d... = Einschaltdauer während der zyklischen Einschaltung&lt;br /&gt;
 en = zyklische Einschaltung aktivieren&lt;br /&gt;
&lt;br /&gt;
=== RX FIFO Read ===&lt;br /&gt;
 Hex = b000&lt;br /&gt;
 Bit-Syntax: 1011000000000000&lt;br /&gt;
&lt;br /&gt;
Dieses Kommando löst die Rückgabe eines Datenbytes (synchron mit dem 8. Bit) aus. Es ist nötig, dass das ef-Bit (RX-FIFO) im Configuration Setting gesetzt wurde, um diese Funktion nutzen zu können!&lt;br /&gt;
&lt;br /&gt;
=== TX Register Write ===&lt;br /&gt;
Dieses Kommando schreibt Daten in den TX-Puffer. Wenn der Sender aktiv ist, wird dieses sofort gesendet. el (TX-Register) muss im Configuration-Setting-Kommando aktiv sein.&lt;br /&gt;
 Hex = b8 &amp;amp; xx&lt;br /&gt;
 Bit-Syntax: 10111000 | DataByteToSend&lt;br /&gt;
 DataByteToSend = Das Datenbyte, welches gesendet werden soll.&lt;br /&gt;
&lt;br /&gt;
(Senden Funktioniert nur wenn zuvor der Status abgefragt wurde)&lt;br /&gt;
&lt;br /&gt;
=== Status Read ===&lt;br /&gt;
Dieses Kommando löst die Rückgabe des Statusregisters aus, welches nach der ersten 0 im ersten Bit synchron übertragen wird.&lt;br /&gt;
 Hex = 0000&lt;br /&gt;
 Bit-Syntax: 0000000000000000&amp;lt;000&amp;gt;&lt;br /&gt;
 Rückgabe-Syntax: x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | x10 | x11 | x12 | x13 | x14 | x15 | x16 | x17 | x18&lt;br /&gt;
 x0 -&amp;gt; x5 = Interrupt bits&lt;br /&gt;
 x6 -&amp;gt; x15 = Status Bits&lt;br /&gt;
 x16 -&amp;gt; x18 = FIFO&lt;br /&gt;
 x0 = FFIT / RGIT (RGIT = TX-Register ist bereit neue Daten zu senden ... kann mit dem TX-Register gelöscht werden)&lt;br /&gt;
     (FFIT = Die Anzahl der Datenbits im FIFO-Puffer hat das eingestellte Limit erreicht.&lt;br /&gt;
      Kann mit einer der FIFO-Lesemethoden gelöscht werden)&lt;br /&gt;
 x1 = POR (PowerOnReset)&lt;br /&gt;
 x2 = FFOV / RGUR (RGUR = Der Datenstrom beim Senden ist abgerissen, da nicht schnell genug Daten nachgeladen wurden)&lt;br /&gt;
      (FFOV = Der RX-FIFO ist übergelaufen)&lt;br /&gt;
 x3 = WKUP&lt;br /&gt;
 x4 = EXT (Externer IRq vom nINT-Pin)&lt;br /&gt;
 x5 = LBD (Low Battery Detected)&lt;br /&gt;
 x6 = FFEM (Der FIFO-Puffer ist leer/EMpty)&lt;br /&gt;
 x7 = RSSI/ATS (ATS = )(RSSI = Die Signalstärke ist über dem eingestelltem Limit)&lt;br /&gt;
 x8 = DQD&lt;br /&gt;
 x9 = CRL&lt;br /&gt;
 x10 = ATGL&lt;br /&gt;
 x11 = OFFS_4&lt;br /&gt;
 x12 = OFFS_3&lt;br /&gt;
 x13 = OFFS_2&lt;br /&gt;
 x14 = OFFS_1&lt;br /&gt;
 x15 = OFFS_0&lt;br /&gt;
 x16 = FO&lt;br /&gt;
 x17 = FO+1&lt;br /&gt;
 x18 = FO+2&lt;br /&gt;
&lt;br /&gt;
== Bezugsquellen ==&lt;br /&gt;
* [[Elektronikversender#csd-electronics|csd-electronics]]&lt;br /&gt;
* [[Elektronikversender#IT-WNS|IT-WNS]]&lt;br /&gt;
* [[Elektronikversender#Pollin_Electronic|Pollin Electronic]]&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
* [[AVR RFM12]]&lt;br /&gt;
* [[RFM12 Protokoll Stack]]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/93801 Bezugsquellen]&lt;br /&gt;
&lt;br /&gt;
Folgende Links sind mit Vorsicht zu genießen, da die Datenblätter teilweise  fehlerbehaftet sind. Es empfiehlt sich, direkt mit dem Datenblatt des RF12 (das ist das IC auf dem Modul) zu arbeiten. Dieses ist so gut wie fehlerfrei.&lt;br /&gt;
&lt;br /&gt;
* [http://www.hoperf.com/pdf/RF12.pdf Datenblatt des ICs RF12] (PDF)&lt;br /&gt;
* [http://www.hoperf.com/pdf/RFM12.pdf Datenblatt des Moduls RFM12] (PDF)&lt;br /&gt;
* [http://www.hoperf.com/pdf/RF12_code.pdf Programming Guide] (PDF)&lt;br /&gt;
* [http://www.hoperf.com/pdf/RF12TOOLS.pdf Demo Kit User Manual] (PDF)&lt;br /&gt;
* [http://www.pollin.de/shop/downloads/D810047S.ZIP Beispielprogramm von Pollin] (ZIP)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Bauteile]]&lt;br /&gt;
[[Kategorie:Funk]]&lt;/div&gt;</summary>
		<author><name>Gregor54321</name></author>
	</entry>
</feed>