Forum: Mikrocontroller und Digitale Elektronik RFM12 Empfängt nur wenn µC an COM Port angeschlossen


von Raphael (Gast)


Lesenswert?

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

von Easylife (Gast)


Lesenswert?

Was für eine Antenne befindet sich denn an den Modulen?

von Raphael (Gast)


Lesenswert?

Hallo,

an beiden Modulen befindet sich eine 17,5cm lange 0,14mm² Litze.

mfG

Raphael

von Raphael (Gast)


Lesenswert?

Kann es evtl. auch mit den Interrupts des UART zusammen hängen?

von holger (Gast)


Lesenswert?

>Deshalb befindet sich nur die main_RX.c im Anhang.

Ich seh nix von Anhang.

von Raphael (Gast)


Angehängte Dateien:

Lesenswert?

Ach mist... den Link vergessen... :D

http://pastebin.com/wQgpgxnF

von Steffen T. (st32)


Lesenswert?

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.

von Raphael (Gast)


Lesenswert?

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

von Steffen T. (st32)


Lesenswert?

Na hast du das dann auch die richtige Datei übertragen? Nicht das dein 
µc noch den alten Code drin hat.

von Raphael (Gast)


Lesenswert?

Uii das wärs jetzt gewesen... habe gleich nochmal nachgeschaut und neu 
übertragen.. aber leider das selbe Spiel.

von holger (Gast)


Lesenswert?

>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.

von Raphael (Gast)


Lesenswert?

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

von holger (Gast)


Lesenswert?

>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.

von Steffen T. (st32)


Lesenswert?

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.

von Raphael (Gast)


Lesenswert?

Habe mir nun die rfm12.c angeschaut. Allerdings wird hier kein UART 
Befehl verwendet.

von Raphael (Gast)


Lesenswert?

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?

von holger (Gast)


Lesenswert?

>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?

von Raphael (Gast)


Lesenswert?

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.

von holger (Gast)


Lesenswert?

>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.

von Raphael (Gast)


Angehängte Dateien:

Lesenswert?

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

von holger (Gast)


Lesenswert?

>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;)

von Volker (Gast)


Lesenswert?

Nur mal so ins Blaue:

Mit welcher Frequenz wird der Mega32 betrieben, und wie sehen die Fuses 
aus?

von Raphael (Gast)


Lesenswert?

@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

von Michi (Gast)


Lesenswert?

Miss doch mal die GND Pins durch ...

von Volker (Gast)


Lesenswert?

Setze mal CKOPT in der High-Fuse. Also 0xD9 -> 0xC9

von Raphael (Gast)


Lesenswert?

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".

von Raphael (Gast)


Lesenswert?

@ Volker: das versuch ich mal :)

von Volker (Gast)


Lesenswert?

Und BOD zu aktivieren kann eigentlich auch nie schaden - es sei denn man 
muß auf jedes uA achten.

von Raphael (Gast)


Lesenswert?

Vielen Dank für die Hinweise! :)
Hat leider beides nicht funktioniert.

von holger (Gast)


Lesenswert?

>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ö.

von Stefan B. (sibbl) Benutzerseite


Lesenswert?

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
von Raphael (Gast)


Lesenswert?

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

von holger (Gast)


Lesenswert?

>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;)

von Stefan B. (sibbl) Benutzerseite


Lesenswert?

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.

von Raphael (Gast)


Lesenswert?

Muss meine verfrühte Euphorie auch zurücknehmen... Es funktioniert doch 
nicht
... hatte vergessen zu Resetten :D :D oh jee.

von Stefan B. (sibbl) Benutzerseite


Lesenswert?

Mach mal R1 weg.

von Raphael (Gast)


Lesenswert?

Leider auch nichts... Was könnte denn vom RX gelesen werden beim Start?

von Chris L. (kingkernel)


Lesenswert?

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
von Raphael (Gast)


Lesenswert?

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 :)

von Raphael (Gast)


Lesenswert?

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

von Martin M. (capiman)


Lesenswert?

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.

von Raphael (Gast)


Lesenswert?

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

von Felix P. (fixxl)


Lesenswert?

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.

von Raphael (Gast)


Lesenswert?

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

von Chris L. (kingkernel)


Lesenswert?

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!

von Raphael (Gast)


Angehängte Dateien:

Lesenswert?

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

von Stefan B. (sibbl) Benutzerseite


Angehängte Dateien:

Lesenswert?

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
Noch kein Account? Hier anmelden.