rfm22b Empfänger läuft nicht

Gast #3818628
Lesenswert?

Hallo....
Ich habe folgendes Problem: Ich habe an einem Atmega32 ein RFM22b 
Funkmodul angeschlossen um damit Daten von einem anderen RFM22b zu 
empfangen. Als Beispiel um zu schauen, ob überhaupt eine Kommunikation 
stattfindet, habe ich das Beispielprogramm von Ulrich-Radig genommen. 
Das Senden funktioniert auch...nur beim Empfänger läuft gar nichts. Habe 
in der while an PORT D5 eine LED angeschlossen um zu sehen, ob das 
Programm überhaupt abgearbeitet wird. Aber es passiert nichts und die 
LED leuchtet dauerhaft(wird am Anfang des Programms 
eingeschaltet)....habe die Ports schon alle an den Atmeg32 angepasst. 
Jemand ne Idee?
Angehängte Dateien:
Gast #3818656
Lesenswert?

>in der while an PORT D5 eine LED angeschlossen um zu sehen, ob das
>Programm überhaupt abgearbeitet wird. Aber es passiert nichts und die
>LED leuchtet dauerhaft(wird am Anfang des Programms
>eingeschaltet)....

Also wird es bei einer dieser Funktionen hängen bleiben:
1
   
2
  usart_init(600);
3
  
4
  rf22_init();
5
  rf22_setfreq(RF22FREQ(869.545));
6

7
  rf22_rxmode();

Jetzt kannst du dich doch schrittweise der problematischen
Funktion nähern. Fang oben an die LED nach einer Funktion
abzuschalten. Wenn sie nicht mehr ausgeht hast du die
Funktion gefunden wo du weiter suchen musst.

>habe die Ports schon alle an den Atmeg32 angepasst.

Und dabei vermutlich Fehler gemacht.

>Jemand ne Idee?

Mit dem bisschen Code: Nein.
Gast #3818699
Lesenswert?

>Komme jetzt in die While rein, bleibe dann aber bei...
>cnt = rf22_getpacket(rx_tmp);

Mit einmal kommst du doch bis in die while(1)?
Wieso geht das jetzt und vorher nicht?
Na, da ist wohl mehr im Busch als man denkt.

Dir ist klar das dein RFM22B nur bis 3.6V arbeitet?
Hoffentlich läuft dein ATMega32 nicht mit 5V.
Es sei denn du hast Pegelwandler dazwischen.

Wie sieht noch mal dein Schaltplan aus?
Gast #3818719
Lesenswert?

Beim Sender läuft der Atmega mit 3,3V. Beim Empfänger mit 
5V....Verdammt. Über haupt nicht drauf geachtet, da ich die anderen Ein- 
und Ausgänge alle mit 5V betreibe. Also brauch ich einen 
Pegelwandler....gut. Danke für die schnelle Antwort.
Persönliche Seite #3826518
Lesenswert?

Hi Peter,

anbei mal ein komplettes Programm, so wie bei es mir funzt. Nicht 
perfekt, aber es läuft. Ist noch ein CO2-Sensor eingebunden, mußt dirs 
halt zurechtmodeln.

Ist noch ein Schaltplan dabei, wie man einen 5V-Atmega mit einem 3.3V 
RFM12B-Modul verbindet (die Ports passen aber glaub ich nicht alle). 
Schauste in der rfm12.h nach.

Vergesse den 100nF Kondensator direkt am Empfangs- UND Sendemodul 
zwischen GND und VSS nicht. Dann sollte es laufen.

Gruss
Angehängte Dateien:
Gast #3826977
Lesenswert?

Danke für das Programm Stefan.....
Sender läuft einwandfrei....Empfänger natürlich immer noch nicht(liegt 
aber nicht am Programm). Mir ist aufgefallen: Ich kann auf den 
Datenleitungen zwischen dem Atmega32 und dem Funkmodul nichts messen 
bzw. messe ich nur Müll, aber keine vernünftigen Pegel.
Gast #3827012
Lesenswert?

Ja hab ich auch gemacht....glaube das Modul ist Kaputt, habe gerade mal 
eine Datenleitung vom Modul getrennt und konnte dann auch einen sauberen 
Pegel von 3,3V messen. Mit Modul habe ich irgendwas mit 0,6V gemessen...
Gast #3836710
Lesenswert?

Links oben auf dem Brett ist der Sender...Unten rechts der Empfänger. 
Links neben dem Empfänger ist der Pegelwandler. Rechts neben dem 
Steckbrett liegt die Platine mit dem Atmega32, der mit dem Empfänger 
kommunizieren  soll.
#3839456
Lesenswert?

@Peter (gast) Sehe ich da einen Arduino MINI/NANO zur Steuerung? Der 
beinhaltet auch einen 3,3 V Regler für einen RFM

