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?
>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.
Hab ich gemacht... Komme jetzt in die While rein, bleibe dann aber bei... cnt = rf22_getpacket(rx_tmp); hängen...danach lässt sich die LED nicht mehr abschalten...
>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?
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.
Hallo habe jetzt einen Pegelwandler zwischen dem Funkmodul und dem Atmega.....trotzdem noch das selbe Problem. Kann nichts Empfangen. Bleibe immer noch an der selben Stelle hängen....
Peter schrieb: > habe jetzt einen Pegelwandler zwischen dem Funkmodul und dem > Atmega.....trotzdem noch das selbe Problem. Kann nichts Empfangen. Und das Modul hat die 5V gut überstanden?
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
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.
Hast es so verdrahtet wie auf dem Beispielschaltplan? Dein Spannungsteiler ist korrekt? Müssen jetzt nicht die gleichen Widerstände sein wie auf dem Schaltplan, aber auf 3,3V sollte es schon rauskommen.
:
Bearbeitet durch User
Ja hab ich.... Ob das Funkmodul die 5V eventuell doch nicht überlebt hat(hatte das letzte Woche nicht beachtet und einige male ohne Pegelwandler programmiert)?
Irgendwo glaube ich mal gelesen zu haben, dass die Dinger nicht so empfindlich sein sollen. Steht iwo hier im Forum. 100nF direkt am Modul zwischen GND und VSS auch dran?
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...
>Mit Modul habe ich irgendwas mit 0,6V gemessen.
Sowas misst man gerne mal wenn das Modul keine Spannungsversorgung hat;)
holger schrieb: > Sowas misst man gerne mal wenn das Modul keine Spannungsversorgung hat;) Doch Spannungsversorgung ist dran.... Hab jetzt ein neues Modul und immer noch das selbe Problem....
Messe immer noch absoluten Mist, wenn ich die Datenleitungen vom Atmega32 mit dem Funkmodul verbinde....Trenn ich das Modul von den Datenleitungen, hab ich saubere 3.3V
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.
@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
:
Bearbeitet durch User
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....
Das LCD funktioniert....daran liegt es nicht. Es zeigt auch was an, nur nicht das was ich Sende...
> 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.
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);
> 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.
String mit 0x00 abschliessen. Sind die empfangenen Zeichen druckbar?
Wenn Du Dir einmal das Programm angeschaut hättest, welches ich gepostet habe, würden sich 3/4 Deiner gestellten Fragen erübrigen. Ach ja, bißchen Hirn solltest Du noch einschalten ;-) Gruss
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.