Forum: Mikrocontroller und Digitale Elektronik RFM12 nIRQ immer Low


von Sebastian (Gast)


Lesenswert?

Hallo allerseits,

ich benutze ein RFM12 als Empfänger im FIFO-Mode ohne Mustererkennung. 
Als Füllschwelle habe ich 1000b also 8Bit eingestellt. Die Daten werden 
ausgelesen sobald der Pin nIRQ auf Low geht. Nun ist das aber leider 
immer der Fall, also wird nur Mist ausgelesen. Die Ereignisse welche den 
Interrupt auslösten könnten habe ich deaktiviert (nINT als Ausgang, 
Brownoutdetection deaktiviert)

Den Sender betreibe ich übrigens auch indem ich den nINT-Pin abfrage und 
Daten in den Sendepuffer lade. Dort funktioniert es auch einwandfrei. 
Ich habe auch schon den Sende- und Empfangscontroller vertauscht um 
auszuschließen dass es an den Modulen liegen könnte.

Was könnte noch einen Interrupt auslösen ?

von jörg g. (Gast)


Lesenswert?

Ich habe derzeit auch ein Problem mit dem Empfangen, jetzt möchte ich 
überprüfen ob es vl. doch am Sender liegt. Kann man vl. irgendwie 
überprüfen das der Sender wirklich sendet?

von Jojo S. (Gast)


Lesenswert?

Wenn man im 'Data Filter Command' den Filter auf Analog stellt (Bit4=1) 
und am Data-Ausgang einen Verstärker anschliesst kann man die Daten im 
Empfänger hörbar machen. Bit3 und 5 in diesem Kommando sollten aber 0 
sein und nicht 1 wie im Datenblatt steht, das ist offensichtlich falsch.

von Sebastian (Gast)


Lesenswert?

Hallo Jörg,

ich sende im Sekundentakt und frage das DRSSI-Bit des Statuswortes im 
Empfänger ab. Beim Senden ist es High und bringt mir dadurch eine LED 
zum Leuchten. Welches Problem hast du mit dem nINT-Signal ?

von Ben M. (benn)


Lesenswert?

Hallo,
ich habe auch gerade das Problem, dass nIRQ im Normalzustand low ausgibt 
- gibt es für dieses Problem mittlerweile eine Lösung bzw. Erklärung?

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Dann löst noch ein anderes internes Modul eine Interruptanfrage aus. 
Schau mal in die Doku, welche Module alle auf die nIRQ Leitung zugreifen 
können.

von Grobi (Gast)


Lesenswert?

Also ich hatte mit dem RFM12 so ziehmlich das gleiche Problem, nach dem 
ich dann alles mögliche ausprobiert hatte von software emuliertes SPI 
und fast jedem source code den ich irgendwo zu dem Thema finden konnte, 
weil ich mir absolut sicher war das sich kein Fehler in die Verkabelung 
eingeschlichen hatte, war die Lösung eher ein glücklicher Zufall. Die 
RFM dinger sind anscheinend SEHR empfindlich was ihre 
Versorgungsspannung angeht. Ich hätte niemals gedacht das es mit sowas 
zu tun hat, aber nachdem ich einen 22µ elko genau über VDD und GND am 
Modul gelötet hatte klappte auf einmal das senden und empfangen auf 
anhieb und bis heute! Aber leider hatte ich erstmal 2-3 Monate 
"rumgedoktert" bis ich auf die Idee gekommen bin, schöne 
Zeitverschwendung. Ansonsten bin ich echt überrascht von den RFMs, kann 
im Haus über 2 Stcokwerke hinweg ohne Probleme mit 38KBaud senden und 
empfangen. Benutze sie als Fernsteuerung für nen e-Helikopter und bis 
jetzt hatte ich auch noch keine Störungen durch irgendwelche 
Funkwetterstationen unserer Nachbarn die auch auf 433MHz senden oder 
Garagentoröffner etc.

mfG Grobi

von Gast (Gast)


Lesenswert?

Hardware: Pollin RFM12s Rev:3.0

ich habe lange gesucht, hier meine Lösung:

Ich benötige beim RFM12 den PIN nIRQ für den Wake-Up Timer
(Batteriebetrieb).

Leider wird nIRQ auf LOW gesetzt und blockiert, nachdem ein Byte
erfolgreich gesendet wurde (d.h. Statusbit RGIT => 1  und  nIRQ => 0).
Im RF12 Datenblatt S.24 geht nIRQ->High nach "clearing et bit"
Das fubktioniert bei meinem Modul nicht!

Wird jetzt der Wake-Up Timer gestartet, bleibt nIRQ die ganze Zeit auf
LOW. Das Wake-Up Event wird korrekt im Statusregisterbit WKUP angezeigt,
nur der nIRQ ist leider blockiert.

