while(!(RF_PIN&(1<<SDO)));// wait until FIFO ready
6
}
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
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
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
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
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
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.
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
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
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
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.
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?
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.
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
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
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
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!
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
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.
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
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
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:
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
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
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
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 ??
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.
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.
@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
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
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
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.
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
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
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
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
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.
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
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
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
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
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.
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
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
>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.
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 ....
>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"
;-)
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!
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
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()
1
if(wert&32768)/
2
sbi(RF_PORT,SDI);
3
else
4
cbi(RF_PORT,SDI);
5
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]
1
if(RF_PIN&(1<<SDO))
2
werti|=1;
3
sbi(RF_PORT,SCK);
4
wert<<=1;//warum erste jetzt shiften?
5
_delay_us(0.3);//Warum 0.3 us?
6
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
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]>>
1
>if(RF_PIN&(1<<SDO))
2
>werti|=1;
3
>sbi(RF_PORT,SCK);
4
>wert<<=1;//warum erste jetzt shiften?
5
>_delay_us(0.3);//Warum 0.3 us?
6
>cbi(RF_PORT,SCK);
7
>
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.
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
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.
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
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
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
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.
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
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
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
> 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
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?
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
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
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
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.
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
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.
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
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).
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
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.
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
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
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.
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?
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
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
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.
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
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.
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
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)
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
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
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
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.
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
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:
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
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.
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ß
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.
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?
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
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.
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.
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
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
@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
> 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.
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.
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
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).
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
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
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.
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
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
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.
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
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
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 -
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.
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 -
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.
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.
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.
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
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.
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 -
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???
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??
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
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:
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.
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???
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???
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.
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
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.
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.
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.
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
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
Bei neueren Versionen gibt es eine leds.h. In der kann man Pins
festlegen an denen Status LED angeschlossen werden.
Bei den alten, einfachen Versionen gabs das noch nicht. Da könnte man
die Leitungen zum RFM12 anschauen: Wenn sich auf denen periodisch etwas
tut, dann sendet das Modul.
Hallo zusammen,
ich hatte die Funkmodule RFM12 (433MHz) von Pollin schon einige Zeit
(ca. 2Jahre) unbenutzt zuhause liegen. Jetzt habe ich die Zeit gefunden
diese an zwei Pollin Demo Boards anzuschließen. Verdrahtet ist alles
entsprechend dem Pollin Adapter Modul. Ich habe zunächt mal das
RFM12_RX_TX.zip Paket von Benedikt ausgepackt und auf meine
Konfiguration angepasst. Dabei ist der Prozessor Takt (Atmega8, 16MHz)
und der FSK Pin auf PB1 auf high zu legen wie schon früher besprochen.
Die Module geben beide einen 10MHz Takt aus (gemessen), den meine
Atmegas aber nicht verwenden.
Die Module liegen nebeneinander auf dem Schreibtisch (ca. 10cm Abstand).
Ich habe Beim Sender "sende...\n" und Empfänger die Meldung "Empfaenger
laeuft !\n" in MS/Hyperterm.
Läuft der Sender, Empfange ich Datenmüll mit einem Haufen Smileys und
Sonderzeichen, aber kein einziges Schnipselchen vom gesendeten Testtext
Den Code habe ich nicht verändert.
Habe schon mit und ohne Antenne versucht -> kein Einfluss.
Empfang mit 5x gesendeter Message ist:
Empfaenger laeuft !
DBIsartHBY !%&qAErh
aefQeaeQY!&%IqBea DBf BrheBY0%%Iz @Brt BBeQr`BBY!%%xABea
BBeaea BB\!%2qAea
Habe auch mal 0xAA gesendet anstelle des Test Textes, erhalte da aber
genauso Datenmüll. Das Bitmuster ist in den empfangenen Daten nicht
wiederzufinden.
Wenn ich nicht sende empfange ich auch nichts => ich denke ich habe
keine externen Störungen aus der Umgebung.
Module sollten nicht defekt sein. Wurden meines erachtens sehr pfleglich
und sorgfältig behandelt. (Jedenfalls bisher)
Habe keine Erfahrung mit HF Funk-Technik, kann aber ein Osziloskop
bedienen. Scanner habe ich nicht. Fernseher noch nicht probiert, weil
örtlich getrennt und der Nutzen hat sich mir für mein aktuelles Problem
noch nicht erschlossen.
Ich könnte ein paar Tipps gebrauchen:
Wo sollte ich als nächtes den Fehler suchen? Was kann ich noch prüfen?
Muss man mit Verstärkung und Frequenzeinstellungen eine Abstimmung
suchen? - Wenn ja, wie geht man geschickt vor?
Was kann ich jetzt noch an Fehlern ausschließen? (Stimmt die
Sendefrequenz, Rastet der Empfänger auf die Frequenz ein, komme ich in
die Präamble, ...)
Grüsse, Oliver
Hab das gleiche prob nur mit dem Basic Programm von bastelbär.
PLZ Help???
könnte sein, dass bei mir was mit der SPI Kommunikation nicht
stimmt...bin mir aber nicht so sicher.
Versuch mal den Prozessortakt runterzusetzen bzw. die Verzögerungen in
den SPI Routinen zu vergrößern. Das FIFO Register darf nicht so schnell
angesprochen werden wie der Rest. Daher kann es sein, dass alles andere
funktioniert, nur die Übertragung nicht.
Hallo,
erstmal muss ich sagen, dass der Code von Benedikt super ist (hat mir
viel Arbeit erspart).
ich habe heute endlich (nach langer langer Fehlersuche) eine
Funkübertragung zwischen einem RFM12 und einem RFM02 zustande gebracht.
Das Ganze funktioniert schon soweit, dass das RFM12 erkennt, wann Daten
angekommen sind und das RFM02 Daten sendet. Die empfangenen Daten werden
dann über USART an den Computer gesendet. Nur leider empfange ich nie
das was ich gesendet habe, also mir kommt es so vor, als ob alle Bits
eines Bytes wild durcheinander gewürfelt werden würden. Aber wenn ich
mehrmals das gleiche Sende, kommt jedesmal der gleiche "Müll" an (auch
wenn ich zwischendrin etwas anderes gesendet habe), also sind die
empfangenen Daten doch nicht ganz zufällig.
Beispiel: Ich sende "test" und empfange jedesmal 00111110, 00001111,
00000100, 00001010, 01111111, dann sende ich "...." und empfange
jedesmal 00111110, 01000011, 00100000, 01010000, 01111000
Komisch ist dabei noch, dass aus 4 gesendeten Bytes 5 Empfangene werden.
Hat jemand vielleicht eine Idee, woran das liegen könnte? Ich denke,
dass die beiden Module nicht genau aufeinander abgestimmt sind, obwohl
ich 2 AtMega8 mit jeweils einem externen Quarz von 3,6864MHz benutze.
(An dem Code habe ich nichts verändert.)
Schon mal im voraus Danke für eure Antworten
Grüße Julian
Da das RFM02 etwas bescheuert anzusteuern ist und nur kurze Peaks im
Takt der Baudrate ausgibt, könnte es sein dass einzelne Impulse
übersehen werden und daher manche Bits mehrmals gesendet werden. Lass
den Sender mal schneller laufen.
Hast du ein zweites RFM12 das du als Sender verwenden könntest, um zu
prüfen ob es damit geht? So könntest du zumindest sicherstellen, dass
der Empfänger funktioniert. Ich tippe nämlich immer noch auf ein Problem
beim RFM02.
Der Sender sendet auf jeden Fall (das habe ich mit einem Fernseher
geprüft). Aber ich werde es morgen nochmal mit einem anderen RFM12
probieren. Obwohl ich mir irgendein Problem mit dem Timing auch gut
vorstellen könnte.
Hallo liebe Funkgemeinde,
wir alle haben schon sehr viele Stunden mit diesen RFM12-Modulen
verbracht und einige haben vielleicht auch schon aufgegeben. Aber last
den Kopf nicht hängen. Die Dinger funktionieren wirklich, jetzt auch bei
mir. Ich gehe jetzt nicht mehr auf die Hardware ein. Ein bisschen
Konzentration beim Löten muss eben jeder mitbringen. Software habe ich
von Benedikt verwendet.
Die funktioniert eigentlich auf Anhieb, wenn da nicht das Problem mit
den Quarzen auf den Modulen wäre. Die sind eben nicht genau gleich und
wenn man jetzt eine Verbindung aufbauen möchte, muss einer von beiden
ggf. abgeglichen werden. Hier ein Beispiel:
Ich habe bei meinem Sender die Frequenz 868.92 MHz eingestellt.
( Achtung :Ich verwende die 868MHZ Module ! )
Für die Variable freq ergibt das einen Wert von :
(868.92-860) / 0.005 = 1784
#define RF12FREQ(freq) ((freq-860.0)/0.005) // macro for calculating
frequency value
rf12_setfreq(RF12FREQ(868.3)); // Sende/Empfangsfrequenz auf 868,92MHz
einstellen
Wenn ich jetzt im Empfänger nach dieser Formel auch den Wert für freq
berechnen lasse ich das zwar richtig, meine Module können aber nie
miteinander kommunizieren. Warum: weil die Quarze so ungenau sind. In
meinem Fall musste ich für freq den Wert 1747 beim Empfänger einstellen.
Theoretisch ist das die Frequenz von 868.735,hier treffen sich Sender
und Empfänger am Besten. Um jetzt bei euren Modulen die beiden Werte zu
ermitteln könnt ihr meinen Sourcecode verwenden.
Und das geht's:
1) Software im Sender wie von Benedikt
2) Software im Empfänger mit folgenden Änderungen:
rf12.c
void rf12_ready(void)
{
unsigned long timeout = 0;
cbi(RF_PORT, SDI);
cbi(RF_PORT, CS);
asm("nop")
while (!(RF_PIN & (1<<SDO))) //wait until FIFO ready or timeout
if (((timeout++)>70000)){break;};
}
main.c
.
.
sei();
uart_puts_P("Empfaenger laeuft !\n\r");
uint16_t freq=1745; // Startwert für Frequenzlauf
rf12_trans(0xA000|freq);
char sst[] = " ";
for (;;)
{
rf12_trans(0xA000|freq);
ltoa(freq, sst, 10);
uart_puts(sst);
uart_puts_P("\n\r");
freq++;
if (freq> 1751) // Endwert für Frequenzlauf
freq=1745;
receive();
}
.
.
.
Im Terminalprogramm sollte dann folgendes erscheinen:
Dies ist ein 868MHz Test 1745
Dies ist ein 868MHz Test 1746
Dies ist ein 868MHz Test 1747
( Habe meinen Text im Sender natürlich auch angepasst )
3) Den besten Wert ermitteln und später im Empfänger eintragen.
868 Module
z.B. 1747 => ( 1747*.005)+ 860= 868.735
rf12_setfreq(RF12FREQ(868.735)); // Sende/Empfangsfrequenz auf
868,92MHz einstellen
433MHz Module
z.B. 1755 => ( 1755*.0025)+430= 434.3875
rf12_setfreq(RF12FREQ(434.3875)); // Sende/Empfangsfrequenz auf
434.3875MHz einstellen
Eigentlich ganz einfach. Vielen Dank noch mal allen für die gute
Vorarbeit.
Viel Spaß beim Probieren!
Thomas
Ok hab auch den ganzen thread durchforstet und muss sagen respekt.
so nun zu meinem problem:
verwende das programm von benedikt "RFM12_RX_TX.zip" und blicke bei der
usart ausgabe nicht durch oder zumindest gehe ich mal stark davon aus
das ich die rs232 schnittstelle nicht richtig konfiguriere.
kann mir da mal einer weiterhelfen? das ein zigste was ich raus bekomme
und nicht schwer ist ist die baudrate von 19200, nur der rest keine
ahnung.
und dann mal frage ob das funktioniert
2 * Funk-AVR-Evaluations-Board v1.2
2 * Atmel ATmega 32 mit 16MHz Clock vom Board
2 * RFM12S
Newbie Daniel schrieb:
> kann mir da mal einer weiterhelfen? das ein zigste was ich raus bekomme> und nicht schwer ist ist die baudrate von 19200, nur der rest keine> ahnung.
Abgesehen von der Baudrate gibts beim UART auch nicht viel zu
konfigurieren für die übliche Anwendung.
Welche Einstellung suchst du denn?
hm...meinte für das hyperterminal. sorry wenn ich mich missverständlich
ausgedrückt habe. oder sollte man da ein anderes prog nutzen um diese
ausgabe auszugeben?
Die Baudrate ist klar, ansonsten 8bits, kein Parity, 1 Stopbit.
Ich verwende immer dieses Programm, das ist für sowas besser geeignet:
Beitrag "Neues Terminal-Programm für Windows"