Forum: Projekte & Code Beispielprogramm für RFM12 433MHz Funk-Module


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Dirk Schlage (Gast)


Lesenswert?

Nein ich hatte den anderen Code von oben
1
void rf12_ready(void)
2
{  cbi(RF_PORT, SDI);
3
  cbi(RF_PORT, CS);
4
  asm("nop");
5
  while (!(RF_PIN&(1<<SDO))); // wait until FIFO ready
6
}
Ich habe jetzt den von vorgestern auch noch mal ausprobiert. Leider 
wartet da nix.
Ich frage mich warum ich am Anfang den Eindruck hatte, daß etwas über 
die Funkstrecke kam. Ich stelle zwischen Sender und empfänger per 
bedingter Compilierung um. Die Sende routine wird beim Empfänger gar 
nicht aufgerufen.
Ich gebe das Ganze dann auf einem Nokia3310-LCD aus.

Ich denke ich muss noch mal ganz zurück, und das Umschalten der Frequenz 
am Ausgang per Oszilloskop messen. Leider bin ich am Oszilloskop etwas 
schusselig. Mit etwas Glück finde ich auch an einem rostigen Nagel die 
10MHz, wenn ich wild an den kleinen Knubbeln rumschraube.

Gibt es die Möglichkeit per SPI ohne Interrupt, oder sonstige Leitungen 
zu prüfen, ob ein Byte empfangen wurde?

Gruß
    Dirk

von Thorsten S. (whitenoise)


Lesenswert?

Hi,

kann da noch jemand was zu sagen!?

Beitrag "rfm und ffit"

gruß,
whitenoise

von CupaCabra (Gast)


Lesenswert?

tach tach,

hab auch nen kleine´s prob. mit meinen RFM02 und einem ATMega8.

habe vom RFM02 den TaktPin CLK auf xTal 1 vom At8 geschaltet doch wie es 
scheint geht da nix.
Der Externe Ausgang XTal am At8 ist ON doch war´s das auch schon.
Habe das Fusebit über MyAvr QuikProg angeschaltet und auf der Evo. Bord 
von Avr geht das ganze auch.
Auf der TestPlatine hingegen nicht.

Benutze ein leicht abgewandeltest C Prog. von  Pollin. auch die 
Schaltung ist übernommen.

was läuft falsch.

mfg. CUpa

von Roland (Gast)


Lesenswert?

Hallo,
ich habe mich 2 Funk-AVR-Eva-board von Pollin bestellt und dazu auch die 
RFM12
Funk modul.Zur Verfügung habe ich die ATMEGA16 chip.
ich habe eine Frage: kann die Software RFM12_RX_TX von Benedik mit dem 
MEGA16 laufen?
wenn nein welche änderungen soll man hier machen damit die software mit 
einem Mega16 läuft?
Ic danke Ihnen in voraus

von Chryst (Gast)


Lesenswert?

Hi alle,
ich bin eine neue mikrocontroller benutzerin und will daten per funk 
übertragen.
dem zu folge bin ich auf diese Beitrag gestoßen und es hat mich sehr 
viele geholfen. ich habe noch einigen schwierigkeiten und hoffe, dass 
jemand hier mir helfen könnte.

am 18.05.2007 Georges E Wrote:

>> ich habe hier Dein Programmierbeispiel gefunden, nachdem ich mit dem
>> Code-Beispiel von Pollin fast verzweifelt hatte, war Dein super
>> strukturierter Code die wahre Wohltat.

>> Ich habe mir von Pollin zwei Funk Eval Boards zugelegt, jeweils mit
>> RFM12 und ATmega32-16 bestückt.
>> Die Verdrahtung ist zwar etwas anders als bei Deiner Hardware, aber mit
>> wenigen Änderungen (Pin defines und Pullup programmieren) lief Deine
>> Software auf Anhieb !!!!

ich wollte gern wissen wie er pin defines für eine ATmega 16 geändert 
hat.

@ Roland:
wenn du dein Problem gelöst hat, kannst mir sagen wie.

MFG
Chryst

von Jonny O. (-geo-)


Lesenswert?

Hallo Benedikt,

erstmal ein großes Dankeschön für das Einstellen des Beispielcodes!

ich teste grade die beiden C- Beispielprogramme für die Module RFM01 und 
RFM02. Ich habe folgendes Problem:

Meistens werden nur das erste oder auch die ersten beiden Bytes korrekt 
übertragen. Ab dann kommt nur Müll an. Beide Module arbeiten mit 10MHz, 
dass habe ich kontrolliert. Offenbar sendet der Sender auch was, sonst 
würde der Empfänger nicht reagieren. Nur leider kommt eben nichts 
Gescheites beim Empfänger an. Ich habe auch schon versucht die 
Init-Funktion am Anfang mehrmals aufzurufen. - Ohne Erfolg.

Hast du da ev. eine Idee?

Grüße
Jonny

von Gast (Gast)


Lesenswert?

Setze mal die SPI Frequenz hoch und lese mal den Status beim Interruppt 
aus. Ich hatte das Prob auch. Bei mir war es so das ich nicht schnell 
genug die empfangengen Daten aus dem Modul gehollt habe und er in der 
Zeit diese schon wieder überschrieben hat.

von Jonny O. (-geo-)


Lesenswert?

Hallo Gast,

vielen Dank für den Hinweis. Könntest du ev. zeigen, an welcher Stelle 
im Code was geändert werden muss - oder deinen geänderten Codeausschnitt 
zeigen?

Das wäre sehr freundlich von Dir :)

Viele Grüße
Jonny

von Marco S. (masterof)


Lesenswert?

Hi,

beim ATmega32 must du im SPCR die Bits SPR1,0 löschen und das SPI2X im 
Register SPSR setzten.

Hoffe ich konnte dir teilweise helfen.

von Jonny O. (-geo-)


Lesenswert?

Hallo Marco,

ich nutze den Atmega8.

von Marco S. (masterof)


Lesenswert?

Hallo Jonny,

Beim ATmega8 heisen diese 2 Register genauso.

von Jonny O. (-geo-)


Lesenswert?

Hallo Marco,

ah - Danke für den Hinweis. Ich habe nun im Main-Programm zu Testzwecken 
diese Zeilen eingetippt:

  SPCR &= ~(1<<SPR1);
  SPCR &= ~(1<<SPR0);
  SPSR |=  (1 << SPI2X);

Das Problem bleibt weiter bestehen. Die ersten beiden Bytes sind noch 
ok, dann kommt irgendwas an.

Werden in Benedikts Beispiel überhaupt die SPI-Register des Chips 
genutzt?

Viele Grüße
Jonny

von Marco S. (masterof)


Lesenswert?

Stimmt habe gerade im beispiel nach geschaut.
Mach mal den Wert bei delay_us(0.3) kleiner. In der Funktion rf12_trans 
.

von Jonny O. (-geo-)


Lesenswert?

Ich habe nun mal den Wert variiert. Es tut sich nichts :(

von liggi (Gast)


Lesenswert?

Hi,

ich hab ein paar Module bei Pollin bestellt. Ich wollte die zwei 
Atmega32 mit dem Takt des Funkmodules versorgen. Soll heißen, ich 
schließe CLK an XTAL1 an. Nun meine Frage, wie muss ich die Fusebits, 
die für den Takt zuständlich sind, einstellen. Auf Ext. Clock, auf Ext. 
RC Osc, auf Ext. Low Freq, oder auf Ext. Crystal/Resonator (auf HIGH, 
MEDIUM oder LOW)?

mfg liggi

von Pete K. (pete77)


Lesenswert?

Ext. Clock.

Du solltest aber einen Quarzoszillator verfügbar haben, falls Du mal 
wieder auf einen Quarz umsteigen möchtest und das RFM12 nicht 
funktioniert.

von liggi (Gast)


Lesenswert?

Danke.
Welchen Ext. Clock soll ich denn nehmen? 6 CK + 0 ms, oder 6 CK + 4 ms 
oder 6 CK + 64 ms?

mfg liggi

von Pete K. (pete77)


Lesenswert?

Mit dem letzten bist Du auf der sicheren Seite.

von Gerrit G. (liggi)


Lesenswert?

Nochmals Danke.

mfg liggi

von Philipp (Gast)


Lesenswert?

Moin,
ich hab mal eine Frage zu den Quellcodes für das RFM02 Module, die in 
diesem Thread zu finden sind.
Bin beim anpassen des Codes darauf gestoßen, dass 0xD2.. an das Modul 
gesendet wird. In den Datenblättern von Pollin und Hope RF gibt es 
jedoch kein Register, was mit D beginnt.
Wozu ist das genau gut?

von Benedikt K. (benedikt)


Lesenswert?

Philipp wrote:

> Bin beim anpassen des Codes darauf gestoßen, dass 0xD2.. an das Modul
> gesendet wird. In den Datenblättern von Pollin und Hope RF gibt es
> jedoch kein Register, was mit D beginnt.

Doch, auf Seite 16 des Hope RF Datenblatts unter Punkt 11.

> Wozu ist das genau gut?

Damit wird der Strom für die interne PLL eingestellt.

von Philipp (Gast)


Lesenswert?

Aha, ich hatte wohl ne alte Version vom Datenblatt.
Danke.

von Christof Kauba (Gast)


Lesenswert?

Hallo, ich hätte da mal eine Frage.
Kann ich die hier vorgestellte Bibliothek auch für das RFM12BP Modul 
verwenden, oder muss ich dazu etwas anpassen?

Welchen Wert muss ich bei diesem Modul für die unterschiedlichen 
Sendeleistungen zum Modul schicken (also z.B. für 10 mW, 25 mW oder die 
max. 500 mW)?

Und noch eine Frage. Ich glaub ich habs nur einfach nicht gesehen, aber 
wie schalte ich das Modul in den Standy, also den Sende- und 
Empfangsteil ab, sodass nur noch der interne Oszillator des Moduls läuft 
und wie schalte ich dann den Sende- bzw. den Empfangsteil wieder an?


Danke im Voraus

Chris

von ITAA0 (Gast)


Lesenswert?

Hallo,

ich arbeite in der Schule mit einem Atmel mega8 und den RFM01/02 
Modulen, leider kriegen wir keine Verbindung zu stande. Ich habe die 
verschiedensten Beispiele benutzt und kamen dennoch zu keinem 
vernünftigem Ergebnis.

Ich habe leider keinen Frequenzscanner, aber laut Ozi sollte eigentlich 
gesendet und empfangen werden. Das was empfangen wird sollte eigentlch 
über UART an einen PC gesendet werden und alles kommt an nur die Sachen 
die via UKW gesendet wurden nicht.

Auf Wunsch kann ich das Programm Listing Online stellen.

Danke schon mal im voraus

von Bast (Gast)


Lesenswert?

@ITAA0 (Gast)

Du mußt einen längeren Thread nehmen. Dieser hier ist eindeutig zu kurz!

von A. Arndt (Gast)


Lesenswert?

Hallo,

ich fange jetzt auch an mit den Rfm12 und Bascom zu tüffteln,
ich verstehe nur nicht, wieso man die Daten wie Frequenz, Baudrate usw.
nicht einfach ins Modul spi-t und gut, da werden Consts geschrieben und
Subs usw. warum ?

Gruss
A. Arndt

von Moi (Gast)


Lesenswert?

Weil sich das für ein guten Programmierstil so gehört!

So ist es einfacher an neue Umgebungsbedingungen anzupassen!

Wer halbwegs vernünftig programmiert verwendet consts etc. Alles andere 
ist nur Bastelmüll!

von A. Arndt (Gast)


Lesenswert?

Hallo,

gut, das ist ansichtssache, ich programmiere mit vielen Kommentaren, 
würde aber nie z.B. um auf einem LCD die Zahl 48 darzustellen 
programmieren

A = 48

lcd a

sondern lcd "48"

und gut.

Ich möchte zum Beispiel nur den Wert, also die 9 Bits eines DS1820 zu 
einem 2. AVR schicken und da via LCD darstellen lassen, nichts mit uart 
usw. also könnte ich doch die Daten wie Frequenz usw, einmal 
rüberschieben zum Modul und mich dann auf das Datensenden konzentrieren 
(Sender) und mir den Wert zurückschicken, wenn identisch i.O. ansonsten 
nochmal schicken bis i.O.


Oder bin ich mit dieser Idee völlig auf dem Holzweg...?

Gruss
A. Arndt

von Manuel Stahl (Gast)


Lesenswert?

Eine Antwort schicken erfordert zumindest schon mal das Umschalten vom 
Empfangs- in den Sendemodus. Rein auf Datensenden reicht also nicht. 
Außerdem muss der Empfänger noch das Ende eines Pakets erkennen und 
falls dieses nicht erkannt wird nach einer gewissen Anzahl Bytes 
aufhören zu empfangen.

Solche Dinge wollen beachtet werden.

von A. Arndt (Gast)


Lesenswert?

Hallo,

das ist klar, ich dachte mir das wie folgt :

Sende Frequenz         'z.B. 433,92 MHz
sende Baudrate         '19200
sende Frequ-Shift       ' 120kHz

und schalte auf Empfang und warte

das gilt für Sender und Empfänger

Dann erfolgt am Sender die Messung mit Ds1820 und schaltet um auf Senden 
und schickt die Daten und schaltet wieder auf Empfang.

Der Empfänger lauert auf Daten, empfängt diese, wartet kurz und schickt 
diese Daten genau so zurück und schaltet wieder Empfang.

Der Sender empfängt die Daten, prüft ob i.O und schickt ggf. Daten 
nochmal und schaltet wieder auf Empfang.

Empfängt der Empfänger innerhalb von 5 Sek nichts mehr wertet er die 
Daten des DS1820 aus und zeigt sie auf dem LCD (dieses könnte natürlich 
noch mit Sendung von z.B. code für ok verfeinert werden).

Man könnte natürlich auch die Auswertung gleich am Sender machen.

So das "Grobgerüst"....

Gruss
A. Arndt

von A. A. (artools)


Lesenswert?

Hi,

gibts keine Rubrik RFM12 für Dummies ohne Sprüche "Steht doch im 
Datenblatt"...

Es gibt halt Hobbybastler und Ingenieure, daher ist auch das Verständnis 
für diese Infos zu verschieden...

Gruss
A. Arndt

von tester (Gast)


Lesenswert?

Hallo zusammen. Ich wollte mich jetzt auch mal mit den Funkmodulen 
beschäftigen und hab auch 2 rfm12 hier liegen. Allerdings seh ich bei 
dem Quellcode, speziell bei der Funktion rf12_trans, noch nicht so ganz 
durch. Vielleicht könnte sich ja jemand bereit erklären mir zu 
verdeutlichen was da vor sich geht.

Hier noch mal die Funktion:
1
unsigned short rf12_trans(unsigned short wert)
2
{  unsigned short werti=0;
3
  unsigned char i;
4
5
  cbi(RF_PORT, CS);
6
  for (i=0; i<16; i++)
7
  {  if (wert&32768)
8
      sbi(RF_PORT, SDI);
9
    else
10
      cbi(RF_PORT, SDI);
11
    werti<<=1;
12
    if (RF_PIN&(1<<SDO))
13
      werti|=1;
14
    sbi(RF_PORT, SCK);
15
    wert<<=1;
16
    _delay_us(0.3);
17
    cbi(RF_PORT, SCK);
18
  }
19
  sbi(RF_PORT, CS);
20
  return werti;
21
}

von Benedikt K. (benedikt)


Lesenswert?

Vereinfacht gesagt bekommt die Funktion einen 16bit Wert, der seriell 
ausgegeben wird. Gleichzeitig werden 16bit eingelesen.

von tester (Gast)


Lesenswert?

ja vereinfacht hab ich das auch verstanden aber ich meinte im detail :)

von A. Arndt (Gast)


Lesenswert?

Hi,

welche Werte müssen denn mindestens ans Modul gesendet werden...?

Frequenz, Baudrate und Bandbreite ????

Was hat es mit dem sog. FIFO auf sich, welchen Befehl muss ich schreiben 
um die empfangenen Daten auszulesen zu können ?

Sind die Daten nach dem Auslesen im Modul weg ?

Wie bekomme ich mit, wenn Daten im Modul angekommen sind ?



