www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Zerstört Pollin-Board den RFM02?


Autor: Robert Knipp (mr_insanity)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe ein Problem mit dem RFM02 auf dem Pollin-Board. Hatte dazu auch 
schon mal hier: Beitrag "Problem mit RFM02" und 
hier: Beitrag "Endlosschleife?" etwas dazu 
gepostet.

Hier nochmal das Programm:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <avr/eeprom.h>
#include <stdlib.h>
#include <util/delay.h>
#include "global.h"
#include "rf02.h"

#define Taster_PORT PORTB
#define Taster_DDR   DDRB
#define Taster_PIN   PINB
#define Taster 1

#define LED_PORT  PORTD
#define LED_DDR   DDRD
#define LED_PIN   PIND
#define LED 5


unsigned char test[2]="01";

int main(void)
{
  Taster_DDR &= ~(1<<Taster);
  LED_DDR |= (1<<LED);
  
  rf02_init();          // ein paar Register setzen (z.B. CLK auf 10MHz)
  rf02_setfreq(RF02FREQ(433.92));  // Sende/Empfangsfrequenz auf 433,92MHz einstellen
  rf02_setpower(0);        // -0dBm Ausgangangsleistung
  rf02_setmodfreq(3);        // 120kHz Frequenzshift
  rf02_setbaud(19200);      // 19200 Baud
  SREG &= ~(1<<7);
  
  
  while(1)
  {
    if (Taster_PIN & (1<<Taster))
    {
      rf02_txdata(test,2);
      LED_PORT |= (1<<LED);      
      _delay_ms(1000);
      LED_PORT &= ~(1<<LED);
    }
  }
}

Nun habe ich mal versucht das auf einem Mega32 zu debuggen und habe 
dabei festgestellt, dass das Programm immer an einer bestimmten Stelle 
hängen bleibt. Ich lasse es einfach laufen, drücke den Taster und 
pausiere es dann. Dabei bleibt es jedesmal an folgender Stelle hängen:
void rf02_shiftout(unsigned char wert)
{  unsigned char j;
  for (j=0; j<8; j++)
  {  
    while(IRQ_PIN&(1<<IRQ));
    while(!(IRQ_PIN&(1<<IRQ))); <---- Hier bleibt es hängen
    if (wert&128)
        sbi(SDI_PORT, SDI);
      else
        cbi(SDI_PORT, SDI);
      wert<<=1;
    }
}
Es kommt also wohl kein IRQ-Request vom RFM02.

Diese Funktion stammt aus der angehängten Library.

Ich dachte mir dann, vielleicht ist ja das RFM02 defekt und habe es 
durch ein nagelneues getauscht. Nachdem Einschalten des Boards 
funktionierte es genau einmal. Also die LED leuchtete nach dem Betätigen 
des Tasters einmal, so wie es sein sollte. Ein weiteres Mal 
funktionierte es aber nicht. Auch ein Reset oder Trennen von der 
Stromversorgung half nichts.
Könntes es nun sein, dass das RFM02 aus irgendeinem Grund gekillt wird? 
Oder hängt es sich vielleicht irgendwie auf?
Kann ich irgendwie testen, ob das Modul noch funktioniert?
Ich weiß wirklich nicht mehr weiter!

MfG
Robert Knipp

Autor: Robert Knipp (mr_insanity)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hat denn keiner eine Idee, woran das liegen könnte?

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vom RF12 Datenblatt her (s. Artikelsammlung) macht die 2. while-Schleife 
IMHO keinen Sinn. Der Empfänger (das RF02 Modul) zeigt ja durch ein LOW 
auf der nIRQ Leitung, dass er vom µC neue Daten empfangen mag. Dann 
sollte man die vom µC aus auch liefern und nicht in einem while trödeln. 
Das rf02 kann dann den IRQ-Request schicken wie es will, durch die 
while-Falle kommt der nie durch! Wenn der Code beim ersten Mal 
funktioniert, hat das andere Gründe.

ADD: Wo kommt denn die Library her? Hast du die geschrieben oder 
umgeschrieben?

Autor: Robert Knipp (mr_insanity)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank für den Tip!
Habe die Schleife mal auskommentiert und es läuft nun durch. Aber der 
Benedikt hat sich doch sicher etwas bei dieser Schleife gedacht. Naja, 
werde mal das RFM01, welches übrigens der Empfänger ist (RFM02 ist 
Sender), in Betrieb nehmen. Vielleicht empfängt es ja was.

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mit "Empfänger" meine ich das Ding, das hier vom µC ("Sender") 
angesprochen wird. Nicht die Funktion bzw. den Funkteil. Ich sollte 
vielleicht besser Master (µC)/Slave (RFxx Modul) benutzen und 
Sender/Empfänger nur bei der Funktion der RFxx Module.

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stefan "stefb" B. wrote:
> Vom RF12 Datenblatt her (s. Artikelsammlung) macht die 2. while-Schleife
> IMHO keinen Sinn. Der Empfänger (das RF02 Modul) zeigt ja durch ein LOW
> auf der nIRQ Leitung, dass er vom µC neue Daten empfangen mag.