Ich habe keine Befehlsequenz gefunden, die den nIRQ sauber wieder
freigibt.
Ich habe getestet:
- Lesen der Statusregister (0x0000)
- das Bit et im Power-Managemant gelöscht und gesetzt, wie im Handbuch
unter "12. wake-up timer" beschrieben
- Alle Varianten den Chip schlafen zu legen (0x8201) und wieder
aufzuschalten.

Als einzigen dirty Workaround  habe ich gefunden, ein zusätzliches dummy
Byte zu senden und den Sender sofort stromlos zu schalten (0x8201) bevor
das Statusbit RGIT/FFIT  Erfolg meldet und nIRQ wieder auf LOW geht.

------------------- NACHTRAG --------------------
Jetzt bin ich beim Stöbern in den Datenblättern von RF12  IA4421  
Si4421 auf folgenden UNTERSCHIED gestoßen:

- Im Datenblatt vom RF12 / IA4421 wird nach Tx der nIRQ freigegen mit 
et=0.
- Im Datenblatt vom Si4421 wird nach Tx der nIRQ freigegen mit et=0 (zB 
0x8201) und anschließend el=0 (zB 0x8057).

Der CODE für den Si4421 funktioniert bei meinem Pollin Modul :-) !!!
Da ich alle viele Codefragmente aus mikrocontroller.net erfolglos 
getestet hatte (meist wird nach Tx nur ein 0x8201 gesendet) nehme ich 
an, dass  verschiedene RFM12 Module im Umlauf sind!

von abach (Gast)


Lesenswert?

Hallo Gast!

Danke, das war der entscheidende Hinweis. Auch bei mir bleibt nIRQ nur 
dann high, wenn ich das el bit lösche!

Danke, habe auch Stunden gebraucht um das rauszufinden.

Grüße

von Chris (Gast)


Lesenswert?

Hi!

Ich habe vermutlich das gleiche Problem mit dem rfm12-Code von Das 
Labor.
Kann mir jemand helfen, den Code zu ändern? Als Anfänger bin ich 
verloren.

Gruß,
Chris

von Sörn (Gast)


Lesenswert?

Hi!

Welche revision des si4421 datenblattes hast du (und von wo her?). Ich 
finde hier[0] auf Seite 28 nur folgendes:
> WKUP: both the nIRQ pin and status bit can be cleared by the read status command

Ich frage, denn den transmitter ab- und wieder anzuschalten würde den 
doch wieder in seinen ursprungszustand versetzen und ggf. aus dem takt 
bringen - ich kann mir jedenfalls vorstellen das der auch eine gewisse 
zeit braucht um sich einzuschwingen.
Werde gleich mal damit rumexperimentieren und schauen ob das zuverlässig 
klappt.

Grüße vom Sörn

---
0: 
http://www.silabs.com/pages/DownloadDoc.aspx?FILEURL=Support%20Documents/TechnicalDocs/Si4421.pdf&src=ProductMatrix

von Chris (Gast)


Lesenswert?

Hi Sörn,

ich habe in den letzten Tagen immer mal wieder gesucht, aber auch keine 
anderen Datenblätter gefunden.... werde wohl auf die Wakeup-Funktion 
verzichten müssen.
Hast du noch etwas herausgefunden?

Gruß,
Chris

von Holger S. (holli_1)


Lesenswert?

Wenn man folgende Dinge beachtet, sollte es keine Probleme mit dem IRQ 
geben.

- nach dem Einschalten geht nIRQ auf low wegen POR und/oder EXT IRQ
- am Ende vom Init des RFM den Status lesen löscht diese IRQ

- Senden: nachdem das letzte Byte an den RFM geschickt wurde, sofort 
et=0 setzen. Sonst wird RGIT IRQ wieder aktiv und nIRQ low. Dies kann 
nicht durch Lesen des Status gelöscht werden, nur durch Übertragen eines 
Bytes in den TX-Puffer. Gilt natürlich nur wenn der TX-Puffer verwendet 
wird.

- Empfangen: nachdem das Letzte Byte aus dem FIFO geholt wurde, sofort 
FIFO abschalten bzw. FIFO Reset ausführen. Sonst wird der FFIT IRQ 
gesetzt und nIRQ wird low. Dieser kann nur durch Auslesen des FIFO 
gelöscht werden.
Nachdem der FIFO einmal die Sync Bytes erkannt hat, liefert er auch ohne 
aktiven Sender noch Daten (zufällige Werte). Durch den FIFO Reset wird 
wieder auf Sync Bytes gewartet

- wake-up timer: Lesen des Staus Registers löscht den WKUP IRQ und nIRQ 
wird wieder high

von Johannes (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Leute,

ich habe das selbe problem mit dem Low am int. Will 
Senden...Funktioniert auch manchmal ;) ... der interrupt pfuscht 
dazwischen vermute ich.

Also:

hab alles durchprobiert...löschen aller register ... in verschiedenen 
kombinationen. Einen Logik-Analyser hab ich auch dazu geholt ;) ... 
kommunikation wie gewünscht!

ich bekam am Anfang immer ein 0x8000 Status. Wie ich dies aber 
interpretieren sollte wusste ich erst nicht. bit nummer 16 nennt sich 
FO? Warum Fifo out? ich will doch nur senden :(

Dieser Code schiebt die daten ins fifo.
Ist aus ner LIB und befindet sich in der Interruptroutine die auf INT0 = 
LOW reagiert.

  if(RF12_status.Tx)
    {
      rf12_trans(0xB800 | RF12_Data[RF12_Index]);
      if(!RF12_Index)
      {
        RF12_status.Tx = 0;
        rf12_trans(0x8208);
      }
      else
      {
        RF12_Index--;
      }
    }

Anbei das aktuelle out...

wie werd ich dem den Herr?
Bitte helft mir :(

von Johannes B. (dercwolf)


Lesenswert?

UM Himmeles WILLEN!

entschuldigt meinen verzweifelten Ausbruch ;)

ich habe das register Falschherum gelesen...0x8000 bedeutet ich solle 
das TX-Register beschreiben ... meine güte. entschuldigung!

von Christian P. (peterfrosta)


Lesenswert?

Johannes dein screenshot von deinem (ich nehme an) pc-oszillosop sieht 
sehr praktisch aus. ich quele mich hier immer mit meinem 2-kanal uni-t 
oszi...
kannst du mir vllt mal den produktnamen von dem teil sagen?
sieht sehr praktisch aus mit dem langen zeitausschnitt, den vielen 
kanälen und der wertanzeige.
würde mich freuen!

und ja ich hänge auch an nIRQ-immer-low fest!
der elektor kam in seinem artikel oder nIRQ aus SDO springt ja scheinbar 
zu selben zeit wie nIRQ?

ich habe schon  etliche stunden (ingesamt sicher tag) am schreibtsich 
vertüfftelt. hab bisher trotzdem noch noch nicht ein Byte richtig 
übertragen :/
wenn mir jemand mal einen funktionierenden Quellcode senden würd oder 
sich meinen code mal anschauen würd, wäre ich sehr erfreut!

dafür das die teile so leicht anzusteuern sein sollen, ist es 
erstaunlich schwierig mit der menge an verschiedenen und scheinbar 
unvollständigen und fehlerhaften datenblättern.
Zumindest für mich.

viele grüße Peter

von Cyblord -. (cyblord)


Lesenswert?

Christian Peskov schrieb:
> Johannes dein screenshot von deinem (ich nehme an) pc-oszillosop sieht
> sehr praktisch aus. ich quele mich hier immer mit meinem 2-kanal uni-t
> oszi...
> kannst du mir vllt mal den produktnamen von dem teil sagen?
> sieht sehr praktisch aus mit dem langen zeitausschnitt, den vielen
> kanälen und der wertanzeige.
> würde mich freuen!

http://www.saleae.com/

Hab ich auch. Das Ding ist absolut genial!
Aber es handelt sich um einen Logic Analyzer, kein Oszi.

von Johannes (Gast)


Lesenswert?

Hallo zusammen.

Genau. Das war der Logik 8. Liegt im Moment bei knapp 130€.
Sehr nützlich und ein muss wenn man experimentel programmiert :)

von Cyblord -. (cyblord)


Lesenswert?

Ach so einen LA braucht man eigentlich immer, wenn man digitale 
Schaltungen entwickelt. Merkt man aber erst wenn man einen hat ;-)

Und nach Europa versenden die über UK, also keine Probleme wegen Zoll.

von Christian P. (peterfrosta)


Lesenswert?

ja besten dank!! als ich den screenshot sah, bin ich auch begeistert 
gewesen :-) und nach dem cyblord mir noch in  der nacht antwortete, habe 
ich auch gleich eins bestellt :) 130 euro ist ja echt fair find ich...
zumal ich mich bisher mit meinem 400€ oszi gequält habe. ich hoffe es 
kommt die woche. ich bin ja ehr n leie und dachte immer die usb oszis 
sind doch nie so gut wie die digitalen dedizierten geräte... aber es ist 
ja kein oszi :)) bin echt gespannt, das sieht so praktisch aus ^^