Gruss
A. Arndt

von Jonas (Gast)


Lesenswert?

Hallo,

bei mir bleibt das Programm, wenn ich senden möchte, hier hängen:

while (!(RF_PIN&(1<<SDO))); // wait until FIFO ready

in der rf12_ready(). Habe auch ein asm("nop"); eingefügt.

Hat jemand ein Tipp für mich, woran das liegen könnte?
Ich habe MISO, MOSI, SCK und nSel und FSK über 10k auf 5V an meinem 
ATMega2560 angeschlossen.

Vielen Dank!

Gruß Jonas

von Jonas (Gast)


Lesenswert?

Problem hat sich erledigt, ich wollte zu schnell hintereinander senden.
Mit einer längeren Wartefunktion funktioniert es.

von Manja (Gast)


Lesenswert?

Hallo,
ich habe nun manches in diesem Thread gelesen, bin Modellfan in und 
möchte einen 1:32 LKW mit einer Fernsteuerung ausstatten.

Habe auch schon manches mit dem ATTiny2313 umgesetzt.

Allerdings stört mich hier etwas die Unzuverlässigkeit der produzierten 
Geräte, wenn ich etwas steuere, dann sollte das meiste auch den 
Empfänger erreichen.

Ich hab mir das so vorgestellt:

Der Sender sendet laufend 3 Bytes, das erste und zweite muß im Empfänger 
in
einen Output je Pin durch Timer in 1ms bis 2ms Rechteck umgesetzt werden 
mit gesamt 20ms Distanz. (Für Servo, Motor). Das dritte Byte dient 
Sonderfunktionen (Licht etc.)

Diese 3 Bytes sollten zyklisch immer wieder gesendet werden, man könnte 
ja noch ein viertes Byte hinzunehmen als Prüfbyte (mit den anderen über 
XOR ermittelt)

Ich hoffe, das man das mit 2 ATTiniy2313 hinbekommt, habe noch jede 
Menge herumliegen, bräuchte nur 2 RFM12

von Manja (Gast)


Lesenswert?

Hallo ,
habe heute von Pollin Päckchen bekommen,
was war darin:

Bausatz Funk AVR Evaluations Board = war in Ordnung, aber

2 * Rainbow - Mouse

in einem Beutel, auf dem 2 Stk. Funkmodul RFM 12 drauf stand.

Auch auf der Rechnung stand 2 * Funkmodul RFM 12

Ist die Firma Pollin bei euch auch so unzuverlässig, wenn ihr was 
bestellt ??

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Manja wrote:
> Ist die Firma Pollin bei euch auch so unzuverlässig, wenn ihr was
> bestellt ??

Nein nur extra bei dir haben sie ne Ausnahme gemacht um dich speziell zu 
ärgen, weil du ein Leerzeichen vor einem doppeltem Satzendezeichen setzt 
:P

Mir isses noch nicht passiert, wurde aber schon öfter berichtet. Einfach 
anrufen dann kriegt mans meist nachgeliefert und darf das falsch 
gelieferte behalten.

von Gerd (Gast)


Lesenswert?

Unzuverlässig? Reichelt hat das letzte Mal bei mir statt 5 Atmega32 
(TQFP) 5 Atmega128 (TQFP) geliefert. Waren mit Atmega32 auf der Tüte 
beschriftet.
Passiert anscheinend in jedem Laden.

von Werner A. (Gast)


Lesenswert?

@Georg E.
Du hast weiter oben geschrieben, dass du 2 DemoBoards von Pollin im 
Einsatz hast und dafür den Code von Benedikt angepasst hättest. Kannst 
du mir den Code evtl. zur Verfügung stellen? Ich hab mir auch gerade 2 
DemoBoards bei Pollin bestellt...

@all
oder kann mir sonst jemand vielleicht 'nen fertigen SimpelCode zur 
Verfügung stellen?

Danke
  Werner

von Susi (Gast)


Lesenswert?

Hallo,
weiss jemand, ob die RFM 01 / 02 auch ohne AVR betrieben werden können ?
Ich würde sie nämlich mit Encoder-Decoder ICs betreiben wollen:
RFM02
Spannung anschliessen
Ausgang von Encoder-IC in FSK-input
nSEL auf Low

RFM01
Spannung anschliessen
nSEL auf Low
Irgendwo müsste das Signal wieder rauskommen....?
oder geht es nicht ?

Danke für Eure Antworten
 Susi

von Vajk .. (vajk)


Lesenswert?

Huhu Susi,
das geht nicht ohne uC .. ein I2C-Speicherchip kann eigentlich auch 
nicht ohne uC leben ... bei den Funkmodulen st das auch so ... (ohke PC 
direkt dran geht auch).
LG
Vajk

von Susi (Gast)


Lesenswert?

@ Vajk
Danke für deine Antwort.
Schade, daß es nicht geht!
Susi

von Manuel S. (thymythos) Benutzerseite


Lesenswert?

A. Arndt wrote:
> Hi,
>
> gibts keine Rubrik RFM12 für Dummies ohne Sprüche "Steht doch im
> Datenblatt"...

Da die Datenblätter eben sehr technisch sind, versucht z.B. dieser 
Wiki-Artikel die Thematik auch auf einfachere Weise zu erklären: 
http://www.mikrocontroller.net/articles/RFM12

> Es gibt halt Hobbybastler und Ingenieure, daher ist auch das Verständnis
> für diese Infos zu verschieden...

Es geht nicht ums Verständnis, sondern darum, dass nicht alles dreifach 
gefragt wird. Es ist völlig klar, dass nicht jeder einen so langen 
Thread wie diesen komplett durchlesen will, dafür gibt es das Wiki! 
Erhält man eine passende Antwort und die Frage steht noch nicht im Wiki 
ist jeder eingeladen dies nachzutragen.

von Richard B. (rbrose)


Lesenswert?

Hallo zusammen,

ich habe ein Problem mit meinem RFM12 das Senden soll.
Das komische ist, wenn ich den Sender an +5V Netzteil anschließe 
funktioniert es immer gut. Wenn ich es aber mit Batterien betreibe, 
funktioniert das fast nie ... nur ab und zu. Hat eine eine Idee woran 
das liegt?

Wenn ich im Batterie Mode den ISP Stecker anstecke dann funktioniert das 
wieder immer.

Das RFM12 schaltet immer auf 10Mhz hängt aber in der sende Funktion wenn 
mit Batterie betrieben wird.

Hat einer eine Idee was ich messen soll oder was das Problem sein 
könnte?


Danke

von Richard B. (rbrose)


Lesenswert?

Ein 220uF Kondensator am RFM12 hat Abhilfe geschaffen.

von Alfred (Gast)


Lesenswert?

Hallo.

Habe ein Problem mit dem Empfangsmodul RFM01.

Die Konfiguration des Moduls habe ich vom Beipsielcode von hopeRF 
übernommen (http://www.hoperf.com/pdf/RF01_code.pdf --> 24 Byte an Modul 
senden).

Das Modul wird über eine HW-SPI angesprochen, die auf 78kHz eingestellt 
ist. Nach der Initialisierung des Moduls wird auf einen NIRQ-Interrupt 
gewartet, der nach 8bits im Buffer auslöst.
Ist das der Fall, werden zuerst die 16bit vom Status Register und danach 
8bit FIFO ausgelesen.

Das Ganze wird 8mal durchgeführt und anschließend das 
FIFO-Löschen-Kommando  ans Modul gesendet.

Nun passiert folgendes: Wenn der NIRQ-Interrupt auslöst, werden statt 
des Status-Registers sofort die 8bit-Daten empfangen.

Nachdem dann wieder FIFO-Löschen geschickt wurde, funktioniert das ganze 
wieder bis zum nächsten Löschen-Kommando. Danach werden wieder statt des 
Status Registers die 8bit-Daten empfangen.

Hat jemand eine Idee, was daran schuld sein könnte???


mfg Alfred

von Lukas B. (lukasb)


Lesenswert?

ich habe mal versucht das beispiel (erstmal provisorisch) auf hardware 
SPI umzubauen. (ertstmal nur den sender) tut aber nicht, jemand ne idee 
warum?
1
 
2
3
#include <avr/io.h>
4
#include "gdi_test.h"
5
#include <stdlib.h>
6
#include <util/delay.h>
7
8
9
10
11
int spi_send (uint16_t value){
12
  uint8_t highbyte;
13
  uint8_t lowbyte;
14
15
  lowbyte = value;
16
  highbyte = (value >> 8);
17
18
  PORTB &= ~(1 << PB2);  //vorsichtshalber SS selber setzen
19
20
  SPDR = highbyte;
21
  /* Wait for transmission complete */
22
  while(!(SPSR & (1<<SPIF)))
23
  ;
24
  PORTB |= (1 << PB2); // SS zurücksetzen
25
  
26
27
  PORTB &= ~(1 << PB2);    //vorsichtshalber SS selber setzen
28
29
  SPDR = lowbyte;
30
  /* Wait for transmission complete */
31
  while(!(SPSR & (1<<SPIF)))
32
  ;
33
  PORTB |= (1 << PB2); // SS zurücksetzen
34
  _delay_ms(1);
35
36
37
  return 0;
38
}
39
40
41
void rf12_txdata(unsigned char *data, unsigned char number)
42
{
43
  spi_send(0x8238);      // TX on
44
  
45
  spi_send(0xB8AA);
46
  
47
  spi_send(0xB8AA);
48
  
49
  spi_send(0xB8AA);
50
  
51
  spi_send(0xB82D);
52
  
53
  spi_send(0xB8D4);
54
55
56
  spi_send(0xB800|32);  //fix erstmal nur 32 senden
57
58
  //for (i=0; i<number; i++)
59
  //{  
60
  //  spi_send(0xB800|(*data++));
61
  //}
62
  
63
  spi_send(0x8208);      // TX off
64
}
65
66
67
68
69
int main (void){
70
71
  //SPI aktivieren
72
  DDRB = (1<<PB3)|(1<<PB5)|(1<<PB2);
73
  SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);
74
75
  DDRD = (1 << PD0);
76
  PORTD = 0;
77
78
  _delay_ms(100);
79
80
81
  spi_send(0xC0E0);      // AVR CLK: 10MHz
82
  spi_send(0x80D7);      // Enable FIFO
83
  spi_send(0xC2AB);      // Data Filter: internal
84
  spi_send(0xCA81);      // Set FIFO mode
85
  spi_send(0xE000);      // disable wakeuptimer
86
  spi_send(0xC800);      // disable low duty cycle
87
  spi_send(0xC4F7);      // AFC settings: autotuning: -10kHz...+7,5kHz
88
89
90
  
91
  uint16_t freq;
92
  freq = RF12FREQ(433.92);
93
94
  spi_send(0xA000|freq);
95
96
  //, , 
97
  uint8_t bandwidth = 4;  //200kHz Bandbreite
98
  uint8_t gain = 1;  //-6dB Verstärkung
99
  uint8_t drssi = 4;  //DRSSI threshold: -79dBm 
100
  spi_send(0x9400|((bandwidth&7)<<5)|((gain&3)<<3)|(drssi&7));
101
102
103
  PORTD |= (1 << PD0);
104
  _delay_ms(500);
105
  PORTD &= ~(1 << PD0);
106
  _delay_ms(500);
107
108
109
110
  uint16_t baud = 19200;
111
112
  if (baud<663){
113
    return;
114
  }
115
116
  if (baud<5400){          // Baudrate= 344827,58621/(R+1)/(1+CS*7)
117
    spi_send(0xC680|((43104/baud)-1));
118
  }
119
  else{
120
    spi_send(0xC600|((344828UL/baud)-1));
121
  }
122
123
  uint8_t power = 0; // 1mW Ausgangangsleistung,
124
  uint8_t mod = 6;   // 120kHz Frequenzshift
125
126
  spi_send(0x9800|(power&7)|((mod&15)<<4));
127
128
129
130
  PORTD |= (1 << PD0);
131
  _delay_ms(500);
132
  PORTD &= ~(1 << PD0);
133
  _delay_ms(500);
134
135
136
  
137
  while (1){
138
139
    PORTD |= (1 << PD0);
140
    _delay_ms(500);
141
    PORTD &= ~(1 << PD0);
142
    _delay_ms(500);
143
144
145
146
    unsigned char *x;
147
    x = "test";
148
149
    rf12_txdata (x,32);
150
    _delay_ms(500);
151
  }
152
153
  return 0;
154
}
gdi_test.h:
1
#define F_CPU 8000000 
2
#define RF12FREQ(freq) ((freq-430.0)/0.0025)

von Florian (Gast)


Lesenswert?

Hallo,

es war die rede davon das der ffit pin auf high geht wenn der fifo voll 
ist beim rfm01. welcher der beiden ist jetzt gemeint, da sind ja 2...

MfG Flo

von Chris T (Gast)


Lesenswert?

Hi,

ich habe mir zwei Module mit dem IA 4221 und IA4320 für Modellbau 
aufgebaut. Der Empfänger wiegt nur ca. 0.3g. Allerdings gibt es noch 
Probleme bei der Programmierung. Ich habe eine zuverlässige Verbindung 
auf 433MHz (Mit geringer Reichweite). Wenn ich allerdings auf beiden 
Seiten 868MHz einstelle tut sich nichts mehr. Muss zusätzlich noch eine 
andere Einstellung vorgenommen werden damit die 868MHz funktionieren? 
Die ANtennenschaltung ist bereits für 868MHz ausgelegt. Ich schiebe die 
Daten direkt (ohne FIFO) raus.  Kann bei Gelegenheit den Code posten.



Chris

von M. W. (hobbyloet)


Lesenswert?

Gerd wrote:
> Unzuverlässig? Reichelt hat das letzte Mal bei mir statt 5 Atmega32
> (TQFP) 5 Atmega128 (TQFP) geliefert. Waren mit Atmega32 auf der Tüte
> beschriftet.

Schon das Geld für die besseren Megas zurück gezahlt?

Irgend wie, treiben sich hier immer mehr Krumme Typen rum.

von Gerd (Gast)


Lesenswert?

Ich hatte bloß einen sehr kurzen Liefertermin mit der zu bauenden 
Schaltung. Der ist wegen der Falschlieferung in die Hose gegangen. 
Ansonsten hätte ich mich darüber gefreut, ist klar. Beim zweiten Mal 
waren es dann FT245 statt Atmega32. Hat mich dann bewogen, woanders zu 
bestellen.
Ich glaube allerdings nicht, dass man wieder so viel Pech mit Reichelt 
haben kann.

Gruß Gerd

von Christian (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Leute,

ich sitze hier jetzt schon ein paar Tage an meiner Funkschaltung (RFM12) 
und versuche die Hardware SPI Schnittstelle zum laufen zu bringen. Ich 
sehe mit einem Oszi auch, dass Daten übertragen werden. Ich versuche die 
Clock des Modules zu ändern. Leider ohne Erfolg.
Ich verwende einen ATMega32.

Vielleicht kann mir einer ja meinen Fehler zeigen.

Thx,
Christian

von Benedikt K. (benedikt)


Lesenswert?

Du musst auch den Chipselect richtig ansteuern, also vor der Übertragung 
auf low und hinterher wieder auf high.

von Christian (Gast)


Angehängte Dateien:

Lesenswert?

Habe ich versucht, aber leider ohne Erfolg. Haben den Code angehängt.

von Benedikt K. (benedikt)


Lesenswert?

Eine Übertragung hat 16bit, nicht 8bit. Also CS vor den 16bit auf Low, 
und hinterher wieder auf high.

von AtmelFreak (Gast)


Lesenswert?

Hallo RFM-Gemeinde,
ich glaube das ist jetzt ein wenig OT aber ich denke das passt hier 
schon.
Mittlerweile habe ich eine Menge Projekte unter FAST-AVR geschrieben und 
sie haben immer beeindruckend gut funktioniert. Zuletzt jetzt das 
Projekt mit 2 RFM 12ern. Es funktionierte natürlich nicht sie mit 
Hard-SPI zum laufen zu zwingen. Also drangemacht an AVR-GCC und zum 
testen Benedikts Code (danke Benedikt für deine Pionierleistung ;-) ) 
geladen, geändert und auf meinem Tiny2313 getoastet und......... siehe 
da es funzt.
Jetzt aber mal meine Frage: Mein Code in FAST-AVR entspricht vom Umfang 
der Funktionen derer in Benidikts Code in C. Nach dem Compilieren habe 
ich aber bei FAST-AVR nur ca 56% RAM beschrieben während mir AVR-GCC 
161% sagt.
Trotz allem habe ich ihn in meinen Chip bekommen. Senden-Empfangen funzt
aber die anschließende bearbeitung der Daten funzt nur ab und an.
Ausserdem habe ich auch festgestellt das manchmal nach dem Einschalten 
der Chip langsamer läuft, Da ich am Anfang 2 LEDs blinken 
lasse.(interner 4 MHz-Takt ist eingefused)