RF12 und RF02 darf man nicht vergleichen! Der RF02 hat keinen FIFO, er 
zeigt mit einem kurzen Impuls an, wann er neue Daten haben möchte. Daher 
muss man beide Flanken abfragen. Ohne die zweite abfrage, wird der RF02 
mit Daten zugemüllt. Wenn der µC zu langsam läuft, oder irgendein 
Interrupt dazwischen kommt, dann verpasst er den Impuls. Es gibt zwar 
auch einen undokumentierten Befehl mit dem man den RF02 in eine andere 
Betriebsart versetzen kann (in der dann ein Rechteck mit 50% duty 
rauskommt), aber irgendeinen Grund wird es haben, warum dieser Modus 
nicht in der Dokumentation auftaucht. Der Hersteller gibt dazu keine 
weiteren Infos raus, außer dessen Existenz zu bestätigen.
Da die RFM12 beim Hersteller genausoviel kosten wie die RF02 bin ich 
seitdem auf die RF02 übergewechselt. Die sind sehr viel schöner 
anzusteuern, RF02 ist echt eine Qual.

Autor: Robert Knipp (mr_insanity)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>...bin ich seitdem auf die RF02 übergewechselt.

Du meinst wohl auf RFM12?

Ich habe die RFM02 genommen, da ich damit eine Fernbedienung realisieren 
möchte und ich mir dachte, Senden reicht ja, nehme ich die RFM02.

Die Schleife muss also drin bleiben? Aber warum hängt er denn da immer?

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, RFM12.
Es gibt 2 Möglichkeiten wieso er hängen bleibt:
- Der AVR ist zu langsam (ich glaube mindestens 4-5MHz braucht die 
Software um den Impuls sicher zu erkennen)
- aus irgendeinem Grund gibt der RF02 keine Impulse aus (da er 
vermutlich nicht richtig initialisiert wurde).

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nachteil des RFM12 ist, dass es nicht als 866MHz 5V-Version verfügbar 
ist, sondern nur als RFM12B für 3,3V. Die RFM01/02 hingegen schon.

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
A. K. wrote:
> Nachteil der RFM12 ist, dass es sie nicht als 866MHz 5V-Version gibt,
> sondern nur als RFM12B für 3,3V. Die RFM01/02 hingegen schon.

Nein, da bist du falsch informiert. Ich habe genau diese Version im 
Einsatz (RFM12 868). Siehe auch hier:
http://www.hoperf.com/pro/RFM12.html

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok, also wo gibt es das, ohne direkt bei Hope kaufen zu müssen?

Autor: Robert Knipp (mr_insanity)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>- Der AVR ist zu langsam (ich glaube mindestens 4-5MHz braucht die
>Software um den Impuls sicher zu erkennen)

Der läuft mit 16MHz


>- aus irgendeinem Grund gibt der RF02 keine Impulse aus (da er
>vermutlich nicht richtig initialisiert wurde).

Habe die Initialisierungsroutine eigentlich nicht verändert. Habe auch 
mal das Delay in der Routine vergrößert und sie auch mal mehrmals 
ausführen lassen am Anfang. Hat alles nichts geholfen.

Autor: Stefan B. (stefan) Benutzerseite
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
@ Benedikt

Danke für den Hinweis, dass RF02 anders als der RF12 ist. Den 
Sachverhalt an sich verstehe ich noch nicht.