so jetzt noch mal zu dem eigentlichen thema:
also mein nIRQ im empfänger blieb auch immer auf low sobald alle 
receiver bits gesetzt wurden. bei mir geht nIRQ erst auf high zurück, 
wenn ich:
nach dem auslesen des FIFOS, 0x0000 sende UND anschliesend 0xca85 (kann 
auch 0x80a7 gewesen sein, hab gerade beides im code stehen) an das RFM 
sende.
Aber es kann doch nicht sein, dass nach jedem ausgelesenen FIFO-Byte den 
ganze receiver ausgeschalten muss?!?

desweiteren hab ich folgendes gravierendes Problem. ICh hoffe das bei 
euch erfahrenen das auch schon auftrat und ihr mir die lösung preisgibt: 
^^

ich versuche ja noch die rudimentäre funkverbindung hinzubekommen.
2mal rfm12b auf 2 Pollin-Funkboards. Bestückt mit atmega32.
wenn der Sender ausgeschaltet ist, empfängt mein revceiverboard das 
rauschen auf der antenne. also ich bekomme zufällige zahlen ausgegeben. 
das freute mich auch erstmal :)

sobald der sender eingeschalten wird, empfange ich nur noch Nullen! :/
a) erfreulich, weil fernwirkung statt findet.
b) unerfreulich, weil funzt ja nicht richtig xD

das war auch der stand der dinge als ich es vpr 1,5 jahren schon 
versuchte. jetzt hab ich mich an neuen beispielen gehalten und wieder 
das gleich bild :/

das hat doch bestimtm auch schon wer von euch mitgemacht?! hat wer nen 
tipp für mich?

ich danke euch ^^

von karsten (Gast)


Lesenswert?

Hallo Christian Peskov,

>ich versuche ja noch die rudimentäre funkverbindung hinzubekommen.
>2mal rfm12b auf 2 Pollin-Funkboards. Bestückt mit atmega32.
>wenn der Sender ausgeschaltet ist, empfängt mein revceiverboard das
>rauschen auf der antenne. also ich bekomme zufällige zahlen ausgegeben.
>das freute mich auch erstmal :)

>sobald der sender eingeschalten wird, empfange ich nur noch Nullen! :/
>a) erfreulich, weil fernwirkung statt findet.
>b) unerfreulich, weil funzt ja nicht richtig xD

>das war auch der stand der dinge als ich es vpr 1,5 jahren schon
>versuchte. jetzt hab ich mich an neuen beispielen gehalten und wieder
>das gleich bild :/

Die Probleme hatte ich auch. Habe mir die Platinen und Software vom RF 
SOAP Projekt hier im Forum besorgt. Sehr gut gemacht. Das hat mir in 
sehr kurzer Zeit ein grundlegendes Verständis des RFM12 gebracht. Vor 
allem: es lief auf anhieb. Gut angelegtes Geld finde ich.

Mit diesen Grundlagen habe ich ein eigenes Projekt auf die Beine 
gestellt und funktioniert gut. Das Projekt nim Sensordaten vom Barometer 
und Hygrometer auf und sendet diese per Funk an eine Basis. Bei 
Interesse PN
an mich.


Der Receiver ansich ist unproblematisch. Der Transmitter macht da 
deutlich mehr Schwierigkeiten. Da Datenblatt von Silabs (Si4420 für den 
RFM12) und das Tool WDS3 von Silabs sind  eine enorme Hilfe. Man muss 
das Datenblatt
 wirklich mehrmals sehr gründlich lesen (Auch mir sind nach mehrmaligem 
Lesen die vielen Stolperfallen klar geworden).

Karsten

von Christian P. (peterfrosta)


Lesenswert?

Danke für deine antwort!


so sehe ich gerade dass das hier noch offen war.

Also mien problem war (und das war scheinbar schon vor 2 jahren der 
haken)
das die printfanweisungen welche ich zu debuggen einfügte, sowohl in der 
Sende als auch empfangsfunktion war. das hat wohl alles zu lange 
gedauert so das nie was ordenlichen eingelesen wurde.
printf überall rausgehauen und schwupp lief es :)
sensationell! ich wäre heute viel weiter wenn ich damals schon dies idee 
gehabt hätte. danach hab ichs nämlich erst mal in die ecke gehauen :-/


auf deine angebot karsten, werde ich bei zeiten aber zurück kommen 
danke!
jetzt guck ich mir erstmal dein genanntes projekt an.

funken tun wir nun cshon und auch testweise mal ein relais angehangen. 
überlegen uns zur zeit noch en geeignetes protokoll..

viele grüße

von Veit K. (veitchen)


Lesenswert?

ufff äääh könnte das wer ganz kurz zusammenfassen in ein paar zeilen 
code?


interrupt abfangen, zeichen lesen, interrupt löschen ... im polling geht 
alles aber beim interrupt schnippsel ich mir hier schon solange code 
zusammen und passiert nix :(

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.