Wäre prima wenn mir jemand sagen könnte warum mir AVR-GCC eine 
Speicherauslastung von rd160% angibt. Achja -os ist eingestellt. Bei 
anderen einstellungen verändert sich allerdings nicht viel.
Vielen Dank schonmal vorab

von fantomas (Gast)


Lesenswert?

hallo leutz, hab frage zur dieser Funktionsaufruf.

setpower(0, 6) // 1mW Ausgangangsleistung, 120kHz Frequenzshift
kann sein das die Frequenz auf 105kHz eingestellt wird und nicht auf 
120?
Hier noch mal die Funktion:

void rf12_setpower(unsigned char power, unsigned char mod)
{
  rf12_trans(0x9800 | (power&7) | ((mod&15)<<4));
}


falls ich falsch liege kurze Erklärung wäre sehr nett:)

thx

von Benedikt K. (benedikt)


Lesenswert?

fantomas wrote:
> hallo leutz, hab frage zur dieser Funktionsaufruf.
>
> setpower(0, 6) // 1mW Ausgangangsleistung, 120kHz Frequenzshift
> kann sein das die Frequenz auf 105kHz eingestellt wird und nicht auf
> 120?

Ja, hast recht. 7 wäre 120kHz.

von fantomas (Gast)


Lesenswert?

(tiefes Dank für Thread @ Benedikt)
Ist es möglich mit den Funkmodulen die Signale der Funk-Schalt-Sets zu 
empfangen?

big thx

von altprog (Gast)


Lesenswert?

Hallo Rf12 - Programmierer,

Pionierarbeit auf dem Gebiet der RF 12-Module. Jetzt scheinen auch die 
bekannten "Verdächtigen" auf den Zug aufzuspringen. Im Januar-Heft der 
Zeitschrift Elektor sind gleich zwei Artikel dazu zu finden. Einmal ein 
Artikel über die Module selbst und einmal die Programmierung einer 
Übertragungsstrecke zwischen zwei RF12-Modulen. Wobei die Synchronierung 
trickreich gelöst worden zu sein scheint. Auf der Elektorseite kann man 
sich die Beispielprogramme kostenlos herunterladen: www. 
elektor.de/071125.
Hat schon jemand damit experimentiert?

Gruß

Altprog

von Psych (Gast)


Lesenswert?

>Hat schon jemand damit experimentiert?

Ist der Code bei denen nicht in Bascom programmiert ? Bäähh.

von Rolf B. (altprog)


Lesenswert?

Hallo,

Ist der Code bei denen nicht in Bascom programmiert ? Bäähh.

Ja genau, aber das ist doch kein Problem. Man kann den Code doch auch in 
andere Sprachen übertragen, soforn man die Fuktion verstanden hat.

Altprog

von Rudger Hauer (Gast)


Lesenswert?

>Ja genau, aber das ist doch kein Problem.

Bascom ? Geht gar nicht ...

>Man kann den Code doch auch in andere Sprachen übertragen

Wenn ich mich in den Bascom-Code einarbeiten muss, dann kann ich auch 
gleich weiter in Basic porgrammieren, aber wer will das schon.

von GagaGast (Gast)


Lesenswert?

naja, eine Programmiersprache ist doch nur ein Handwerkszeug ...
und wenn Du bascom nicht verstehst und von "einarbyten" sprichst,
aber C oder asm kannste? ... dat paßt irgendwie nicht ....

von Rudger Hauer (Gast)


Lesenswert?

>nicht verstehst

Davon hat keiner gesprochen, programmiere ab und an noch was in 
VisualBasic am Rechner, so isset nicht.

Jedoch hat Bascom mir nie gefallen, hatte mir auch mal das Buch von 
Rowalt geholt, aber es direkt wieder verkauft.

>aber C oder asm kannste?

Früher (in den  90er - Oh gott bin ich alt ..) hab ich µC nur in ASM 
programmiert (Damals nur PICs brrr).

Heutzutage programmiere ich nur noch C, da mann verschiedene Controller 
nutzen will/muss.

>"einarbyten"

;-)

von GagaGast (Gast)


Lesenswert?

Hallo Rudger

> Davon hat keiner gesprochen, programmiere ab und
> an noch was in VisualBasic am Rechner, so isset nicht.
oh dann solltest Du Dich hier registrieren, damit ich Dich mal
direkt per email kontaktieren kann ...

>> aber C oder asm kannste?
> Früher (in den  90er - Oh gott bin ich alt ..) hab ich µC
> nur in ASM programmiert (Damals nur PICs brrr).
handshake, alldings haß ich PICs, 8051er .. das waren mir lieber

> Heutzutage programmiere ich nur noch C, da mann
> verschiedene Controller nutzen will/muss.
ack,dto.

... ergo kannst Du sehrwohl den Quälcode in bas(tel)com lesen!

von Rolf B. (altprog)


Lesenswert?

Hallo,

eigentlich wollte ich ja keine Diskussion über Programmiersprachen 
anstoßen. Deswegen wiederhole ich meine Frage: Hat jemand sich die 
Beispielprogramme schon mal genauer angesehen oder gar damit 
experimentiert?

Gruß

Altprog

von Michael K. (manhunt)


Lesenswert?

Hallo

Also ich habe einige Fragen zu Bendikts Code:

Dazu schreibe ich die Funktionen hin und meine Frage in den Kommentaren, 
bzw die Frage Allgemein.

Ihr würdet mir sehr helfen wenn ihr mir einige Dinge erklären könntet.

Also:

1.) Die Pins SDI und SDO und CS, müssten diese in der rf12.c nicht also 
Eingang oder Ausgang definiert werden?

2.) Funktion: rf12_trans()

1
if (wert&32768) /
2
      sbi(RF_PORT, SDI);
3
    else
4
      cbi(RF_PORT, SDI); 
5
    werti<<=1;
Also ist SDI nicht der Input? Ich denke mir Folgendes Bei dieser 
Funktion, alle bits bis auf das 15 ausblenden und dann SDI je nach dem 
auf High oder Low setzen, dannach das  vorletzte Bit der Variable der 
Stelle 14 an die Stelle 15 Schieben und im nächsten durchgang senden.

Wieso wird hier SDI und nicht SDO verwendet?

3.) Funktion: rf_trans() [Siehe Kommentare]
1
        if (RF_PIN&(1<<SDO))  
2
      werti|=1;
3
    sbi(RF_PORT, SCK);
4
    wert<<=1;          //warum erste jetzt shiften?
5
    _delay_us(0.3);  //Warum 0.3 us?
6
    cbi(RF_PORT, SCK);
Die Frage warum man SDO bzw den Output für den Input verwendet bleibt, 
bzw wo definiert wurde ob Ausgang oder Eingang (DDRB =...)

4.)
Funktion:  rf12_txdata

Warum Schicke ich in dieser Funktion zuerst:
  rf12_trans(0xB8AA);
  rf12_trans(0xB8AA);
  rf12_trans(0xB8AA);
  rf12_trans(0xB82D);
  rf12_trans(0xB8D4);

Wechle beteutung hat 3xAA, 2D und D4 habe dazu nirgenst etwas gefunden.





5.) Funktion: rf12_rxdata
  rf12_trans(0xCA81);      // set FIFO mode
  rf12_trans(0xCA83);      // enable FIFO
Muss ich den FIFO am Ende der Funktion nicht wieder disablen, bzw würden 
ein 0xCA83 nicht reichen? wozu das 0xCA81 davor?


6.) Was ist dieser FIFO? (JaJa First IN First Out aber was ersetzt der 
mir?) :D


Ich bin für jede Hilfe/Antwort dankbar.


Liebe Grüße,
Michael

von Benedikt K. (benedikt)


Lesenswert?

Michael Graßl wrote:
> 1.) Die Pins SDI und SDO und CS, müssten diese in der rf12.c nicht also
> Eingang oder Ausgang definiert werden?

Ja, werden sie auch:
  RF_DDR=(1<<SDI)|(1<<SCK)|(1<<CS);
  RF_PORT=(1<<CS);

> 2.) Funktion: rf12_trans()

> Also ist SDI nicht der Input?

Jain. SDI ist der Ausgang vom AVR und der Eingang vom RF12. Je nachdem 
von welcher Seite man es aus betrachtet ist es also entweder Ausgang 
oder Eingang.

> 3.) Funktion: rf_trans() [Siehe Kommentare]
>
>
1
>         if (RF_PIN&(1<<SDO))
2
>       werti|=1;
3
>     sbi(RF_PORT, SCK);
4
>     wert<<=1;          //warum erste jetzt shiften?
5
>     _delay_us(0.3);  //Warum 0.3 us?
6
>     cbi(RF_PORT, SCK);
7
>

Wenn du vorher shiften würdest, dann würde das MSB verloren gehen.
0,3µs, weil das Datenblatt maximal 2,5MHz Taktfrequenz erlaubt. Dazu 
noch etwas Reserve, damit es zu keinen Timingproblemen kommt.

> Wechle beteutung hat 3xAA, 2D und D4 habe dazu nirgenst etwas gefunden.

2DDA ist das Syncword, das der Empfänger erkennt. AA sind Binär 
10101010, also möglichst viele Flanken, damit der Empfänger sich auf die 
Baudrate einstellen kann.

> 5.) Funktion: rf12_rxdata
>   rf12_trans(0xCA81);      // set FIFO mode
>   rf12_trans(0xCA83);      // enable FIFO
> Muss ich den FIFO am Ende der Funktion nicht wieder disablen, bzw würden
> ein 0xCA83 nicht reichen? wozu das 0xCA81 davor?

Die Antwort hast du dir selbst gegeben: 0xCA81 schaltet den FIFO Mode 
ein, deaktiviert aber das FIFO. Mit der Sequenz 0xCA81 -> 0xCA83 wird 
die Syncword Erkennung gestartet.
Das Abschalten geschieht bei mir durch das Abschalten des Empfängers.

von Michael K. (manhunt)


Lesenswert?

Benedikt K. wrote:

>> 2.) Funktion: rf12_trans()
>
>> Also ist SDI nicht der Input?
>
> Jain. SDI ist der Ausgang vom AVR und der Eingang vom RF12. Je nachdem
> von welcher Seite man es aus betrachtet ist es also entweder Ausgang
> oder Eingang.

Aso, so siehst du das, da ich immer von meinem AVR den ich Programmiere 
Ausgegangen bin ist mir das nicht in den sin gekommen.


>
> Wenn du vorher shiften würdest, dann würde das MSB verloren gehen.

Meine erste Idee war es auch dort zu shiften wo derweil werti <<=1; 
steht, weil es dann in einem Logischen zusammenhang stehen würde.(Zu dem 
Zeitpunkt an dem ist das MSB eh schon egal oder?)


> 2DDA ist das Syncword, das der Empfänger erkennt. AA sind Binär
> 10101010, also möglichst viele Flanken, damit der Empfänger sich auf die
> Baudrate einstellen kann.

Ahm, ich geh mal davon aus beim 2DDA hast du dich beim A vertippt, Frage 
wo steht das mit dem 2DD4 und fängt er dann erst zu senden an oder der 
empfänger erst zum "empfangen" bzw das empfangen als Daten anzusehen?




> Die Antwort hast du dir selbst gegeben: 0xCA81 schaltet den FIFO Mode
> ein, deaktiviert aber das FIFO. Mit der Sequenz 0xCA81 -> 0xCA83 wird
> die Syncword Erkennung gestartet.
> Das Abschalten geschieht bei mir durch das Abschalten des Empfängers.

Naja ich meinte das die Zwei Schritte auch nur mit 0xCA83 gemacht werden 
könnten da ja beim  1 --> 001, 3--> 011, immer das erste Bit gesetzt 
wird.
ASO mit RX off wird der FIFO auch bedeutungslos

Danke für die schnelle Hilfe.

lg Michael

von Benedikt K. (benedikt)


Lesenswert?

Michael Graßl wrote:
> Meine erste Idee war es auch dort zu shiften wo derweil werti <<=1;
> steht, weil es dann in einem Logischen zusammenhang stehen würde.(Zu dem
> Zeitpunkt an dem ist das MSB eh schon egal oder?)

Ja, das sollte auch gehen.
Ich schiebe halt gerne mehr am Ende. Der Hintergedanke war, diesen Shift 
als Wartezeit sinnvoll einzusetzen, aber der Compiler stellt die 
Reihenfolge vermutlich um, daher funktioniert das nicht ganz.

> Ahm, ich geh mal davon aus beim 2DDA hast du dich beim A vertippt,

Ja. 4 und A sehen sich irgendwie so ähnlich.

> Frage wo steht das mit dem 2DD4

RF12 Datenblatt, Seite 18 unter 7. FIFO and Reset Mode Command.

> und fängt er dann erst zu senden an oder der
> empfänger erst zum "empfangen" bzw das empfangen als Daten anzusehen?

Er beginnt erst nach dem Empfang von 2DD4 mit dem Füllen des FIFOs.

> Naja ich meinte das die Zwei Schritte auch nur mit 0xCA83 gemacht werden
> könnten da ja beim  1 --> 001, 3--> 011, immer das erste Bit gesetzt
> wird.

Es geht darum, dass ff bit (Bit 1) zurücksetzen, damit die Syncword 
Erkennung neu gestartet wird. Man muss also beide Befehle ausführen, 
damit es funktioniert.

von Michael K. (manhunt)


Lesenswert?

Gut Danke die Fragen habe ich jetzt verstanden.

Nun bleibt nur mehr die Frage zum FIFO.

Frage Benedikt, wie müsste der Ablauf aussehen wenn ich das Ganze ohne 
Polling realisieren würde.

Würde das dann so aussehen das vom nIRQ die Anfrage nach dem Nächsten 
Bit zum senden kommt und vom nInt die Meldung das ein neues Bit anliegt?
Bzw was müsste ich spezielle einstellen?

lg Michael

von Benedikt K. (benedikt)


Lesenswert?

Am einfachsten geht das über den FFIT Pin: Dieser geht auf high, sobald 
Daten im FIFO sind. Diesen muss nur nur an einen externen Interrupt Pin 
legen.

von Michael K. (manhunt)


Lesenswert?

Hallo


Thx, also der FITT geht auf High wenn Daten zum auslesen da sind, aber 
wie bekomme ich mit ob ich mehr Daten in den FiFo zum schreiben Platz 
haben?

Oder ist das abhängig davon ob RX oder TX aktiv ist?


LG, Michael

von Robert K. (mr_insanity)


Angehängte Dateien:

Lesenswert?

Hallo Forum,

ich versuche nun auch seit einiger Zeit die RFM12 zum laufen zu bringen 
und zwar mit zwei Pollin-Boards.
Ich habe Benedikts Code ein klein wenig geändert. Es sollte bei 
Betätigen des Tasters auf dem Senderboard eine 1 gesendet werden. Wenn 
diese empfangen wird sollte auf dem Empfängerboard eine LED kurz 
aufleuchten. Danach sollte die LED noch einmal, zur Bestätigung des 
Programmdurchlaufes, aufleuchten.
Die LED leuchtet aber nur einmal auf. Der Empfänger empfängt also etwas 
aber nur nicht die gewollte 1.
Ich habe nun keinen blassen Schimmer wo der Fehler liegt. Ich hoffe ihr 
könnt mir helfen.
Den Code habe ich mal in den Anhang getan, damit das hier nicht zu lang 
wird.

MfG
Robert

von Benedikt K. (benedikt)


Lesenswert?