Hast Du Deinem RFM auch eine Antenne vepaßt?

@altera  Es gibt auch 5-V RFM-Module bei Pollin...
und für die restliche Beschaltung habe ich kleine Platinchen entworfen, 
die mit oder ohne 3,3, V Regler für RFMs geeignet sind. Und zwar einen 
für den RFM12b und eine für den Power-RFM (RFM12BP). Falls einer 
Interesse hat (Schaltbild EAGLE; Layout als Nutzen auch EAGLE) lade ich 
das gerne hoch.

Good Luck, Yogy
Gast #3852065
Lesenswert?

Läuft jetzt!!!! Danke für eure Hilfe....

Hab da gleich mal die nächste Frage: wollte mir die Daten, die ich 
empfange, auf einem LCD anzeigen lassen....funktioniert aber irgendwie 
nicht richtig.
Hat jemand eine Idee bzw. eine Ahnung was da falsch sein könnte im Code?
Insgesamt soll ein String von fünf Zeichen ankommen....
Angehängte Dateien:
#3852773
Lesenswert?

> In rx_tmp müsste doch das drin stehen was ich Sende oder?

In der Datei rfm12.h wird die Datei "sensoren.h" mit eingebunden, dort 
findest du den Aufbau der Datenstruktur.
1
typedef union _datenblock
2
{
3
 uchar data[16];
4
 struct
5
  {uchar n;               //Laenge des Datenpakets
6
   int id;                //Eindeutige Nummer des Senders
7
   int temp1,temp2,temp3,temp4;//die beiden Temperaturen in AchtelgradC.
8
   uint batt;            //Batteriespannung in Millivolt
9
   long zaehler;         //Aufsummierte Temperaturdifferenzen
10
   uchar sec,min,stu;    //aktuelle Zeit des Senders
11
  };
12
} datenblock;


Hier wird das Datenpaket gesendet:
1
    rfm12_senden(antwort.data);

und hier empfangen:
1
    err=rfm12_empfang(block.data);
2
    id=block.id;

Also sind die empfangenen Daten in "block.data" welches 16 Byte groß 
ist.
Die zugehörige Struktur ist 20 Byte groß ... komisch.

In dem Archiv "Funkthermometer_RFM12b.zip" kann man eine Datei "rfm12.c" 
finden in der ganz unten ein vereinfachtes Beispiel steht.
Gast #3853291
Lesenswert?

Mike J. schrieb:
> und hier empfangen:    err=rfm12_empfang(block.data)

OK, ja danke. Hatte jetzt ein anderes Programm verwendet und zwar das 
Beispielprogramm von Ulrich-Radig. Da sah es ungefähr genauso aus:
cnt=rfm22_getpacket(rx_tmp); etwas weiter oben hab ich die c datei als 
Anhang.
wie kann ich mir dann die empfangenen Daten auf einem LCD anzeigen 
lassen?
SO:  err=rfm12_empfang(block.data);
     lcd_string(block.data);
#3856362
Lesenswert?

> wie kann ich mir dann die empfangenen Daten auf einem LCD anzeigen
> lassen?
> SO:  err=rfm12_empfang(block.data);
>      lcd_string(block.data);

Dieses "data" ist ja wahrscheinlich einfach nur ein Array mit einer 
bestimmten Länge, z.B. 16 Zeichen.
Wenn die Daten in dem Array als String angesehen werden sollen, dann 
musst du am Ende eine Null hinzufügen.

Wenn du das Datenpaket beim versenden gleich am Ende mit einer Null 
bestückst, dann wird dieses "lcd_string(block.data);" so funktionieren.


//----------------------------
Dieses Stück Code kopiert die Zeichen in ein neues Array, an die Stellen 
0 bis 15 (=16 Zeichen) und erstellt an der 16. Stelle des neuen Strings 
eine Null.
(das ist natürlich sinnlos wenn du nur 3 Zeichen überträgst, dann stehen 
an den Stellen 3 bis 15 nur Müll)
1
uint8_t meinArray[17];
2
uint8_t i = 0;
3
for(i = 0; i<16; i++)
4
{
5
    meinArray[i] = block.data[i];
6
}
7
meinArray[16] = 0; // Null (String-Terminierung)

Wenn du die Zahl 16 in dem Code durch eine Variable ersetzt welche die 
Länge deines Strings enthält (z.B. 3), dann funktioniert das auch mit 
einer variablen Zeichenkette.
#3857701
Lesenswert?

Hallo Peter (Gast),
lass dich nicht ärgern, aber schau dir trotzdem das Programm von "Stefan 
B." an ... es ist immer recht unschön wenn man sich die Mühe macht sein 
Programm hier zu posten und es dann quasi nicht genutzt wird.

Sag dann mal Bescheid ob es dir gelungen ist die versendeten Daten auf 
dem LCD anzuzeigen.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren