mikrocontroller.net

Forum: Projekte & Code Beispielprogramm für RFM12 433MHz Funk-Module


Autor: Jojo S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
und 'Receiver' ist bei dir falsch geschrieben ;-)
Ok, das sollte nicht stören. Aber ich würde vor den Calls im Programm 
erstmal den Stackpointer initialisieren.

Autor: florian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
der stackpointer wird initialisiert bzw. wird ihm in der zeile mov 
sp,#022h der startplatz im speicher zugewiesen...

Autor: Jojo S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
stimmt, obwohl ich schon 4 Augen habe habe ich nur auf die Zeile nach 
dem Label geguckt.

Autor: Richard B. (rbrose)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

muss ich den RFM12 am AVR SCK, MOSI und MISO per Jumper anschliessen 
damit ich, wenn ich den AVR Programmieren will mit ISP, das FRM12 
abschliesen kann? Oder kann ich direkt per ISP programmieren auch wenn 
der RFM12 dran hängt?

Autor: R. Max (rmax)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Richard B. wrote:

> Oder kann ich direkt per ISP programmieren auch wenn
> der RFM12 dran hängt?

Ja. Da SPI ein Bus ist, kannst Du beide Funktionen gleichzeitig 
verdrahtet lassen. Solange am RFM12 nSEL nicht auf Low gezogen wird, 
sind seine übrigen SPI-Pins hochohmig und stehen damit der 
Programmierung des Controllers nicht im Wege.

Autor: florian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
kann es eventuell auch daran liegen das ich keinen enstörkondensator von 
100nF für die Betriebsspannung zwischen 5V und GND hab?