Das geht dann mit dem nIRQ Pin: Dieser geht auf Low, sobald sich 
irgendwas im RFM12 tut. Wenn man mehrere Interruptquellen hat, dann muss 
man erst den Status auslesen um festzustellen was den Interrupt 
ausgelöst hat.

von Michael K. (manhunt)


Lesenswert?

Ok, aber wofür ist dann der nINT?

Damit sich der nIRQ Rührt muss ich also nix tun/einstellen.

Also ich geh dann mal Testen.

Danke für die Hilfe.

Michael

von Manuel S. (thymythos) Benutzerseite


Lesenswert?

> Ok, aber wofür ist dann der nINT?

Steht auch im Datenblatt. Der nINT ist ein Eingang und kann über das 
Statusregister des RFM12 abgefragt werden.

von Benedikt K. (benedikt)


Lesenswert?

Michael Graßl wrote:
> Ok, aber wofür ist dann der nINT?

Das ist ein Interrupt Eingang, den braucht man eigentlich nicht.

von Christoph db1uq K. (christoph_kessler)


Lesenswert?

Kann man den Frequenzhub verringern, indem man den Quarz wechselt?
Ich habe mal ausgerechnet, dass ein Quarz von etwa 4,75MHz bei 
Einstellung auf das 915 MHz-Band Sendefrequnezen zwischen 427 und 441 
MHz erlauben würde. Allerdings steht im Datenblatt was von min. 8 MHz.
Damit würde sich der große Frequenzhub von mind. 30 kHz auf weniger als 
die Hälfte verringern, was eher amateurfunküblichen Bandbreiten 
entspricht. Mit einem 5 MHz Quarz ginge immerhin 430,24 - 439,76 also 
fats das ganze Amateurband, bei 15 kHz Hub

von Robert K. (mr_insanity)


Lesenswert?

Hat denn keiner eine Idee zu meinem Problem?

von Mike K. (1tester)


Angehängte Dateien:

Lesenswert?

Hallo

Ich habe ein Problem bei der Initialisierung meiner Module. Und zwar 
habe habe ich 2 rfm12 module aufgebaut eines auf einem Pollinboard und 
eines auf einer eigen Kontstruktion.

Nun je nach Gemütszustand  der Module initialisieren sie oder nicht.

Wenn ich mir das ganze am Oszi anschaue Sehe ich je nachdem eine 
Frequenz mit einer länge vom 1000ns bzw 10mhz (das sollte wohl so sein) 
oder eben nur irgend ne Schwingung mit 100ns länge. (Siehe Bild)

Frage ist das normal wenn die Module nicht initialisieren bzw ist diese 
Frequenz normal?

Achja übertragen habe ich bis jetzt auch noch nichts erfolgreich. Dazu 
hätte ich jedoch eine Frage wenn ich 15 mal ein 'T' übertrage und zum 
schluß ein \n aber nur ein T einlese bleibt der Rest im rfm12 bzw wie 
groß ist der Buffer im rfm12?

lg Michael

von Vajk .. (vajk)


Lesenswert?

> Nun je nach Gemütszustand  der Module initialisieren sie oder nicht.

zu meinem Frust, habe ich das auch so erlebt ... bis ich in einer
der letzten elrads gelesen habe, daß die keinen langsamen Stromanstieg
a la Netzteil mögen .. sprich man sollte sie mit einem Transistor als 
Schalter via uC "an" machen ... sprich der Powerup-Reset braucht eine 
steile Flanke.

Viel Erfolg
Vajk

von Benedikt K. (benedikt)


Lesenswert?

Vajk .v.i. wrote:

> bis ich in einer der letzten elrads gelesen habe,

http://de.wikipedia.org/wiki/Elrad
Solange gibts die RFM12 doch noch garnicht.


> daß die keinen langsamen Stromanstieg
> a la Netzteil mögen .. sprich man sollte sie mit einem Transistor als
> Schalter via uC "an" machen ... sprich der Powerup-Reset braucht eine
> steile Flanke.

Habe ich bisher noch nie drauf geachtet und hatte noch nie Probleme 
damit.
Wartest du vielleicht nach dem Einschalten vielleicht nicht ausreichend 
lange bis das Modul bereit ist?

von Mike K. (1tester)


Lesenswert?

Hallo


Ich habe gerade festgestellt das die module auch dann einen 10mhz takt 
ausgeben wenn ich Sie mitten im Programm per nRes auf low ziehe, dann 
ist für die Dauer von low keine Frequenz mehr da aber dann kommt Sie 
wieder.

Frage ist eine Frequenz von 10mhz kein Anzeichen für eine geglückte 
Initialisierung?

PS: Meine erste überlegung war nicht das Schalten per Transistor sondern 
das Reseten per µC. Einfach als Ausgang definieren und dann bei Zeiten 
von High auf low switchen....

lg michael

von Mike K. (1tester)


Lesenswert?

edit: Gut Beitrag bearbeiten geht anscheinend nach X min nicht mehr.

So, ich habe Folgendes heraus gefunden das rfm12 modul gibt 
standardmäßig 10mhz aus, nur nach meiner Initialisierung wird es so ein 
müll....ich geh mal alle Pins nachmessen...

lg Michael

von Mike K. (1tester)


Lesenswert?

Hallo

Ich komme einfach nicht weiter, frage könnte mal jemand von euch einen 
Foto machen was bei euch am CLK rauskommt bei erfolgreicher 
Initialisierung?

edit: Ich weiß es hört sich Blöd an, Foto -> Screenshot vom Oszi.*nicht 
das mir einer den Pin Fotografiert.... ;-)

Lg, Michael

von Benedikt K. (benedikt)


Lesenswert?

Mike K. wrote:
> könnte mal jemand von euch einen
> Foto machen was bei euch am CLK rauskommt bei erfolgreicher
> Initialisierung?

Für was brauchst du ein Foto? Selbst ohne Bild solltest du doch 10MHz 
von 1MHz auf dem Oszi unterscheiden können...

Dein Bild sieht gut aus:
http://www.mikrocontroller.net/attachment/46526/init.jpg
Das 1MHz Signal ist ein recht sauberes Rechteck, das 10MHz Signal ist 
mehr oder weniger (je nach kapazitiver Last) verrundet. Ähnlich sieht es 
bei mir auch aus.

Nach dem Einschalten:
1MHz -> gut
Nach dem Senden des Befehls der auf 10MHz umschaltet (also nach der 
rf12_init():
10MHz -> gut
1MHz -> schlecht

Wenn die 10MHz rauskommen, dann ist zumindest die SPI Verbindung zum 
RFM12 in Ordnung.

von Mike K. (1tester)


Lesenswert?

Hallo


Danke sehr ich wollte nur die Bestätigung das die runde Frequenz passt.


Lg, Mike

von Florian R. (Firma: TU Wien) (frist)


Lesenswert?

Hallo,
ich werde jetzt auch mal ein paar Experimente mit den Modulen starten 
und natürlich würde ich gern auf den hier geposteten Code zurückgreifen. 
Mit welchen AVRs verträgt sich der den reibungslos oder zumindest mit 
wenig Anpassungen? Ich fürchte ich brauch etwas mehr Speicher als die 2k 
des ATTiny2313. Es soll aber ein Tiny werden, das es um eine 
betteriebetreibene Fernsteuerung geht. Ein paar ATTyiny45 hätte ich da, 
aber der hat zu wenig IOs.

Ich frag nur, weil ich mir nämlich neulich selber mal ein Bein gestellt 
haben, mit dem Beschluss ein Projekt von einem ATMega32 auf ATMega644 
portiert, was überraschend viel Arbeit war.

Grüße
Flo

von Benedikt K. (benedikt)


Lesenswert?

Florian Rist wrote:

> Mit welchen AVRs verträgt sich der den reibungslos oder zumindest mit
> wenig Anpassungen?

Der Code mit Software SPI ist auf einem tiny2313 und die Versionen mit 
Hardware SPI auf einem mega8 entwickelt.
Von der Größe her sollte ein tiny2313 aber für alles reichen, auch von 
der Geschwindigkeit her.
Nur wenn man die Sendedaten (z.B. aus einem UART Datenstrom) puffern 
muss, dann sind die 128Byte SRAM schnell verbraucht.

von Florian R. (Firma: TU Wien) (frist)


Lesenswert?

Hallo Benedikt

> Der Code mit Software SPI ist auf einem tiny2313 und die Versionen mit
> Hardware SPI auf einem mega8 entwickelt.

OK. Danke.

> Von der Größe her sollte ein tiny2313 aber für alles reichen, auch von
> der Geschwindigkeit her.

Braucht das Funkmodul eigentlich auf der Sendeseite eine bestimmte 
mindest Geschwindigkeit, oder könnte ich da mit der Taktfrequenz quasi 
beliebig weit nach unten gehen?

> Nur wenn man die Sendedaten (z.B. aus einem UART Datenstrom) puffern
> muss, dann sind die 128Byte SRAM schnell verbraucht.

Das muss ich nicht, also sind die 128 Byte wohl auch kein Problem

Grüße
Flo

von Benedikt K. (benedikt)


Lesenswert?

Florian Rist wrote:

> Braucht das Funkmodul eigentlich auf der Sendeseite eine bestimmte
> mindest Geschwindigkeit, oder könnte ich da mit der Taktfrequenz quasi
> beliebig weit nach unten gehen?

Was meinst du mit Taktfrequenz? Der 10MHz Takt wird von dem Modul 
selbst. Die Baudrate kann man an sich beliebig wählen, wenn man das FIFO 
verwendet gibt es ein paar Grenzen aufgrund des begrenzten Teilerfaktor. 
Wenn man das FIFO nicht verwendet, kann man die Baudrate an sich 
beliebig lang machen (auch wenn dies wenig Sinn hat).

von R. M. (rmax)


Lesenswert?

Benedikt K. wrote:

> Was meinst du mit Taktfrequenz?

Ich denke, er meint den SPI-Takt.

von Florian R. (Firma: TU Wien) (frist)


Lesenswert?

Hallo

> Ich denke, er meint den SPI-Takt.

Genau. Und damit indirekt auch den Takt des µCs. Ich dachte mir ich 
versuche es mit weniger als den üblichen 10 MHz, um Strom zu sparen. 
Allerdings ist es wohl auch kein Problem mit 10 MHz zu leben der µC wird 
je eh die meiste Zeit in Tiefschlaf verbringen und so praktisch keinen 
Strom verbrauchen.

Grüße
Flo

von Manuel Stahl (Gast)


Lesenswert?

Der einzig limitierende Faktor ist die Geschwindigkeit mit der du Daten 
rein fütterst. Das muss schnell genug gehen damit der Sendefifo nicht 
leer läuft.

von Mike K. (1tester)


Lesenswert?

AHM....japadabadu....es lebt/sendet/empfängt.

Danke für die Hilfe und für den Code Benedikt.

edit: ahm wie ich den Fehler gefunden habe?

Nun ich habe alle Kabel nochmal nachgesteckt, dann haben beide Module 
initialisiert, dann habe ich beide Module etwas senden lassen, eines der 
beiden Module ist beim senden in ne Endlosschleife gekommen (aktiviertes 
led ging nicht aus), das war für mich defekt, nach einem Wechsel gings 
dann fast auf Anhieb da es noch Probleme mit der Stromversorgung 
gab....

lg mike

von Mike K. (1tester)


Lesenswert?

Hallo


ich habe eine Frage wie wirkt es sich aus wenn ich CS dauerhaft auf 
Masse ziehe, da es ja eigentlich mein eingziger spi slave ist?

Bzw würde das Probleme beim Programmieren des AVR uCs per SPI bringen?

lg Mike

von Benedikt K. (benedikt)


Lesenswert?

Mike K. wrote:
> ich habe eine Frage wie wirkt es sich aus wenn ich CS dauerhaft auf
> Masse ziehe, da es ja eigentlich mein eingziger spi slave ist?

Ich habe es noch nicht ausprobiert, aber vermutlich ja, da der RF12 
daran das Ende/den Anfang eines Befehls erkennt.

> Bzw würde das Probleme beim Programmieren des AVR uCs per SPI bringen?

Definitiv ja, denn dann ist SDO dauerhaft aktiv. Selbst mit am µC 
angeschlossenem CS gibt es oft Probleme wenn kein Pullup an CS ist. 
Ansonsten floated der beim Programmieren und ist dann eventuell auf Low.

von Mike K. (1tester)


Lesenswert?

Danke für die Hilfe zu später Stunde.

lg mike

von Jörn A. (joern_)


Lesenswert?

Hy

ich konnte bis jetzt im Forum leider kein Hilfe dazu finden.

Ich kommuniziere zur Zeit zwischen zwei/drei RFM12.

Ich habe eine Basisstation, die mehrere Außenstationen abfragt. Dazu 
wird jeweils eine ID versendet und wenn die Außenstation die hat 
antwortet sie. So wollte ich doppeltes senden verhindern.

loop
[
send( ID0)
recieve()
send( ID1)
recieve()
send( ID2)
recieve()

]

Das ganze funktionert perfekt aber ich wollte mal testen was passiert, 
wenn der z.B. ID1
z.B. durch Störungen nicht antwortet. habe ihn daher für 10 Sekunden
ausgeschaltet.... das Programm sollte die dann überspringen und noch die 
anderen Stationen abfragen können.

Leider sendet meine Basisstation nicht mehr raus, nachdem er einmal 
keine Antwort vom einer Außenstation bekommen hat! Die Außenstation 
funktioniert wunderbar aber die Basisstation erst wieder nach einem 
Reset(komplett Strom an/aus).

Damit er nicht in der Recieve Schleife hängen bleibt ( falls nur ein 
Slave nicht geht) und ewig wartet habe ich den Timer zugeschaltet.
Dieser wird vor jeder Empfangsfunktion immer Timer =0 gesetzt. Der Timer 
zählt
per ISR hoch und nach 5 Sekunden, wenn nichts kommt, bricht er mit break 
ab siehe Code....

Mit dem Timer läuft es auch wunderbar weiter in einer Schleife aber er 
sendet einfach
nicht mehr, sobald einmal keine Antwort kam. Das ist dann leider das
Ende der Kommunikation da ohne Befehl keine Antwort mehr vom allen 
Außenstationen kommt :D

das habe ich hinzugefügt:


void rf12_ready(void)
{
cbi(RF_PORT, CS);
  while (!(RF_PIN&(1<<SDO))) // wait until FIFO ready
  {
    if (Timer > 10)
    {
    error=1;
    break;
    }
  }
}

auch der Versuch vor jedem senden eine neue INIT durchzuführen hat nicht 
geholfen. bleibt der RFM12 irgendwie hängen?

von Mike K. (1tester)


Lesenswert?

Hallo

Ich habe jetzt das DB des rf12 3 mal durchkämmt aber finde die max SPI 
frequenz nicht...

Könntet ihr mir da kurz helfen, ich vermute derzeit 10mhz/4 gehe ich da 
richtig?

lg mike

von Manuel Stahl (Gast)


Lesenswert?

Das kommt ganz gut hin. 4 MHz könnten gerade noch gehen.

von Mike K. (1tester)


Lesenswert?

Hallo

ähm 10/4 = 2,5mhz....

Der rf12 läuft ja mit 10mhz und bei 4mhz wäre der Teilungsfaktor ja 2.5 
wovon ich aber noch nichts gehört habe oder ist das beim rf12 anders als 
bei atmel pic und co?

lg mike

von Benedikt K. (benedikt)


Lesenswert?

Es gibt 2 Grenzwerte:
Einmal die normalen Register, für die nur die man nur das Timing aus dem 
Datenblatt einhalten muss, und dann noch das Auslesen/Beschreiben des 
FIFOs das auf 10MHz/4 begrenzt ist. Das ist eine gemeine Falle.

von Mike K. (1tester)


Lesenswert?

Hallo

Danke für die Hilfe, frage weißt du zufällig wo ich die Timing zeiten 
der Register finde. Bzw kannst du mir sagen ob es viele Probleme gibt 
wenn ich an die grenze von 2.5mhz gehe weil du hast da sicher schon mehr 
Erfahrung.


Edit: noch etwas im DB meines Atm168 habe ich das CPHA bit entdeckt für 
SPI, nun bei folgendem Absatz steige ich aus, frage was macht der sp12 
schickt er die Daten schon bei der steigenden oder erst bei der 
fallenden Flanke?

Bit 2 – CPHA: Clock Phase
The settings of the Clock Phase bit (CPHA) determine if data is sampled 
on the leading (first) or
trailing (last) edge of SCK. Refer to Figure 18-3 and Figure 18-4 for an 
example. The CPOL
functionality is summarized below:


lg tester

von Benedikt K. (benedikt)


Lesenswert?

Mike K. wrote:
> Danke für die Hilfe, frage weißt du zufällig wo ich die Timing zeiten
> der Register finde.

RF12 Datenblatt Seite 13.

> Bzw kannst du mir sagen ob es viele Probleme gibt
> wenn ich an die grenze von 2.5mhz gehe weil du hast da sicher schon mehr
> Erfahrung.

Wenn die 2,5MHz wirklich kleiner/gleich als die 10MHz/4 sind, gibt es 
keine Probleme (das ist zum Beispiel der Fall, wenn man den RFM12 Takt 
als AVR Takt verwendet). 8MHz/4 (interner 8MHz Oszillator) habe ich auch 
schon probiert, das geht auch ohne Probleme.

> Edit: noch etwas im DB meines Atm168 habe ich das CPHA bit entdeckt für
> SPI, nun bei folgendem Absatz steige ich aus, frage was macht der sp12
> schickt er die Daten schon bei der steigenden oder erst bei der
> fallenden Flanke?

Der RF12 schickt die Daten bei der fallenden Flanke raus, und liest bei 
der steigenden Flanke ein. Somit kommen nur die SPI Modi 0 und 2 in 
Frage.
Da laut dem Timingdiagramm auf Seite 13 CLK zu Beginn und am Ende Low 
ist, muss CPOL 0 sein. Somit bleibt nur SPI Mode 0 übrig.

von Mike K. (1tester)


Lesenswert?

Hallo


Danke für die Hilfe, eine Frage hätte ich noch, der rf12 idelt bei SCK 
High oder?

PS: die Skizze auf seite 13 verstehe ich zwar nicht ganz aber der clock 
da ist mit 2mhz eingezeichnet.... deshalb und auf grund deines Beitrags 
nehme ich das mal als Grenzwert....


lg tester

von Werner B. (werner-b)


Lesenswert?

@Jörn Ahrens,

solltest du im Fehlerfall nicht CS wieder wegnehmen?
1
void rf12_ready(void)
2
{
3
  RF_PORT &= ~(1<<CS);
4
  while (!(RF_PIN&(1<<SDO))) // wait until FIFO ready
5
  {
6
    if (Timer > 10)
7
    {
8
       RF_PORT |= (1<<CS);
9
       error = 1;
10
       break;
11
    }
12
  }
13
}

von Jörn A. (joern_)


Lesenswert?

Guten Morgen

ich hatte das Problem zusammen mit der schnellen Hilfe von Benedikt 
lösen können.
Ich nutze einen Timer um ein ewiges warten ohne Antwort zu vermeiden. 
Funktioniert mitlerweile auch wunderbar aber hatte leider Timer = 0 an 
der falschen Stelle im Code in der TX Funktion... dadurch hat er nach 
einmal Abbruch in der RX nicht mehr gesendet...

in der

void rf12_txdata(unsigned char *data, unsigned char number)
1
{ unsigned char i;
2
Timer=0;                                        // hier Soll es hin = funktioniert
3
rf12_trans(0x8238); // TX on
4
rf12_ready();
5
rf12_trans(0xB8AA);
6
rf12_ready();
7
rf12_trans(0xB8AA);
8
rf12_ready();
9
rf12_trans(0xB8AA);
10
rf12_ready();
11
rf12_trans(0xB82D);
12
rf12_ready();
13
rf12_trans(0xB8D4);
14
Timer=0;                                        // hier war es zuerst = Fehler
15
for (i=0; i<number; i++)
16
{ rf12_ready();
17
rf12_trans(0xB800|(*data++));
18
}
19
rf12_ready();
20
rf12_trans(0x8208); // TX off
21
}
22
23
void rf12_rxdata(unsigned char *data, unsigned char number)
24
{ unsigned char i;
25
rf12_trans(0x82C8); // RX on
26
rf12_trans(0xCA81); // set FIFO mode
27
rf12_trans(0xCA83); // enable FIFO
28
Timer=0;
29
for (i=0; i<number; i++)
30
{ rf12_ready();
31
*data++=rf12_trans(0xB000);
32
}
33
rf12_trans(0x8208); // RX off
34
}

von Stefan F. (feissy)


Lesenswert?

hallo,
ich habe mir letzte woche auch die beiden Funkmoduloe von pollin gekauft 
RFM01 und RFM02 und jetzt möchte ich das so haben, dass ich an den 
atmega8 vom sendemodul einfach 8 taster an die pins pd0 bis pd7 hänge 
und dann damit 8 ausgänge auch pd0 bis pd7 am anderen atmega8 des 
empfangmoduls steuern kann.

ist das mit deinem programm ( von benedikt ) so ohne weiters möglich?

schon mal danke für eure hilfe

Stefan

von Gerrit G. (liggi)


Lesenswert?

du kannst die zustände der Ports in einem Char speichern und den dann 
sende. Der andere Atmega setzt die Port dann entsprchend des Chars. Man 
müsste sich nur noch eine Fehlerüberprüfung überlegen.

mfg Gerrit

von Stefan F. (feissy)


Lesenswert?

was bedeutet das denn

Man müsste sich nur noch eine Fehlerüberprüfung überlegen.

????? ich hab nämlich nich sooo viel die anhung davon ;-)
mfg

