Hallo zusammen, ich benutze das RFM12 Funkmodul zur Kommunikation zweier ATMega32. Dazu verwende ich die Firmware von Jürgen Eckert, die hier zu finden ist. http://www.mikrocontroller.net/articles/AVR_RFM12 an rfm12.c und uart.c habe ich nichts verändert. Deshalb befindet sich nur die main_RX.c im Anhang. Nun zu meinem (sehr seltsamen) Problem. Das Empfangen funktioniert nur dann, wenn der Empfänger von einem Terminal am PC ausgelesen wird. Selbst wenn ich alle Funktionen, die mit UART zu tun haben, und deren Aufrufe auskommentiere, oder sogar uart.c aus der MAKEFILE nehme und alle Verweise entferne, funktioniert es nur mit angeschlossenem Terminal-Rechner. Das Programm hängt sich aber nicht auf, was eine Test LED gezeigt hat. Dann habe ich vermutet, dass die Masse vielleicht bei Sender und Empfänger die selbe sein muss und beide auf ein Potential gelegt. Aber selbst das funktioniert nicht. Vielleicht könnt ihr mir weiterhelfen. Das wäre klasse! Vielen Dank im Voraus, Raphael
Was für eine Antenne befindet sich denn an den Modulen?
Hallo, an beiden Modulen befindet sich eine 17,5cm lange 0,14mm² Litze. mfG Raphael
Kann es evtl. auch mit den Interrupts des UART zusammen hängen?
>Deshalb befindet sich nur die main_RX.c im Anhang.
Ich seh nix von Anhang.
1 | int main(void) |
2 | {
|
3 | |
4 | sei(); |
5 | |
6 | UART_Init(); |
7 | rf12_init(); // ein paar Register setzen (z.B. CLK auf 10MHz) |
8 | UART_Tx_Str("Init\n", 5); |
Deine uart wird doch initialisiert.
Hier schon, aber auch wenn ich
1 | #include "uart.h" |
2 | |
3 | UART_Init(); |
und alle anderen Funktionsaufrufe entferne, sowie den "uart.c" Eintrag in der MAKEFILE, bleibt das Problem bestehen, dass es nur mit angeschlossenem COM-Port funktioniert. Das ist auf verschiedenen Rechnern, verschiedenen Spannungsversorgungen und verschiedenen Platinen, reproduzierbar und mir unerklärlich :D mfG Raphael
Na hast du das dann auch die richtige Datei übertragen? Nicht das dein µc noch den alten Code drin hat.
Uii das wärs jetzt gewesen... habe gleich nochmal nachgeschaut und neu übertragen.. aber leider das selbe Spiel.
>bleibt das Problem bestehen, dass es nur mit angeschlossenem COM-Port >funktioniert. Das ist auf verschiedenen Rechnern, verschiedenen >Spannungsversorgungen und verschiedenen Platinen, reproduzierbar und mir >unerklärlich :D Vermutlich schliesst das Kabel deines COM Ports eine Masseverbindung die auf deiner Platine ohne dieses Kabel nicht vorhanden ist.
Ich benutze einen USB to Serial Adapter mit 4 PINS: GND RX TX und VCC, wobei ich VCC nicht benutzen muss, damit es funktioniert. Wenn ich nur GND verbinde, funktioniert es nicht. werden RX und TX im "Ruhezustand" denn auf high oder low gezogen? Oder welche Masseverbindung könnte denn durch den Adapter verbunden werden? mfG Raphael
>werden RX und TX im "Ruhezustand" >denn auf high oder low gezogen? Im Ruhezustand stehen auf RX und TX High Pegel. Was mich jetzt wieder vermuten lässt das TX vom USB Adapter dein Funkmodul und möglicherweise auch deinen uC parasitär versorgt. Jetzt wird es höchste Zeit für Schaltplan und Fotos.
1 | UART_Tx_Str(test, sprintf(test, "Start val: %u\n", rf12_rxstart())); |
evtl. wartet dein Programm bis die Daten abgeholt worden sind. Hier sind noch einige Teile der UART aktiv. Schau mal in die rf12.c vielleicht ist da noch was drin.
Habe mir nun die rfm12.c angeschaut. Allerdings wird hier kein UART Befehl verwendet.
Auch interessant: Es muss nur der RX-PIN (PD0) des ATMEGAs verbunden sein. Dh er muss keine Daten verschicken können. Nur (irgendwas) empfangen, wobei ich nicht wüsste was "Termite" schickt?
>Auch interessant: Es muss nur der RX-PIN (PD0) des ATMEGAs verbunden >sein. Dh er muss keine Daten verschicken können. Nur (irgendwas) >empfangen, wobei ich nicht wüsste was "Termite" schickt? Zieh den USB Adapter ab und miss an VCC, GND wie hoch die Versorgungsspannung ist. Sind alle VCC und GND angeschlossen, oder mal wieder AVCC vergessen?
AVCC ist dran :) Da ich mir mit der Versorgungsspannung auch unsicher war, hab ich die 5V vom USB Adapter direkt als Versorgungsspannung getestet. Leider auch hier keine Besserung. Sobald RX vom µC mit TX vom Adapter verbunden ist, läufts (nach einem Reset) und wenn es mal läuft und ich RX Wegnehme, läufts (bis zum nächsten Reset) weiter.
>Da ich mir mit der Versorgungsspannung auch unsicher war
Wieso unsicher? Miss sie mit einem Multimeter.
Und lass den USB Adapter dabei ab.
So, ohne Schaltplan und Fotos bin ich dann mal weg.
Bringt nichts hier weiter zu raten.
War mir unsicher ob es daran liegen könnte, nicht ob die Spannung die richtige ist... Es sind 5,02V um genau zu sei :) Den Schaltplan habe ich angehängt. mfG Raphael
>Es sind 5,02V um genau zu sei :)
Und wo hast du die gemessen? Oben am Chip oder
auf der Platine? Es ist schon sehr bedenklich
das der ATMega eine Starthilfe über den RXD Pin braucht
um anzulaufen. Vieleicht ist der VCC Pin ja gar nicht
verbunden. Da war doch schon mal einer wo das so war;)
Nur mal so ins Blaue: Mit welcher Frequenz wird der Mega32 betrieben, und wie sehen die Fuses aus?
@hogler: Die Spannung hab ich direkt an den Pins vom ATMEGA gemessen. Jeweils VCC und AVCC zur Kontrolle. @Volker: Er Läuft mit 16MHz und die Fuses sind LOW: 0xFF HIGH: 0xD9 Also High Freq. Ext. Crystal mit +64ms Startup Time und ohne JTAG
Setze mal CKOPT in der High-Fuse. Also 0xD9 -> 0xC9
GNDs geprüft und es sind alle auf dem selben Potential. (Brücke auch beide vom ATMEGA immer nochmal).. Auch das RFM12 Modul hat die selbe Masse. Das seltsame ist ja dass das Programm schon läuft, nur eben das Empfangen vom Emfangsmodul läuft immer ins Timeout und funktioniert erst nach der "Starthilfe".
Und BOD zu aktivieren kann eigentlich auch nie schaden - es sei denn man muß auf jedes uA achten.
Vielen Dank für die Hinweise! :) Hat leider beides nicht funktioniert.
>Und BOD zu aktivieren kann eigentlich auch nie schaden - es sei denn man >muß auf jedes uA achten. Und wenn man jedes uA braucht deaktiviert man es und bringt den Controller u.U. in einen undefinierten Zustand oder zerschrabbelt das EEPROM? Och nö.
Hänge mal direkt zwischen GND und VSS (so nah wie möglich am RFM) nen 100nf Kondensator rein, ich hatte da ein ähnliches Problem mit dem Empfang. Nach 3 Tage suchen hatte ichs dann. Ups: VDD natürlich
:
Bearbeitet durch User
Stefan B. Mein HELD! :D Das wars! hab direkt an die GND und VDD Pins vom RFM12 einen Kondensator drangelötet und siehe da!! Vielen Dank an alle für die Unterstützung!!!! mfG Raphael
>Das wars! hab direkt an die GND und VDD Pins vom RFM12 einen Kondensator >drangelötet und siehe da!! Jetzt muss man sich nur noch fragen was das mit dem RXD Pin zu tun hat. Ich habe keinen 100n direkt am RFM12 (10cm weg) und es tut trotzdem. Ich habe aber 100n direkt am uC. Wem hat der 100n jetzt geholfen? Dem uC oder dem RFM;)
Ich würde sagen dem RFM. Ich hatte/habe nen 100nf am uC und total wirre Zeichen aufm Display. Erst als ich zusätzlich dann den 100nf an den RFM gelötet habe gings.
Muss meine verfrühte Euphorie auch zurücknehmen... Es funktioniert doch nicht ... hatte vergessen zu Resetten :D :D oh jee.
Leider auch nichts... Was könnte denn vom RX gelesen werden beim Start?
an den RFM12 muss laut datenblatt ein 10µF Elko und ein 100nF Kerko ran. Ausserdem muss zwischen einschalten und Init des RFM12 mindestens 100ms gewartet werden. Was passiert denn, wenn du den RX Pin des UART statt an den Rechner zum beispiel direkt an Vcc oder GND hängst? Wie sehen deine Fuses aus? [EDIT] Was du noch machen könntest. Lösch mal alles aus dem Quellcode, bis auf die Reine Empfangsroutine und lass darin Beispielsweise eine LED Toggeln. Schonmal ne andere Bausrate beim RFM12 probiert?
:
Bearbeitet durch User
Die Fuses sind nun LOW:0xBF HIGH:0xC9 Bin alle Möglichkeiten mit TX RX an VCC und GND durchgegangen, leider ohne Erfolg. Das mit den 100ms versuche ich mal :)
Eine Zeitverzögerung hat nichts gebracht... Die Empfangsroutine läuft immer ins Timeout... dh die Funktion rf12_rxfinish() gibt immer 255 zurück wenn der Controller nicht über die RX Leitung "gestartet" wird. Wegen der Baudrate... Es funktioniert ja wenn ich mit einer verbundenen RX Leitung zum PC starte einwandfrei. mfG Raphael
Könntest auch mal eine LED (direkt als erste Aktion) blinken lassen (oder ähnliches), damit man sieht, ob der uC gar nicht läuft oder läuft und dabei auf irgendwas wartet.
Hallo, Also eine TestLED hat gezeigt, dass das Programm an sich läuft. Nur der Case:
1 | If(timeout>0) |
2 | {...}
|
Wird ohne angeschlossenen RX nicht aufgerufen. mfG Raphael
Hängt der nRES-Pin wie im Schaltplan in der Luft? Zur Sicherheit würde ich den mal via 10k-Pullup auf VCC hängen, ansonsten reicht ein kurzer Low-Spike (1µs) an diesem Pin, dass der Controller in den Reset geschickt und alle Register auf ihren Einschaltzustand zurückgesetzt werden.
Hallo Felix, habe nun den nRES mit einem Pullup versehen, leider auch keine Änderung. Ich habe auch versucht die Interrupts erst nach einer Verzögerung freizugeben - ohne Erfolg. Den RX auf 3,3V zu legen (der am Adapter gemessene Wert im Ruhezustand) verschafft keine Abhilfe. Den RXPin Parallel durch einen anderen COM-Port zu "überwachen" führte auch zu keinem Ergebnis. es wird vom PC also anscheinend nichts geschickt. mfG Raphael
Mach doch mal Bitte ein Foto der Schaltung von Bestückungs- und Lötseite. Poste dann noch bitte den Schaltplan, so wie du die Schaltung aufgebaut hast und Poste deinen kompletten Code, auch das, was du nicht verändert hast. Alles Rätselraten Bringt hier nix, wenn man nicht alles sieht. Ansonsten würde ich jetzt das Programm neu anfangen und erstmal nur den RFM12 ansteuern und ne LED blinken lassen, bis das sauber Funktioniert. Danach erst schritt für schritt den Rest ergänzen!
Hallo, habe mal eine Zip erstellt mit allem Drin: Schaltplan, so wie es nun aufgebaut ist, Fotos (sieht inzwischen etwas wüst aus :D) und Dem kompletten Programm. mfG Raphael
Hastes hinbekommen? Im Anhang mal mein Proggi. Bin noch nicht fertig, aber funzen tuts zumindest schonmal. Aber an Deinen Lötkünsten solltest Du noch einiges verbessern ;-)
:
Bearbeitet durch User
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.