Sehen die Impulse so aus wie im Bild oben? Das ist das einzige, dass ich 
mit nIRQ Wechseln beim RF02 (http://www.hoperf.com/pdf/rf02.pdf) finde. 
nach dem Bild würde ich die 2. while Schleife (Warten auf nIRQ HIGH) 
hinter die if/else-Anweisung setzen.

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stefan "stefb" B. wrote:

> Sehen die Impulse so aus wie im Bild oben? Das ist das einzige, dass ich
> mit nIRQ Wechseln beim RF02 (http://www.hoperf.com/pdf/rf02.pdf) finde.

Ja. Das sind die Impulse.

> nach dem Bild würde ich die 2. while Schleife (Warten auf nIRQ HIGH)
> hinter die if/else-Anweisung setzen.

Meine Idee war, dass mit der steigenden Flanke neue Daten ausgegeben 
werden, da das Modul die Daten mit der fallenden Flanke speichert.
Andersrum sollte es aber genauso funktionieren. Wichtig ist nur, beide 
Flanken abzufragen.

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich meine, so könnte es besser gehen, weil das Modul so mehr als 1,6 µs 
Zeit hat, das richtige Bit zu sehen.

Müsste man aber im Oszi anschauen, ob die Spur im Bild oben realistisch 
ist (nIRQ LOW länger als nIRQ HIGH) und wieviel Zeit das Erhöhen und das 
Prüfen von j brauchen (muss <1,6 µs sein!).

ADD: Die Zeit für Beginn der nächsten Schleife sollte sogar egal sein, 
wenn das >1,6 µs dauert, rauscht der Programmablauf einfach durch das 
erste while durch und macht legal mit dem nächsten Bit weiter.

void rf02_shiftout(unsigned char wert)
{  
  unsigned char j;
  for (j = 0; j < 8; j++)
  {  
    while(IRQ_PIN & (1 << IRQ));   // auf fallende Flanke nIRQ warten
    if (wert & 128)                // Bit anlegen
        sbi(SDI_PORT, SDI);
      else
        cbi(SDI_PORT, SDI);
    wert <<= 1;
    while(!(IRQ_PIN & (1 << IRQ))); // auf steigende Flanke nIRQ warten
  }
}


Autor: Robert Knipp (mr_insanity)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe das mal entsprechend geändert. Der bleibt trotzdem immer beim 
Warten auf die steigende Flanke hängen.

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast du mal nachgesehen, ob die Versorgungsspannung noch reicht, wenn 
das erste Bit auf die Reise soll (s. bei Bug #1 Optokoppler bei 
http://www.controller-designs.de/index.php?lang=de...)

Bzw. ich sehe in deinem main() nirgends, dass du über PORTD PD4 den 
Optokoppler OK1 auf dem Pollin-Funkboard einschaltest. Wenn du dieses 
Board hast, fehlt dem Modul die Versorgungsspannung und es grabscht sich 
"zuwenig zum Leben und zuviel zum Sterben" aus den Datenleitungen. 
Vielleicht fehlt ihm beim Senden des ersten Bits dann endgültig der Saft 
um nIRQ kurz hochzuziehen.

Autor: Robert Knipp (mr_insanity)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mein Board hat keinen Optokoppler.

Autor: Robert Knipp (mr_insanity)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Das sieht so aus.

Da steckt man alles über Jumper.

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ah v1.2, sieht besser aus. Mir gehen aber jetzt die Ideen aus und zwei 
falsche Mutmaßungen heute reichen.

Autor: Robert Knipp (mr_insanity)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Benedikt

Also ich habe mit Hilfe des Beispielprogrammes von Pollin, was Deinem ja 
auchsehr ähnlich ist, und dem Datenblatt vom rf02 nochmal etwas 
herumprobiert. Das Programm bleibt aber immer noch an der selben Stelle 
hängen, wobei es auch egal ob man das zweite while vor oder nach dem 
Anlegen des SDI Signals einfügt.

Witzigerweise hat es einmal nach dem Aufspielen auf den Controller 
einmal funktioniert.

Hast Du das Programm denn mal mit einem RFM02 zum laufen bekommen?

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, ich hatte mit der Software die ich im Forum gepostet habe (also 
RFM01 + RFM02) Daten übertragen. Allerdings nur Testweise, danach habe 
ich die RFM01+02 beseite gelegt und mich mehr mit dem RFM12 beschäftigt.

Hast du ein Oszilloskop? Falls ja, dann mess mal am IRQ Ausgang, da 
müssten mit der Baudrate Impulse erkennbar sein.

Autor: Robert Knipp (mr_insanity)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe leider keins.
Aber ich denke mal da wird auch nicht viel kommen. Sonst würde doch auch 
der Controller nicht immer an der selben Stelle hängen bleiben, oder?

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich kontrolliere sowas gerne mal nach, um Verdrahtungsfehler usw. 
auszuschließen. Man kann aber davon ausgehen, dass beim AVR nichts 
ankommt. Wieso nichts ankommt, da kann ich leider auch nur raten, das 
könnte alles mögliche sein.

Autor: Robert Knipp (mr_insanity)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hmm.... vielleicht bestelle ich mir einfach mal ein paar RFM12 und 
versuche es damit mal.

Autor: Jens Kleemann (studone)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hab grad eben nen post zu diesem Problem gemacht.

Siehe hier..

Beitrag "Re: Problem mit RFM02"

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.