von Gerrit G. (liggi)


Lesenswert?

soweit wie ich weiß, ist in dem Programm keine Fehlerüberprüfung, wie 
zum
Beispiel eine Hash. Bei so wenigen Daten, könnte man sie auch einfach 
mehrmals senden. Desweitern könnte man auch noch ein Byte dranhängen, 
das dafür sorgt, dass die Summe der gesetzten Bits z.B. gerade ist.
Hier sind noch ein paar andere Beispiel und Anregungen:
http://de.wikipedia.org/wiki/Pr%C3%BCfsumme

von Benedikt K. (benedikt)


Angehängte Dateien:

Lesenswert?

Wenn es auch RFM12 sein dürfen, dann hätte ich hier noch etwas:

Diese Software überträgt beliebige Datenpakete in beide Richtungen, 
inkl. Fehlerprüfung und Empfangsbestätigung. Es wird auch automatisch 
eine bestimmte Anzahl an erneuten Sendeversuchen unternommen, falls es 
das erste mal nicht klappt. Der Erfolg der Übertragung wird von der 
Funktion zurückgeliefert.
Das ganze ist eine Verallgemeinerung der RS232 Funkbrücke. Da ich das 
ganze allgemein halten wollte, verwende ich außer einem Timer Interrupt 
für die Timeouts keine weiteren Interrupts. Daher muss man regelmäßig 
die Empfangsroutine aufrufen.

von feissy (Gast)


Lesenswert?

also wenn ich mir quasi 2 rfm12 funkmodule besorge und dann dein 
beispiel c-code auf die atmega8 aufspiele, kann ich so die ports pd0 bis 
pd7 auf den jeweils anderen atmega 8 ausgeben???
mfg

von Benedikt K. (benedikt)


Lesenswert?

Ja, so in etwa.
Du musst dann halt anstelle der uart_getchar() Funktion den Port 
einlesen und anstelle der uart_putc() den Port beschreiben.
Um so wenig wie möglich zu senden wäre es z.B. gut wenn man nur nach 
Änderungen an den Eingängen einen neuen Wert sendet, also so in etwa:
1
unsigned char lastpins=0;
2
for (;;)
3
{  unsigned char pins;
4
   check_rx_packet();
5
   pins=PIND;
6
   if (pins!=lastpins)
7
   {  tx_data(&pins,1));
8
      lastpins=pins;
9
   }
10
}

von feissy (Gast)


Lesenswert?

also heißt das so
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
#include <avr/pgmspace.h>
4
#include <avr/eeprom.h>
5
#include <stdlib.h>
6
#include <portbits.h>
7
#include "global.h"
8
#include "uart.h"
9
#include "rf12.h"
10
#define F_CPU 10000000UL
11
#include <util/delay.h>
12
13
#define RF_BAUDRATE    15000    // Baudrate des RFM12
14
15
unsigned char lastpins=0;
16
for (;;)
17
{  unsigned char pins;
18
   check_rx_packet();
19
   pins=PIND;
20
   if (pins!=lastpins)
21
   {  tx_data(&pins,1));
22
      lastpins=pins;
23
   }
24
}

und wenn ich das dann auf beiden atmegas aufspiele müsste das 
funktionieren???
sorry wenn ich nerve aber ich hab da nicht so wirklich die ahnung von 
;-)
mfg schönen abend noch

von Benedikt K. (benedikt)


Lesenswert?

Nein, nicht ganz.
Die Initialisierung brauchst du schon noch.
Weiterhin müssen beim Empfänger die Daten auch noch wieder an die Pins 
ausgegeben werden.

von feissy (Gast)


Lesenswert?

also so :
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
#include <avr/pgmspace.h>
4
#include <avr/eeprom.h>
5
#include <stdlib.h>
6
#include <portbits.h>
7
#include "global.h"
8
#include "uart.h"
9
#include "rf12.h"
10
#define F_CPU 10000000UL
11
#include <util/delay.h>
12
13
#define RF_BAUDRATE    15000    // Baudrate des RFM12
14
15
unsigned char data[128];
16
unsigned char tdiv=30;
17
unsigned char lastpins=0;
18
19
20
int main(void)
21
{  PORTB=1;
22
  PORTD=31;
23
  DDRC=63;
24
  DDRD=238;
25
26
  sei();
27
28
  rf12_init();                      // RF12 + IO Ports initialisieren
29
    uart_init(UART_BAUD_SELECT(19200, F_CPU));
30
  rf12_config(RF_BAUDRATE, RF12FREQ(433.92), 0, QUIET);  // Baudrate, Frequenz, Leistung (0=max, 7=min), Umgebungsbedingungen (QUIET, NORMAL, NOISY)
31
  rf12_rxmode();                      // Empfang starten
32
33
  for (;;)
34
35
{  unsigned char pins;
36
   check_rx_packet();
37
   pins=PIND;
38
   if (pins!=lastpins)
39
   {  tx_data(&pins,1));
40
      lastpins=pins;
41
   
42
       }
43
44
    }
45
  }
46
}

für das sdendemodul???
mfg

von Benedikt K. (benedikt)


Lesenswert?

Jetzt noch PortD auf Eingang und die uart_init entfernen (da hier kein 
UART gebraucht wird) und das ganze sollte funktionieren.

von Schorsch (Gast)


Lesenswert?

Salú!

Kann mir mal eben einer sagen, ob die reine Datenübertragung bei im mit 
dem Code vom Benedikt funktioniert? Ich meine damit alle Daten, >= 0x80. 
Bei mir funktioniert die Sache nämlich nur, solange ich mich auf die 
Übertragung vom kleinen ASCII-Zeichnsatz beschränke (also bis Dezimal 
126) beschränke. Das sehr zuverlässig. Alles drüber, bringt Mist.

Danke und Gruß

von Benedikt K. (benedikt)


Lesenswert?

Es sollte eigentlich funktionieren.
Verwendest du zufällig die Software von ganz oben? Die hat nämlich ein 
paar kleinere Bugs die u.a. sowas bewirken können.
Die neueren Versionen funktionieren aber definitiv mit allen Werten. Man 
muss nämlich u.a. bei den Werten 0x00 und 0xFF dafür sorgen, dass nie 2 
oder mehr solcher Werte aufeinander folgen.

von Schorsch (Gast)


Lesenswert?

Wieso soll man dafür sorgen müssen?. Die Übertragung von zweimal 0x00 
hintereinander funktioniert bei mir ganz wunderbar. Ist auch laut 
Datenblatt kein Problem.

Welche Software soll ich stattdessen verwenden?

von Schorsch (Gast)


Lesenswert?

Hallo Benedikt,

ich habs gerade nochmal getestet - zweimal 0x00 hintereinander gibt 
keine Probleme. Erste wenn ich 0x80 oder etwas darüber sende gibts Zoff.

Ich verwendet Deinen Code, hab ich aber auf HW-SPI umgebaut, weil ich 
kein Freund von wechselndem Timing im Clock bin. Fahr auch gut so.

Bis auf die "Kleinigkeit" eben...

Gruß
Schorsch

von Benedikt K. (benedikt)


Lesenswert?

Schorsch wrote:
> Wieso soll man dafür sorgen müssen?.

Ganz einfach:
Der RF12 synchronisiert anhand der Flanken vom Signal seine Baudrate. 
Wenn lange Zeit keine Flanken vorhanden sind (also bei 0 und bei 255), 
kann es sein, dass die Baudrate wegdriftet und ein Bit übersprungen oder 
doppelt eingelesen wird.
Da 0 ein Wert ist, der bei der Messwertübertragung durchaus häufiger 
vorkommt als andere Werte, ist dies schnell passiert.

Das das Problem exakt ab 0x80 auftritt klingt stark nach einem Fehler im 
Code. Zeig mal die komplette Software.

von Ulrich M. (Gast)


Lesenswert?

Hallo zusammen,

ich teste gerade mit einem Evaluations-Board V1.2 von Pollin die 
Funkmodule RFM12. Das System läuft aber nur sporadisch.
Es kommt häufig vor, dass das RGIT-Bit nach einem transmitter register 
write command nicht gesetzt ist.
Es wird die Funktion rf12_ready benutzt, das Programm hängt dann in dem 
while.

Mit dem Command status read kann man sehen, dass nach dem power on nur 
das POR-Bit gesetzt ist und kein anderes Bit im Status-Word.

Die sonstige Kommunikation zu dem RFM12 scheint ok, ich habe das mit dem
Befehl „low battery and microcontroller clock divider command“ getestet. 
Es ist immer möglich den clock output einzustellen und dies mit einem 
Scope zu prüfen.

Vielleicht kann mir jemand helfen wo ich das Problem suchen kann.

von Joern_A (Gast)


Lesenswert?

aso also wenn ich als erstes eine Null übertrage kann es sein, das es 
nicht registriert wird?

von Mike K. (1tester)


Lesenswert?

Hallo

leider bin erst dieser Tage dazu gekommen mich mit Hardware SPI zu 
beschäftigen.

Nun habe ich Prompt das erste Problem ich bin zu schnell aber nochmal 
von vorne:

Der hardware SPI Takt is 1MHZ (8mhz clock und SPI2X und SPR0 sind 
gesetzt)

Nun wenn ich einen Befehl einzeln Absetze zb den für 10mhz clock 
funktioniert alles nur wenn ich mehrere Parameter hintereinander Abgebe 
scheint es als würde er diese nicht erkennen.


zum versenden der einzelnen Daten habe ich die Funktion

unsigned char spi_transresive(unsigned char data) {


  unsigned char resive=0;
  SPCR &= ~(1<<SPIE);

  SPDR = data;
    while(!(SPSR & (1<<SPIF)))
      ;
  resive = SPDR;
    SPCR |= (1<<SPIE);
    return resive;

  }

Diese Funktion rufe ich 2mal auf beginnent mit dem High teil...

Nun habe ich die funktion um einen teil erweitert und zwar wurde die 
while bedingung erweitert um: && !(SPI_PIN&(1<<SPI_MISO))
Nun hat es aber anstandslos Funktioniert.

Mein Problem ist nun das diese Arbeit später von einem Interrupt 
übernommen werden soll weshalb ich diese erweiterung nicht brauchen kann 
irgend und nur SPIF reichen sollte.

Hat irgenjemand eine Idee was bei mir flash ist. (wie gesagt prinzipiell 
funktionierts)

PS: Ich habe auch schon 1ms warten zwischen den Paramtern Probiert geht 
auch wunderbar....


lg mike

von Sebastian (Gast)


Lesenswert?

Hallo,