Autor: Richard B. (rbrose)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich habe meine Testschaltung mit zwei RFM12 Modulen aufgebaut.
Mit dem Programm RFM12_RX_TX habe ich den Empfänger und Sender bespielt.
Wenn ich jetzt beide starte ... sehe ich im Terminal vom Empfänger nur 
Empfänger "Empfaenger laeuft !<\n>" und dann kommt nix mehr ... also 
empfängt der Empfänger nichts :-(

Wie gehe ich jetzt am besten vor um das Problem zu finden? Wo muss ich 
messen?
Beide haben keine Antenne dran ... sind aber 40 cm von einander 
entfernt.


Vielen Dank im voraus!

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

Bewertung
0 lesenswert
nicht lesenswert
Versuche irgendwie herauszufinden, ob die Frequenz am CLK Ausgang der 
Module bei 10MHz. Wenn nicht, dann ist irgendwas falsch angeschlossen.

Autor: Richard B. (rbrose)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie kann ich es am besten rausfinden wenn ich kein Ozi habe? Kann ich 
irgendwie einen Zähler mit einem AVR bauen`?

Autor: Fabian B. (fabs)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Viele Digitalmultimeter haben einene Hz-Messmöglichkeit.
oder du baust dir irgendwie (z.B. aus TTL Zähler-Bausteinen) einen 
20-Bit-Counter auf und schließt ans CarryBit ein D-Flipflop mit einer 
Led an... die sollte dann ca mit 9Hz blinken. Wobei das ziemlich von 
Hinten durch die Brust ins Auge wäre.
Was hast du denn für Meßgeräte zur Verfügung?

Gruß
Fabian

Autor: Christian M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ bobkins

Könntest du mir vielleicht deinen C-Code für die 868 Module geben? Ich 
sitze hier an dran, es läuft nicht und finde den Fehler nicht. Aufbau 
ist wie auf dem Bild von Benedikt aber es will einfach nicht. Ich denke 
mal, dass ich noch falsche Einstellungen habe.

Thx im vorraus,

Christian

Autor: MAX (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo,

würde mich ebenfalls für die konfiguration eines 868MHz funkmoduls 
interessieren, bzw was man alles umschreiben muss um den code von 
benedikt für sein 433MHz modul verwenden zu können.

Danke,
MAX

Autor: Richard B. (rbrose)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Benedikt K. wrote:
> Versuche irgendwie herauszufinden, ob die Frequenz am CLK Ausgang der
> Module bei 10MHz. Wenn nicht, dann ist irgendwas falsch angeschlossen.

Danke dir Benedikt. Jetzt funktioniert es ;-)
Am Sender waren es nicht 10Mhz.

Autor: Richard B. (rbrose)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Meine Module werden vom Mega8 mit internen Clock 8 Mhz gesteuert.
Ist das ein Problem das die Module mit internen Clock laufen? Hab die 
mit 19200Baud laufen.

Ist es wie bei UART das man 0.2% Fehler hat? oder ist es da egal? Soll 
ich lieber 11.05 ... mhz benutzen?

Achja, ich benutze isolierten Kupferdraht für die Antenne, ist das ok? 
oder ist nicht isoliert besser?

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

Bewertung
0 lesenswert
nicht lesenswert
Bei den Modulen ist das egal, da diese ihren eigenen Quarz haben.

Autor: Richard B. (rbrose)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Achja, ich benutze isolierten Kupferdraht für die Antenne, ist das ok?
oder ist nicht isoliert besser?

Autor: Richard B. (rbrose)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Keiner eine Antwort?

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

Bewertung
0 lesenswert
nicht lesenswert
Die Isolierung des Drahtes ist egal, der Draht sollte nur nicht zu dünn 
sein (so ab 0,5mm Durchmesser aufwärts)

Autor: Richard B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke dir Benedikt.

So ... die Module versenden fleisig Chars.
Ich will aber nun das der Sender ein int von 0 bis 999 versendet und der 
Empfänger die auch als int bekommt. Wie mach ich das? Kann mir einer 
einen codeschnippsel posten?
Ich habe das mit atoi versucht ... klappt aber irgendwie nicht.

Danke

Autor: Fabian B. (fabs)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was heisst denn versucht? code?
Du verschickst nur chars... wenn du dann wieder Ints haben willst musst 
du sie wandeln...eben mit atoi

Gruß
Fabian

Autor: Richard B. (rbrose)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier der C Code für den Empfänger:
void receive(void)
{  
  unsigned char test[1];  
  uint8_t tmp;
  rf12_rxdata(test,1);
  tmp = atoi(test[0]);  
  if(tmp > 0 && tmp < 10) 
  {
    einer = tmp;
  }
}

Beim Build bekomme ich diese Warnung:
../main.c:106: warning: implicit declaration of function 'atoi'
Wie kriege ich die Warnung weg?

Hier der Code vom Sender:
void send(void)
{  unsigned char test[]="2";  
  rf12_txdata(test,1);
}

Aber irgendwie ist einer und tmp immer 0.

Einer eine Idee?

Autor: R. Max (rmax)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Richard B. wrote:
> Hier der C Code für den Empfänger:

>   tmp = atoi(test[0]);

atoi nimmt char* als Argument, Du gibt ihm hier aber nur ein char.
So wäre es richtig:

    tmp = atoi(test);

Dann mußt Du allerdings auch sicherstellen, daß der String mit einem 
'\0' abgeschlossen ist, entweder indem Du es mitschickst oder indem Du 
test[1]='\0' setzt. In beiden Fällen mußt Du test noch entsprechend 
größer deklarieren.

> ../main.c:106: warning: implicit declaration of function 'atoi'
> [/c]
> Wie kriege ich die Warnung weg?
#include <stdlib.h>

> Hier der Code vom Sender:
>
>
> void send(void)
> {  unsigned char test[]="2";
>   rf12_txdata(test,1);
> 

Um die \0 mitzuschicken, die den String abschließt, mußt Du hier zwei 
Zeichen übertragen.


Ein ganz anderer Ansatz wäre noch, den Integer-Wert Byte für Byte binär 
zu übertragen, dann würdest Du Dir das Konvertieren nach ASCII und 
zurück sparen und ein Wert hätte bei der Übertragung immer die gleiche 
Anzahl von Bytes.

Autor: Richard B. (rbrose)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Reinhard Max
Danke für die ersten Anmerkungen.

Wie mache ich es mit dem Interger? Wie verschicke ich binär?

Autor: R. Max (rmax)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Richard B. wrote:
> Wie mache ich es mit dem Interger?

Das wollte ich dem geneigten Leser eigentlich als Übungsaufgabe 
überlassen ;)

> Wie verschicke ich binär?

Für die Module gibt es da keinen Unterschied, die verschicken einfach 
nur Bytes. Ob es sich dabei um (ASCII-)Strings oder Binärdaten handelt 
ist eine Frage der Interpretation in der sich Sender und Empfänger halt 
einig sein müssen, damit sie Daten austauschen können.

Von daher sollte man das das, was rf12_txdata übergeben bekommt, besser 
nicht als String betrachten (obwohl es im Einzelfall ein solcher sein 
kann), sondern als Puffer, der eine beliebige Bytefolge enthalten kann.

Die einfachste Möglichkeit, einen int-Wert binär zu schicken, würde z.B. 
so aussehen:
int foo = 42;
rf12_txdata((char*)&foo, sizeof(int));

Die Adresse der int-Variablen wird in einen char-Pointer umgedeutet und 
rf12_txdata soll ab dieser Adresse so viele Bytes senden, wie in einer 
Integer-Variablen enthalten sind.

An der Empfänger-Seite darfst Du jezt aber wirklich mal selber üben... 
;)

Autor: Richard B. (rbrose)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke dir.

Probiere das zuhause aus ... muss leider noch einbisschen hier auf der
Arbeit arbeiten :-)

Hier meine Überlegung schon mal:
void receive(void)
{  
  int test;  
  rf12_rxdata((char*)&test,sizeof(int));  
  if(test > 0 && test < 10) 
  {
    einer = test;
  }
}

Geht es in die richtige Richtung?

Autor: R. Max (rmax)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Richard B. wrote:

> Geht es in die richtige Richtung?

Ja, der Aufruf von rf12_rxdata müßte so passen, den if-Block kannst Du 
Dir aber sparen, denn nach dem Empfang steht in test ja schon der 
komplette int-Wert drin.

Autor: Richard B. (rbrose)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok, mach gleich Feierabend und teste es.

Wie mache ich es eigentlich mit einer Überprüfung ob auch das richtige 
angekommen ist?

Sender(sendet int 144) -> Empfänger(sendet int 144 zurück) -> 
Sender(Überprüf 144 = 144 ) -> Empfänger(stimmt)

Autor: R. Max (rmax)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, so kann man das machen, aber effizienter ist es, wenn der Sender 
gleich redundante Informationen mitschickt, anhand derer der Empfánger 
die Korrektheit selbst überprüfen kann.

Beispielsweise kann der Sender die Daten doppelt schicken, einmal 
normal, einmal invertiert, um Fehler durch systematische Bitkipper 
auszuschließen, was sich aber wegen der Verdopplung der Daten nur bei 
kleinem Datenvolumen (Fernbediungunskommandos, sporadische Meßwerte, 
etc.) anbietet.

Bei größeren Datenblöcken wird meistens mit Prüfsummen (Stichwort: CRC) 
gearbeitet.

Autor: Richard B. (rbrose)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So beim Builden der funktion:
void send_int(uint16_t zahl)
{      
  rf12_txdata((char*)&zahl,sizeof(uint16_t));
}

Kriege ich den Fehler:
../main.c:125: warning: pointer targets in passing argument 1 of 'rf12_txdata' differ in signedness

Was heißt das? Finde vieles bei google aber keine Erklärung.

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

Bewertung
0 lesenswert
nicht lesenswert
Das bedeutet nur, dass rf12_txdata() einen unsigned char* erwartet, du 
aber einen char* übergibst. Es hat in diesem Fall aber keine 
Auswirkungen auf die Funktion.

Autor: Richard B. (rbrose)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok stimmt. Muss ich jede funktion nochmal in die main.c reinschreiben 
die ich benutze?

Wie z.B. itoa, bekomme nählich die Warnung:

../main.c:131: warning: implicit declaration of function 'itoa'

Das heißt doch ich muss die oben nochmal hinschreiben ... also den 
function kopf ... oder?

Autor: Richard B. (rbrose)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mhhh irgendwas mache ich falsch. Hier mein Code

Sennder:
In der main schleife:
  send_int(354);
  for (unsigned char i=0; i<250; i++)
       _delay_ms(10);


Die Funktion:


void send_int(uint16_t zahl)
{      
  rf12_txdata((char*)&zahl,sizeof(uint16_t));
}



Empfänger:
  while(1) 
   {            
     receive_int();                                    
   }


void receive_int(void)
{  
  uint16_t test;  
  char buffer[7];

    rf12_rxdata((char*)&test,sizeof(uint16_t));    
    
  itoa( test, buffer, 10);
  uart_puts(buffer);  
  uart_putc('\n');
}


Und das ist das Ergebniss auf dem Terminal:

- 9 1 1 8 \n
1 6 2 2 6 \n
3 2 6 1 0 \n
1 6 2 2 6 \n
1 6 2 2 6 \n
1 6 2 2 6 \n
1 3 7 8 \n
3 2 6 1 0 \n
3 2 6 1 0 \n
1 5 2 0 2 \n
1 6 2 2 6 \n
1 6 2 2 6 \n
8 0 3 4 \n
- 1 5 8 \n
1 6 2 2 6 \n


Wieso das? Wieso hab ich so ein Ergebniss?

Autor: Richard B. (rbrose)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hilfe ... das Liegt an den Modulen ... die Übertragen mit Fehlern ... Oh 
man.

Hab die Empfänger funktion so geändert:

void receive_int(void)
{  
  int test;    
    rf12_rxdata((char*)&test,sizeof(int)); 
  
  if(test == 123)
  {
    uart_puts("Richtig!");  
  } else 
  {
    uart_puts("Falsch!");  
  }       
}


Das Ergebniss ist:
S e n d e r   l a e u f t   ! \n F a l s c h ! F a l s c h ! F a l s c h ! 
F a l s c h ! F a l s c h ! F a l s c h ! F a l s c h ! F a l s c h ! F a l s c h ! 
F a l s c h ! F a l s c h ! F a l s c h ! F a l s c h ! F a l s c h ! F a l s c h ! 
F a l s c h ! F a l s c h ! F a l s c h ! F a l s c h ! F a l s c h ! F a l s c h ! 
F a l s c h ! F a l s c h ! F a l s c h ! F a l s c h ! F a l s c h ! F a l s c h ! 
F a l s c h ! F a l s c h ! R i c h t i g ! F a l s c h ! R i c h t i g ! F a l s c h !
 R i c h t i g ! 
F a l s c h ! R i c h t i g ! R i c h t i g ! R i c h t i g ! R i c h t i g ! F a l s c h !
 F a l s c h ! R i c h t i g ! F a l s c h ! R i c h t i g ! R i c h t i g !

Was kann ich für ein besseren Empfang machen?
rf12_setbandwidth(4, 1, 4); Kann ich hier was machen?

Autor: Richard B. (rbrose)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Finde leider hier nichts welche Register ich einstellen kann um die 
Sendeleistung zu verbessern. Was kann ich einstellen? Müssen die 
Einstellungen beim Sender und Empfänger gleich sein um die optimale 
Einstellugen zu bekommen? Wie tastet man sich da heran?

Muss ich vielleicht die Baud runterdrehen?
Was kann ich mit rf12_setpower machen?

Achja meine Module sind nur 50cm von einander entfernt ... und liefern 
so ein schlechtes Ergebnis. Das kann doch nicht sein.

Autor: R. Max (rmax)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Richard B. wrote:

> Das heißt doch ich muss die oben nochmal hinschreiben ... also den
> function kopf ... oder?

Nein, nur den passenden Header einbinden, in dem die Funktion deklariert 
ist, so wie ich es Dir für atoi schonmal hingeschrieben hatte.

> Was kann ich für ein besseren Empfang machen?

Richtig senden? ;)

Deine Sende-Schleife läßt zwischen den einzelnen Sendungen eine längere 
Pause. In dem Fall darfst Du meines Wissens anschließend nicht einfach 
weiter Daten senden, sondern mußt die Übertragung mit Präambel und allem 
Trallala neu aufsetzen, damit der Empfänger sich wieder neu auf den 
Sender synchronisieren kann.

Übrigens ist das letzte Byte Deiner Müll-Werte in den meisten Zeilen 
korrekt, was meines Erachtens auch auf ein Synchronisations-Problem 
hindeutet.

Autor: Richard B. (rbrose)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Endlich antwortet einer ;-)

Das mit dem Header geht jetzt danke.

Das verstehe ich nicht. Das heißt wenn ich eine Sekunde warte muss ich 
das Modul wieder von einem Initialisieren?

Das Problem ist ja auch das die ersten Zeichen auch nicht immer richtig 
ankommen. Habe an den rf12_setbankwidth werten einbisschen gespielt und 
es hat verbesserungen gegeben.
Aber leider weiss ich nicht wie hoch ich gehen darf und was z.B.
rf12_setbankwidth(4,1,4) ist  // 200kHz Bandbreite, -6dB Verstärkung, 
DRSSI threshold: -79dBm

was ist aber rf12_setbankwidth(4,2,4) ? doppelt so viel? also -12db?

Autor: Richard B. (rbrose)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Reinhard Max

Wie Synchronisiere ich die Module? Finde hier nirgends informationen.
Vielen Dank für deine Mühe.

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

Bewertung
0 lesenswert
nicht lesenswert
Das synchronisieren macht die Software schon selbst, darum musst du dich 
nicht kümmern.

Für maximale Reichweite sollte diese Einstellung gut sein:
rf12_setpower(0, 5);
rf12_setbankwidth(4,0,0);

Damit sollten einige 10m selbst unter ungünstigen Bedingungen möglich 
sein.

Welche Software verwendest du eigentlich ?

Autor: Richard B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Benedikt,

ich benutze den von dir empfohlenen Code: RFM12_RX_TX.zip
Ich werde die Einstellungen gleich testen. Und das Ergebniss hier 
Posten.
Die Einstellugen müssen beim Sender und Empfänger gleich sein oder?

Maximale Reichweite ... heißt das, das bei 50 cm ich damit ein Problem 
haben könnte aber nicht in 5m ?

Autor: Richard B. (rbrose)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe es mit den Einstellungen probiert ... es ist sogar noch 
schlechter.

Ich habe mal die funktion wieder zurückgebaut und verschicke wieder 
einen Text und hier sieht es irgendwie besser aus.

Ergebnis:
S e n d e r   l a e u f t   ! \n
D i e s   i s t   e i n   4 3 3 M H z   T e s t   ! ! ! \n
     D i e s   i s t   e i n   4 3 3 M H z   T e s t   ! ! ! \n
    \x D i e s   i s t   e i n   4 3 3 M H z   T e s t   ! ! ! \n
    ÿ D i e s   i s t   e i n   4 3 3 M H z   T e s t   ! ! ! \n
    ? D i e s   i s t   e i n   4 3 3 M H z   T e s t   ! ! ! \n
     D i e s   i s t   e i n   4 3 3 M H z   T e s t   ! ! ! \n
     D i e s   i s t   e i n   4 3 3 M H z   T e s t   ! ! ! \n
     D i e s   i s t   e i n   4 3 3 M H z   T e s t   ! ! ! \n
     D i e s   i s t   e i n   4 3 3 M H z   T e s t   ! ! ! \n
     D i e s   i s t   e i n   4 3 3 M H z   T e s t   ! ! ! \n
     D i e s   i s t   e i n   4 3 3 M H z   T e s t   ! ! ! \n
    ÿ D i e s   i s t   e i n   4 3 3 M H z   T e s t   ! ! ! \n
     D i e s   i s t   e i n   4 3 3 M H z   T e s t   ! ! ! \n
     D i e s   i s t   e i n   4 3 3 M H z   T e s t   ! ! ! \n
     D i e s   i s t   e i n   4 3 3 M H z   T e s t   ! ! ! \n
     D i e s   i s t   e i n   4 3 3 M H z   T e s t   ! ! ! \n
     D i e s   i s t   e i n   4 3 3 M H z   T e s t   ! ! ! \n
     D i e s   i s t   e i n   4 3 3 M H z   T e s t   ! ! ! \n
     D i e s   i s t   e i n   4 3 3 M H z   T e s t   ! ! ! \n
    ÿ D i e s   i s t   e i n   4 3 3 M H z   T e s t   ! ! ! \n
     D i e s   i s t   e i n   4 3 3 M H z   T e s t   ! ! ! \n
     D i e s   i s t   e i n   4 3 3 M H z   T e s t   ! ! ! \n
     D i e s   i s t   e i n   4 3 3 M H z   T e s t   ! ! ! \n
    ÿ D i e s   i s t   e i n   4 3 3 M H z   T e s t   ! ! ! \n
     D i e s   i s t   e i n   4 3 3 M H z   T e s t   ! ! ! \n
    ÿ D i e s   i s t   e i n   4 3 3 M H z   T e s t   ! ! ! \n
    ÿ D i e s   i s t   e i n   4 3 3 M H z   T e s t   ! ! ! \n
     D i e s   i s t   e i n   4 3 3 M H z   T e s t   ! ! ! \n
    ÿ D i e s   i s t   e i n   4 3 3 M H z   T e s t   ! ! ! \n
     D i e s   i s t   e i n   4 3 3 M H z   T e s t   ! ! ! \n
    ÿ D i e s   i s t   e i n   4 3 3 M H z   T e s t   ! ! ! \n
    ÿ D i e s   i s t   e i n   4 3 3 M H z   T e s t   ! ! ! \n
     D i e s   i s t   e i n   4 3 3 M H z   T e s t   ! ! ! \n
     D i e s   i s t   e i n   4 3 3 M H z   T e s t   ! ! ! \n
     D i e s   i s t   e i n   4 3 3 M H z   T e s t   ! ! ! \n
        

Am Anfang habe ich ein ÿ was ich nicht mitschicke ... kann es sein wenn 
ich nur eine Zahl schicke es immer wegem dem ÿ zu einem Problem kommt?
Soll ich dann lieber sowas machen "######-123+######"
Heißt das ich davor einbisschen blödsind schicke und dann nach - und + 
suche um die Zahl zu finden?

Hast du eine Idee?


Vielen DANK im voraus.

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

Bewertung
0 lesenswert
nicht lesenswert
Wenn ich das richtig sehe, ist das erste Byte jeweils zuviel.
Probier mal folgendes aus:
Ersetze diese Funktion durch das hier (bzw. wichtig ist eigentlich nur 
das 2. nop. Eventuell reicht die Pause vor dem Einlesen nicht ganz aus:

void rf12_ready(void)
{
  cbi(RF_PORT, CS);
  asm("nop");
  asm("nop");
  while (!(RF_PIN&(1<<SDO)));      // wait until FIFO ready
  sbi(RF_PORT, CS);
}

Autor: Richard B. (rbrose)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Benedikt,

meine rf12_ready funktion sieht so aus:
void rf12_ready(void)
{  cbi(RF_PORT, SDI);
  cbi(RF_PORT, CS);
  asm("nop");
  while (!(RF_PIN&(1<<SDO))); // wait until FIFO ready
}

Soll ich die so abändern wie bei dir?

Autor: Richard B. (rbrose)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hab die Methode so geändert wie du die hast ... hat aber leider nicht 
geholfen ich kriege am anfang immer irgend ein Müll.

Autor: Browncoat (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Irgendwie funktioniert das alles nicht bei mir. Hab den RFM12, der sagt 
garnix, der RFM01 macht auch keine Anstalten was zu empfangen, der RFM02 
sendet zumindest das original Pollin Programm.

Bei den hier geposteten Progs regt sich garnix. Der Optokoppler wurde 
fachmännisch gebrückt. Die Programme laufen auf einem ATMega8 mit 
internen 8 MHz, eine 17 cm Antenne schmückt die Boards, ein 1k 
Widerstand legt beim RFM12 FSK auf VCC.

Muss ich bei den RFM01 und RFM02 auch noch irgendwelche Modifikationen 
am pollin Board vornehmen um die zum funktionieren zu bewegen? Wie 
siehts beim RFM12 aus?

Ich hau die Dinger gleich inne Egge!

MfG BC

Autor: Lorenz .. (lorenz)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Browncoat:
Welchen COde verwendest du? Mit IRQs oder gepollt? Bei den IRQ-Methode 
hatte ich mal was zum Pollin-Board gepostet. Gepollt sollte auch so 
funktionieren.
Ansonsten habe ich bei meinem Board nur noch den Takt aus dem RFM12 auf 
den Quartzsteckplatz gelegt, um die 10Mhz Takt zu nutzen. Widerstand 
habe ich wie du 1k auf Vcc.
Schreib mal welchen Code du nutzt, dann kann ich dir evtl ein "working 
sample" schicken.

Autor: Browncoat (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi, also ich benutze die Codes aus diesem Thread,

Für das RFM01
http://www.mikrocontroller.net/attachment/22522/rfm01.zip
Das original Pollin Programm macht hier nichts ausser nach dem Reset 
drei mal die LED blinken zu lassen. Die Software hier funktioniert 
bisher nicht.


RFM02
http://www.mikrocontroller.net/attachment/22516/rfm02.zip

Das Senden mit dem RFM02 und original Pollin Code klappt, getestet am 
TV, Kanal S37. Mit dem Code hier sagt erleider garnichts.



fürs RFM12
http://www.mikrocontroller.net/attachment/23263/RF...

Der original Pollin Code macht auch hier keine Anstalten, getestet 
gestern am Spektrumanalysator.
Mit dem Code von hier erhalte ich schonmal eine Meldung via RS232.

Hab leider von jedem Funkmodul nur eins zur Verfügung, und die 
befürchtung, daß RFM01 und RFM12 einen weg haben könnten, da sich da 
schon ein paar andere Leute dran versucht haben. RFM02 hab ich selbst 
aufgelötet und getestet.

MfG BC

Autor: Florian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kann eventuell jemand hier seine exakten Einstellungen sprich der 
register posten wäre echt nett.
Komm nämlich auch nich weiter vielleicht funktionierts ja mit anderen 
Einstellungen...

MfG Flo

Autor: Richard B. (rbrose)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sehe ich das richtig, dass der Empfänger ständig in einer Schleife hängt 
bis er etwas empfängt?

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

Bewertung
0 lesenswert
nicht lesenswert
Ja, bei den einfachen Versionen schon. Die besseren nutzen einen 
Interrupt.

Autor: Richard B. (rbrose)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kannst du mir eine bessere Version nennen? Ohne das ich die Verkabelung 
neu machen muss?

Hab die Verkabelung so wie es in der gif von der RFM12_RX_TX.zip steht.

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

Bewertung
0 lesenswert
nicht lesenswert
Das geht nicht. Man braucht zumindest noch eine Verbindung von FFIT zu 
einem INT Anschluss-

Autor: Richard B. (rbrose)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ASO verstanden. Das heißt wenn der FFIT eine Flanke setzt dann reagiert 
der INT von AVR und bearbeitet das empfangene. Richtig?

Welche Version nehme ich dafür? Hier ist es schon langsam 
unübersichtlich.

Autor: Maximilian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nachdem man Empfänger nichts empfangt habe, habe ich mal am Filter 
Kondensator des RSSI Pin gemessen und immer wenn der Sender sendet, 
hatte ich einen kurzen Spannungsanstieg messen, heißt das der Sender 
funktioniert?

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

Bewertung
0 lesenswert
nicht lesenswert
Ja. Das heißt auch, dass der Empfänger in etwa auf die selbe Frequenz 
eingestellt ist, und läuft.
Ich würde entweder auf ein fehlendes Sync Word vom Sender tippen, auf 
ein nicht aktives FIFO oder sonst eine falsche Modulationseinstellung.

Autor: Maximilian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die schnelle Antwort!

Ist einmal gut zu wissen das irgendwas geht.

Das Sync Word ist doch nach der Preamble B82D und B8D4 oder hab ich das 
was übersehen?

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

Bewertung
0 lesenswert
nicht lesenswert
2DD4 ist das Sync Word. Davor kommen noch ein paar AA (10101010 usw.) um 
den Empfänger auf die Bitrate einzusynchronisieren.

Autor: Maximilian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie muss ich das machen wenn ich beim empfangen nicht pollen will 
sondern den Interrupt verwenden?

Hab gelesen FFIT mit nINT verbinden und dann nIRQ zum µC stimmt das?

Jedenfalls ohne irgendwas tut der nIRQ Pin nur selten was.

Autor: Fabian B. (fabs)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein, du verbindest FFIT mit dem uC. Wenn der FFIT feuert, dann sind so 
viele Bits im FIFO wie du als Benachrichtigungsschwelle eingestellt 
hast...(Benedikts default ist 8 Bit).

Mehr brauchts nicht.

Gruß
Fabian

Autor: Maximilian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aha, habe ich das jetzt richtig verstanden:

Wenn Daten im FIFO dann geht FFIT auf high, sobald Daten aus sind geht 
er auf low.

Autor: Fabian B. (fabs)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Exakt.
Du kannst also im Prinzip im Interrupt ein Byte ausm Fifo abholen. Wenn 
noch mehr da sind feuert der Int ja eh wieder. Vorausgesetzt du hast nen 
Levelinterrupt! FFIT bleibt High(?) solange der Fifo über der Schwelle 
ist.

Gruß
Fabian

Autor: Richard B. (rbrose)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn der AVR bei "wait until FIFO ready" stecken bleibt ...
void rf12_ready(void)
{
  cbi(RF_PORT, CS);
  asm("nop");
  asm("nop");
  while (!(RF_PIN&(1<<SDO)));      // wait until FIFO ready
  sbi(RF_PORT, CS);
}

was könnte das Problem sein?

Und wie kann ich prüfen ohne Ozi ob mein Modul mit 10Mhz läuft?

Autor: Richard B. (rbrose)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Funk Modul das funktioniert hat 2.08V zwischen CLK und GND und das 
Modul das nicht funktioniert hat 1.81V. Kann man daraus schließen, dass 
das Modul das nicht funktioniert mit weniger MHZ am CLK läuft?

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

Bewertung
0 lesenswert
nicht lesenswert
Das kann man eigentlich nicht sagen, es könnte noch andere Gründe geben.

Autor: Richard B. (rbrose)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hab den Fehler gefunden. Es lag an DDRB = 0xFF; :-(

Autor: Maximilian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nachdem ich jetzt daran glaub das mein Hardware SPI ein Problem hat 
wollte ich mal Fragen ob mir jemand die Software-Routine für SPI von 
Benedikt bitte erklären könnte:
#else      //Routine für Software SPI
  for (unsigned char i=0; i<16; i++)
  {  
    if (wert&32768)
      RF_PORT |=(1<<SDI);
    else
      RF_PORT &=~(1<<SDI);
    werti<<=1;
    if (RF_PIN&(1<<SDO))
      werti|=1;
    RF_PORT |=(1<<SCK);
    wert<<=1;
    asm("nop");
    RF_PORT &=~(1<<SCK);
  }
#endif
  RF_PORT |=(1<<CS);
  return werti;

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

Bewertung
0 lesenswert
nicht lesenswert
Ganz einfach:
Als erstes wird das höchstwertige Bit ausgegeben, danach der Wert um 
eine Stelle nach links geschoben, so dass das gerade eben an den Port 
gelegte Bits rausfällt. An die nun freie Stelle rechts wird der 
Eingangspin eingelesen.
Es wird also gleichzeitig gesendet und empfangen, so wie es bei SPI 
üblich ist. Die SCK Leitung wird dann noch getoggelt, und das ganze 16x 
(für die 16bit) wiederholt.
Am ende wurde der Wert der anfangs in Wert war gesendet, und ein 16bit 
Wert von SPI in Wert empfangen.

Autor: Richard B. (rbrose)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hab eine Frage zur Antenne. Ist es besser die Antenne mit voller länge 
(17cm) in das Gehäuse zu legen oder es zur einer Spirale aufwickeln?

Sind 433Mhz Module.

Autor: Richard B. (rbrose)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Keiner will mir das beantworten? :-(

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

Bewertung
0 lesenswert
nicht lesenswert
Das liegt vermutlich daran, dass man die Frage so nicht beantworten 
kann.
17cm Antenne ist mit Sicherheit die einfachere Lösung, da eine gut 
optimierte Spirale als Antenne nicht einfach zu berechnen ist.
Ich würde also die 17cm verwenden, da man da weniger falsch machen kann.

Autor: Fabian B. (fabs)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Benedikt:
hast du ein paar Links oder Infos wie man sowas berechnet?
Ich hab in meiner Fernbedienung die Antenne zu einer Spirale mit ca 8mm 
Durchmesser gewickelt (Platzgründe) und musste eine deutlich verminderte 
Reichweite feststellen.

Gruß
Fabian

Autor: Maximilian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe nun noch immer das gleiche Problem: Wenn der Sender sendet 
ändert sich beim Empfänger am RSSI Pin was.

Beide Module sind gleich initialisert, Sender/Empfänger Register 
gesetzt.

Module liegen 10cm entfernt, Software oder Hardware SPI bringen das 
gleiche Resultat.

Weiß vielleicht jemand was da sein könnte?

Autor: Richard B. (rbrose)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eine Frage noch zum AVR-Sleep Mode.
Ich benutzen den RFM12 per polling. Der Empfänger ist also in der Main 
die ganze Zeit in der while schleife vom RFM12 bis er Daten zugesendet 
bekommt.
Wie kann ich den AVR in den Sleep Modus setzen?
Heißt wenn 5 Minuten keine Daten angekommen sind dann schlafen gehen.

Das könnte man einfach in einem Timer lösen ... aber ich habe gehört das 
man keinen Sleep befehl im Timer machen sollte da es zu Problemen führt.
Hat einer eine Idee wie man das machen könnte?

Ich weiß eine Lösung wäre, wenn man das ansteuern des RFM12 per 
Interrupt machen würde ... aber die Hardware ist schon gelötet.

Autor: bobkins (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Richard B.
Die 17 cm Draht-Antenne solltest du nicht als Spirale wickeln, da sich 
damit die Eigenschaften der Antenne verändern. Ideal ist gerade!

Die ideale Länge der Draht-Antenne hängt von der Frequenz ab und 
berechnet sich laut Literatur so:

l = c0 / (f * 4)

l=Länge der Draht-Antenne
c0=Lichtgeschwindigkeit in Luft in m/s
f=Frequenz in Hz

c0/f stellt die Wellenlänge der Funkwelle dar. Als Antenne wird 1/4 der 
Wellenlänge verwendet (Stichwort "Viertelwellendipol").

Beispiel:
f=433Mhz
l = 300e6 m/s / (433e6 Hz * 4) = 17,3cm

Wenn du deine Antenne als Spirale wickeln willst, oder sonst irgendwie 
vom langen Draht abweichen willst, müsstest du dir ein spannendes Buch 
über Hochfrequenztechnik anschauen, auf Erfahrungswerte ausweichen, oder 
deine Antennenkonstruktion mit einem Messempfänger ausmessen. Letzteres 
gibt dir einen praktischen Wert.

Der Vollständigkeit halber erwähne ich noch den Verkürzungsfaktor. Der 
berücksichtigt den Unterschied der Wellenausbreitungsgeschwindigkeit in 
Vakuum gegenüber der Geschwindigkeit im (Kupfer-)Draht. Den könnte man 
einfach als 0,96 annehmen. Also würde die Antenne kürzer als 17,3 cm 
werden.

So genau kann man das allerdings nicht sagen, weil selbst das kleine 
Stückchen Leiterbahn auf dem RFM-Modul seine Finger im Spiel hat, uvm. 
Daher sagen wir einfach mal 17cm, passt schon!


@Christian M.
Sorry, hab dich ganz vergessen! Mein Code ist derselbe, wie auch für die 
433 MHz-Module. Nur die Konfiguration habe ich etwas angepasst, so wie 
ich es laut Datenblätter für richtig hielt. Wenn du die haben möchtest, 
müsste ich mal bei Gelegenheit nachschauen.

mfg bobkins

Autor: Michel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo bobkins (Gast),

es wäre toll wenn du die Konfiguration für die 868 Module einmal 
heraussuchen kannst. Auch ich habe hier, ähnlich wie Christian ein 868 
Modul das leider nicht läuft.

Gruß Michael

Autor: Christian Mertens (inscene)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@bobkins

Freut mich, dass du mich nicht vergessen hast. Ich bin aber durch langes 
studieren des Codes und des Datenblattes selbst auf die Loesung 
gekommen. Sind im Grunde nur zwei oder drei Aenderungen. Werde die heute 
abend hier auch mal angeben.
Zurzeit bin ich mit einem Kommunikations-Protocoll fuer die Module 
beschaeftigt. Halt mit Frames variabeler Groesse, CRC usw.
Mal schauen was dabei rauskommt.

Bye, Christian.

PS.: Ich habe hier leider keine deutschen Umlaute. Arbeite in den NL. 
Also nicht ueber die Schreibweise wundern ;-)

Autor: Christian Mertens (inscene)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So, hier die Einstellungen für die 868 MHz Module.

Die Frequenz umstellen (in der Main):
rf12_setfreq(RF12FREQ(868.92));  // Sende/Empfangsfrequenz auf 868,92MHz einstellen

In der Funktion void rf12_init(void) folgendes ändern (in der rf12.c):
//rf12_trans(0x80D7);      // Enable FIFO 433 MHz
rf12_trans(0x80E7);      // Enable FIFO 868 MHz

In der rf12.h volgendes ändern:
//#define RF12FREQ(freq)  ((freq-430.0)/0.0025)              // macro for calculating frequency value out of frequency in MHz
#define RF12FREQ(freq)  ((freq-860.0)/0.005)              // macro for calculating frequency value out of frequency in MHz

Das war auch schon alles. Ich habe diese Änderungen in der Version 
rfm12_rs232_rxtx.zip gemacht.

Ich hoffe das hilft euch weiter.

Gruß, Christian

Autor: bobkins (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hi!

super, dann werd ich ja nicht mehr gebraucht ;-)

Soweit ich mich erinnern kann (hab mal wieder meinen krempel nicht hier) 
habe ich die Einstellungen genauso gemacht. wie gesagt, siehe 
Datenblatt.

mfg bobkins

Autor: Anna W. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Leider wird vielerorts nur mehr der RFM12B angeboten. Der soll im 
Prinzip gleich sein, verträgt allerdings nur max 3,8V. Laut Datenblatt 
liegt der High-Output bei min Vdd-0,4 = dann 3,4V.

Mein AtMega Board hat nur 5V. Laut Datenblatt Mega16 liegt die Input 
High Voltage bei min. 0,6*V=3V. Hat schon jemand ausprobiert, ob da die 
Kommunikation reibungsfrei läuft? Bzw. kann ich einfach 2 Dioden nehmen 
für die Absenkung der 5V? Hab keinen Platz für noch nen Spannungsregler 
bzw. Pegelwandler und will es möglichst einfach lösen. Vorschläge?

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Pegelwandler

3V high an den AVR wäre knapp. Aber du kannst davon ausgehen, dass ein 
unbelasteter Ausgang eines CMOS ICs annähernd Vdd liefert, nur dauert 
low=>high dann länger als im Datasheet vom RFM steht. Wenn du den 
SPI-Takt also nicht voll ausreizt und dem RFM seine 3,5V gibst, dann 
dürfte das gut funktionieren.

Wenn Dioden, dann ausreichend belastet damit es mindestens 0,6V pro 
Diode sind (1mA min bei 1N4148). Bei den 0,3µA eines RFM12 im Standby 
kommen dort sonst weit über 4V an. Also Lastwiderstand 3K3 hinter die 
Dioden, und auch einen kleinen Elko, sonst entscheidet der RFM em Ende 
noch auf Brownout sobald er aufwacht.

Autor: maddin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...ich habe ein paar kleine fragen zu diesen beiden routinen:

void rf12_txdata(unsigned char *data, unsigned char number)
{  unsigned char i;
  rf12_trans(0x8238);      // TX on
  rf12_ready();
  rf12_trans(0xB8AA);
  rf12_ready();
  rf12_trans(0xB8AA);
  rf12_ready();
  rf12_trans(0xB8AA);
  rf12_ready();
  rf12_trans(0xB82D);
  rf12_ready();
  rf12_trans(0xB8D4);
  for (i=0; i<number; i++)
  {    rf12_ready();
    rf12_trans(0xB800|(*data++));
  }
  rf12_ready();
  _delay_us(10);
  rf12_trans(0x8208);      // TX off
}

void rf12_rxdata(unsigned char *data, unsigned char number)
{  unsigned char i;
  rf12_trans(0x82C8);      // RX on
  rf12_trans(0xCA81);      // set FIFO mode
  rf12_trans(0xCA83);      // enable FIFO
  for (i=0; i<number; i++)
  {  rf12_ready();
    *data++=rf12_trans(0xB000);
  }
  rf12_trans(0x8208);      // RX off
}

1) in benedikts code ist zwischen:
  rf12_trans(0xCA81);      // set FIFO mode

und :
  rf12_trans(0xCA83);      // enable FIFO
ein delay, ist es notwendig - warum?

2)beim einschalten von rx oder tx werden immer beide optionen nach der 
jeweiligen aktion wieder abgeschaltet, warum? kann ich auch direkt 
umschalten..

3)es müsste doch auch moglich sein, mit einem flankeninterrupt zu 
empfangen, indem man ffit nach jedem byte das man ausliest abfragt.

4)das modul bietet auch die möglichkeit statusmeldungen zurückzulesen 
(datenblatt befehl 16 (0xxx xxxx xxxx xxxx), leider ist er nicht 
dokumentiert, also welches bis welchen status rückmeldet, oder gibts da 
noch ein extra datenblatt?

5)zu der präambel von B8AA, wurde weiter oben schon angesprochen:
wo wird diese wieder entfernt?

6)was bewirkt:
         rf12_trans(0xB82D);
  rf12_ready();
  rf12_trans(0xB8D4);

sind das noch befehle?


gruß und vielen dank im vorraus,

m.

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Statusbits stehen sehr wohl im Datasheet vom RF12.

Die Präambel schmeisst der Emfänger weg, weil er überhaupt erst bei 2DD4 
wirklich aufwacht.

Autor: ReinHerR (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
auf die Gefahr hin dass ich mich beim total Blamiere: Ich hab bei diesem 
Prog. von Benedikt echt Probleme.

Ich habe das Programm eingebaut und es lässt sich mit nur einer Warnunge 
Compilieren  (../main.c:55: warning: pointer targets in passing argument 
1 of 'lcd_puts' differ in signedness
). Der ATMega16 hängt sich nicht auf. Aber auf dem Display entsteht nur 
Datenmüll:
Wenn ich die empfangenen Daten wie folgt verarbeite:

rf12_rxdata(test,15);
// daten verarbeiten
lcd_gotoxy(0,0);
lcd_puts(test);

dann bekomme ich einen 15 Zeichen breiten schwarzen Balken.

Ersteze ich "lcd_puts(test);" durch lcd_puts(test[3]); dann bekomme ich 
den ganzen Bildschirm voller wirrer zeichen (bei jedem Durchlauf die 
gleichen).
Der ATMega hängt sich aber nicht auf. Habe auf zwei Boards (gleiche 
Verdrahtung) die gleichen Probleme. Es ist egal ob das eine Board sendet 
oder nicht, im Sekundentakt wird das Display beschrieben.

Hab´ ich jetzt das CHAR-Handling nicht verstanden oder hab´ich ein ganz 
anderes Problem?
Danke für die Hilfe
Gruß
Kuddel

Autor: Vajk .v.i. (vajk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kleine Frage - ist die Empfangssteuerung von RFM01 und RFM12 und die 
Sendesteuerung von RFM02 und RFM12 jeweils identisch, also die Module 
austuaschbar? Ich googel da schon ganze Zeit und finde keine Antwort.
LG
Vajk

Autor: Christian J. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein, ist sie nicht. Befehlsbits sind jeweils andere.

Autor: Steven (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo alle,
ich suchte eine Sende-/Empfang Modul SET für die Übertragung von Daten 
mit einer entfernung von mindesten 30m. und bin auf diese Beitrag 
gestoßen. Als controller benutze ich der Mega16 der auf den AVR STK500 
angeschlossen ist. jetz wollte ich gern der RF12 als Sende-/Empfang 
Modul SET benutzen und habe einige Fragen an euch.

1-kann ich der RF12 direkt an meiner AVR STK500 anschliessen und 
benutzen ohne weiter änderungen oder erweiterungen?

2- wenn änderungen nötig sind: welche sind die?

3- welche Type von Antenne um mein Ziel zu erreichen kann ich benutzen?

Danke im voraus
Steven

Autor: helge (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

Warum hat eigendlich keiner den Betrag von Horst beachtet? Meiner 
Meinung nach, stellt er eine sehr durchdachte effektive Lösung dar. Bei 
mir entstand der Eindruck, das alles was von Benedikts Mainstream-Lösung 
abweicht, einfach ignoriert wird, auch - oder besonders - wenn es eine 
gute Idee ist.

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

Bewertung
0 lesenswert
nicht lesenswert
helge wrote:
> Warum hat eigendlich keiner den Betrag von Horst beachtet?

Keine Ahnung. Anscheinend reden alle mit, aber wirklich nutzen tut 
niemand die Software.
Bei meiner RS232 Funkbrücke wollten alle eine Menü über das sich die 
Parameter einstellen lassen. Also habe ich diese eingebaut. Irgendwann 
habe ich festgestellt, dass diese einen größeren Bug hat, der eigentlich 
relativ schnell auffällt, wenn man die Software verwendet (die 
Einstellungen werden nicht gespeichert). Da sich aber bisher niemand 
beschwert hat, muss ich davon ausgehen, dass niemand die Software 
verwendet. Daher investiere ich dafür auch keine Zeit mehr.

Autor: Christoph Kessler (db1uq) (christoph_kessler)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Benedikt,

Ich habe mir vor kurzem ein RFM12 bei Pollin gekauft, und will mal 
versuchen es für 9600 Baud Packet-Radio zu benutzen. Ein Digipeater auf 
438,425MHz steht in Sichtweite, sodaß zu geringe Empfindlichkeit kein 
Problem sein dürfte. Die minimale Bandbreite von 64 kHz ist allerdings 
etwas breit. Auch der FSK-Frequenzhub ist etwas groß, läßt der sich 
einstellen?

Ist der analoge RSSI-Ausgang am RFM12 zugänglich? Die digitale RSSI gibt 
ja leider nur eine Schwellenüberschreitung aus, die man höchstens auf 
verschiedene Schwellen umschalten könnte. Laut Datenblatt müßte ein 1nF 
C am RSSI-Analoganschluß liegen.

Gibt es auch einen Händler für die 500mW-Version hierzulande, oder muß 
man die in Tschechien bestellen?

Anscheinend hat das Modul auch eine untere Grenzfrequnez für die 
Modulation, ich bin aus dem Datenblatt noch nicht recht schlau geworden.

Autor: Benedikt K. (benedikt) (Moderator)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Christoph Kessler wrote:
> Auch der FSK-Frequenzhub ist etwas groß, läßt der sich einstellen?

In 15kHz Schritten aufwärts.

> Ist der analoge RSSI-Ausgang am RFM12 zugänglich?

Ja, siehe Zeichnung.

> Anscheinend hat das Modul auch eine untere Grenzfrequnez für die
> Modulation, ich bin aus dem Datenblatt noch nicht recht schlau geworden.

Ja, scheint so zu sein. Ich hatte mit den analogen RSSI Ausgang mal 
versucht ein RFM12 als Spektrumanalyser für das 433MHz Band zu 
missbrauchen, dabei fiel mir auf, dass es etwas Ober und Unterhalb der 
eigentlichen Frequenz ein Signal am RSSI Pin erzeugt, nicht aber wenn 
man genau auf die Frequenz geht.

Autor: Christoph Kessler (db1uq) (christoph_kessler)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja genau die Idee hatte ich auch, einen einfachen Panaoramaempfänger. Es 
gibt wohl verschiedene Genarationen dieses Moduls, mal sehen ob meines 
auch an der Stelle einen C hat.

Das 500mW-Modul hatte ich über den Thread entdeckt:
Beitrag "Sammelbestellung bei tme.eu : RFM12 , 100nF 0805, Atmega88"
 Sammelbestellung bei tme.eu : RFM12 , 100nF 0805, Atmega88

Autor: Christoph Kessler (db1uq) (christoph_kessler)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Da steht was von 7 kHz Hochpass, ob das ein Schreibfehler ist?

Wieso haben die im Datenblatt das Ausschnitt-Drucken verhindert? Zum 
Glück gibts Ghostscript das sich um solche Feinheinten nicht kümmert.

Autor: Dirk Schlage (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich habe jetzt versucht meine beiden Module RFM12 mit dem Code aus 
diesem Thread in Betrieb zu setzen. Auf den ersten Blick hat auch alles 
ganz toll ausgesehen. Jetzt habe ich aber festgestellt, daß mein 
rf12_ready nicht blockierend ist, so wie es eigentlich sein sollte. Wenn 
der Sender gar nicht engeschaltet ist, wird einfach von der 
Empfangsroutine 0xff in den Puffer eingetragen.
Ich habe schon die kleinen Verbesserungen am rf12_ready nachgetragen. 
Jetzt fällt mir nichts mehr ein.
Hat jemand einen Tip?

Dirk

Autor: Vajk .v.i. (vajk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hat sich von euch schon jemand das Beispiel von Ulrich Radig
(http://ulrichradig.de/ -> arv -> usbfunk) angesehen ?

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

Bewertung
0 lesenswert
nicht lesenswert
Dirk Schlage wrote:
> Jetzt habe ich aber festgestellt, daß mein
> rf12_ready nicht blockierend ist, so wie es eigentlich sein sollte. Wenn
> der Sender gar nicht engeschaltet ist, wird einfach von der
> Empfangsroutine 0xff in den Puffer eingetragen.

Hast du rf12_ready so angepasst ?

void rf12_ready(void)
{
  cbi(RF_PORT, CS);
  asm("nop");
  asm("nop");
  while (!(RF_PIN&(1<<SDO)));      // wait until FIFO ready
  sbi(RF_PORT, CS);
}

Das sollte funktionieren.

Autor: Thorsten S. (whitenoise)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe noch eine kleine frage zur sendebereitschaft des moduls, im 
code von benedikt wird das modul immer im rx gehalten, will eines 
senden, wird es in den sendezusatnd gebracht, und die daten werden 
übertragen (den protokoll overhead/ sicherungsschicht mit 
richtungswechsel und bestätigung mal weggelassen).

ich hatte bei meiner funkstrecke das problem, das ich zu scheinbar zu 
schnell nach dem senden wieder in den rx zustand geschaltet habe, das 
modul sendete nicht richtig.

im code ist diese funktion dafür zuständig:
/*void rf12_rxmode(void)
{
  rf12_trans(0x82C8);                // RX on
  rf12_trans(0xCA81);                // set FIFO mode
  _delay_ms(.6);
  rf12_trans(0xCA83);                // enable FIFO: sync word search
  rf12_trans(0);                  // Status lesen um Bits zu löschen

}*/

im datenblatt ist gott sei dank das das modul diese zeit benötigt.

jetzt meine frage:

es gibt eine funktion:

static inline void rf12_ready(void)
{
  cbi(RF_PORT, CS);
  asm("nop");
  asm("nop");
  while (!(RF_PIN&(1<<SDO)));              sbi(RF_PORT, CS);
}

um die bereitschaft des moduls abzufragen, die scheint dies anhand des 
zustandes der sdo leitung zu machen, warum nicht anhand der statusbits, 
oder geht das nicht?

gruß,
whitenoise

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

Bewertung
0 lesenswert
nicht lesenswert
White Noise wrote:
> es gibt eine funktion:
>
> static inline void rf12_ready(void)
> {
>   cbi(RF_PORT, CS);
>   asm("nop");
>   asm("nop");
>   while (!(RF_PIN&(1<<SDO)));              sbi(RF_PORT, CS);
> }
>
> um die bereitschaft des moduls abzufragen,

Die Fragt nicht ab, ob das Modul bereit ist zu senden/empfangen, sondern 
nur ob Platz im Sendepuffer ist bzw. ob Daten im Empfangspuffer sind.

> die scheint dies anhand des
> zustandes der sdo leitung zu machen, warum nicht anhand der statusbits,
> oder geht das nicht?

Das Statusbit wird über die SDO Leitung übertragen. Zufällig ist es 
genau das erste Bit, daher muss nicht das komplette Statusregister 
gelesen werden.

Autor: Thorsten S. (whitenoise)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke - klar

Autor: Wasweissich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Benedikt
Ich möchte noch was wegen Deinem Post vom 14.05.2008 15:25 sagen.
Es tut mir leid, das Du da wenig Rückkoppelung bekommst.

Ich muss sagen, das ich mich für das Thema, auch die RS232 Brücke sehr 
interessiere. Leider trifft es in den Spezifikationen (Fehlerkorrektur 
usw.) nicht meine Vorstellungen.
Habe auch leider meine eigenen Bemühungen wegen anderer Projekte immer 
weiter verschieben müssen. Aber irgendwann wird Dich mal der Hammer 
treffen und einer wird sich wegen der Bugs beschweren. ;-)

Trotzdem lese ich immer wieder mit und bin oft erfreut wie geduldig und 
kompetent Du, nach so langer Zeit antwortest. Es ist wirklich immer 
wieder eine Freude von Dir zu lesen.

Bitte mach weiter so. Echt Klasse.

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

Bewertung
0 lesenswert
nicht lesenswert
Falls du, (oder mal jemand anderst) eine ordentliche Fehlerkorrektur in 
die Funkübertragung einbaut, dann wäre es schön wenn er den Code mal 
veröffentlichen würde. Denn genau zu diesem Punkt findet man eigentlich 
rein garnichts im Internet. Ich hatte damals Tagelang nach verschiedenen 
Verfahren gesucht. Die waren alle entweder zu schlecht (Verhältnis 
Overhead zu erreichter Sicherheit zu schlecht) oder zu Rechenaufwendig 
(viel SRAM notwendig, und oft auch sehr rechenaufwendig).

Autor: Wasweissich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Die waren alle entweder zu schlecht (Verhältnis
>Overhead zu erreichter Sicherheit zu schlecht) oder zu Rechenaufwendig
>(viel SRAM notwendig, und oft auch sehr rechenaufwendig).

Ich kann das dann hier posten wenn es soweit ist.
Allerdings muss ich Dir rechtgeben, das es nicht einfach ist einen 
Kompromiss zwischen Nutzdatenrate, Sicherheit und Aufwand zu finden.
Dazu kommt noch das die Entfernung und die Funkemgebung starken Enfluss 
haben. Möglicherweise wird Dir meine Lösung auch nicht gefallen,
aber das werden wir ja dann sehen.

Autor: Dirk Schlage (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein ich hatte den anderen Code von oben
void rf12_ready(void)
{  cbi(RF_PORT, SDI);
  cbi(RF_PORT, CS);
  asm("nop");
  while (!(RF_PIN&(1<<SDO))); // wait until FIFO ready
}
Ich habe jetzt den von vorgestern auch noch mal ausprobiert. Leider 
wartet da nix.
Ich frage mich warum ich am Anfang den Eindruck hatte, daß etwas über 
die Funkstrecke kam. Ich stelle zwischen Sender und empfänger per 
bedingter Compilierung um. Die Sende routine wird beim Empfänger gar 
nicht aufgerufen.
Ich gebe das Ganze dann auf einem Nokia3310-LCD aus.

Ich denke ich muss noch mal ganz zurück, und das Umschalten der Frequenz 
am Ausgang per Oszilloskop messen. Leider bin ich am Oszilloskop etwas 
schusselig. Mit etwas Glück finde ich auch an einem rostigen Nagel die 
10MHz, wenn ich wild an den kleinen Knubbeln rumschraube.

Gibt es die Möglichkeit per SPI ohne Interrupt, oder sonstige Leitungen 
zu prüfen, ob ein Byte empfangen wurde?

Gruß
    Dirk

Autor: Thorsten S. (whitenoise)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

kann da noch jemand was zu sagen!?

Beitrag "rfm und ffit"

gruß,
whitenoise

Autor: CupaCabra (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
tach tach,

hab auch nen kleine´s prob. mit meinen RFM02 und einem ATMega8.

habe vom RFM02 den TaktPin CLK auf xTal 1 vom At8 geschaltet doch wie es 
scheint geht da nix.
Der Externe Ausgang XTal am At8 ist ON doch war´s das auch schon.
Habe das Fusebit über MyAvr QuikProg angeschaltet und auf der Evo. Bord 
von Avr geht das ganze auch.
Auf der TestPlatine hingegen nicht.

Benutze ein leicht abgewandeltest C Prog. von  Pollin. auch die 
Schaltung ist übernommen.

was läuft falsch.

mfg. CUpa

Autor: Roland (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich habe mich 2 Funk-AVR-Eva-board von Pollin bestellt und dazu auch die 
RFM12
Funk modul.Zur Verfügung habe ich die ATMEGA16 chip.
ich habe eine Frage: kann die Software RFM12_RX_TX von Benedik mit dem 
MEGA16 laufen?
wenn nein welche änderungen soll man hier machen damit die software mit 
einem Mega16 läuft?
Ic danke Ihnen in voraus

Autor: Chryst (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi alle,
ich bin eine neue mikrocontroller benutzerin und will daten per funk 
übertragen.
dem zu folge bin ich auf diese Beitrag gestoßen und es hat mich sehr 
viele geholfen. ich habe noch einigen schwierigkeiten und hoffe, dass 
jemand hier mir helfen könnte.

am 18.05.2007 Georges E Wrote:

>> ich habe hier Dein Programmierbeispiel gefunden, nachdem ich mit dem
>> Code-Beispiel von Pollin fast verzweifelt hatte, war Dein super
>> strukturierter Code die wahre Wohltat.

>> Ich habe mir von Pollin zwei Funk Eval Boards zugelegt, jeweils mit
>> RFM12 und ATmega32-16 bestückt.
>> Die Verdrahtung ist zwar etwas anders als bei Deiner Hardware, aber mit
>> wenigen Änderungen (Pin defines und Pullup programmieren) lief Deine
>> Software auf Anhieb !!!!

ich wollte gern wissen wie er pin defines für eine ATmega 16 geändert 
hat.

@ Roland:
wenn du dein Problem gelöst hat, kannst mir sagen wie.

MFG
Chryst

Autor: Jonny Obivan (-geo-)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Benedikt,

erstmal ein großes Dankeschön für das Einstellen des Beispielcodes!

ich teste grade die beiden C- Beispielprogramme für die Module RFM01 und 
RFM02. Ich habe folgendes Problem:

Meistens werden nur das erste oder auch die ersten beiden Bytes korrekt 
übertragen. Ab dann kommt nur Müll an. Beide Module arbeiten mit 10MHz, 
dass habe ich kontrolliert. Offenbar sendet der Sender auch was, sonst 
würde der Empfänger nicht reagieren. Nur leider kommt eben nichts 
Gescheites beim Empfänger an. Ich habe auch schon versucht die 
Init-Funktion am Anfang mehrmals aufzurufen. - Ohne Erfolg.

Hast du da ev. eine Idee?

Grüße
Jonny

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Setze mal die SPI Frequenz hoch und lese mal den Status beim Interruppt 
aus. Ich hatte das Prob auch. Bei mir war es so das ich nicht schnell 
genug die empfangengen Daten aus dem Modul gehollt habe und er in der 
Zeit diese schon wieder überschrieben hat.

Autor: Jonny Obivan (-geo-)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Gast,

vielen Dank für den Hinweis. Könntest du ev. zeigen, an welcher Stelle 
im Code was geändert werden muss - oder deinen geänderten Codeausschnitt 
zeigen?

Das wäre sehr freundlich von Dir :)

Viele Grüße
Jonny

Autor: Marco S. (masterof)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

beim ATmega32 must du im SPCR die Bits SPR1,0 löschen und das SPI2X im 
Register SPSR setzten.

Hoffe ich konnte dir teilweise helfen.

Autor: Jonny Obivan (-geo-)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Marco,

ich nutze den Atmega8.

Autor: Marco S. (masterof)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Jonny,

Beim ATmega8 heisen diese 2 Register genauso.

Autor: Jonny Obivan (-geo-)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Marco,

ah - Danke für den Hinweis. Ich habe nun im Main-Programm zu Testzwecken 
diese Zeilen eingetippt:

  SPCR &= ~(1<<SPR1);
  SPCR &= ~(1<<SPR0);
  SPSR |=  (1 << SPI2X);

Das Problem bleibt weiter bestehen. Die ersten beiden Bytes sind noch 
ok, dann kommt irgendwas an.

Werden in Benedikts Beispiel überhaupt die SPI-Register des Chips 
genutzt?

Viele Grüße
Jonny

Autor: Marco S. (masterof)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stimmt habe gerade im beispiel nach geschaut.
Mach mal den Wert bei delay_us(0.3) kleiner. In der Funktion rf12_trans 
.

Autor: Jonny Obivan (-geo-)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe nun mal den Wert variiert. Es tut sich nichts :(

Autor: liggi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

ich hab ein paar Module bei Pollin bestellt. Ich wollte die zwei 
Atmega32 mit dem Takt des Funkmodules versorgen. Soll heißen, ich 
schließe CLK an XTAL1 an. Nun meine Frage, wie muss ich die Fusebits, 
die für den Takt zuständlich sind, einstellen. Auf Ext. Clock, auf Ext. 
RC Osc, auf Ext. Low Freq, oder auf Ext. Crystal/Resonator (auf HIGH, 
MEDIUM oder LOW)?

mfg liggi

Autor: Pete K. (pete77)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ext. Clock.

Du solltest aber einen Quarzoszillator verfügbar haben, falls Du mal 
wieder auf einen Quarz umsteigen möchtest und das RFM12 nicht 
funktioniert.

Autor: liggi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke.
Welchen Ext. Clock soll ich denn nehmen? 6 CK + 0 ms, oder 6 CK + 4 ms 
oder 6 CK + 64 ms?

mfg liggi

Autor: Pete K. (pete77)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mit dem letzten bist Du auf der sicheren Seite.

Autor: Gerrit G. (liggi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nochmals Danke.

mfg liggi

Autor: Philipp (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin,
ich hab mal eine Frage zu den Quellcodes für das RFM02 Module, die in 
diesem Thread zu finden sind.
Bin beim anpassen des Codes darauf gestoßen, dass 0xD2.. an das Modul 
gesendet wird. In den Datenblättern von Pollin und Hope RF gibt es 
jedoch kein Register, was mit D beginnt.
Wozu ist das genau gut?

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

Bewertung
0 lesenswert
nicht lesenswert
Philipp wrote:

> Bin beim anpassen des Codes darauf gestoßen, dass 0xD2.. an das Modul
> gesendet wird. In den Datenblättern von Pollin und Hope RF gibt es
> jedoch kein Register, was mit D beginnt.

Doch, auf Seite 16 des Hope RF Datenblatts unter Punkt 11.

> Wozu ist das genau gut?

Damit wird der Strom für die interne PLL eingestellt.

Autor: Philipp (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aha, ich hatte wohl ne alte Version vom Datenblatt.
Danke.

Autor: Christof Kauba (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, ich hätte da mal eine Frage.
Kann ich die hier vorgestellte Bibliothek auch für das RFM12BP Modul 
verwenden, oder muss ich dazu etwas anpassen?

Welchen Wert muss ich bei diesem Modul für die unterschiedlichen 
Sendeleistungen zum Modul schicken (also z.B. für 10 mW, 25 mW oder die 
max. 500 mW)?

Und noch eine Frage. Ich glaub ich habs nur einfach nicht gesehen, aber 
wie schalte ich das Modul in den Standy, also den Sende- und 
Empfangsteil ab, sodass nur noch der interne Oszillator des Moduls läuft 
und wie schalte ich dann den Sende- bzw. den Empfangsteil wieder an?


Danke im Voraus

Chris

Autor: ITAA0 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich arbeite in der Schule mit einem Atmel mega8 und den RFM01/02 
Modulen, leider kriegen wir keine Verbindung zu stande. Ich habe die 
verschiedensten Beispiele benutzt und kamen dennoch zu keinem 
vernünftigem Ergebnis.

Ich habe leider keinen Frequenzscanner, aber laut Ozi sollte eigentlich 
gesendet und empfangen werden. Das was empfangen wird sollte eigentlch 
über UART an einen PC gesendet werden und alles kommt an nur die Sachen 
die via UKW gesendet wurden nicht.

Auf Wunsch kann ich das Programm Listing Online stellen.

Danke schon mal im voraus

Autor: Bast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ITAA0 (Gast)

Du mußt einen längeren Thread nehmen. Dieser hier ist eindeutig zu kurz!

Autor: A. Arndt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich fange jetzt auch an mit den Rfm12 und Bascom zu tüffteln,
ich verstehe nur nicht, wieso man die Daten wie Frequenz, Baudrate usw.
nicht einfach ins Modul spi-t und gut, da werden Consts geschrieben und
Subs usw. warum ?

Gruss
A. Arndt

Autor: Moi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Weil sich das für ein guten Programmierstil so gehört!

So ist es einfacher an neue Umgebungsbedingungen anzupassen!

Wer halbwegs vernünftig programmiert verwendet consts etc. Alles andere 
ist nur Bastelmüll!

Autor: A. Arndt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

gut, das ist ansichtssache, ich programmiere mit vielen Kommentaren, 
würde aber nie z.B. um auf einem LCD die Zahl 48 darzustellen 
programmieren

A = 48

lcd a

sondern lcd "48"

und gut.

Ich möchte zum Beispiel nur den Wert, also die 9 Bits eines DS1820 zu 
einem 2. AVR schicken und da via LCD darstellen lassen, nichts mit uart 
usw. also könnte ich doch die Daten wie Frequenz usw, einmal 
rüberschieben zum Modul und mich dann auf das Datensenden konzentrieren 
(Sender) und mir den Wert zurückschicken, wenn identisch i.O. ansonsten 
nochmal schicken bis i.O.


Oder bin ich mit dieser Idee völlig auf dem Holzweg...?

Gruss
A. Arndt

Autor: Manuel Stahl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eine Antwort schicken erfordert zumindest schon mal das Umschalten vom 
Empfangs- in den Sendemodus. Rein auf Datensenden reicht also nicht. 
Außerdem muss der Empfänger noch das Ende eines Pakets erkennen und 
falls dieses nicht erkannt wird nach einer gewissen Anzahl Bytes 
aufhören zu empfangen.

Solche Dinge wollen beachtet werden.

Autor: A. Arndt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

das ist klar, ich dachte mir das wie folgt :

Sende Frequenz         'z.B. 433,92 MHz
sende Baudrate         '19200
sende Frequ-Shift       ' 120kHz

und schalte auf Empfang und warte

das gilt für Sender und Empfänger

Dann erfolgt am Sender die Messung mit Ds1820 und schaltet um auf Senden 
und schickt die Daten und schaltet wieder auf Empfang.

Der Empfänger lauert auf Daten, empfängt diese, wartet kurz und schickt 
diese Daten genau so zurück und schaltet wieder Empfang.

Der Sender empfängt die Daten, prüft ob i.O und schickt ggf. Daten 
nochmal und schaltet wieder auf Empfang.

Empfängt der Empfänger innerhalb von 5 Sek nichts mehr wertet er die 
Daten des DS1820 aus und zeigt sie auf dem LCD (dieses könnte natürlich 
noch mit Sendung von z.B. code für ok verfeinert werden).

Man könnte natürlich auch die Auswertung gleich am Sender machen.

So das "Grobgerüst"....

Gruss
A. Arndt

Autor: A. Arndt (artools)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

gibts keine Rubrik RFM12 für Dummies ohne Sprüche "Steht doch im 
Datenblatt"...

Es gibt halt Hobbybastler und Ingenieure, daher ist auch das Verständnis 
für diese Infos zu verschieden...

Gruss
A. Arndt

Autor: tester (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen. Ich wollte mich jetzt auch mal mit den Funkmodulen 
beschäftigen und hab auch 2 rfm12 hier liegen. Allerdings seh ich bei 
dem Quellcode, speziell bei der Funktion rf12_trans, noch nicht so ganz 
durch. Vielleicht könnte sich ja jemand bereit erklären mir zu 
verdeutlichen was da vor sich geht.

Hier noch mal die Funktion:
unsigned short rf12_trans(unsigned short wert)
{  unsigned short werti=0;
  unsigned char i;

  cbi(RF_PORT, CS);
  for (i=0; i<16; i++)
  {  if (wert&32768)
      sbi(RF_PORT, SDI);
    else
      cbi(RF_PORT, SDI);
    werti<<=1;
    if (RF_PIN&(1<<SDO))
      werti|=1;
    sbi(RF_PORT, SCK);
    wert<<=1;
    _delay_us(0.3);
    cbi(RF_PORT, SCK);
  }
  sbi(RF_PORT, CS);
  return werti;
}

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

Bewertung
0 lesenswert
nicht lesenswert
Vereinfacht gesagt bekommt die Funktion einen 16bit Wert, der seriell 
ausgegeben wird. Gleichzeitig werden 16bit eingelesen.

Autor: tester (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja vereinfacht hab ich das auch verstanden aber ich meinte im detail :)

Autor: A. Arndt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

welche Werte müssen denn mindestens ans Modul gesendet werden...?

Frequenz, Baudrate und Bandbreite ????

Was hat es mit dem sog. FIFO auf sich, welchen Befehl muss ich schreiben 
um die empfangenen Daten auszulesen zu können ?

Sind die Daten nach dem Auslesen im Modul weg ?

Wie bekomme ich mit, wenn Daten im Modul angekommen sind ?



Gruss
A. Arndt

Autor: Jonas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

bei mir bleibt das Programm, wenn ich senden möchte, hier hängen:

while (!(RF_PIN&(1<<SDO))); // wait until FIFO ready

in der rf12_ready(). Habe auch ein asm("nop"); eingefügt.

Hat jemand ein Tipp für mich, woran das liegen könnte?
Ich habe MISO, MOSI, SCK und nSel und FSK über 10k auf 5V an meinem 
ATMega2560 angeschlossen.

Vielen Dank!

Gruß Jonas

Autor: Jonas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Problem hat sich erledigt, ich wollte zu schnell hintereinander senden.
Mit einer längeren Wartefunktion funktioniert es.

Autor: Manja (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich habe nun manches in diesem Thread gelesen, bin Modellfan in und 
möchte einen 1:32 LKW mit einer Fernsteuerung ausstatten.

Habe auch schon manches mit dem ATTiny2313 umgesetzt.

Allerdings stört mich hier etwas die Unzuverlässigkeit der produzierten 
Geräte, wenn ich etwas steuere, dann sollte das meiste auch den 
Empfänger erreichen.

Ich hab mir das so vorgestellt:

Der Sender sendet laufend 3 Bytes, das erste und zweite muß im Empfänger 
in
einen Output je Pin durch Timer in 1ms bis 2ms Rechteck umgesetzt werden 
mit gesamt 20ms Distanz. (Für Servo, Motor). Das dritte Byte dient 
Sonderfunktionen (Licht etc.)

Diese 3 Bytes sollten zyklisch immer wieder gesendet werden, man könnte 
ja noch ein viertes Byte hinzunehmen als Prüfbyte (mit den anderen über 
XOR ermittelt)

Ich hoffe, das man das mit 2 ATTiniy2313 hinbekommt, habe noch jede 
Menge herumliegen, bräuchte nur 2 RFM12

Autor: Manja (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo ,
habe heute von Pollin Päckchen bekommen,
was war darin:

Bausatz Funk AVR Evaluations Board = war in Ordnung, aber

2 * Rainbow - Mouse

in einem Beutel, auf dem 2 Stk. Funkmodul RFM 12 drauf stand.

Auch auf der Rechnung stand 2 * Funkmodul RFM 12

Ist die Firma Pollin bei euch auch so unzuverlässig, wenn ihr was 
bestellt ??

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Manja wrote:
> Ist die Firma Pollin bei euch auch so unzuverlässig, wenn ihr was
> bestellt ??

Nein nur extra bei dir haben sie ne Ausnahme gemacht um dich speziell zu 
ärgen, weil du ein Leerzeichen vor einem doppeltem Satzendezeichen setzt 
:P

Mir isses noch nicht passiert, wurde aber schon öfter berichtet. Einfach 
anrufen dann kriegt mans meist nachgeliefert und darf das falsch 
gelieferte behalten.

Autor: Gerd (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Unzuverlässig? Reichelt hat das letzte Mal bei mir statt 5 Atmega32 
(TQFP) 5 Atmega128 (TQFP) geliefert. Waren mit Atmega32 auf der Tüte 
beschriftet.
Passiert anscheinend in jedem Laden.

Autor: Werner A. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Georg E.
Du hast weiter oben geschrieben, dass du 2 DemoBoards von Pollin im 
Einsatz hast und dafür den Code von Benedikt angepasst hättest. Kannst 
du mir den Code evtl. zur Verfügung stellen? Ich hab mir auch gerade 2 
DemoBoards bei Pollin bestellt...

@all
oder kann mir sonst jemand vielleicht 'nen fertigen SimpelCode zur 
Verfügung stellen?

Danke
  Werner

Autor: Susi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
weiss jemand, ob die RFM 01 / 02 auch ohne AVR betrieben werden können ?
Ich würde sie nämlich mit Encoder-Decoder ICs betreiben wollen:
RFM02
Spannung anschliessen
Ausgang von Encoder-IC in FSK-input
nSEL auf Low

RFM01
Spannung anschliessen
nSEL auf Low
Irgendwo müsste das Signal wieder rauskommen....?
oder geht es nicht ?

Danke für Eure Antworten
 Susi

Autor: Vajk .v.i. (vajk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Huhu Susi,
das geht nicht ohne uC .. ein I2C-Speicherchip kann eigentlich auch 
nicht ohne uC leben ... bei den Funkmodulen st das auch so ... (ohke PC 
direkt dran geht auch).
LG
Vajk

Autor: Susi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Vajk
Danke für deine Antwort.
Schade, daß es nicht geht!
Susi

Autor: Manuel Stahl (thymythos) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
A. Arndt wrote:
> Hi,
>
> gibts keine Rubrik RFM12 für Dummies ohne Sprüche "Steht doch im
> Datenblatt"...

Da die Datenblätter eben sehr technisch sind, versucht z.B. dieser 
Wiki-Artikel die Thematik auch auf einfachere Weise zu erklären: 
http://www.mikrocontroller.net/articles/RFM12

> Es gibt halt Hobbybastler und Ingenieure, daher ist auch das Verständnis
> für diese Infos zu verschieden...

Es geht nicht ums Verständnis, sondern darum, dass nicht alles dreifach 
gefragt wird. Es ist völlig klar, dass nicht jeder einen so langen 
Thread wie diesen komplett durchlesen will, dafür gibt es das Wiki! 
Erhält man eine passende Antwort und die Frage steht noch nicht im Wiki 
ist jeder eingeladen dies nachzutragen.

Autor: Richard B. (rbrose)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich habe ein Problem mit meinem RFM12 das Senden soll.
Das komische ist, wenn ich den Sender an +5V Netzteil anschließe 
funktioniert es immer gut. Wenn ich es aber mit Batterien betreibe, 
funktioniert das fast nie ... nur ab und zu. Hat eine eine Idee woran 
das liegt?

Wenn ich im Batterie Mode den ISP Stecker anstecke dann funktioniert das 
wieder immer.

Das RFM12 schaltet immer auf 10Mhz hängt aber in der sende Funktion wenn 
mit Batterie betrieben wird.

Hat einer eine Idee was ich messen soll oder was das Problem sein 
könnte?


Danke

Autor: Richard B. (rbrose)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ein 220uF Kondensator am RFM12 hat Abhilfe geschaffen.

Autor: Alfred (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo.

Habe ein Problem mit dem Empfangsmodul RFM01.

Die Konfiguration des Moduls habe ich vom Beipsielcode von hopeRF 
übernommen (http://www.hoperf.com/pdf/RF01_code.pdf --> 24 Byte an Modul 
senden).

Das Modul wird über eine HW-SPI angesprochen, die auf 78kHz eingestellt 
ist. Nach der Initialisierung des Moduls wird auf einen NIRQ-Interrupt 
gewartet, der nach 8bits im Buffer auslöst.
Ist das der Fall, werden zuerst die 16bit vom Status Register und danach 
8bit FIFO ausgelesen.

Das Ganze wird 8mal durchgeführt und anschließend das 
FIFO-Löschen-Kommando  ans Modul gesendet.

Nun passiert folgendes: Wenn der NIRQ-Interrupt auslöst, werden statt 
des Status-Registers sofort die 8bit-Daten empfangen.

Nachdem dann wieder FIFO-Löschen geschickt wurde, funktioniert das ganze 
wieder bis zum nächsten Löschen-Kommando. Danach werden wieder statt des 
Status Registers die 8bit-Daten empfangen.

Hat jemand eine Idee, was daran schuld sein könnte???


mfg Alfred

Autor: Lukas Baumann (lukasb)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich habe mal versucht das beispiel (erstmal provisorisch) auf hardware 
SPI umzubauen. (ertstmal nur den sender) tut aber nicht, jemand ne idee 
warum?
 

#include <avr/io.h>
#include "gdi_test.h"
#include <stdlib.h>
#include <util/delay.h>




int spi_send (uint16_t value){
  uint8_t highbyte;
  uint8_t lowbyte;

  lowbyte = value;
  highbyte = (value >> 8);

  PORTB &= ~(1 << PB2);  //vorsichtshalber SS selber setzen

  SPDR = highbyte;
  /* Wait for transmission complete */
  while(!(SPSR & (1<<SPIF)))
  ;
  PORTB |= (1 << PB2); // SS zurücksetzen
  

  PORTB &= ~(1 << PB2);    //vorsichtshalber SS selber setzen

  SPDR = lowbyte;
  /* Wait for transmission complete */
  while(!(SPSR & (1<<SPIF)))
  ;
  PORTB |= (1 << PB2); // SS zurücksetzen
  _delay_ms(1);


  return 0;
}


void rf12_txdata(unsigned char *data, unsigned char number)
{
  spi_send(0x8238);      // TX on
  
  spi_send(0xB8AA);
  
  spi_send(0xB8AA);
  
  spi_send(0xB8AA);
  
  spi_send(0xB82D);
  
  spi_send(0xB8D4);


  spi_send(0xB800|32);  //fix erstmal nur 32 senden

  //for (i=0; i<number; i++)
  //{  
  //  spi_send(0xB800|(*data++));
  //}
  
  spi_send(0x8208);      // TX off
}




int main (void){

  //SPI aktivieren
  DDRB = (1<<PB3)|(1<<PB5)|(1<<PB2);
  SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);

  DDRD = (1 << PD0);
  PORTD = 0;

  _delay_ms(100);


  spi_send(0xC0E0);      // AVR CLK: 10MHz
  spi_send(0x80D7);      // Enable FIFO
  spi_send(0xC2AB);      // Data Filter: internal
  spi_send(0xCA81);      // Set FIFO mode
  spi_send(0xE000);      // disable wakeuptimer
  spi_send(0xC800);      // disable low duty cycle
  spi_send(0xC4F7);      // AFC settings: autotuning: -10kHz...+7,5kHz


  
  uint16_t freq;
  freq = RF12FREQ(433.92);

  spi_send(0xA000|freq);

  //, , 
  uint8_t bandwidth = 4;  //200kHz Bandbreite
  uint8_t gain = 1;  //-6dB Verstärkung
  uint8_t drssi = 4;  //DRSSI threshold: -79dBm 
  spi_send(0x9400|((bandwidth&7)<<5)|((gain&3)<<3)|(drssi&7));


  PORTD |= (1 << PD0);
  _delay_ms(500);
  PORTD &= ~(1 << PD0);
  _delay_ms(500);



  uint16_t baud = 19200;

  if (baud<663){
    return;
  }

  if (baud<5400){          // Baudrate= 344827,58621/(R+1)/(1+CS*7)
    spi_send(0xC680|((43104/baud)-1));
  }
  else{
    spi_send(0xC600|((344828UL/baud)-1));
  }

  uint8_t power = 0; // 1mW Ausgangangsleistung,
  uint8_t mod = 6;   // 120kHz Frequenzshift

  spi_send(0x9800|(power&7)|((mod&15)<<4));



  PORTD |= (1 << PD0);
  _delay_ms(500);
  PORTD &= ~(1 << PD0);
  _delay_ms(500);


  
  while (1){

    PORTD |= (1 << PD0);
    _delay_ms(500);
    PORTD &= ~(1 << PD0);
    _delay_ms(500);



    unsigned char *x;
    x = "test";

    rf12_txdata (x,32);
    _delay_ms(500);
  }

  return 0;
}



gdi_test.h:
#define F_CPU 8000000 
#define RF12FREQ(freq) ((freq-430.0)/0.0025) 

Autor: Florian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

es war die rede davon das der ffit pin auf high geht wenn der fifo voll 
ist beim rfm01. welcher der beiden ist jetzt gemeint, da sind ja 2...

MfG Flo

Autor: Chris T (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

ich habe mir zwei Module mit dem IA 4221 und IA4320 für Modellbau 
aufgebaut. Der Empfänger wiegt nur ca. 0.3g. Allerdings gibt es noch 
Probleme bei der Programmierung. Ich habe eine zuverlässige Verbindung 
auf 433MHz (Mit geringer Reichweite). Wenn ich allerdings auf beiden 
Seiten 868MHz einstelle tut sich nichts mehr. Muss zusätzlich noch eine 
andere Einstellung vorgenommen werden damit die 868MHz funktionieren? 
Die ANtennenschaltung ist bereits für 868MHz ausgelegt. Ich schiebe die 
Daten direkt (ohne FIFO) raus.  Kann bei Gelegenheit den Code posten.



Chris

Autor: M. W. (hobbyloet)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gerd wrote:
> Unzuverlässig? Reichelt hat das letzte Mal bei mir statt 5 Atmega32
> (TQFP) 5 Atmega128 (TQFP) geliefert. Waren mit Atmega32 auf der Tüte
> beschriftet.

Schon das Geld für die besseren Megas zurück gezahlt?

Irgend wie, treiben sich hier immer mehr Krumme Typen rum.

Autor: Gerd (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hatte bloß einen sehr kurzen Liefertermin mit der zu bauenden 
Schaltung. Der ist wegen der Falschlieferung in die Hose gegangen. 
Ansonsten hätte ich mich darüber gefreut, ist klar. Beim zweiten Mal 
waren es dann FT245 statt Atmega32. Hat mich dann bewogen, woanders zu 
bestellen.
Ich glaube allerdings nicht, dass man wieder so viel Pech mit Reichelt 
haben kann.

Gruß Gerd

Autor: Christian (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,

ich sitze hier jetzt schon ein paar Tage an meiner Funkschaltung (RFM12) 
und versuche die Hardware SPI Schnittstelle zum laufen zu bringen. Ich 
sehe mit einem Oszi auch, dass Daten übertragen werden. Ich versuche die 
Clock des Modules zu ändern. Leider ohne Erfolg.
Ich verwende einen ATMega32.

Vielleicht kann mir einer ja meinen Fehler zeigen.

Thx,
Christian

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

Bewertung
0 lesenswert
nicht lesenswert
Du musst auch den Chipselect richtig ansteuern, also vor der Übertragung 
auf low und hinterher wieder auf high.

Autor: Christian (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Habe ich versucht, aber leider ohne Erfolg. Haben den Code angehängt.

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

Bewertung
0 lesenswert
nicht lesenswert
Eine Übertragung hat 16bit, nicht 8bit. Also CS vor den 16bit auf Low, 
und hinterher wieder auf high.

Autor: AtmelFreak (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo RFM-Gemeinde,
ich glaube das ist jetzt ein wenig OT aber ich denke das passt hier 
schon.
Mittlerweile habe ich eine Menge Projekte unter FAST-AVR geschrieben und 
sie haben immer beeindruckend gut funktioniert. Zuletzt jetzt das 
Projekt mit 2 RFM 12ern. Es funktionierte natürlich nicht sie mit 
Hard-SPI zum laufen zu zwingen. Also drangemacht an AVR-GCC und zum 
testen Benedikts Code (danke Benedikt für deine Pionierleistung ;-) ) 
geladen, geändert und auf meinem Tiny2313 getoastet und......... siehe 
da es funzt.
Jetzt aber mal meine Frage: Mein Code in FAST-AVR entspricht vom Umfang 
der Funktionen derer in Benidikts Code in C. Nach dem Compilieren habe 
ich aber bei FAST-AVR nur ca 56% RAM beschrieben während mir AVR-GCC 
161% sagt.
Trotz allem habe ich ihn in meinen Chip bekommen. Senden-Empfangen funzt
aber die anschließende bearbeitung der Daten funzt nur ab und an.
Ausserdem habe ich auch festgestellt das manchmal nach dem Einschalten 
der Chip langsamer läuft, Da ich am Anfang 2 LEDs blinken 
lasse.(interner 4 MHz-Takt ist eingefused)

Wäre prima wenn mir jemand sagen könnte warum mir AVR-GCC eine 
Speicherauslastung von rd160% angibt. Achja -os ist eingestellt. Bei 
anderen einstellungen verändert sich allerdings nicht viel.
Vielen Dank schonmal vorab

Autor: fantomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo leutz, hab frage zur dieser Funktionsaufruf.

setpower(0, 6) // 1mW Ausgangangsleistung, 120kHz Frequenzshift
kann sein das die Frequenz auf 105kHz eingestellt wird und nicht auf 
120?
Hier noch mal die Funktion:

void rf12_setpower(unsigned char power, unsigned char mod)
{
  rf12_trans(0x9800 | (power&7) | ((mod&15)<<4));
}


falls ich falsch liege kurze Erklärung wäre sehr nett:)

thx

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

Bewertung
0 lesenswert
nicht lesenswert
fantomas wrote:
> hallo leutz, hab frage zur dieser Funktionsaufruf.
>
> setpower(0, 6) // 1mW Ausgangangsleistung, 120kHz Frequenzshift
> kann sein das die Frequenz auf 105kHz eingestellt wird und nicht auf
> 120?

Ja, hast recht. 7 wäre 120kHz.

Autor: fantomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
(tiefes Dank für Thread @ Benedikt)
Ist es möglich mit den Funkmodulen die Signale der Funk-Schalt-Sets zu 
empfangen?

big thx

Autor: altprog (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Rf12 - Programmierer,

Pionierarbeit auf dem Gebiet der RF 12-Module. Jetzt scheinen auch die 
bekannten "Verdächtigen" auf den Zug aufzuspringen. Im Januar-Heft der 
Zeitschrift Elektor sind gleich zwei Artikel dazu zu finden. Einmal ein 
Artikel über die Module selbst und einmal die Programmierung einer 
Übertragungsstrecke zwischen zwei RF12-Modulen. Wobei die Synchronierung 
trickreich gelöst worden zu sein scheint. Auf der Elektorseite kann man 
sich die Beispielprogramme kostenlos herunterladen: www. 
elektor.de/071125.
Hat schon jemand damit experimentiert?

Gruß

Altprog

Autor: Psych (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Hat schon jemand damit experimentiert?

Ist der Code bei denen nicht in Bascom programmiert ? Bäähh.

Autor: Rolf Becker (altprog)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Ist der Code bei denen nicht in Bascom programmiert ? Bäähh.

Ja genau, aber das ist doch kein Problem. Man kann den Code doch auch in 
andere Sprachen übertragen, soforn man die Fuktion verstanden hat.

Altprog

Autor: Rudger Hauer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Ja genau, aber das ist doch kein Problem.

Bascom ? Geht gar nicht ...

>Man kann den Code doch auch in andere Sprachen übertragen

Wenn ich mich in den Bascom-Code einarbeiten muss, dann kann ich auch 
gleich weiter in Basic porgrammieren, aber wer will das schon.

Autor: GagaGast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
naja, eine Programmiersprache ist doch nur ein Handwerkszeug ...
und wenn Du bascom nicht verstehst und von "einarbyten" sprichst,
aber C oder asm kannste? ... dat paßt irgendwie nicht ....

Autor: Rudger Hauer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>nicht verstehst

Davon hat keiner gesprochen, programmiere ab und an noch was in 
VisualBasic am Rechner, so isset nicht.

Jedoch hat Bascom mir nie gefallen, hatte mir auch mal das Buch von 
Rowalt geholt, aber es direkt wieder verkauft.

>aber C oder asm kannste?

Früher (in den  90er - Oh gott bin ich alt ..) hab ich µC nur in ASM 
programmiert (Damals nur PICs brrr).

Heutzutage programmiere ich nur noch C, da mann verschiedene Controller 
nutzen will/muss.

>"einarbyten"

;-)

Autor: GagaGast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Rudger

> Davon hat keiner gesprochen, programmiere ab und
> an noch was in VisualBasic am Rechner, so isset nicht.
oh dann solltest Du Dich hier registrieren, damit ich Dich mal
direkt per email kontaktieren kann ...

>> aber C oder asm kannste?
> Früher (in den  90er - Oh gott bin ich alt ..) hab ich µC
> nur in ASM programmiert (Damals nur PICs brrr).
handshake, alldings haß ich PICs, 8051er .. das waren mir lieber

> Heutzutage programmiere ich nur noch C, da mann
> verschiedene Controller nutzen will/muss.
ack,dto.

... ergo kannst Du sehrwohl den Quälcode in bas(tel)com lesen!

Autor: Rolf Becker (altprog)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

eigentlich wollte ich ja keine Diskussion über Programmiersprachen 
anstoßen. Deswegen wiederhole ich meine Frage: Hat jemand sich die 
Beispielprogramme schon mal genauer angesehen oder gar damit 
experimentiert?

Gruß

Altprog

Autor: Michael K^3 (manhunt)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Also ich habe einige Fragen zu Bendikts Code:

Dazu schreibe ich die Funktionen hin und meine Frage in den Kommentaren, 
bzw die Frage Allgemein.

Ihr würdet mir sehr helfen wenn ihr mir einige Dinge erklären könntet.

Also:

1.) Die Pins SDI und SDO und CS, müssten diese in der rf12.c nicht also 
Eingang oder Ausgang definiert werden?

2.) Funktion: rf12_trans()

if (wert&32768) /
      sbi(RF_PORT, SDI);
    else
      cbi(RF_PORT, SDI); 
    werti<<=1; 
Also ist SDI nicht der Input? Ich denke mir Folgendes Bei dieser 
Funktion, alle bits bis auf das 15 ausblenden und dann SDI je nach dem 
auf High oder Low setzen, dannach das  vorletzte Bit der Variable der 
Stelle 14 an die Stelle 15 Schieben und im nächsten durchgang senden.

Wieso wird hier SDI und nicht SDO verwendet?

3.) Funktion: rf_trans() [Siehe Kommentare]
        if (RF_PIN&(1<<SDO))  
      werti|=1;
    sbi(RF_PORT, SCK);
    wert<<=1;          //warum erste jetzt shiften?
    _delay_us(0.3);  //Warum 0.3 us?
    cbi(RF_PORT, SCK);
Die Frage warum man SDO bzw den Output für den Input verwendet bleibt, 
bzw wo definiert wurde ob Ausgang oder Eingang (DDRB =...)

4.)
Funktion:  rf12_txdata

Warum Schicke ich in dieser Funktion zuerst:
  rf12_trans(0xB8AA);
  rf12_trans(0xB8AA);
  rf12_trans(0xB8AA);
  rf12_trans(0xB82D);
  rf12_trans(0xB8D4);

Wechle beteutung hat 3xAA, 2D und D4 habe dazu nirgenst etwas gefunden.





5.) Funktion: rf12_rxdata
  rf12_trans(0xCA81);      // set FIFO mode
  rf12_trans(0xCA83);      // enable FIFO
Muss ich den FIFO am Ende der Funktion nicht wieder disablen, bzw würden 
ein 0xCA83 nicht reichen? wozu das 0xCA81 davor?


6.) Was ist dieser FIFO? (JaJa First IN First Out aber was ersetzt der 
mir?) :D


Ich bin für jede Hilfe/Antwort dankbar.


Liebe Grüße,
Michael

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

Bewertung
0 lesenswert
nicht lesenswert
Michael Graßl wrote:
> 1.) Die Pins SDI und SDO und CS, müssten diese in der rf12.c nicht also
> Eingang oder Ausgang definiert werden?

Ja, werden sie auch:
  RF_DDR=(1<<SDI)|(1<<SCK)|(1<<CS);
  RF_PORT=(1<<CS);

> 2.) Funktion: rf12_trans()

> Also ist SDI nicht der Input?

Jain. SDI ist der Ausgang vom AVR und der Eingang vom RF12. Je nachdem 
von welcher Seite man es aus betrachtet ist es also entweder Ausgang 
oder Eingang.

> 3.) Funktion: rf_trans() [Siehe Kommentare]
>
>
>         if (RF_PIN&(1<<SDO))
>       werti|=1;
>     sbi(RF_PORT, SCK);
>     wert<<=1;          //warum erste jetzt shiften?
>     _delay_us(0.3);  //Warum 0.3 us?
>     cbi(RF_PORT, SCK);
> 

Wenn du vorher shiften würdest, dann würde das MSB verloren gehen.
0,3µs, weil das Datenblatt maximal 2,5MHz Taktfrequenz erlaubt. Dazu 
noch etwas Reserve, damit es zu keinen Timingproblemen kommt.

> Wechle beteutung hat 3xAA, 2D und D4 habe dazu nirgenst etwas gefunden.

2DDA ist das Syncword, das der Empfänger erkennt. AA sind Binär 
10101010, also möglichst viele Flanken, damit der Empfänger sich auf die 
Baudrate einstellen kann.

> 5.) Funktion: rf12_rxdata
>   rf12_trans(0xCA81);      // set FIFO mode
>   rf12_trans(0xCA83);      // enable FIFO
> Muss ich den FIFO am Ende der Funktion nicht wieder disablen, bzw würden
> ein 0xCA83 nicht reichen? wozu das 0xCA81 davor?

Die Antwort hast du dir selbst gegeben: 0xCA81 schaltet den FIFO Mode 
ein, deaktiviert aber das FIFO. Mit der Sequenz 0xCA81 -> 0xCA83 wird 
die Syncword Erkennung gestartet.
Das Abschalten geschieht bei mir durch das Abschalten des Empfängers.

Autor: Michael K^3 (manhunt)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Benedikt K. wrote:

>> 2.) Funktion: rf12_trans()
>
>> Also ist SDI nicht der Input?
>
> Jain. SDI ist der Ausgang vom AVR und der Eingang vom RF12. Je nachdem
> von welcher Seite man es aus betrachtet ist es also entweder Ausgang
> oder Eingang.

Aso, so siehst du das, da ich immer von meinem AVR den ich Programmiere 
Ausgegangen bin ist mir das nicht in den sin gekommen.


>
> Wenn du vorher shiften würdest, dann würde das MSB verloren gehen.

Meine erste Idee war es auch dort zu shiften wo derweil werti <<=1; 
steht, weil es dann in einem Logischen zusammenhang stehen würde.(Zu dem 
Zeitpunkt an dem ist das MSB eh schon egal oder?)


> 2DDA ist das Syncword, das der Empfänger erkennt. AA sind Binär
> 10101010, also möglichst viele Flanken, damit der Empfänger sich auf die
> Baudrate einstellen kann.

Ahm, ich geh mal davon aus beim 2DDA hast du dich beim A vertippt, Frage 
wo steht das mit dem 2DD4 und fängt er dann erst zu senden an oder der 
empfänger erst zum "empfangen" bzw das empfangen als Daten anzusehen?




> Die Antwort hast du dir selbst gegeben: 0xCA81 schaltet den FIFO Mode
> ein, deaktiviert aber das FIFO. Mit der Sequenz 0xCA81 -> 0xCA83 wird
> die Syncword Erkennung gestartet.
> Das Abschalten geschieht bei mir durch das Abschalten des Empfängers.

Naja ich meinte das die Zwei Schritte auch nur mit 0xCA83 gemacht werden 
könnten da ja beim  1 --> 001, 3--> 011, immer das erste Bit gesetzt 
wird.
ASO mit RX off wird der FIFO auch bedeutungslos

Danke für die schnelle Hilfe.

lg Michael

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

Bewertung
0 lesenswert
nicht lesenswert
Michael Graßl wrote:
> Meine erste Idee war es auch dort zu shiften wo derweil werti <<=1;
> steht, weil es dann in einem Logischen zusammenhang stehen würde.(Zu dem
> Zeitpunkt an dem ist das MSB eh schon egal oder?)

Ja, das sollte auch gehen.
Ich schiebe halt gerne mehr am Ende. Der Hintergedanke war, diesen Shift 
als Wartezeit sinnvoll einzusetzen, aber der Compiler stellt die 
Reihenfolge vermutlich um, daher funktioniert das nicht ganz.

> Ahm, ich geh mal davon aus beim 2DDA hast du dich beim A vertippt,

Ja. 4 und A sehen sich irgendwie so ähnlich.

> Frage wo steht das mit dem 2DD4

RF12 Datenblatt, Seite 18 unter 7. FIFO and Reset Mode Command.

> und fängt er dann erst zu senden an oder der
> empfänger erst zum "empfangen" bzw das empfangen als Daten anzusehen?

Er beginnt erst nach dem Empfang von 2DD4 mit dem Füllen des FIFOs.

> Naja ich meinte das die Zwei Schritte auch nur mit 0xCA83 gemacht werden
> könnten da ja beim  1 --> 001, 3--> 011, immer das erste Bit gesetzt
> wird.

Es geht darum, dass ff bit (Bit 1) zurücksetzen, damit die Syncword 
Erkennung neu gestartet wird. Man muss also beide Befehle ausführen, 
damit es funktioniert.

Autor: Michael K^3 (manhunt)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gut Danke die Fragen habe ich jetzt verstanden.

Nun bleibt nur mehr die Frage zum FIFO.

Frage Benedikt, wie müsste der Ablauf aussehen wenn ich das Ganze ohne 
Polling realisieren würde.

Würde das dann so aussehen das vom nIRQ die Anfrage nach dem Nächsten 
Bit zum senden kommt und vom nInt die Meldung das ein neues Bit anliegt?
Bzw was müsste ich spezielle einstellen?

lg Michael

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

Bewertung
0 lesenswert
nicht lesenswert
Am einfachsten geht das über den FFIT Pin: Dieser geht auf high, sobald 
Daten im FIFO sind. Diesen muss nur nur an einen externen Interrupt Pin 
legen.

Autor: Michael K^3 (manhunt)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo


Thx, also der FITT geht auf High wenn Daten zum auslesen da sind, aber 
wie bekomme ich mit ob ich mehr Daten in den FiFo zum schreiben Platz 
haben?

Oder ist das abhängig davon ob RX oder TX aktiv ist?


LG, Michael

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

Bewertung
0 lesenswert
nicht lesenswert
Hallo Forum,

ich versuche nun auch seit einiger Zeit die RFM12 zum laufen zu bringen 
und zwar mit zwei Pollin-Boards.
Ich habe Benedikts Code ein klein wenig geändert. Es sollte bei 
Betätigen des Tasters auf dem Senderboard eine 1 gesendet werden. Wenn 
diese empfangen wird sollte auf dem Empfängerboard eine LED kurz 
aufleuchten. Danach sollte die LED noch einmal, zur Bestätigung des 
Programmdurchlaufes, aufleuchten.
Die LED leuchtet aber nur einmal auf. Der Empfänger empfängt also etwas 
aber nur nicht die gewollte 1.
Ich habe nun keinen blassen Schimmer wo der Fehler liegt. Ich hoffe ihr 
könnt mir helfen.
Den Code habe ich mal in den Anhang getan, damit das hier nicht zu lang 
wird.

MfG
Robert

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

Bewertung
0 lesenswert
nicht lesenswert
Das geht dann mit dem nIRQ Pin: Dieser geht auf Low, sobald sich 
irgendwas im RFM12 tut. Wenn man mehrere Interruptquellen hat, dann muss 
man erst den Status auslesen um festzustellen was den Interrupt 
ausgelöst hat.

Autor: Michael K^3 (manhunt)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok, aber wofür ist dann der nINT?

Damit sich der nIRQ Rührt muss ich also nix tun/einstellen.

Also ich geh dann mal Testen.

Danke für die Hilfe.

Michael

Autor: Manuel Stahl (thymythos) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Ok, aber wofür ist dann der nINT?

Steht auch im Datenblatt. Der nINT ist ein Eingang und kann über das 
Statusregister des RFM12 abgefragt werden.

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

Bewertung
0 lesenswert
nicht lesenswert
Michael Graßl wrote:
> Ok, aber wofür ist dann der nINT?

Das ist ein Interrupt Eingang, den braucht man eigentlich nicht.

Autor: Christoph Kessler (db1uq) (christoph_kessler)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kann man den Frequenzhub verringern, indem man den Quarz wechselt?
Ich habe mal ausgerechnet, dass ein Quarz von etwa 4,75MHz bei 
Einstellung auf das 915 MHz-Band Sendefrequnezen zwischen 427 und 441 
MHz erlauben würde. Allerdings steht im Datenblatt was von min. 8 MHz.
Damit würde sich der große Frequenzhub von mind. 30 kHz auf weniger als 
die Hälfte verringern, was eher amateurfunküblichen Bandbreiten 
entspricht. Mit einem 5 MHz Quarz ginge immerhin 430,24 - 439,76 also 
fats das ganze Amateurband, bei 15 kHz Hub

Autor: Robert Knipp (mr_insanity)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hat denn keiner eine Idee zu meinem Problem?

Autor: Mike K. (1tester)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Ich habe ein Problem bei der Initialisierung meiner Module. Und zwar 
habe habe ich 2 rfm12 module aufgebaut eines auf einem Pollinboard und 
eines auf einer eigen Kontstruktion.

Nun je nach Gemütszustand  der Module initialisieren sie oder nicht.

Wenn ich mir das ganze am Oszi anschaue Sehe ich je nachdem eine 
Frequenz mit einer länge vom 1000ns bzw 10mhz (das sollte wohl so sein) 
oder eben nur irgend ne Schwingung mit 100ns länge. (Siehe Bild)

Frage ist das normal wenn die Module nicht initialisieren bzw ist diese 
Frequenz normal?

Achja übertragen habe ich bis jetzt auch noch nichts erfolgreich. Dazu 
hätte ich jedoch eine Frage wenn ich 15 mal ein 'T' übertrage und zum 
schluß ein \n aber nur ein T einlese bleibt der Rest im rfm12 bzw wie 
groß ist der Buffer im rfm12?

lg Michael

Autor: Vajk .v.i. (vajk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Nun je nach Gemütszustand  der Module initialisieren sie oder nicht.

zu meinem Frust, habe ich das auch so erlebt ... bis ich in einer
der letzten elrads gelesen habe, daß die keinen langsamen Stromanstieg
a la Netzteil mögen .. sprich man sollte sie mit einem Transistor als 
Schalter via uC "an" machen ... sprich der Powerup-Reset braucht eine 
steile Flanke.

Viel Erfolg
Vajk

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

Bewertung
0 lesenswert
nicht lesenswert
Vajk .v.i. wrote:

> bis ich in einer der letzten elrads gelesen habe,

http://de.wikipedia.org/wiki/Elrad
Solange gibts die RFM12 doch noch garnicht.


> daß die keinen langsamen Stromanstieg
> a la Netzteil mögen .. sprich man sollte sie mit einem Transistor als
> Schalter via uC "an" machen ... sprich der Powerup-Reset braucht eine
> steile Flanke.

Habe ich bisher noch nie drauf geachtet und hatte noch nie Probleme 
damit.
Wartest du vielleicht nach dem Einschalten vielleicht nicht ausreichend 
lange bis das Modul bereit ist?

Autor: Mike K. (1tester)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo


Ich habe gerade festgestellt das die module auch dann einen 10mhz takt 
ausgeben wenn ich Sie mitten im Programm per nRes auf low ziehe, dann 
ist für die Dauer von low keine Frequenz mehr da aber dann kommt Sie 
wieder.

Frage ist eine Frequenz von 10mhz kein Anzeichen für eine geglückte 
Initialisierung?

PS: Meine erste überlegung war nicht das Schalten per Transistor sondern 
das Reseten per µC. Einfach als Ausgang definieren und dann bei Zeiten 
von High auf low switchen....

lg michael

Autor: Mike K. (1tester)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
edit: Gut Beitrag bearbeiten geht anscheinend nach X min nicht mehr.

So, ich habe Folgendes heraus gefunden das rfm12 modul gibt 
standardmäßig 10mhz aus, nur nach meiner Initialisierung wird es so ein 
müll....ich geh mal alle Pins nachmessen...

lg Michael

Autor: Mike K. (1tester)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Ich komme einfach nicht weiter, frage könnte mal jemand von euch einen 
Foto machen was bei euch am CLK rauskommt bei erfolgreicher 
Initialisierung?

edit: Ich weiß es hört sich Blöd an, Foto -> Screenshot vom Oszi.*nicht 
das mir einer den Pin Fotografiert.... ;-)

Lg, Michael

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

Bewertung
0 lesenswert
nicht lesenswert
Mike K. wrote:
> könnte mal jemand von euch einen
> Foto machen was bei euch am CLK rauskommt bei erfolgreicher
> Initialisierung?

Für was brauchst du ein Foto? Selbst ohne Bild solltest du doch 10MHz 
von 1MHz auf dem Oszi unterscheiden können...

Dein Bild sieht gut aus:
http://www.mikrocontroller.net/attachment/46526/init.jpg
Das 1MHz Signal ist ein recht sauberes Rechteck, das 10MHz Signal ist 
mehr oder weniger (je nach kapazitiver Last) verrundet. Ähnlich sieht es 
bei mir auch aus.

Nach dem Einschalten:
1MHz -> gut
Nach dem Senden des Befehls der auf 10MHz umschaltet (also nach der 
rf12_init():
10MHz -> gut
1MHz -> schlecht

Wenn die 10MHz rauskommen, dann ist zumindest die SPI Verbindung zum 
RFM12 in Ordnung.

Autor: Mike K. (1tester)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo


Danke sehr ich wollte nur die Bestätigung das die runde Frequenz passt.


Lg, Mike

Autor: Florian Rist (Firma: TU Wien) (frist)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich werde jetzt auch mal ein paar Experimente mit den Modulen starten 
und natürlich würde ich gern auf den hier geposteten Code zurückgreifen. 
Mit welchen AVRs verträgt sich der den reibungslos oder zumindest mit 
wenig Anpassungen? Ich fürchte ich brauch etwas mehr Speicher als die 2k 
des ATTiny2313. Es soll aber ein Tiny werden, das es um eine 
betteriebetreibene Fernsteuerung geht. Ein paar ATTyiny45 hätte ich da, 
aber der hat zu wenig IOs.

Ich frag nur, weil ich mir nämlich neulich selber mal ein Bein gestellt 
haben, mit dem Beschluss ein Projekt von einem ATMega32 auf ATMega644 
portiert, was überraschend viel Arbeit war.

Grüße
Flo

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

Bewertung
0 lesenswert
nicht lesenswert
Florian Rist wrote:

> Mit welchen AVRs verträgt sich der den reibungslos oder zumindest mit
> wenig Anpassungen?

Der Code mit Software SPI ist auf einem tiny2313 und die Versionen mit 
Hardware SPI auf einem mega8 entwickelt.
Von der Größe her sollte ein tiny2313 aber für alles reichen, auch von 
der Geschwindigkeit her.
Nur wenn man die Sendedaten (z.B. aus einem UART Datenstrom) puffern 
muss, dann sind die 128Byte SRAM schnell verbraucht.

Autor: Florian Rist (Firma: TU Wien) (frist)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Benedikt

> Der Code mit Software SPI ist auf einem tiny2313 und die Versionen mit
> Hardware SPI auf einem mega8 entwickelt.

OK. Danke.

> Von der Größe her sollte ein tiny2313 aber für alles reichen, auch von
> der Geschwindigkeit her.

Braucht das Funkmodul eigentlich auf der Sendeseite eine bestimmte 
mindest Geschwindigkeit, oder könnte ich da mit der Taktfrequenz quasi 
beliebig weit nach unten gehen?

> Nur wenn man die Sendedaten (z.B. aus einem UART Datenstrom) puffern
> muss, dann sind die 128Byte SRAM schnell verbraucht.

Das muss ich nicht, also sind die 128 Byte wohl auch kein Problem

Grüße
Flo

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

Bewertung
0 lesenswert
nicht lesenswert
Florian Rist wrote:

> Braucht das Funkmodul eigentlich auf der Sendeseite eine bestimmte
> mindest Geschwindigkeit, oder könnte ich da mit der Taktfrequenz quasi
> beliebig weit nach unten gehen?

Was meinst du mit Taktfrequenz? Der 10MHz Takt wird von dem Modul 
selbst. Die Baudrate kann man an sich beliebig wählen, wenn man das FIFO 
verwendet gibt es ein paar Grenzen aufgrund des begrenzten Teilerfaktor. 
Wenn man das FIFO nicht verwendet, kann man die Baudrate an sich 
beliebig lang machen (auch wenn dies wenig Sinn hat).

Autor: R. Max (rmax)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Benedikt K. wrote:

> Was meinst du mit Taktfrequenz?

Ich denke, er meint den SPI-Takt.

Autor: Florian Rist (Firma: TU Wien) (frist)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

> Ich denke, er meint den SPI-Takt.

Genau. Und damit indirekt auch den Takt des µCs. Ich dachte mir ich 
versuche es mit weniger als den üblichen 10 MHz, um Strom zu sparen. 
Allerdings ist es wohl auch kein Problem mit 10 MHz zu leben der µC wird 
je eh die meiste Zeit in Tiefschlaf verbringen und so praktisch keinen 
Strom verbrauchen.

Grüße
Flo

Autor: Manuel Stahl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der einzig limitierende Faktor ist die Geschwindigkeit mit der du Daten 
rein fütterst. Das muss schnell genug gehen damit der Sendefifo nicht 
leer läuft.

Autor: Mike K. (1tester)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
AHM....japadabadu....es lebt/sendet/empfängt.

Danke für die Hilfe und für den Code Benedikt.

edit: ahm wie ich den Fehler gefunden habe?

Nun ich habe alle Kabel nochmal nachgesteckt, dann haben beide Module 
initialisiert, dann habe ich beide Module etwas senden lassen, eines der 
beiden Module ist beim senden in ne Endlosschleife gekommen (aktiviertes 
led ging nicht aus), das war für mich defekt, nach einem Wechsel gings 
dann fast auf Anhieb da es noch Probleme mit der Stromversorgung 
gab....

lg mike

Autor: Mike K. (1tester)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo


ich habe eine Frage wie wirkt es sich aus wenn ich CS dauerhaft auf 
Masse ziehe, da es ja eigentlich mein eingziger spi slave ist?

Bzw würde das Probleme beim Programmieren des AVR uCs per SPI bringen?

lg Mike

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

Bewertung
0 lesenswert
nicht lesenswert
Mike K. wrote:
> ich habe eine Frage wie wirkt es sich aus wenn ich CS dauerhaft auf
> Masse ziehe, da es ja eigentlich mein eingziger spi slave ist?

Ich habe es noch nicht ausprobiert, aber vermutlich ja, da der RF12 
daran das Ende/den Anfang eines Befehls erkennt.

> Bzw würde das Probleme beim Programmieren des AVR uCs per SPI bringen?

Definitiv ja, denn dann ist SDO dauerhaft aktiv. Selbst mit am µC 
angeschlossenem CS gibt es oft Probleme wenn kein Pullup an CS ist. 
Ansonsten floated der beim Programmieren und ist dann eventuell auf Low.

Autor: Mike K. (1tester)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die Hilfe zu später Stunde.

lg mike

Autor: Jörn A. (joern_)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hy

ich konnte bis jetzt im Forum leider kein Hilfe dazu finden.

Ich kommuniziere zur Zeit zwischen zwei/drei RFM12.

Ich habe eine Basisstation, die mehrere Außenstationen abfragt. Dazu 
wird jeweils eine ID versendet und wenn die Außenstation die hat 
antwortet sie. So wollte ich doppeltes senden verhindern.

loop
[
send( ID0)
recieve()
send( ID1)
recieve()
send( ID2)
recieve()

]

Das ganze funktionert perfekt aber ich wollte mal testen was passiert, 
wenn der z.B. ID1
z.B. durch Störungen nicht antwortet. habe ihn daher für 10 Sekunden
ausgeschaltet.... das Programm sollte die dann überspringen und noch die 
anderen Stationen abfragen können.

Leider sendet meine Basisstation nicht mehr raus, nachdem er einmal 
keine Antwort vom einer Außenstation bekommen hat! Die Außenstation 
funktioniert wunderbar aber die Basisstation erst wieder nach einem 
Reset(komplett Strom an/aus).

Damit er nicht in der Recieve Schleife hängen bleibt ( falls nur ein 
Slave nicht geht) und ewig wartet habe ich den Timer zugeschaltet.
Dieser wird vor jeder Empfangsfunktion immer Timer =0 gesetzt. Der Timer 
zählt
per ISR hoch und nach 5 Sekunden, wenn nichts kommt, bricht er mit break 
ab siehe Code....

Mit dem Timer läuft es auch wunderbar weiter in einer Schleife aber er 
sendet einfach
nicht mehr, sobald einmal keine Antwort kam. Das ist dann leider das
Ende der Kommunikation da ohne Befehl keine Antwort mehr vom allen 
Außenstationen kommt :D

das habe ich hinzugefügt:


void rf12_ready(void)
{
cbi(RF_PORT, CS);
  while (!(RF_PIN&(1<<SDO))) // wait until FIFO ready
  {
    if (Timer > 10)
    {
    error=1;
    break;
    }
  }
}

auch der Versuch vor jedem senden eine neue INIT durchzuführen hat nicht 
geholfen. bleibt der RFM12 irgendwie hängen?

Autor: Mike K. (1tester)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Ich habe jetzt das DB des rf12 3 mal durchkämmt aber finde die max SPI 
frequenz nicht...

Könntet ihr mir da kurz helfen, ich vermute derzeit 10mhz/4 gehe ich da 
richtig?

lg mike

Autor: Manuel Stahl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das kommt ganz gut hin. 4 MHz könnten gerade noch gehen.

Autor: Mike K. (1tester)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

ähm 10/4 = 2,5mhz....

Der rf12 läuft ja mit 10mhz und bei 4mhz wäre der Teilungsfaktor ja 2.5 
wovon ich aber noch nichts gehört habe oder ist das beim rf12 anders als 
bei atmel pic und co?

lg mike

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

Bewertung
0 lesenswert
nicht lesenswert
Es gibt 2 Grenzwerte:
Einmal die normalen Register, für die nur die man nur das Timing aus dem 
Datenblatt einhalten muss, und dann noch das Auslesen/Beschreiben des 
FIFOs das auf 10MHz/4 begrenzt ist. Das ist eine gemeine Falle.

Autor: Mike K. (1tester)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Danke für die Hilfe, frage weißt du zufällig wo ich die Timing zeiten 
der Register finde. Bzw kannst du mir sagen ob es viele Probleme gibt 
wenn ich an die grenze von 2.5mhz gehe weil du hast da sicher schon mehr 
Erfahrung.


Edit: noch etwas im DB meines Atm168 habe ich das CPHA bit entdeckt für 
SPI, nun bei folgendem Absatz steige ich aus, frage was macht der sp12 
schickt er die Daten schon bei der steigenden oder erst bei der 
fallenden Flanke?

Bit 2 – CPHA: Clock Phase
The settings of the Clock Phase bit (CPHA) determine if data is sampled 
on the leading (first) or
trailing (last) edge of SCK. Refer to Figure 18-3 and Figure 18-4 for an 
example. The CPOL
functionality is summarized below:


lg tester

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

Bewertung
0 lesenswert
nicht lesenswert
Mike K. wrote:
> Danke für die Hilfe, frage weißt du zufällig wo ich die Timing zeiten
> der Register finde.

RF12 Datenblatt Seite 13.

> Bzw kannst du mir sagen ob es viele Probleme gibt
> wenn ich an die grenze von 2.5mhz gehe weil du hast da sicher schon mehr
> Erfahrung.

Wenn die 2,5MHz wirklich kleiner/gleich als die 10MHz/4 sind, gibt es 
keine Probleme (das ist zum Beispiel der Fall, wenn man den RFM12 Takt 
als AVR Takt verwendet). 8MHz/4 (interner 8MHz Oszillator) habe ich auch 
schon probiert, das geht auch ohne Probleme.

> Edit: noch etwas im DB meines Atm168 habe ich das CPHA bit entdeckt für
> SPI, nun bei folgendem Absatz steige ich aus, frage was macht der sp12
> schickt er die Daten schon bei der steigenden oder erst bei der
> fallenden Flanke?

Der RF12 schickt die Daten bei der fallenden Flanke raus, und liest bei 
der steigenden Flanke ein. Somit kommen nur die SPI Modi 0 und 2 in 
Frage.
Da laut dem Timingdiagramm auf Seite 13 CLK zu Beginn und am Ende Low 
ist, muss CPOL 0 sein. Somit bleibt nur SPI Mode 0 übrig.

Autor: Mike K. (1tester)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo


Danke für die Hilfe, eine Frage hätte ich noch, der rf12 idelt bei SCK 
High oder?

PS: die Skizze auf seite 13 verstehe ich zwar nicht ganz aber der clock 
da ist mit 2mhz eingezeichnet.... deshalb und auf grund deines Beitrags 
nehme ich das mal als Grenzwert....


lg tester

Autor: Werner B. (werner-b)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Jörn Ahrens,

solltest du im Fehlerfall nicht CS wieder wegnehmen?
void rf12_ready(void)
{
  RF_PORT &= ~(1<<CS);
  while (!(RF_PIN&(1<<SDO))) // wait until FIFO ready
  {
    if (Timer > 10)
    {
       RF_PORT |= (1<<CS);
       error = 1;
       break;
    }
  }
}

Autor: Jörn A. (joern_)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guten Morgen

ich hatte das Problem zusammen mit der schnellen Hilfe von Benedikt 
lösen können.
Ich nutze einen Timer um ein ewiges warten ohne Antwort zu vermeiden. 
Funktioniert mitlerweile auch wunderbar aber hatte leider Timer = 0 an 
der falschen Stelle im Code in der TX Funktion... dadurch hat er nach 
einmal Abbruch in der RX nicht mehr gesendet...

in der

void rf12_txdata(unsigned char *data, unsigned char number)
{ unsigned char i;
Timer=0;                                        // hier Soll es hin = funktioniert
rf12_trans(0x8238); // TX on
rf12_ready();
rf12_trans(0xB8AA);
rf12_ready();
rf12_trans(0xB8AA);
rf12_ready();
rf12_trans(0xB8AA);
rf12_ready();
rf12_trans(0xB82D);
rf12_ready();
rf12_trans(0xB8D4);
Timer=0;                                        // hier war es zuerst = Fehler
for (i=0; i<number; i++)
{ rf12_ready();
rf12_trans(0xB800|(*data++));
}
rf12_ready();
rf12_trans(0x8208); // TX off
}

void rf12_rxdata(unsigned char *data, unsigned char number)
{ unsigned char i;
rf12_trans(0x82C8); // RX on
rf12_trans(0xCA81); // set FIFO mode
rf12_trans(0xCA83); // enable FIFO
Timer=0;
for (i=0; i<number; i++)
{ rf12_ready();
*data++=rf12_trans(0xB000);
}
rf12_trans(0x8208); // RX off
}

Autor: Stefan F. (feissy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo,
ich habe mir letzte woche auch die beiden Funkmoduloe von pollin gekauft 
RFM01 und RFM02 und jetzt möchte ich das so haben, dass ich an den 
atmega8 vom sendemodul einfach 8 taster an die pins pd0 bis pd7 hänge 
und dann damit 8 ausgänge auch pd0 bis pd7 am anderen atmega8 des 
empfangmoduls steuern kann.

ist das mit deinem programm ( von benedikt ) so ohne weiters möglich?

schon mal danke für eure hilfe

Stefan

Autor: Gerrit G. (liggi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
du kannst die zustände der Ports in einem Char speichern und den dann 
sende. Der andere Atmega setzt die Port dann entsprchend des Chars. Man 
müsste sich nur noch eine Fehlerüberprüfung überlegen.

mfg Gerrit

Autor: Stefan F. (feissy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
was bedeutet das denn

Man müsste sich nur noch eine Fehlerüberprüfung überlegen.

????? ich hab nämlich nich sooo viel die anhung davon ;-)
mfg

Autor: Gerrit G. (liggi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
soweit wie ich weiß, ist in dem Programm keine Fehlerüberprüfung, wie 
zum
Beispiel eine Hash. Bei so wenigen Daten, könnte man sie auch einfach 
mehrmals senden. Desweitern könnte man auch noch ein Byte dranhängen, 
das dafür sorgt, dass die Summe der gesetzten Bits z.B. gerade ist.
Hier sind noch ein paar andere Beispiel und Anregungen:
http://de.wikipedia.org/wiki/Pr%C3%BCfsumme

Autor: Benedikt K. (benedikt) (Moderator)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Wenn es auch RFM12 sein dürfen, dann hätte ich hier noch etwas:

Diese Software überträgt beliebige Datenpakete in beide Richtungen, 
inkl. Fehlerprüfung und Empfangsbestätigung. Es wird auch automatisch 
eine bestimmte Anzahl an erneuten Sendeversuchen unternommen, falls es 
das erste mal nicht klappt. Der Erfolg der Übertragung wird von der 
Funktion zurückgeliefert.
Das ganze ist eine Verallgemeinerung der RS232 Funkbrücke. Da ich das 
ganze allgemein halten wollte, verwende ich außer einem Timer Interrupt 
für die Timeouts keine weiteren Interrupts. Daher muss man regelmäßig 
die Empfangsroutine aufrufen.

Autor: feissy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also wenn ich mir quasi 2 rfm12 funkmodule besorge und dann dein 
beispiel c-code auf die atmega8 aufspiele, kann ich so die ports pd0 bis 
pd7 auf den jeweils anderen atmega 8 ausgeben???
mfg

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

Bewertung
0 lesenswert
nicht lesenswert
Ja, so in etwa.
Du musst dann halt anstelle der uart_getchar() Funktion den Port 
einlesen und anstelle der uart_putc() den Port beschreiben.
Um so wenig wie möglich zu senden wäre es z.B. gut wenn man nur nach 
Änderungen an den Eingängen einen neuen Wert sendet, also so in etwa:
unsigned char lastpins=0;
for (;;)
{  unsigned char pins;
   check_rx_packet();
   pins=PIND;
   if (pins!=lastpins)
   {  tx_data(&pins,1));
      lastpins=pins;
   }
}

Autor: feissy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also heißt das so

#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <avr/eeprom.h>
#include <stdlib.h>
#include <portbits.h>
#include "global.h"
#include "uart.h"
#include "rf12.h"
#define F_CPU 10000000UL
#include <util/delay.h>

#define RF_BAUDRATE    15000    // Baudrate des RFM12

unsigned char lastpins=0;
for (;;)
{  unsigned char pins;
   check_rx_packet();
   pins=PIND;
   if (pins!=lastpins)
   {  tx_data(&pins,1));
      lastpins=pins;
   }
}


und wenn ich das dann auf beiden atmegas aufspiele müsste das 
funktionieren???
sorry wenn ich nerve aber ich hab da nicht so wirklich die ahnung von 
;-)
mfg schönen abend noch

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

Bewertung
0 lesenswert
nicht lesenswert
Nein, nicht ganz.
Die Initialisierung brauchst du schon noch.
Weiterhin müssen beim Empfänger die Daten auch noch wieder an die Pins 
ausgegeben werden.

Autor: feissy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also so :

#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <avr/eeprom.h>
#include <stdlib.h>
#include <portbits.h>
#include "global.h"
#include "uart.h"
#include "rf12.h"
#define F_CPU 10000000UL
#include <util/delay.h>

#define RF_BAUDRATE    15000    // Baudrate des RFM12

unsigned char data[128];
unsigned char tdiv=30;
unsigned char lastpins=0;


int main(void)
{  PORTB=1;
  PORTD=31;
  DDRC=63;
  DDRD=238;

  sei();

  rf12_init();                      // RF12 + IO Ports initialisieren
    uart_init(UART_BAUD_SELECT(19200, F_CPU));
  rf12_config(RF_BAUDRATE, RF12FREQ(433.92), 0, QUIET);  // Baudrate, Frequenz, Leistung (0=max, 7=min), Umgebungsbedingungen (QUIET, NORMAL, NOISY)
  rf12_rxmode();                      // Empfang starten

  for (;;)

{  unsigned char pins;
   check_rx_packet();
   pins=PIND;
   if (pins!=lastpins)
   {  tx_data(&pins,1));
      lastpins=pins;
   
       }

    }
  }
}


für das sdendemodul???
mfg

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

Bewertung
0 lesenswert
nicht lesenswert
Jetzt noch PortD auf Eingang und die uart_init entfernen (da hier kein 
UART gebraucht wird) und das ganze sollte funktionieren.

Autor: Schorsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Salú!

Kann mir mal eben einer sagen, ob die reine Datenübertragung bei im mit 
dem Code vom Benedikt funktioniert? Ich meine damit alle Daten, >= 0x80. 
Bei mir funktioniert die Sache nämlich nur, solange ich mich auf die 
Übertragung vom kleinen ASCII-Zeichnsatz beschränke (also bis Dezimal 
126) beschränke. Das sehr zuverlässig. Alles drüber, bringt Mist.

Danke und Gruß

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

Bewertung
0 lesenswert
nicht lesenswert
Es sollte eigentlich funktionieren.
Verwendest du zufällig die Software von ganz oben? Die hat nämlich ein 
paar kleinere Bugs die u.a. sowas bewirken können.
Die neueren Versionen funktionieren aber definitiv mit allen Werten. Man 
muss nämlich u.a. bei den Werten 0x00 und 0xFF dafür sorgen, dass nie 2 
oder mehr solcher Werte aufeinander folgen.

Autor: Schorsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wieso soll man dafür sorgen müssen?. Die Übertragung von zweimal 0x00 
hintereinander funktioniert bei mir ganz wunderbar. Ist auch laut 
Datenblatt kein Problem.

Welche Software soll ich stattdessen verwenden?

Autor: Schorsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Benedikt,

ich habs gerade nochmal getestet - zweimal 0x00 hintereinander gibt 
keine Probleme. Erste wenn ich 0x80 oder etwas darüber sende gibts Zoff.

Ich verwendet Deinen Code, hab ich aber auf HW-SPI umgebaut, weil ich 
kein Freund von wechselndem Timing im Clock bin. Fahr auch gut so.

Bis auf die "Kleinigkeit" eben...

Gruß
Schorsch

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

Bewertung
0 lesenswert
nicht lesenswert
Schorsch wrote:
> Wieso soll man dafür sorgen müssen?.

Ganz einfach:
Der RF12 synchronisiert anhand der Flanken vom Signal seine Baudrate. 
Wenn lange Zeit keine Flanken vorhanden sind (also bei 0 und bei 255), 
kann es sein, dass die Baudrate wegdriftet und ein Bit übersprungen oder 
doppelt eingelesen wird.
Da 0 ein Wert ist, der bei der Messwertübertragung durchaus häufiger 
vorkommt als andere Werte, ist dies schnell passiert.

Das das Problem exakt ab 0x80 auftritt klingt stark nach einem Fehler im 
Code. Zeig mal die komplette Software.

Autor: Ulrich M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich teste gerade mit einem Evaluations-Board V1.2 von Pollin die 
Funkmodule RFM12. Das System läuft aber nur sporadisch.
Es kommt häufig vor, dass das RGIT-Bit nach einem transmitter register 
write command nicht gesetzt ist.
Es wird die Funktion rf12_ready benutzt, das Programm hängt dann in dem 
while.

Mit dem Command status read kann man sehen, dass nach dem power on nur 
das POR-Bit gesetzt ist und kein anderes Bit im Status-Word.

Die sonstige Kommunikation zu dem RFM12 scheint ok, ich habe das mit dem
Befehl „low battery and microcontroller clock divider command“ getestet. 
Es ist immer möglich den clock output einzustellen und dies mit einem 
Scope zu prüfen.

Vielleicht kann mir jemand helfen wo ich das Problem suchen kann.

Autor: Joern_A (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
aso also wenn ich als erstes eine Null übertrage kann es sein, das es 
nicht registriert wird?

Autor: Mike K. (1tester)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

leider bin erst dieser Tage dazu gekommen mich mit Hardware SPI zu 
beschäftigen.

Nun habe ich Prompt das erste Problem ich bin zu schnell aber nochmal 
von vorne:

Der hardware SPI Takt is 1MHZ (8mhz clock und SPI2X und SPR0 sind 
gesetzt)

Nun wenn ich einen Befehl einzeln Absetze zb den für 10mhz clock 
funktioniert alles nur wenn ich mehrere Parameter hintereinander Abgebe 
scheint es als würde er diese nicht erkennen.


zum versenden der einzelnen Daten habe ich die Funktion

unsigned char spi_transresive(unsigned char data) {


  unsigned char resive=0;
  SPCR &= ~(1<<SPIE);

  SPDR = data;
    while(!(SPSR & (1<<SPIF)))
      ;
  resive = SPDR;
    SPCR |= (1<<SPIE);
    return resive;

  }

Diese Funktion rufe ich 2mal auf beginnent mit dem High teil...

Nun habe ich die funktion um einen teil erweitert und zwar wurde die 
while bedingung erweitert um: && !(SPI_PIN&(1<<SPI_MISO))
Nun hat es aber anstandslos Funktioniert.

Mein Problem ist nun das diese Arbeit später von einem Interrupt 
übernommen werden soll weshalb ich diese erweiterung nicht brauchen kann 
irgend und nur SPIF reichen sollte.

Hat irgenjemand eine Idee was bei mir flash ist. (wie gesagt prinzipiell 
funktionierts)

PS: Ich habe auch schon 1ms warten zwischen den Paramtern Probiert geht 
auch wunderbar....


lg mike

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe Benedikts Schaltung und Code übernommen, aber bekomme keine 
fehlerfreie Komunikation zwischen meinem RFM12 (als Sender) und RFM01 
hin. Sender und empfänger bekommen die richtige Initalisierung. Sobald 
der Sender angeschlossen ist, kommen Daten beim Empfänger an, aber diese 
sind leider nicht die gesendeten, sonder zufällig auftretende Bits. 
Vielleicht ist es ein Timingproblem oder einer der Chips ist einfach 
kaputt. Ich habe leider nicht soviel Erfahrung und weiß nicht, wo ich 
weiter nach einem Fehler suchen kann?

Danke und frohe Ostern
Sebastian

Autor: Karl-heinz H. (kalliheinzi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Benedikt...

Erstmal herzlichen Dank für dein tolles Programm..
es läuft sehr zuverlässig.
Ich meine dieses : rfm12_just_rxtx.zip

Ich benutze allerdings die RFM12B-Dip Module mit 868 Mhz und 3,3Volt.
Die Module habe ich erstmal zur Probe mit Widerständen (1,8 und 3,3KOhm)
auf 5Volt angepasst.Klappt auch sehr gut.

Als IDE benutze ich AvrStudio und habe dein Programm hier entsprechend
angepasst.Dabei ist mir folgendes aufgefallen :

extern void rx_packet(void);

...hast du wohl im Eifer des Gefechts vergessen im rf12-header
einzutragen- AvrStudio hat gemeckert.

rf12_trans(0x80D7);// Enable FIFO

müsste aber heissen :

rf12_trans(0x80D7);//433 MHz EL,EF,11.5pF

Ist mir aber nur aufgefallen, weil ich die 868-Module habe und Diese
zu Anfang nur in unmittelbarer Nähe funktioniert hatten.
Habe ich übersehen, weil da " Enable FIFO " stand. :)
Man überliest es leicht.

für 868Mhz : rf12_trans(0x80E7);//868 MHz EL,EF,11.5pF

soweit - sogut - es klappt ja alles...

was ich aber nicht verstehe und im mom noch nicht nachvollziehen
kann - ist :

Warum brauchen die Module ca.30 sec. um sich zu synchronisieren ???

danach läuft die Übertragung perfekt - sogar aus meinem Garten.

Vorher habe ich mit dem Pollin-programm gespielt und es auch
zum Laufen bekommen. Hier finden sich die Module sofort.
Aber es arbeitet halt mit INT0.

Sag' jetzt bitte nicht - dann nimm das doch. :)

Da du wesentlich mehr Erfahrung mit den Dingern hast- als ich, würde ich
gerne wissen, warum das so ist ???

Mein Ziel ist eine Fernbedienung für eine selbstgebaute 5zu1-Anlage.
Deswegen muss der avr im Sender auch schlafen gelegt werden können,
um Batteriegerecht zu werden.

lg
kalliheinzi

Autor: Manuel Stahl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Nun wenn ich einen Befehl einzeln Absetze zb den für 10mhz clock
> funktioniert alles nur wenn ich mehrere Parameter hintereinander Abgebe
> scheint es als würde er diese nicht erkennen.

Zwischen den Einzelbefehlen muss das Chip-Enable deaktiviert und wieder 
aktiviert werden. Wenn du länger wartest, tritt halt ein Timeout auf und 
deswegen geht's auch.

Autor: Christian Lutze (quadratqualle)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

weiß jemand was die aktuelle funktionierende Version für den rm12 und 
rm01 ist?

mfg quadratqualle

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

Bewertung
0 lesenswert
nicht lesenswert
Von mir gibt es eigentlich nur recht wenige Versionen. Hier die beiden 
die ich empfehlen kann:

Eine einfache Testversion mit Software SPI, ideal für die ersten 
Versuche mit dem RFM12:
Beitrag "Re: Beispielprogramm für RFM12 433MHz Funk-Module"

Bidirektionale Übertragung inkl. Empfangsbestätigung (nicht unbedingt 
gut zum Verstehen geeignet, eher zum Anwenden):
Beitrag "Re: Beispielprogramm für RFM12 433MHz Funk-Module"

RFM01 und RFM02 verwende ich nicht mehr, daher gibt es davon nur je eine 
Version die nicht perfekt ist, aber funktionieren sollte.

Autor: Mike K. (1tester)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo


Frage kann ich dem RFM12 nachdem ich meine Daten erhalten habe sagen 
Danke das wars jetzt such wieder nach start Bytes?

Weil bis jetzt habe ich immer das Senden aktiviert und dann wieder auf 
empfangen umgeschalten...

Lg mike

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

Bewertung
0 lesenswert
nicht lesenswert
Mike K. schrieb:

> Frage kann ich dem RFM12 nachdem ich meine Daten erhalten habe sagen
> Danke das wars jetzt such wieder nach start Bytes?

Ja. Anders gehts auch garnicht, denn der RF12 weiß nicht wann die Daten 
zuende sind, er empfängt einfach immer weiter.

Zum Neustarten des Empfangs reicht es das FIFO abzuschalten und wieder 
anzuschalten (0xCA81 + 0xCA83).

Autor: Mike K. (1tester)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke sehr.

Eine Frage hätte ich noch, Solange FFIT auf High ist kann ich noch 
mindestens ein Byte einlesen oder?

LG mike

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

Bewertung
0 lesenswert
nicht lesenswert
Ja.

Autor: Mike K. (1tester)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eine Frage habe ich noch wie groß ist der FiFo maximal?

Ist es der Fifo IT Level Max von 15Bits also fast 2 Byte? Was passiert 
wenn ich nicht schnell genug bin die Daten Abzuholen?

lg Inf

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

Bewertung
0 lesenswert
nicht lesenswert
Es sind genau 2 Bytes. Wenn das FIFO voll ist, gehen Daten verloren.

Autor: Mike K. (1tester)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe ein Problem mit Hardware SPI,

Also das Original Programm von Benedikt funktioniert ohne Probleme mit 
meinem uC board. Nun habe ich das ganze mal auf hardware SPI umgebaut.

F= F_CPU/16 => 20mhz/16

So das initalisieren des Modules funktioniert, das schließe ich aus den 
10mhz clock output.

Beim senden polle ich SPIF...danach ist für mich die Übertragung 
erledigt
Nun sende ich folgende Bytes an das Modul:

0x8238
0xB8AA
0xB8AA
0xB82D
0xB8D4

10 mal 0xB8AA

0x8208

Dann beginnt Das spiel wieder von vorne mit 0x8238 aber spätestens nach 
dem 3mal bleibt es bei selbigem 0x8238 stehen weil das SPIF flag nicht 
fällt. Nun scheint es so als würde das Modul hängen.

Nur selbst in den erfolgreichen Durchläuf werden keine Daten gesendet.

Hat dazu irgenjemand eine Idee?

Und was macht eigentlich rf12_ready den das habe ich irgendwie nirgendst 
verbaut...

edit: Achja ob ich 0xB8AA nun 10mal oder 1000mal als Daten verschicke 
ändert an der Situation nur wenig...

lg mike

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

Bewertung
0 lesenswert
nicht lesenswert
Mike K. schrieb:

> Und was macht eigentlich rf12_ready den das habe ich irgendwie nirgendst
> verbaut...

Es prüft ob Platz im Sendefifo ist. Ohne die Abfrage gehen alle Daten 
außer den ersten beiden verloren, da das FIFO überläuft.

Autor: Mike K. (1tester)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gut jetzt habe ich ein rf12 ready verbaut:

Vielen dank für die ständige Hilfe vorallem am Sonntag.

SPI_PORT &= ~(1<<SPI_SS);

while (!(SPI_PIN&(1<<SPI_MISO))); // wait until FIFO ready

Nun werden zumindest Daten versand leider bleibt er nochimmer nach dem 
3ten mal hängen.

Ganz so als sei das rfm12 modul abgeschmiert...

Des weitern habe ich herausgefunden das das RFM12 modul weiter Blockt 
den ich den uC kurz resete. Nur wenn ich etwas länger auf dem Reset 
bleibe funktioniert das Ganze wieder. Das RFM12 modul wird aber nicht 
zurück gesetzt...


Lg mike

Autor: Mike K. (1tester)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich glaube ich habe das Problem gefunden ich habe nach dem pollen des 
SPI Interrupt frag vergessen dieses zu löschen und schließend das zuvor 
gelöschte SPI ISR enable wieder gesetzt was zur Ausführung der SPI ISR 
führte in der ich zuvor nur schwachsinn hatte... oder wird das SPIF flag 
nach dem auslesen  von SPDR selbst ständig gelöscht?

Leider kommte ich es noch nicht testen.


Lg, mike

Autor: Christian Lutze (quadratqualle)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

ist es normal das der RFM12 beim empfangen bei rf12_ready in einer 
endlos schleife bleibt? Also wen nix von einem anderen gesendet 
wird?warte er dort so lange bis jemand etwas sendet? Die Verbindung 
dürfte gehen, da ich 10 Mhz am Clock Ausgang habe.

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

Bewertung
0 lesenswert
nicht lesenswert
Ja.
Wenn das nicht erwünscht ist, kann man erst prüfen ob Daten im FIFO 
sind, ehe man die Empfangsfunktion aufruft, so wie bei dieser Version: 
Beitrag "Re: Beispielprogramm für RFM12 433MHz Funk-Module"

Autor: Christian Lutze (quadratqualle)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich bekomm einfach kein verbindung zwischen dem rfm12 und rfm01 hin ich 
hab die codes von Benedikt genommen und die Verbidnungen stimmen auch. 
Ich bekomme bei beiden die 10Mhz Ausgang also müssten doch eigentlich 
alles richtig sein!?

Ich bin über jede Hilfe dankbar.

mfg Christian

Autor: Jan W. (jan_1)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Ich habe heute viele Stunden damit verbracht den ganzen Thread zu lesen, 
leider stehe ich nun vor einem noch größeren Problem.

Bei dem Projekt was ich gerade realisiere, handelt es sich um Folgendes:
Mit einer in ca. 2,5m Höhe angebrachten Kamera wird ein Roboter erkannt 
und dessen Position bestimmt. Anschließend soll der Roboter zu einem 
bestimmten Punkt fahren (später einem Ball nachfahren). Also der Roboter 
selbst empfängt nur Daten zur Motorsteuerung, hat also keine Sensoren 
oder ähnliches.

Nun, das Alles funktioniert soweit ganz gut, auch der Roboter ist schon 
gebaut; leider fehlt mir noch ein wichtiges Element...

...eine Kommunikation zwischen dem PC und dem Roboter, per Funk (433Mhz 
oder 868Mhz). Habe mir dazu das "AVR Evaluation Board" zum Senden der 
Befehle gekauft. Zum Empfangen der Daten am Roboter hab ich ein eigenes 
Board entwickelt. (beide mit einem RFM12 bestückt)

Nun mein Problem:
Ich habe schon relativ viel Erfahrung mit C++, Java und ähnlichen 
Programmiersprachen. Leider bin ich im Bereich von µC nicht so gut 
drauf.
Finde die Programme von Benedikt richtig gut (danke vielmals ;) ), doch 
leider blick ich nicht so wirklich durch.

Ich möchte mein AVR Board mit einer RS 232 Schnittstelle mit dem PC 
verbinden, dieser übergibt dann laufend neue Befehle, die an den Roboter 
gesendet werden sollen.

Doch mit welcher Funktion (UART?!) kann ich mit dem Programm von 
Benedikt diese neuen Befehle vom PC einlesen und anschließend immer 
wieder senden!?

Habe das Programm "RFM12_RX_TX.zip", helfen mir da Funktionen aus dem 
"uart.c" !?

Also schon mal danke, dass ihr meinen Beitrag durchgelesen habt und 
vielleicht will mir ja jemand mit einem kleinen Programm oder Funktionen 
welche ich dazu brauche, helfen ;-)

DANKE!!

Viele Grüße
Jan

Autor: muecke (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,
mit Hilfe des "rfm12_just_rxtx"-Codes von Benedikt (danke hierfür ;-) 
versuche ich eine Funk-Lichtschranke zu realisieren. Leider habe ich das 
Problem, dass sich der Empfänger aufhängt, sobald der Sender nicht 
erreichbar ist. Jörn Ahrens hat am 13.03.2009 das gleiche Problem, 
allerdings mit anderem Quellcode, lösen können. Leider stelle ich mich 
hier etwas blöde an und komme zu keiner Lösung.
Könnt ihr mir sagen, wie ich software-mäßig (z.B. wie Jörn mit einem 
Timer), einen nichtantwortenden Empfänger ignorieren kann? Ich kann mir 
den Fehler auch leider nicht wirklich erklären. Kommt es zu einem 
Buffer-Überlauf des FIFOs? Über eine kleine Hilfestellung wäre ich 
wirklich sehr dankbar!

Vielen Danke und ein schönes Pfingstwochenende!
Gruß,
Jens

PS: Am Quellcode von Benedikt habe ich nichts grundlegendes geändert -

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

Bewertung
0 lesenswert
nicht lesenswert
muecke schrieb:
> Leider habe ich das
> Problem, dass sich der Empfänger aufhängt, sobald der Sender nicht
> erreichbar ist. Jörn Ahrens hat am 13.03.2009 das gleiche Problem,
> allerdings mit anderem Quellcode, lösen können. Leider stelle ich mich
> hier etwas blöde an und komme zu keiner Lösung.

Mit der Version sollte sich das ganze eigentlich nicht aufhängen.
Hast du das
if rx_data_in_buffer())
im Code drin gelassen?

Damit sollte eigentlich nur dann die Empfangsfunktion aufgerufen werden, 
wenn auch wirklich Daten empfangen wurden.

Autor: muecke (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Benedikt,
schön, dass gerade du dich meldest. Die Funktion habe ich, ähnlich wie 
in deinem Beispiel, in einer for-Schleife untergebracht. Allerdings 
möchte ich mit dem Modul, bei dem der Fehler auftritt, nur senden. 
Konkret wird ein "S" gesendet und somit die Zeitmessung gestartet, 
sobald eine Lichtschranke unterbrochen wird. Normales Senden ist kein 
Problem, nur wenn ich den Empfänger ausschalte und in der Zwischenzeit 
wieder was gesendet wird, hängt sich der Sender auf und eine weitere 
Kommunikation mit wieder eingeschaltetem Empfänger, ist nicht mehr 
möglich. Die if rx_data_in_buffer()-Funktion wird bei mir zwar 
aufgerufen um mögliche Daten zu empfangen, allerings verwerfe ich die 
Daten. Trotzdem findet ja im Hintergrund eine Fehlererkennung statt, wo 
sich vermutlich bei mir der Fehler eingeschlichen hat. Du hast doch an 
dieser Stelle schon Jörn weitergeholfen - meinst du nicht, dass ich an 
der gleichen Stelle hänge?
Danke -

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

Bewertung
0 lesenswert
nicht lesenswert
muecke schrieb:
> Normales Senden ist kein
> Problem, nur wenn ich den Empfänger ausschalte und in der Zwischenzeit
> wieder was gesendet wird, hängt sich der Sender auf und eine weitere
> Kommunikation mit wieder eingeschaltetem Empfänger, ist nicht mehr
> möglich.

Was hängt sich nun auf? Der Sender (wie hier) oder der Empfänger (wie du 
im vorigen Post geschrieben hast)?

> Du hast doch an
> dieser Stelle schon Jörn weitergeholfen - meinst du nicht, dass ich an
> der gleichen Stelle hänge?

Nein, das war ein anderes Problem. Jörg hatte das Problem, dass er immer 
auf Daten gewartet hat, auch wenn garkeine ankahmen. Bei dieser Version 
wird durch das if  rx_data_in_buffer() umgangen, denn nur wenn Daten da 
sind, werden auch welche abgeholt.

Autor: muecke (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
OK - Ich versuche es mal ausführlicher zu beschreiben, meine Beiträge 
scheinen doch verwirrend zu sein - sorry. Vorab: Es ist der Sender, der 
hängen bleibt. Folgende Situation:
Der Sender sendet fortlaufend ein "S" an einen Empfänger. Dieser 
Empfänger gerät jetzt aus dem Empfangsbereich (oder wird ausgeschaltet). 
Der Sender merkt das nicht und sendet fleißig weiter. Kommt jetzt der 
Empfänger wieder in den Empfangsbereich (oder wird wieder angeschaltet), 
so kommt es zu keiner weiteren Kommunikation. Ich nehme an, dass der 
Sender auf eine Antwort wartet, die das korrekt empfangene "S" 
bestätigt?!? Ich muss zugeben, dass ich nicht alle Funktionen komplett 
verstanden habe.

Ein Versuch per Watchdog zu resetten klappt leider nicht. Der Watchdog 
wird zwar ausgelöst, doch leider lässt sich das RFM12-Modul nicht 
resetten bzw. erneut initialisieren. Ich habe deshalb angenommen, dass 
noch alte Daten im FIFO verweilen und nicht verarbeitet werden können.
Eine Quick-and-Dirty Lösung wäre vielleicht das resetten per Watchdog 
mit anschließender neu-Initialisierung des RFM12. Nur fehlt es mir 
leider an Hintergrundinfos, was ich zusätzlich zu der normalen 
Initialisierung hinzufügen muss.

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

Bewertung
0 lesenswert
nicht lesenswert
Hast du mal die Software unverändert ausprobiert und geschaut ob der 
Sender dann immer noch abstürzt? Die sollte 1x pro Sekunde einen Wert 
senden.
Dass das RFM12 sich irgendwo aufhängt und selbst ein Reset des AVRs 
nichts bringt klingt sehr merkwürdig, denn eigentlich macht die Software 
eine Init des RFM12 und beschreibt eigentlich alle Register nach dem 
Einschalten.

Autor: muecke (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Benedikt,
danke, dass du so schnell geantwortet hast. Bin leider gerade erst 
wieder zum Basteln gekommen. Ich habe deine Original-Software 
draufgespielt und siehe da, es funktioniert wie gewünscht ;-) Noch weiß 
ich nicht wo mein Fehler liegt, aber ich werde nochmal Stück für Stück 
meine Änderungen einpflegen und dann sehen wo es hakt. Vielen Dank 
nochmal für deine schnellen Antworten.
Ich verfolge dieses Funk-Projekt hier schon seit langer Zeit und ich 
muss einfach mal einen Lob an die Entwickler aussprechen, wie toll ihr 
(aber insbesonderem du, Benedikt) hier Stück für Stück eine super 
Software auf die Beine gestellt habt. Hat immer wieder Spaß gemacht, die 
Entwicklung zu verfolgen!
Grüße, Jens

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

Bewertung
0 lesenswert
nicht lesenswert
Da der Empfang der Daten in der check_rx_packet(); Funktion erfolgt, 
muss diese mindestens mit 1kHz aufgerufen werden, ansonsten kann es zu 
Problemen kommen.
Irgendwann muss ich den Empfang mal in den Interrupt verlagern.

Autor: muecke (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zum vorerst Letzten ;-)
Ich habe meinen Fehler gefunden und möchte ihn kurz beschreiben. 
Vielleicht hängt ein anderer Anfänger an einer ähnlichen Stelle.
Das Senden hatte ich durch einen Interrupt ausgelöst. Funktioniert auch 
alles wunderbar, nur wenn der Empfänger nicht mehr erreichbar ist, wird 
das Zeitinterrupt benötigt (fürs Timeout, meine ich). Dieser ist 
allerdings durch den Sendeinterrupt blockiert. Echt ein blöder 
Anfängerfehler, aber ich habe aus der Fehlersuche mal wieder gelernt.
Jetzt setze ich im Sendeinterrupt nur noch ein globales Char, welches 
dann in der fotlaufenden for-Schleife ausgewertet wird und das Zeichen 
entsprechend gesendet wird.
Nochmals danke -

Autor: Feissy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo, habe mal ne kurze frage und zwar habe ich zwei rfm12 module in 
betrieb genommen und möchte ganz einfach mit einem taster an PD1 auch 
dementsprechend einen ausgang in meinem Fall eig PB0 steuern. Ich habe 
folgenden code und er funktioniert auch soweit. Nur tut es nur, wenn ich 
den taster an PD0 habe und drücke, kann ich am anderen Atmega an PD1 die 
Led zum leuchten bringen jedoch blionkt sie immer nur kurz auf, wenn ich 
den taster betätige. Woran liegt das???


#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <avr/eeprom.h>
#include <stdlib.h>
#include "portbits.h"
#include "global.h"
#include "rf12.h"
#define F_CPU 10000000UL
#include <util/delay.h>

#define RF_BAUDRATE    15000    // Baudrate des RFM12

unsigned char data[128];
unsigned char tdiv=30;
unsigned char lastpins=0;


int main(void)
{  

  DDRD=0b1111100;
  

  

  PORTB=1;
  PORTD=31;
  DDRC=63;
  DDRD=238;

  sei();

  rf12_init();                      // RF12 + IO Ports initialisieren
    
  rf12_config(RF_BAUDRATE, RF12FREQ(433.92), 0, QUIET);  // Baudrate, Frequenz, Leistung (0=max, 7=min), Umgebungsbedingungen (QUIET, NORMAL, NOISY)
  rf12_rxmode();                      // Empfang starten

  for (;;)

{  unsigned char pins;
   check_rx_packet();
   pins=PIND;
   if (pins!=lastpins)
   {  tx_data(&pins,1);
      lastpins=pins;
   
       }

  if (PIND & (1<<PD1)) { 
  PORTB = 0b00000011;
  }


    }
  }






mfg stefan

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

Bewertung
0 lesenswert
nicht lesenswert
Ist die gleiche Software auch beim Empfänger drauf? Ich sehe da nirgends 
wo die empfangenen Daten verarbeitet werden.

Autor: Feissy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oh ich habe grade selber gesehen, das PD0 ja RXD ist, dann habe ich die 
ganze zeit gesehen, das daten gesendet werden und dan TXD wieder 
ankeokmmen.
jedenfalkls funktioniert die Übertragung schon.
ja ich hab das auf beiden atmegas drauf.
Reicht das nich wenn ich schreibe:

 if (PIND & (1<<PD1)) {
  PORTB = 0b00000011;
  }


für die Verarbeitung??

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

Bewertung
0 lesenswert
nicht lesenswert
Die empfangenen Daten verwendest du nicht wirklich.
if rx_data_in_buffer())
{  unsigned char count, i;
  count=rx_data(data);
  if (data[0]&1)
   PORTB|=1;
  else
   PORTB&=~1;
}
Damit würde eine Änderung an PortD0 beim Sender PortB0 beim Empfänger 
steuern.

Autor: Feissy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also wenn ich das so mache dann tut sich auch nichts...............

Autor: Feissy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <avr/eeprom.h>
#include <stdlib.h>
#include "portbits.h"
#include "global.h"
#include "rf12.h"
#define F_CPU 10000000UL
#include <util/delay.h>

#define RF_BAUDRATE    15000    // Baudrate des RFM12

unsigned char data[128];
unsigned char tdiv=30;
unsigned char lastpins=0;


int main(void)
{  

  DDRD=0x00;
  DDRB=0xff;
    

  PORTB=1;
  PORTD=31;
  DDRC=63;
  DDRD=238;

  sei();

  rf12_init();                      // RF12 + IO Ports initialisieren
    
  rf12_config(RF_BAUDRATE, RF12FREQ(433.92), 0, QUIET);  // Baudrate, 
  rf12_rxmode();                      // Empfang starten

  for (;;)

{  unsigned char pins;
   check_rx_packet();
   pins=PIND;
   if (pins!=lastpins)
   {  tx_data(&pins,1);
      lastpins=pins;
   
       }

  if (rx_data_in_buffer())
{  unsigned char count, i;
  count=rx_data(data);
  if (data[0]&1)
   PORTB|=1;
  else
   PORTB&=~1;
}

    }
  }

also auch wenn ich das so auf den atmega 8 spiele Funktioniert das nicht 
man kann nur an PD1 am empfäger sehen, wenn man PD0 am Sender drückt.

Autor: Feissy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok hat sich grade alles erledigt funktioniert alles wunderbar.
danke für die schnelle Hilfe.
Ps. manchmal hat man einfach ein Brett vorm kopf ^^

Autor: Feissy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie kann ich denn jetzt alle Ports PD0 bis PD7 einlesen und dann auch 
wieder an PB oder glaube PC ist besser, da alle frei sind, ausgeben. 
welche Funktion muss ich ändern?
Also mit einem Eingang alle Ausgänge ansteuern  ist ja kein Problem, 
aber ich möchte gerne jeden einzeln ansteuern.
mfg

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

Bewertung
0 lesenswert
nicht lesenswert
  if (rx_data_in_buffer())
{  unsigned char count;
  count=rx_data(data);
  PORTC=data[0];
}

Damit wird das Byte komplett auf Portc (soweit halt Pins da sind) 
ausgegeben.

Autor: Feissy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So hab noch mal ne Frage und zwar wie kann ich wenn ich die daten wieder 
ausgebe auch die Eingänge entprellen, sodass ich mit einem tastendruck 
An bzw. und dann wieder Ausschalten kann?
Hier mein code, der aber "leider" nicht funktioniert:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <avr/eeprom.h>
#include <stdlib.h>
#include "portbits.h"
#include "global.h"
#include "rf12.h"
#define F_CPU 10000000UL
#include <util/delay.h>

#define RF_BAUDRATE    15000    // Baudrate des RFM12

unsigned char data[128];
unsigned char tdiv=30;
unsigned char lastpins=0;

  inline uint8_t debounce(volatile uint8_t *port, uint8_t pin)
  {
      if ( ! (*port & (1 << pin)) )
      {
        /* Pin wurde auf Masse gezogen, 100ms warten   */
        _delay_ms(50);  // max. 262.1 ms 
        _delay_ms(50); 
          if ( *port & (1 << pin) )
          {
            /* Anwender Zeit zum Loslassen des Tasters geben */
              _delay_ms(50);
              _delay_ms(50); 
              return 1;
          }
      }
      return 0;
  }

int main(void)
{  

  DDRD &= ~( 1 << PB0 );                 // PD0 auf Eingang
    PORTD |= ( 1 << PB0 ); 
    

  PORTB=1;
  PORTD=31;
  DDRC=63;
  DDRD=238;

  sei();

  rf12_init();                      // RF12 + IO Ports initialisieren
    
  rf12_config(RF_BAUDRATE, RF12FREQ(433.92), 0, QUIET);  // Baudrate, Frequenz, Leistung (0=max, 7=min), Umgebungsbedingungen (QUIET, NORMAL, NOISY)
  rf12_rxmode();                      // Empfang starten

  for (;;)

{  unsigned char pins;
   check_rx_packet();
   pins=PIND;
   if (pins!=lastpins)
   {  tx_data(&pins,1);
      lastpins=pins;
   
       }

 if (rx_data_in_buffer())
{  unsigned char count;
  count=rx_data(data);
  PORTC=data[0];

 if (debounce(&PIND, PD0))             // Taster an PIN PD0 gedrueckt
    PORTC = PINC ^ ( 1 << PC0 );       // LED an PC0 an bzw aus

}       
   
    }
  }

Woran liegt das oder muss ich beim einlesen der ports etwas ändern?

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

Bewertung
0 lesenswert
nicht lesenswert
Ich würde fast darauf tippen, dass es an debounce liegt, denn damit das 
funktioniert, muss man drücken und innerhalb von 100ms wieder los 
lassen. Dieser Zeitpunkt ist denke ich nur schwer zu treffen.

Autor: Feissy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mh also ich hab da jetzt verschiedene zeiten ausprobiert aber daran 
liegt es nicht.
kann man denn beim auslesen der daten was ändern oder kann es sein das 
man so etwas überhaupt nicht auslesen kann, das der taster entprellt 
ist???

Autor: Stefan F. (feissy)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
so hier noch mal der code. hab noch mal bissl was geändert unter anderem 
die if schleife nach hinten aus der ersten if schleife gezogen und die 
zeit vergrößert.
also weenn ich direkt am sende avr ne led an PC0 hänge funzt das auch 
mit an und aus aber eben nich am empfänger, dort bleibt sie so lange an, 
wie man auch drückt.
 habt ihr noch ne idee???

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

Bewertung
0 lesenswert
nicht lesenswert
Sende doch mal feste Daten, dann kannst du ausschließen, dass es an der 
Tastenentprellung liegt.

Autor: GierigeSau (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen.
Ich hab gerade den 2-Jahres Thread hinter mir gebracht ;) Der längste 
den ich an einem stück gelesen habe^^
Da ich mich auch bald mit den Modulen beschäftigen werde, wollte ich 
einfach nur mal meinen Dank an euch aussprechen, an allen die daran 
mitgewirkt haben. Ich Fang jetzt gerade erst mit C Programmierung an, 
aber mit den ganzen Werken hier sollte es keine Probleme geben ;)
Meine RFM-Module sollen ADC-Werte (3x Temp. mit LM35 (Displayausgabe 
funktioniert schon) + 6 versch. Spng. (6 Cellen LiPo) + Strommessung 
(Wie am besten bis 150Amp messen?) Übertragen.
Echt saubere Arbeit von euch, weiter so.

MFG Timo S.

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,

am 18.05.2007 hat Georg folgendes geschrieben:

  Hallo Benedikt,

  ich habe hier Dein Programmierbeispiel gefunden, nachdem ich mit dem
  Code-Beispiel von Pollin fast verzweifelt hatte, war Dein super
  strukturierter Code die wahre Wohltat.

  Ich habe mir von Pollin zwei Funk Eval Boards zugelegt, jeweils mit
  RFM12 und ATmega32-16 bestückt.
  Die Verdrahtung ist zwar etwas anders als bei Deiner Hardware, aber 
mit
  wenigen Änderungen (Pin defines und Pullup programmieren) lief Deine
  Software auf Anhieb !!!!

  Danke für dieses Stück gute Arbeit !!!


  Georg

Jetzt habe ich genau die gleiche Konfiguration wie Georg, also die 
beiden Boards, jeweils mit RFM12 von Pollin sowie beide mit Atmega32 
bestückt. Er schreibt, dass er Pin-defines und Pullup ändern musste, 
damit das Programm läuft. Kann mir mal bitte jemand sagen, wie die 
Änderungen im Programm aussehen müssen?

Ähhhh, achja, bitte bei den Antworten (hoffentlich :-) berücksichtigen, 
dass ich gerade erst anfange, mit AVR´s rumzuspielen.

Vielen Dank für die Hilfe im voraus

Ralf

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hmmm,

keiner Lust mir ein bisschen auf die Sprünge zu helfen?

Würde mir wirklich weiterhelfen.

Grüße
Ralf

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

Bewertung
0 lesenswert
nicht lesenswert
Ralf schrieb:

> Jetzt habe ich genau die gleiche Konfiguration wie Georg, also die
> beiden Boards, jeweils mit RFM12 von Pollin sowie beide mit Atmega32
> bestückt. Er schreibt, dass er Pin-defines und Pullup ändern musste,
> damit das Programm läuft. Kann mir mal bitte jemand sagen, wie die
> Änderungen im Programm aussehen müssen?

In der rf12.c finden sich diese Zeilen:

#define RF_PORT  PORTB
#define RF_DDR  DDRB
#define RF_PIN  PINB

#define SDI    3
#define SCK    5
#define CS    2
#define SDO    4

Dort müssen der Port und die Pinnummern eingetragen werden, wo das Modul 
angeschlossen ist.

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Erstmal möchte ich Benedikt K. dafür danken, dass er dieses gute 
Beispiel veröffentlicht hat.
Ich möchte die rfm12 dazu nutzen Temperaturdaten(uint8_t und uint16_t) 
zu "verschicken", mit dem Beispiel "Dies ist ein 433MHz Test !!!\n   " 
klappt dies auch tadellos, allerdings schaffe ich es nicht einzelne 
unsigned char oder unsigned int zu übermitteln. Ein kleiner Denkanstoss 
würde mir hoffentlich weiterhelfen.

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
kann mir niemand einen Denkanstoß liefern?

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

Bewertung
0 lesenswert
nicht lesenswert
Der Funktion musst du Daten übergeben (in Form eines unsigned char 
Arrays) und die Anzahl an Bytes. Diese werden übertragen.
Du musst deine Werte halt irgendwie in das Array bekommen, z.B. über ein 
struct oder per Hand den uint16 Wert in 2 Bytes zerlegen.

Autor: Raphael S. (raphaels)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich möchte nun auch eine Funkverbindung an meinen schon sehr weit
fortgeschrittenen Webserver bauen.

Leider schaffe ich es nicht, eine Verbindung herzustellen.

Wenn ich das Status-Register auslesen, nach dem ersten Start, bekomme 
ich 0x4000. Das sieht ja noch ganz gut aus.
Nach dem Initialisieren ist das Statusregister aber immer auf 0x0000, 
auch wenn ich das FIFO eingeschaltet habe. Es müsste aber doch 
eigentlich das FFEM-Bit gesetzt sein, oder?

Ich habe die Version Benedikt verwendet, aber für einen DS89C450 
"abgeändert". Sehr viel gab es da nicht, eigentlich nur die rf12_trans 
Funktion ein bisschen abändern.
Ich habe die Funktion auch schon testweise in Assembler geschrieben, 
genau die gleichen Probleme.

Desweiteren habe ich das Setzen der Frequenz, der Baudrate usw., was 
eig. in in main passiert, in die init Funktion verschoben.

Setzen der 10Mhz funktioniert auch.

Ich weiß nicht, woran das noch liegen könnte...

Würde mich über Hilfe freuen!
RaphaelS

Autor: Franz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich habe eine Schaltung mit Benedikts Software aufgebaut und mich dabei 
auch an seinen Schaltplan gehalten. Gibt es jetzt eine Möglichkeit zu 
sehen/testen ob soweit alles in Ordnung ist? Irgendeine LED die leuchten 
sollte, ein Pin der high ist etc? Oder sollte ?
Viele Grüße Franz