ich habe Benedikts Schaltung und Code übernommen, aber bekomme keine 
fehlerfreie Komunikation zwischen meinem RFM12 (als Sender) und RFM01 
hin. Sender und empfänger bekommen die richtige Initalisierung. Sobald 
der Sender angeschlossen ist, kommen Daten beim Empfänger an, aber diese 
sind leider nicht die gesendeten, sonder zufällig auftretende Bits. 
Vielleicht ist es ein Timingproblem oder einer der Chips ist einfach 
kaputt. Ich habe leider nicht soviel Erfahrung und weiß nicht, wo ich 
weiter nach einem Fehler suchen kann?

Danke und frohe Ostern
Sebastian

von Karl-heinz H. (kalliheinzi)


Lesenswert?

@Benedikt...

Erstmal herzlichen Dank für dein tolles Programm..
es läuft sehr zuverlässig.
Ich meine dieses : rfm12_just_rxtx.zip

Ich benutze allerdings die RFM12B-Dip Module mit 868 Mhz und 3,3Volt.
Die Module habe ich erstmal zur Probe mit Widerständen (1,8 und 3,3KOhm)
auf 5Volt angepasst.Klappt auch sehr gut.

Als IDE benutze ich AvrStudio und habe dein Programm hier entsprechend
angepasst.Dabei ist mir folgendes aufgefallen :

extern void rx_packet(void);

...hast du wohl im Eifer des Gefechts vergessen im rf12-header
einzutragen- AvrStudio hat gemeckert.

rf12_trans(0x80D7);// Enable FIFO

müsste aber heissen :

rf12_trans(0x80D7);//433 MHz EL,EF,11.5pF

Ist mir aber nur aufgefallen, weil ich die 868-Module habe und Diese
zu Anfang nur in unmittelbarer Nähe funktioniert hatten.
Habe ich übersehen, weil da " Enable FIFO " stand. :)
Man überliest es leicht.

für 868Mhz : rf12_trans(0x80E7);//868 MHz EL,EF,11.5pF

soweit - sogut - es klappt ja alles...

was ich aber nicht verstehe und im mom noch nicht nachvollziehen
kann - ist :

Warum brauchen die Module ca.30 sec. um sich zu synchronisieren ???

danach läuft die Übertragung perfekt - sogar aus meinem Garten.

Vorher habe ich mit dem Pollin-programm gespielt und es auch
zum Laufen bekommen. Hier finden sich die Module sofort.
Aber es arbeitet halt mit INT0.

Sag' jetzt bitte nicht - dann nimm das doch. :)

Da du wesentlich mehr Erfahrung mit den Dingern hast- als ich, würde ich
gerne wissen, warum das so ist ???

Mein Ziel ist eine Fernbedienung für eine selbstgebaute 5zu1-Anlage.
Deswegen muss der avr im Sender auch schlafen gelegt werden können,
um Batteriegerecht zu werden.

lg
kalliheinzi

von Manuel Stahl (Gast)


Lesenswert?

> Nun wenn ich einen Befehl einzeln Absetze zb den für 10mhz clock
> funktioniert alles nur wenn ich mehrere Parameter hintereinander Abgebe
> scheint es als würde er diese nicht erkennen.

Zwischen den Einzelbefehlen muss das Chip-Enable deaktiviert und wieder 
aktiviert werden. Wenn du länger wartest, tritt halt ein Timeout auf und 
deswegen geht's auch.

von Christian L. (quadratqualle)


Lesenswert?

Hallo

weiß jemand was die aktuelle funktionierende Version für den rm12 und 
rm01 ist?

mfg quadratqualle

von Benedikt K. (benedikt)


Lesenswert?

Von mir gibt es eigentlich nur recht wenige Versionen. Hier die beiden 
die ich empfehlen kann:

Eine einfache Testversion mit Software SPI, ideal für die ersten 
Versuche mit dem RFM12:
Beitrag "Re: Beispielprogramm für RFM12 433MHz Funk-Module"

Bidirektionale Übertragung inkl. Empfangsbestätigung (nicht unbedingt 
gut zum Verstehen geeignet, eher zum Anwenden):
Beitrag "Re: Beispielprogramm für RFM12 433MHz Funk-Module"

RFM01 und RFM02 verwende ich nicht mehr, daher gibt es davon nur je eine 
Version die nicht perfekt ist, aber funktionieren sollte.

von Mike K. (1tester)


Lesenswert?

Hallo


Frage kann ich dem RFM12 nachdem ich meine Daten erhalten habe sagen 
Danke das wars jetzt such wieder nach start Bytes?

Weil bis jetzt habe ich immer das Senden aktiviert und dann wieder auf 
empfangen umgeschalten...

Lg mike

von Benedikt K. (benedikt)


Lesenswert?

Mike K. schrieb:

> Frage kann ich dem RFM12 nachdem ich meine Daten erhalten habe sagen
> Danke das wars jetzt such wieder nach start Bytes?

Ja. Anders gehts auch garnicht, denn der RF12 weiß nicht wann die Daten 
zuende sind, er empfängt einfach immer weiter.

Zum Neustarten des Empfangs reicht es das FIFO abzuschalten und wieder 
anzuschalten (0xCA81 + 0xCA83).

von Mike K. (1tester)


Lesenswert?

Danke sehr.

Eine Frage hätte ich noch, Solange FFIT auf High ist kann ich noch 
mindestens ein Byte einlesen oder?

LG mike

von Benedikt K. (benedikt)


Lesenswert?

Ja.

von Mike K. (1tester)


Lesenswert?

Eine Frage habe ich noch wie groß ist der FiFo maximal?

Ist es der Fifo IT Level Max von 15Bits also fast 2 Byte? Was passiert 
wenn ich nicht schnell genug bin die Daten Abzuholen?

lg Inf

von Benedikt K. (benedikt)


Lesenswert?

Es sind genau 2 Bytes. Wenn das FIFO voll ist, gehen Daten verloren.

von Mike K. (1tester)


Lesenswert?

Ich habe ein Problem mit Hardware SPI,

Also das Original Programm von Benedikt funktioniert ohne Probleme mit 
meinem uC board. Nun habe ich das ganze mal auf hardware SPI umgebaut.

F= F_CPU/16 => 20mhz/16

So das initalisieren des Modules funktioniert, das schließe ich aus den 
10mhz clock output.

Beim senden polle ich SPIF...danach ist für mich die Übertragung 
erledigt
Nun sende ich folgende Bytes an das Modul:

0x8238
0xB8AA
0xB8AA
0xB82D
0xB8D4

10 mal 0xB8AA

0x8208

Dann beginnt Das spiel wieder von vorne mit 0x8238 aber spätestens nach 
dem 3mal bleibt es bei selbigem 0x8238 stehen weil das SPIF flag nicht 
fällt. Nun scheint es so als würde das Modul hängen.

Nur selbst in den erfolgreichen Durchläuf werden keine Daten gesendet.

Hat dazu irgenjemand eine Idee?

Und was macht eigentlich rf12_ready den das habe ich irgendwie nirgendst 
verbaut...

edit: Achja ob ich 0xB8AA nun 10mal oder 1000mal als Daten verschicke 
ändert an der Situation nur wenig...

lg mike

von Benedikt K. (benedikt)


Lesenswert?

Mike K. schrieb:

> Und was macht eigentlich rf12_ready den das habe ich irgendwie nirgendst
> verbaut...

Es prüft ob Platz im Sendefifo ist. Ohne die Abfrage gehen alle Daten 
außer den ersten beiden verloren, da das FIFO überläuft.

von Mike K. (1tester)


Lesenswert?

Gut jetzt habe ich ein rf12 ready verbaut:

Vielen dank für die ständige Hilfe vorallem am Sonntag.

SPI_PORT &= ~(1<<SPI_SS);

while (!(SPI_PIN&(1<<SPI_MISO))); // wait until FIFO ready

Nun werden zumindest Daten versand leider bleibt er nochimmer nach dem 
3ten mal hängen.

Ganz so als sei das rfm12 modul abgeschmiert...

Des weitern habe ich herausgefunden das das RFM12 modul weiter Blockt 
den ich den uC kurz resete. Nur wenn ich etwas länger auf dem Reset 
bleibe funktioniert das Ganze wieder. Das RFM12 modul wird aber nicht 
zurück gesetzt...


Lg mike

von Mike K. (1tester)


Lesenswert?

Ich glaube ich habe das Problem gefunden ich habe nach dem pollen des 
SPI Interrupt frag vergessen dieses zu löschen und schließend das zuvor 
gelöschte SPI ISR enable wieder gesetzt was zur Ausführung der SPI ISR 
führte in der ich zuvor nur schwachsinn hatte... oder wird das SPIF flag 
nach dem auslesen  von SPDR selbst ständig gelöscht?

Leider kommte ich es noch nicht testen.


Lg, mike

von Christian L. (quadratqualle)


Lesenswert?

Hallo

ist es normal das der RFM12 beim empfangen bei rf12_ready in einer 
endlos schleife bleibt? Also wen nix von einem anderen gesendet 
wird?warte er dort so lange bis jemand etwas sendet? Die Verbindung 
dürfte gehen, da ich 10 Mhz am Clock Ausgang habe.

von Benedikt K. (benedikt)


Lesenswert?

Ja.
Wenn das nicht erwünscht ist, kann man erst prüfen ob Daten im FIFO 
sind, ehe man die Empfangsfunktion aufruft, so wie bei dieser Version: 
Beitrag "Re: Beispielprogramm für RFM12 433MHz Funk-Module"

von Christian L. (quadratqualle)


Lesenswert?

ich bekomm einfach kein verbindung zwischen dem rfm12 und rfm01 hin ich 
hab die codes von Benedikt genommen und die Verbidnungen stimmen auch. 
Ich bekomme bei beiden die 10Mhz Ausgang also müssten doch eigentlich 
alles richtig sein!?

Ich bin über jede Hilfe dankbar.

mfg Christian

von Jan W. (jan_1)


Lesenswert?

Hallo,

Ich habe heute viele Stunden damit verbracht den ganzen Thread zu lesen, 
leider stehe ich nun vor einem noch größeren Problem.

Bei dem Projekt was ich gerade realisiere, handelt es sich um Folgendes:
Mit einer in ca. 2,5m Höhe angebrachten Kamera wird ein Roboter erkannt 
und dessen Position bestimmt. Anschließend soll der Roboter zu einem 
bestimmten Punkt fahren (später einem Ball nachfahren). Also der Roboter 
selbst empfängt nur Daten zur Motorsteuerung, hat also keine Sensoren 
oder ähnliches.

Nun, das Alles funktioniert soweit ganz gut, auch der Roboter ist schon 
gebaut; leider fehlt mir noch ein wichtiges Element...

...eine Kommunikation zwischen dem PC und dem Roboter, per Funk (433Mhz 
oder 868Mhz). Habe mir dazu das "AVR Evaluation Board" zum Senden der 
Befehle gekauft. Zum Empfangen der Daten am Roboter hab ich ein eigenes 
Board entwickelt. (beide mit einem RFM12 bestückt)

Nun mein Problem:
Ich habe schon relativ viel Erfahrung mit C++, Java und ähnlichen 
Programmiersprachen. Leider bin ich im Bereich von µC nicht so gut 
drauf.
Finde die Programme von Benedikt richtig gut (danke vielmals ;) ), doch 
leider blick ich nicht so wirklich durch.

Ich möchte mein AVR Board mit einer RS 232 Schnittstelle mit dem PC 
verbinden, dieser übergibt dann laufend neue Befehle, die an den Roboter 
gesendet werden sollen.

Doch mit welcher Funktion (UART?!) kann ich mit dem Programm von 
Benedikt diese neuen Befehle vom PC einlesen und anschließend immer 
wieder senden!?

Habe das Programm "RFM12_RX_TX.zip", helfen mir da Funktionen aus dem 
"uart.c" !?

Also schon mal danke, dass ihr meinen Beitrag durchgelesen habt und 
vielleicht will mir ja jemand mit einem kleinen Programm oder Funktionen 
welche ich dazu brauche, helfen ;-)

DANKE!!

Viele Grüße
Jan

von muecke (Gast)


Lesenswert?

Hallo zusammen,
mit Hilfe des "rfm12_just_rxtx"-Codes von Benedikt (danke hierfür ;-) 
versuche ich eine Funk-Lichtschranke zu realisieren. Leider habe ich das 
Problem, dass sich der Empfänger aufhängt, sobald der Sender nicht 
erreichbar ist. Jörn Ahrens hat am 13.03.2009 das gleiche Problem, 
allerdings mit anderem Quellcode, lösen können. Leider stelle ich mich 
hier etwas blöde an und komme zu keiner Lösung.
Könnt ihr mir sagen, wie ich software-mäßig (z.B. wie Jörn mit einem 
Timer), einen nichtantwortenden Empfänger ignorieren kann? Ich kann mir 
den Fehler auch leider nicht wirklich erklären. Kommt es zu einem 
Buffer-Überlauf des FIFOs? Über eine kleine Hilfestellung wäre ich 
wirklich sehr dankbar!

Vielen Danke und ein schönes Pfingstwochenende!
Gruß,
Jens

PS: Am Quellcode von Benedikt habe ich nichts grundlegendes geändert -

von Benedikt K. (benedikt)


Lesenswert?

muecke schrieb:
> Leider habe ich das
> Problem, dass sich der Empfänger aufhängt, sobald der Sender nicht
> erreichbar ist. Jörn Ahrens hat am 13.03.2009 das gleiche Problem,
> allerdings mit anderem Quellcode, lösen können. Leider stelle ich mich
> hier etwas blöde an und komme zu keiner Lösung.

Mit der Version sollte sich das ganze eigentlich nicht aufhängen.
Hast du das
if rx_data_in_buffer())
im Code drin gelassen?

Damit sollte eigentlich nur dann die Empfangsfunktion aufgerufen werden, 
wenn auch wirklich Daten empfangen wurden.

von muecke (Gast)


Lesenswert?

Hallo Benedikt,
schön, dass gerade du dich meldest. Die Funktion habe ich, ähnlich wie 
in deinem Beispiel, in einer for-Schleife untergebracht. Allerdings 
möchte ich mit dem Modul, bei dem der Fehler auftritt, nur senden. 
Konkret wird ein "S" gesendet und somit die Zeitmessung gestartet, 
sobald eine Lichtschranke unterbrochen wird. Normales Senden ist kein 
Problem, nur wenn ich den Empfänger ausschalte und in der Zwischenzeit 
wieder was gesendet wird, hängt sich der Sender auf und eine weitere 
Kommunikation mit wieder eingeschaltetem Empfänger, ist nicht mehr 
möglich. Die if rx_data_in_buffer()-Funktion wird bei mir zwar 
aufgerufen um mögliche Daten zu empfangen, allerings verwerfe ich die 
Daten. Trotzdem findet ja im Hintergrund eine Fehlererkennung statt, wo 
sich vermutlich bei mir der Fehler eingeschlichen hat. Du hast doch an 
dieser Stelle schon Jörn weitergeholfen - meinst du nicht, dass ich an 
der gleichen Stelle hänge?
Danke -

von Benedikt K. (benedikt)


Lesenswert?

muecke schrieb:
> Normales Senden ist kein
> Problem, nur wenn ich den Empfänger ausschalte und in der Zwischenzeit
> wieder was gesendet wird, hängt sich der Sender auf und eine weitere
> Kommunikation mit wieder eingeschaltetem Empfänger, ist nicht mehr
> möglich.

Was hängt sich nun auf? Der Sender (wie hier) oder der Empfänger (wie du 
im vorigen Post geschrieben hast)?

> Du hast doch an
> dieser Stelle schon Jörn weitergeholfen - meinst du nicht, dass ich an
> der gleichen Stelle hänge?

Nein, das war ein anderes Problem. Jörg hatte das Problem, dass er immer 
auf Daten gewartet hat, auch wenn garkeine ankahmen. Bei dieser Version 
wird durch das if  rx_data_in_buffer() umgangen, denn nur wenn Daten da 
sind, werden auch welche abgeholt.

von muecke (Gast)


Lesenswert?

OK - Ich versuche es mal ausführlicher zu beschreiben, meine Beiträge 
scheinen doch verwirrend zu sein - sorry. Vorab: Es ist der Sender, der 
hängen bleibt. Folgende Situation:
Der Sender sendet fortlaufend ein "S" an einen Empfänger. Dieser 
Empfänger gerät jetzt aus dem Empfangsbereich (oder wird ausgeschaltet). 
Der Sender merkt das nicht und sendet fleißig weiter. Kommt jetzt der 
Empfänger wieder in den Empfangsbereich (oder wird wieder angeschaltet), 
so kommt es zu keiner weiteren Kommunikation. Ich nehme an, dass der 
Sender auf eine Antwort wartet, die das korrekt empfangene "S" 
bestätigt?!? Ich muss zugeben, dass ich nicht alle Funktionen komplett 
verstanden habe.

Ein Versuch per Watchdog zu resetten klappt leider nicht. Der Watchdog 
wird zwar ausgelöst, doch leider lässt sich das RFM12-Modul nicht 
resetten bzw. erneut initialisieren. Ich habe deshalb angenommen, dass 
noch alte Daten im FIFO verweilen und nicht verarbeitet werden können.
Eine Quick-and-Dirty Lösung wäre vielleicht das resetten per Watchdog 
mit anschließender neu-Initialisierung des RFM12. Nur fehlt es mir 
leider an Hintergrundinfos, was ich zusätzlich zu der normalen 
Initialisierung hinzufügen muss.

von Benedikt K. (benedikt)


Lesenswert?

Hast du mal die Software unverändert ausprobiert und geschaut ob der 
Sender dann immer noch abstürzt? Die sollte 1x pro Sekunde einen Wert 
senden.
Dass das RFM12 sich irgendwo aufhängt und selbst ein Reset des AVRs 
nichts bringt klingt sehr merkwürdig, denn eigentlich macht die Software 
eine Init des RFM12 und beschreibt eigentlich alle Register nach dem 
Einschalten.

von muecke (Gast)


Lesenswert?

Hallo Benedikt,
danke, dass du so schnell geantwortet hast. Bin leider gerade erst 
wieder zum Basteln gekommen. Ich habe deine Original-Software 
draufgespielt und siehe da, es funktioniert wie gewünscht ;-) Noch weiß 
ich nicht wo mein Fehler liegt, aber ich werde nochmal Stück für Stück 
meine Änderungen einpflegen und dann sehen wo es hakt. Vielen Dank 
nochmal für deine schnellen Antworten.
Ich verfolge dieses Funk-Projekt hier schon seit langer Zeit und ich 
muss einfach mal einen Lob an die Entwickler aussprechen, wie toll ihr 
(aber insbesonderem du, Benedikt) hier Stück für Stück eine super 
Software auf die Beine gestellt habt. Hat immer wieder Spaß gemacht, die 
Entwicklung zu verfolgen!
Grüße, Jens

von Benedikt K. (benedikt)


Lesenswert?

Da der Empfang der Daten in der check_rx_packet(); Funktion erfolgt, 
muss diese mindestens mit 1kHz aufgerufen werden, ansonsten kann es zu 
Problemen kommen.
Irgendwann muss ich den Empfang mal in den Interrupt verlagern.

von muecke (Gast)


Lesenswert?

Hallo zum vorerst Letzten ;-)
Ich habe meinen Fehler gefunden und möchte ihn kurz beschreiben. 
Vielleicht hängt ein anderer Anfänger an einer ähnlichen Stelle.
Das Senden hatte ich durch einen Interrupt ausgelöst. Funktioniert auch 
alles wunderbar, nur wenn der Empfänger nicht mehr erreichbar ist, wird 
das Zeitinterrupt benötigt (fürs Timeout, meine ich). Dieser ist 
allerdings durch den Sendeinterrupt blockiert. Echt ein blöder 
Anfängerfehler, aber ich habe aus der Fehlersuche mal wieder gelernt.
Jetzt setze ich im Sendeinterrupt nur noch ein globales Char, welches 
dann in der fotlaufenden for-Schleife ausgewertet wird und das Zeichen 
entsprechend gesendet wird.
Nochmals danke -

von Feissy (Gast)


Lesenswert?

hallo, habe mal ne kurze frage und zwar habe ich zwei rfm12 module in 
betrieb genommen und möchte ganz einfach mit einem taster an PD1 auch 
dementsprechend einen ausgang in meinem Fall eig PB0 steuern. Ich habe 
folgenden code und er funktioniert auch soweit. Nur tut es nur, wenn ich 
den taster an PD0 habe und drücke, kann ich am anderen Atmega an PD1 die 
Led zum leuchten bringen jedoch blionkt sie immer nur kurz auf, wenn ich 
den taster betätige. Woran liegt das???

1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
#include <avr/pgmspace.h>
4
#include <avr/eeprom.h>
5
#include <stdlib.h>
6
#include "portbits.h"
7
#include "global.h"
8
#include "rf12.h"
9
#define F_CPU 10000000UL
10
#include <util/delay.h>
11
12
#define RF_BAUDRATE    15000    // Baudrate des RFM12
13
14
unsigned char data[128];
15
unsigned char tdiv=30;
16
unsigned char lastpins=0;
17
18
19
int main(void)
20
{  
21
22
  DDRD=0b1111100;
23
  
24
25
  
26
27
  PORTB=1;
28
  PORTD=31;
29
  DDRC=63;
30
  DDRD=238;
31
32
  sei();
33
34
  rf12_init();                      // RF12 + IO Ports initialisieren
35
    
36
  rf12_config(RF_BAUDRATE, RF12FREQ(433.92), 0, QUIET);  // Baudrate, Frequenz, Leistung (0=max, 7=min), Umgebungsbedingungen (QUIET, NORMAL, NOISY)
37
  rf12_rxmode();                      // Empfang starten
38
39
  for (;;)
40
41
{  unsigned char pins;
42
   check_rx_packet();
43
   pins=PIND;
44
   if (pins!=lastpins)
45
   {  tx_data(&pins,1);
46
      lastpins=pins;
47
   
48
       }
49
50
  if (PIND & (1<<PD1)) { 
51
  PORTB = 0b00000011;
52
  }
53
54
55
    }
56
  }

mfg stefan

von Benedikt K. (benedikt)


Lesenswert?

Ist die gleiche Software auch beim Empfänger drauf? Ich sehe da nirgends 
wo die empfangenen Daten verarbeitet werden.

von Feissy (Gast)


Lesenswert?

Oh ich habe grade selber gesehen, das PD0 ja RXD ist, dann habe ich die 
ganze zeit gesehen, das daten gesendet werden und dan TXD wieder 
ankeokmmen.
jedenfalkls funktioniert die Übertragung schon.
ja ich hab das auf beiden atmegas drauf.
Reicht das nich wenn ich schreibe:

 if (PIND & (1<<PD1)) {
  PORTB = 0b00000011;
  }


für die Verarbeitung??

von Benedikt K. (benedikt)


Lesenswert?

Die empfangenen Daten verwendest du nicht wirklich.
1
if rx_data_in_buffer())
2
{  unsigned char count, i;
3
  count=rx_data(data);
4
  if (data[0]&1)
5
   PORTB|=1;
6
  else
7
   PORTB&=~1;
8
}
Damit würde eine Änderung an PortD0 beim Sender PortB0 beim Empfänger 
steuern.

von Feissy (Gast)


Lesenswert?

also wenn ich das so mache dann tut sich auch nichts...............

von Feissy (Gast)


Lesenswert?

1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
#include <avr/pgmspace.h>
4
#include <avr/eeprom.h>
5
#include <stdlib.h>
6
#include "portbits.h"
7
#include "global.h"
8
#include "rf12.h"
9
#define F_CPU 10000000UL
10
#include <util/delay.h>
11
12
#define RF_BAUDRATE    15000    // Baudrate des RFM12
13
14
unsigned char data[128];
15
unsigned char tdiv=30;
16
unsigned char lastpins=0;
17
18
19
int main(void)
20
{  
21
22
  DDRD=0x00;
23
  DDRB=0xff;
24
    
25
26
  PORTB=1;
27
  PORTD=31;
28
  DDRC=63;
29
  DDRD=238;
30
31
  sei();
32
33
  rf12_init();                      // RF12 + IO Ports initialisieren
34
    
35
  rf12_config(RF_BAUDRATE, RF12FREQ(433.92), 0, QUIET);  // Baudrate, 
36
  rf12_rxmode();                      // Empfang starten
37
38
  for (;;)
39
40
{  unsigned char pins;
41
   check_rx_packet();
42
   pins=PIND;
43
   if (pins!=lastpins)
44
   {  tx_data(&pins,1);
45
      lastpins=pins;
46
   
47
       }
48
49
  if (rx_data_in_buffer())
50
{  unsigned char count, i;
51
  count=rx_data(data);
52
  if (data[0]&1)
53
   PORTB|=1;
54
  else
55
   PORTB&=~1;
56
}
57
58
    }
59
  }

also auch wenn ich das so auf den atmega 8 spiele Funktioniert das nicht 
man kann nur an PD1 am empfäger sehen, wenn man PD0 am Sender drückt.

von Feissy (Gast)


Lesenswert?

ok hat sich grade alles erledigt funktioniert alles wunderbar.
danke für die schnelle Hilfe.
Ps. manchmal hat man einfach ein Brett vorm kopf ^^

von Feissy (Gast)


Lesenswert?

Wie kann ich denn jetzt alle Ports PD0 bis PD7 einlesen und dann auch 
wieder an PB oder glaube PC ist besser, da alle frei sind, ausgeben. 
welche Funktion muss ich ändern?
Also mit einem Eingang alle Ausgänge ansteuern  ist ja kein Problem, 
aber ich möchte gerne jeden einzeln ansteuern.
mfg

von Benedikt K. (benedikt)


Lesenswert?

1
  if (rx_data_in_buffer())
2
{  unsigned char count;
3
  count=rx_data(data);
4
  PORTC=data[0];
5
}

Damit wird das Byte komplett auf Portc (soweit halt Pins da sind) 
ausgegeben.

von Feissy (Gast)


Lesenswert?

So hab noch mal ne Frage und zwar wie kann ich wenn ich die daten wieder 
ausgebe auch die Eingänge entprellen, sodass ich mit einem tastendruck 
An bzw. und dann wieder Ausschalten kann?
Hier mein code, der aber "leider" nicht funktioniert:
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
#include <avr/pgmspace.h>
4
#include <avr/eeprom.h>
5
#include <stdlib.h>
6
#include "portbits.h"
7
#include "global.h"
8
#include "rf12.h"
9
#define F_CPU 10000000UL
10
#include <util/delay.h>
11
12
#define RF_BAUDRATE    15000    // Baudrate des RFM12
13
14
unsigned char data[128];
15
unsigned char tdiv=30;
16
unsigned char lastpins=0;
17
18
  inline uint8_t debounce(volatile uint8_t *port, uint8_t pin)
19
  {
20
      if ( ! (*port & (1 << pin)) )
21
      {
22
        /* Pin wurde auf Masse gezogen, 100ms warten   */
23
        _delay_ms(50);  // max. 262.1 ms 
24
        _delay_ms(50); 
25
          if ( *port & (1 << pin) )
26
          {
27
            /* Anwender Zeit zum Loslassen des Tasters geben */
28
              _delay_ms(50);
29
              _delay_ms(50); 
30
              return 1;
31
          }
32
      }
33
      return 0;
34
  }
35
36
int main(void)
37
{  
38
39
  DDRD &= ~( 1 << PB0 );                 // PD0 auf Eingang
40
    PORTD |= ( 1 << PB0 ); 
41
    
42
43
  PORTB=1;
44
  PORTD=31;
45
  DDRC=63;
46
  DDRD=238;
47
48
  sei();
49
50
  rf12_init();                      // RF12 + IO Ports initialisieren
51
    
52
  rf12_config(RF_BAUDRATE, RF12FREQ(433.92), 0, QUIET);  // Baudrate, Frequenz, Leistung (0=max, 7=min), Umgebungsbedingungen (QUIET, NORMAL, NOISY)
53
  rf12_rxmode();                      // Empfang starten
54
55
  for (;;)
56
57
{  unsigned char pins;
58
   check_rx_packet();
59
   pins=PIND;
60
   if (pins!=lastpins)
61
   {  tx_data(&pins,1);
62
      lastpins=pins;
63
   
64
       }
65
66
 if (rx_data_in_buffer())
67
{  unsigned char count;
68
  count=rx_data(data);
69
  PORTC=data[0];
70
71
 if (debounce(&PIND, PD0))             // Taster an PIN PD0 gedrueckt
72
    PORTC = PINC ^ ( 1 << PC0 );       // LED an PC0 an bzw aus
73
74
}       
75
   
76
    }
77
  }

Woran liegt das oder muss ich beim einlesen der ports etwas ändern?

von Benedikt K. (benedikt)


Lesenswert?

Ich würde fast darauf tippen, dass es an debounce liegt, denn damit das 
funktioniert, muss man drücken und innerhalb von 100ms wieder los 
lassen. Dieser Zeitpunkt ist denke ich nur schwer zu treffen.

von Feissy (Gast)


Lesenswert?

mh also ich hab da jetzt verschiedene zeiten ausprobiert aber daran 
liegt es nicht.
kann man denn beim auslesen der daten was ändern oder kann es sein das 
man so etwas überhaupt nicht auslesen kann, das der taster entprellt 
ist???

von Stefan F. (feissy)


Angehängte Dateien:

Lesenswert?

so hier noch mal der code. hab noch mal bissl was geändert unter anderem 
die if schleife nach hinten aus der ersten if schleife gezogen und die 
zeit vergrößert.
also weenn ich direkt am sende avr ne led an PC0 hänge funzt das auch 
mit an und aus aber eben nich am empfänger, dort bleibt sie so lange an, 
wie man auch drückt.
 habt ihr noch ne idee???

von Benedikt K. (benedikt)


Lesenswert?

Sende doch mal feste Daten, dann kannst du ausschließen, dass es an der 
Tastenentprellung liegt.

von GierigeSau (Gast)


Lesenswert?

Hallo zusammen.
Ich hab gerade den 2-Jahres Thread hinter mir gebracht ;) Der längste 
den ich an einem stück gelesen habe^^
Da ich mich auch bald mit den Modulen beschäftigen werde, wollte ich 
einfach nur mal meinen Dank an euch aussprechen, an allen die daran 
mitgewirkt haben. Ich Fang jetzt gerade erst mit C Programmierung an, 
aber mit den ganzen Werken hier sollte es keine Probleme geben ;)
Meine RFM-Module sollen ADC-Werte (3x Temp. mit LM35 (Displayausgabe 
funktioniert schon) + 6 versch. Spng. (6 Cellen LiPo) + Strommessung 
(Wie am besten bis 150Amp messen?) Übertragen.
Echt saubere Arbeit von euch, weiter so.

MFG Timo S.

von Ralf (Gast)


Lesenswert?

Hallo Leute,

am 18.05.2007 hat Georg folgendes geschrieben:

  Hallo Benedikt,

  ich habe hier Dein Programmierbeispiel gefunden, nachdem ich mit dem
  Code-Beispiel von Pollin fast verzweifelt hatte, war Dein super
  strukturierter Code die wahre Wohltat.

  Ich habe mir von Pollin zwei Funk Eval Boards zugelegt, jeweils mit
  RFM12 und ATmega32-16 bestückt.
  Die Verdrahtung ist zwar etwas anders als bei Deiner Hardware, aber 
mit
  wenigen Änderungen (Pin defines und Pullup programmieren) lief Deine
  Software auf Anhieb !!!!

  Danke für dieses Stück gute Arbeit !!!


  Georg

Jetzt habe ich genau die gleiche Konfiguration wie Georg, also die 
beiden Boards, jeweils mit RFM12 von Pollin sowie beide mit Atmega32 
bestückt. Er schreibt, dass er Pin-defines und Pullup ändern musste, 
damit das Programm läuft. Kann mir mal bitte jemand sagen, wie die 
Änderungen im Programm aussehen müssen?

Ähhhh, achja, bitte bei den Antworten (hoffentlich :-) berücksichtigen, 
dass ich gerade erst anfange, mit AVR´s rumzuspielen.

Vielen Dank für die Hilfe im voraus

Ralf

von Ralf (Gast)


Lesenswert?

Hmmm,

keiner Lust mir ein bisschen auf die Sprünge zu helfen?

Würde mir wirklich weiterhelfen.

Grüße
Ralf

von Benedikt K. (benedikt)


Lesenswert?

Ralf schrieb:

> Jetzt habe ich genau die gleiche Konfiguration wie Georg, also die
> beiden Boards, jeweils mit RFM12 von Pollin sowie beide mit Atmega32
> bestückt. Er schreibt, dass er Pin-defines und Pullup ändern musste,
> damit das Programm läuft. Kann mir mal bitte jemand sagen, wie die
> Änderungen im Programm aussehen müssen?

In der rf12.c finden sich diese Zeilen:

#define RF_PORT  PORTB
#define RF_DDR  DDRB
#define RF_PIN  PINB

#define SDI    3
#define SCK    5
#define CS    2
#define SDO    4

Dort müssen der Port und die Pinnummern eingetragen werden, wo das Modul 
angeschlossen ist.

von gast (Gast)


Lesenswert?

Erstmal möchte ich Benedikt K. dafür danken, dass er dieses gute 
Beispiel veröffentlicht hat.
Ich möchte die rfm12 dazu nutzen Temperaturdaten(uint8_t und uint16_t) 
zu "verschicken", mit dem Beispiel "Dies ist ein 433MHz Test !!!\n   " 
klappt dies auch tadellos, allerdings schaffe ich es nicht einzelne 
unsigned char oder unsigned int zu übermitteln. Ein kleiner Denkanstoss 
würde mir hoffentlich weiterhelfen.

von gast (Gast)


Lesenswert?

kann mir niemand einen Denkanstoß liefern?

von Benedikt K. (benedikt)


Lesenswert?

Der Funktion musst du Daten übergeben (in Form eines unsigned char 
Arrays) und die Anzahl an Bytes. Diese werden übertragen.
Du musst deine Werte halt irgendwie in das Array bekommen, z.B. über ein 
struct oder per Hand den uint16 Wert in 2 Bytes zerlegen.

von Raphael S. (raphaels)


Lesenswert?

Hallo,

ich möchte nun auch eine Funkverbindung an meinen schon sehr weit
fortgeschrittenen Webserver bauen.

Leider schaffe ich es nicht, eine Verbindung herzustellen.

Wenn ich das Status-Register auslesen, nach dem ersten Start, bekomme 
ich 0x4000. Das sieht ja noch ganz gut aus.
Nach dem Initialisieren ist das Statusregister aber immer auf 0x0000, 
auch wenn ich das FIFO eingeschaltet habe. Es müsste aber doch 
eigentlich das FFEM-Bit gesetzt sein, oder?

Ich habe die Version Benedikt verwendet, aber für einen DS89C450 
"abgeändert". Sehr viel gab es da nicht, eigentlich nur die rf12_trans 
Funktion ein bisschen abändern.
Ich habe die Funktion auch schon testweise in Assembler geschrieben, 
genau die gleichen Probleme.

Desweiteren habe ich das Setzen der Frequenz, der Baudrate usw., was 
eig. in in main passiert, in die init Funktion verschoben.

Setzen der 10Mhz funktioniert auch.

Ich weiß nicht, woran das noch liegen könnte...

Würde mich über Hilfe freuen!
RaphaelS

von Franz (Gast)


Lesenswert?

Hallo,
ich habe eine Schaltung mit Benedikts Software aufgebaut und mich dabei 
auch an seinen Schaltplan gehalten. Gibt es jetzt eine Möglichkeit zu 
sehen/testen ob soweit alles in Ordnung ist? Irgendeine LED die leuchten 
sollte, ein Pin der high ist etc? Oder sollte ?
Viele Grüße Franz

von Benedikt K. (benedikt)


Lesenswert?

Bei neueren Versionen gibt es eine leds.h. In der kann man Pins 
festlegen an denen Status LED angeschlossen werden.
Bei den alten, einfachen Versionen gabs das noch nicht. Da könnte man 
die Leitungen zum RFM12 anschauen: Wenn sich auf denen periodisch etwas 
tut, dann sendet das Modul.

von Oliver Schneider (Gast)


Lesenswert?

Hallo zusammen,
ich hatte die Funkmodule RFM12 (433MHz) von Pollin schon einige Zeit 
(ca. 2Jahre) unbenutzt zuhause liegen. Jetzt habe ich die Zeit gefunden 
diese an zwei Pollin Demo Boards anzuschließen. Verdrahtet ist alles 
entsprechend dem Pollin Adapter Modul. Ich habe zunächt mal das 
RFM12_RX_TX.zip Paket von Benedikt ausgepackt und auf meine 
Konfiguration angepasst. Dabei ist der Prozessor Takt (Atmega8, 16MHz) 
und der FSK Pin auf PB1 auf high zu legen wie schon früher besprochen.
Die Module geben beide einen 10MHz Takt aus (gemessen), den meine 
Atmegas aber nicht verwenden.
Die Module liegen nebeneinander auf dem Schreibtisch (ca. 10cm Abstand).
Ich habe Beim Sender "sende...\n" und Empfänger die Meldung "Empfaenger 
laeuft !\n" in MS/Hyperterm.

Läuft der Sender, Empfange ich Datenmüll mit einem Haufen Smileys und 
Sonderzeichen, aber kein einziges Schnipselchen vom gesendeten Testtext 
Den Code habe ich nicht verändert.
Habe schon mit und ohne Antenne versucht -> kein Einfluss.
Empfang mit 5x gesendeter Message ist:
Empfaenger laeuft !
                                              DBIsartHBY !%&qAErh  
aefQeaeQY!&%IqBea DBf BrheBY0%%Iz @Brt   BBeQr`BBY!%%xABea 
 BBeaea BB\!%2qAea 

Habe auch mal 0xAA gesendet anstelle des Test Textes, erhalte da aber 
genauso Datenmüll. Das Bitmuster ist in den empfangenen Daten nicht 
wiederzufinden.
Wenn ich nicht sende empfange ich auch nichts => ich denke ich habe 
keine externen Störungen aus der Umgebung.
Module sollten nicht defekt sein. Wurden meines erachtens sehr pfleglich 
und sorgfältig behandelt. (Jedenfalls bisher)

Habe keine Erfahrung mit HF Funk-Technik, kann aber ein Osziloskop 
bedienen. Scanner habe ich nicht. Fernseher noch nicht probiert, weil 
örtlich getrennt und der Nutzen hat sich mir für mein aktuelles Problem 
noch nicht erschlossen.

Ich könnte ein paar Tipps gebrauchen:
Wo sollte ich als nächtes den Fehler suchen? Was kann ich noch prüfen?
Muss man mit Verstärkung und Frequenzeinstellungen eine Abstimmung 
suchen? - Wenn ja, wie geht man geschickt vor?
Was kann ich jetzt noch an Fehlern ausschließen? (Stimmt die 
Sendefrequenz, Rastet der Empfänger auf die Frequenz ein, komme ich in 
die Präamble, ...)

Grüsse, Oliver

von Bimbo385 (Gast)


Lesenswert?

Hab das gleiche prob nur mit dem Basic Programm von bastelbär.


PLZ Help???


könnte sein, dass bei mir was mit der SPI Kommunikation nicht 
stimmt...bin mir aber nicht so sicher.

von Benedikt K. (benedikt)


Lesenswert?

Versuch mal den Prozessortakt runterzusetzen bzw. die Verzögerungen in 
den SPI Routinen zu vergrößern. Das FIFO Register darf nicht so schnell 
angesprochen werden wie der Rest. Daher kann es sein, dass alles andere 
funktioniert, nur die Übertragung nicht.

von Oliver Schneider (Gast)


Lesenswert?

Ich habe jetzt beide Boards auf 8MHz für den Atmega8 umgebaut und 
geflasht.
Leider ist das Ergebnis unverändert schlecht.

Oliver

von Julian (Gast)


Lesenswert?

Hallo,

erstmal muss ich sagen, dass der Code von Benedikt super ist (hat mir 
viel Arbeit erspart).

ich habe heute endlich (nach langer langer Fehlersuche) eine 
Funkübertragung zwischen einem RFM12 und einem RFM02 zustande gebracht.

Das Ganze funktioniert schon soweit, dass das RFM12 erkennt, wann Daten 
angekommen sind und das RFM02 Daten sendet. Die empfangenen Daten werden 
dann über USART an den Computer gesendet. Nur leider empfange ich nie 
das was ich gesendet habe, also mir kommt es so vor, als ob alle Bits 
eines Bytes wild durcheinander gewürfelt werden würden. Aber wenn ich 
mehrmals das gleiche Sende, kommt jedesmal der gleiche "Müll" an (auch 
wenn ich zwischendrin etwas anderes gesendet habe), also sind die 
empfangenen Daten doch nicht ganz zufällig.
Beispiel: Ich sende "test" und empfange jedesmal 00111110, 00001111, 
00000100, 00001010, 01111111, dann sende ich "...." und empfange 
jedesmal 00111110, 01000011, 00100000, 01010000, 01111000
Komisch ist dabei noch, dass aus 4 gesendeten Bytes 5 Empfangene werden.

Hat jemand vielleicht eine Idee, woran das liegen könnte? Ich denke, 
dass die beiden Module nicht genau aufeinander abgestimmt sind, obwohl 
ich 2 AtMega8 mit jeweils einem externen Quarz von 3,6864MHz benutze. 
(An dem Code habe ich nichts verändert.)

Schon mal im voraus Danke für eure Antworten

Grüße Julian

von Benedikt K. (benedikt)


Lesenswert?

Da das RFM02 etwas bescheuert anzusteuern ist und nur kurze Peaks im 
Takt der Baudrate ausgibt, könnte es sein dass einzelne Impulse 
übersehen werden und daher manche Bits mehrmals gesendet werden. Lass 
den Sender mal schneller laufen.

von Julian (Gast)


Lesenswert?

Danke für die schnelle Antwort.

Aber wie soll ich das machen? Mit einer höheren Baudrate?

mfg

von Benedikt K. (benedikt)


Lesenswert?

Höhere Quarzfrequenz am mega8.

von Julian (Gast)


Lesenswert?

Das hat nichts gebracht, weder mit 4 noch mit 8MHz.

von Benedikt K. (benedikt)


Lesenswert?

Hast du ein zweites RFM12 das du als Sender verwenden könntest, um zu 
prüfen ob es damit geht? So könntest du zumindest sicherstellen, dass 
der Empfänger funktioniert. Ich tippe nämlich immer noch auf ein Problem 
beim RFM02.

von Julian (Gast)


Lesenswert?

Der Sender sendet auf jeden Fall (das habe ich mit einem Fernseher 
geprüft). Aber ich werde es morgen nochmal mit einem anderen RFM12 
probieren. Obwohl ich mir irgendein Problem mit dem Timing auch gut 
vorstellen könnte.

von Thomas Unruh (Gast)


Angehängte Dateien:

Lesenswert?

Hallo liebe Funkgemeinde,

wir alle haben schon sehr  viele Stunden  mit diesen RFM12-Modulen 
verbracht und einige haben vielleicht auch schon aufgegeben. Aber last 
den Kopf nicht hängen. Die Dinger funktionieren wirklich, jetzt auch bei 
mir.  Ich gehe jetzt nicht mehr auf die Hardware ein. Ein bisschen 
Konzentration beim Löten muss eben jeder mitbringen.  Software habe ich 
von Benedikt verwendet.
Die  funktioniert eigentlich auf Anhieb, wenn da nicht das Problem mit 
den Quarzen auf den Modulen wäre. Die sind eben nicht genau gleich und 
wenn man  jetzt eine Verbindung aufbauen möchte, muss einer von beiden 
ggf. abgeglichen werden. Hier ein Beispiel:

Ich habe bei meinem Sender  die Frequenz 868.92 MHz eingestellt.
 ( Achtung :Ich verwende die 868MHZ Module ! )

Für die Variable  freq ergibt das einen Wert von :
(868.92-860) / 0.005 = 1784

#define RF12FREQ(freq)  ((freq-860.0)/0.005)  // macro for calculating 
frequency value
rf12_setfreq(RF12FREQ(868.3));  // Sende/Empfangsfrequenz auf 868,92MHz 
einstellen

Wenn ich jetzt im Empfänger nach dieser Formel auch den Wert für freq 
berechnen lasse ich das zwar richtig, meine Module  können aber nie 
miteinander kommunizieren. Warum:  weil die Quarze so ungenau sind. In 
meinem Fall musste ich für freq den Wert 1747 beim Empfänger einstellen.

Theoretisch ist das die Frequenz von 868.735,hier treffen sich Sender 
und Empfänger am Besten.  Um jetzt bei euren Modulen die beiden Werte zu 
ermitteln könnt ihr meinen Sourcecode verwenden.
 Und das geht's:

1) Software im Sender wie von Benedikt
2) Software im Empfänger mit folgenden Änderungen:

rf12.c
void rf12_ready(void)
{
  unsigned long timeout = 0;

   cbi(RF_PORT, SDI);
  cbi(RF_PORT, CS);
    asm("nop")

    while (!(RF_PIN & (1<<SDO)))    //wait until FIFO ready or timeout
         if (((timeout++)>70000)){break;};
}


main.c

.
.
sei();
  uart_puts_P("Empfaenger laeuft !\n\r");
    uint16_t freq=1745; // Startwert für Frequenzlauf
  rf12_trans(0xA000|freq);
  char   sst[] = "          ";

  for (;;)
    {


    rf12_trans(0xA000|freq);
    ltoa(freq, sst, 10);
    uart_puts(sst);
    uart_puts_P("\n\r");

    freq++;
    if (freq> 1751) // Endwert für Frequenzlauf
      freq=1745;
    receive();

    }
.
.
.
Im Terminalprogramm sollte dann folgendes erscheinen:

Dies ist ein 868MHz Test  1745
Dies ist ein 868MHz Test  1746
Dies ist ein 868MHz Test  1747

( Habe meinen Text im Sender natürlich auch angepasst  )

3) Den besten Wert ermitteln und später im Empfänger eintragen.

868 Module
z.B.  1747 =>   ( 1747*.005)+ 860= 868.735

rf12_setfreq(RF12FREQ(868.735));  // Sende/Empfangsfrequenz auf 
868,92MHz einstellen

433MHz Module
z.B.  1755  => ( 1755*.0025)+430= 434.3875
rf12_setfreq(RF12FREQ(434.3875));  // Sende/Empfangsfrequenz auf 
434.3875MHz einstellen

Eigentlich ganz einfach. Vielen Dank noch mal allen für die gute 
Vorarbeit.
Viel Spaß beim Probieren!

Thomas

von Newbie Daniel (Gast)


Lesenswert?

Ok hab auch den ganzen thread durchforstet und muss sagen respekt.
so nun zu meinem problem:

verwende das programm von benedikt "RFM12_RX_TX.zip" und blicke bei der 
usart ausgabe nicht durch oder zumindest gehe ich mal stark davon aus 
das ich die rs232 schnittstelle nicht richtig konfiguriere.
kann mir da mal einer weiterhelfen? das ein zigste was ich raus bekomme 
und nicht schwer ist ist die baudrate von 19200, nur der rest keine 
ahnung.

und dann mal frage ob das funktioniert
2 * Funk-AVR-Evaluations-Board v1.2
2 * Atmel ATmega 32 mit 16MHz Clock vom Board
2 * RFM12S

von Benedikt K. (benedikt)


Lesenswert?

Newbie Daniel schrieb:
> kann mir da mal einer weiterhelfen? das ein zigste was ich raus bekomme
> und nicht schwer ist ist die baudrate von 19200, nur der rest keine
> ahnung.

Abgesehen von der Baudrate gibts beim UART auch nicht viel zu 
konfigurieren für die übliche Anwendung.
Welche Einstellung suchst du denn?

von Newbie Daniel (Gast)


Lesenswert?

hm...meinte für das hyperterminal. sorry wenn ich mich missverständlich 
ausgedrückt habe. oder sollte man da ein anderes prog nutzen um diese 
ausgabe auszugeben?

von Benedikt K. (benedikt)


Lesenswert?

Die Baudrate ist klar, ansonsten 8bits, kein Parity, 1 Stopbit.

Ich verwende immer dieses Programm, das ist für sowas besser geeignet:
Beitrag "Neues Terminal-Programm für Windows"

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.