Hallo, ich habe mir inwzischen ein Funkmodul das Funkmodul RFM12 von Pollin zugelegt und komme irgendwie noch nicht so richtig damit zurecht. Einerseits habe ich jetzt eine Platine als Fertigbausatz (Funkmodulbausatz von Pollin mit einem RFM12) und andererseits von Rowalt ein AVR Mikrokontroller Board mit SIL Sockelleisten woran ich mein zweites RFM12 angeschlossen habe. Ich habe mir gedacht das ich als erstes das Rowalt Board ständig durch die gegend funken lasse und das gefunkte per Pollin Funkevaluationsboard empfange und danach auf die RS232 Schnittstelle ausgebe. Da ich das Datenblatt von Pollin gerade als Klopapier vieleicht noch gute Zwecke leistet hab ich den Rat im Forum befolgt und mir direkt vom Hersteller das Datenblatt von HOPE angesehen. Ich weiß es gibt schon fertige Funkstacks usw. aber ich möchte das ganze erstmal so simpel wie möglich machen und durch den Äther senden und empfangen. Da ich auf der Empfangsseite angeblich nur 00er Bytes bekomme (zumindest sagt mir das die RS232) stelle ich mir nun folgende Fragen: Wie kann ich a) erstmal überprüfen ob mein Rowalt Sendemodul überhaupt sendet? und b) das mein Empfangsmodull empfängt? Als Antennen verwende ich bisher 2 ca 17cm lange verlötete Drahtstücke. Ist das ok soweit? Ich will damit momentan noch keine Reichweitenrekorde aufstellen, mir gehts nurmal ums Prinzip. Als Quellcode für das ganze habe ich den Code im Datenblatt von Hoppe verwendet: Das Sendemodul hängt dabei wie folgt am Atmega8 // NIRQ -> PD2 // SCK -> PB5 // SDO -> PB4 // SDI -> PB3 // NSEL -> PD2 // FSK/DATA/NFFS -> PD7 // DLCK -> PD3 // NINT -> PB0 Der Takt des Prozessors beträgt wie man sieht 8Mhz (interner Oszilator) Sender: #define F_CPU 8000000UL #include <avr/io.h> #include <compat/ina90.h> //#include <avr/interrupt.h> #include <stdint.h> #include <stdbool.h> // #include <avr/eeprom.h> #include <util/delay.h> #include <avr/interrupt.h> // #include "rf12.h" #define DDR_IN 0 #define DDR_OUT 1 #define PORT_SEL PORTB #define PIN_SEL PINB #define DDR_SEL DDRB #define PORT_SDI PORTB #define PIN_SDI PINB #define DDR_SDI DDRB #define PORT_SCK PORTB #define PIN_SCK PINB #define DDR_SCK DDRB #define PORT_SDO PORTB #define PIN_SDO PINB #define DDR_SDO DDRB #define PORT_DATA PORTD #define PIN_DATA PIND #define DDR_DATA DDRD #define PB7 7// -- #define PB6 6// | #define RFXX_SCK 5// | #define RFXX_SDO 4// |RF_PORT #define RFXX_SDI 3// | #define RFXX_SEL 2// | #define NC 1// | #define PBO 0//--/ #define SEL_OUTPUT() DDR_SEL|= (1<<RFXX_SEL) #define HI_SEL() PORT_SEL|= (1<<RFXX_SEL) #define LOW_SEL() PORT_SEL&=~(1<<RFXX_SEL) #define SDI_OUTPUT() DDR_SDI|= (1<<RFXX_SDI) #define HI_SDI() PORT_SDI|= (1<<RFXX_SDI) #define LOW_SDI() PORT_SDI&=~(1<<RFXX_SDI) #define SDO_INPUT() DDR_SDO&= ~(1<<RFXX_SDO) #define SDO_HI() PIN_SDO&(1<<RFXX_SDO) #define SCK_OUTPUT() DDR_SCK|= (1<<RFXX_SCK) #define HI_SCK() PORT_SCK|= (1<<RFXX_SCK) #define LOW_SCK() PORT_SCK&=~(1<<RFXX_SCK) #define RF12_DATA 4//PD4 #define DATA_OUT DDR_DATA|=1<<RF12_DATA #define HI_DATA PORT_DATA|=1<<RF12_DATA #define LEDG_OUTPUT() DDRD|=~(1<<6) #define LEDR_OUTPUT() DDRD|=~(1<<7) #define LEDG_ON() PORTD|=(1<<6) #define LEDG_OFF() PORTD&=~(1<<6) #define LEDR_ON() PORTD|=(1<<7) #define LEDR_OFF() PORTD&=~(1<<7) void RFXX_PORT_INIT(void) { HI_SEL(); HI_SDI(); LOW_SCK(); SEL_OUTPUT(); SDI_OUTPUT(); SDO_INPUT(); SCK_OUTPUT(); } unsigned int RFXX_WRT_CMD(unsigned int aCmd) { unsigned char i; unsigned int temp; LOW_SCK(); LOW_SEL(); for(i=0;i<16;i++) { temp<<=1; if (SDO_HI()) { temp |=0x0001; } LOW_SCK(); if(aCmd&0x8000) { HI_SDI(); }else { LOW_SDI(); } HI_SCK(); aCmd<<=1; }; LOW_SCK(); HI_SEL(); return (temp) ; } void RF12_INIT(void) { RFXX_WRT_CMD(0x80D7) ;//EL,EF, 433band, l2.0pF RFXX_WRT_CMD(0x8239) ;//!er, !ebb, ET, ES, EX, !eb, !ew,DC RFXX_WRT_CMD(0xA640) ;//A140=430.8MHz 434Mhz? RFXX_WRT_CMD(0xC647) ;//19.2kbps RFXX_WRT_CMD(0x94A0) ;//VDI,FAST, l34kHz,OdBm,-103dBm RFXX_WRT_CMD(0xC2AC) ;//AL, !ml,DIG,DQD4 RFXX_WRT_CMD(0xCA81) ;//FIFO8,SYNC, !ff,DR RFXX_WRT_CMD(0xC483) ;//@PWR,NO RSTRIC, !st, !fi,OE,EN RFXX_WRT_CMD(0x9850) ;//!mp,9810=30kHz,MAX OUT RFXX_WRT_CMD(0xE000) ;//NOT USE RFXX_WRT_CMD(0xC800) ;//NOT USE RFXX_WRT_CMD(0xC400) ;//1.66MHz, 2.2V } void RF12_SEND(unsigned char aByte) { while(PIND&(1<<2)) ;//wait for previously TX over RFXX_WRT_CMD(0xB800+aByte) ; } #define LEDG_OUTPUT() DDRD|=~(1<<6) #define LEDR_OUTPUT() DDRD|=~(1<<7) #define LEDG_ON() PORTD|=(1<<6) #define LEDG_OFF() PORTD&=~(1<<6) #define LEDR_ON() PORTD|=(1<<7) #define LEDR_OFF() PORTD&=~(1<<7) void send(void); void receive(void); void ledTest(void){ for (int i=0;i<3;i++){ LEDR_ON(); LEDG_ON(); _delay_ms(200); LEDR_OFF(); LEDG_OFF(); _delay_ms(200); } } int main(void){ // -------------- unsigned int i, j; unsigned char ChkSum; asm volatile ("cli") ; DDRB=0x00;//PB INPUT; DDRD=0x00;//PD INPUT; //POWER ON indication: both LEDR and LEDG blink 3 times LEDG_OFF(); LEDR_OFF(); LEDG_OUTPUT(); LEDR_OUTPUT(); for(i=0;i<3;i++) { _delay_ms(200) ; LEDG_ON(); LEDR_ON(); _delay_ms(200) ; LEDG_OFF(); LEDR_OFF(); } bool redWasLast = true; RFXX_PORT_INIT(); RF12_INIT(); DDRD|= (1<<RF12_DATA) ; PORTD|= (1<<RF12_DATA) ;// SET nFFS pin HI when using TX register DDRD&=~(1<<2); //PD2(INTO) while(1) { RFXX_WRT_CMD(0x0000) ;//read status register RFXX_WRT_CMD(0x8239) ;//!er, !ebb,ET,ES, EX, !eb, !ew,DC ChkSum=0; RF12_SEND(0xAA) ;//PREAMBLE RF12_SEND(0xAA) ;//PREAMBLE RF12_SEND(0xAA) ;//PREAMBLE RF12_SEND(0x2D) ;//SYNC HI BYTE RF12_SEND(0xD4) ;//SYNC LOW BYTE RF12_SEND(0x30) ;//DATA BYTE 0 ChkSum+=0x30; RF12_SEND(0x31) ;//DATA BYTE 1 ChkSum+=0x31; RF12_SEND(0x32) ; ChkSum+=0x32; RF12_SEND(0x33) ; ChkSum+=0x33; RF12_SEND(0x34) ; ChkSum+=0x34; RF12_SEND(0x35) ; ChkSum+=0x35; RF12_SEND(0x36) ; ChkSum+=0x36; RF12_SEND(0x37) ; ChkSum+=0x37; RF12_SEND(0x38) ; ChkSum+=0x38; RF12_SEND(0x39) ; ChkSum+=0x39; RF12_SEND(0x3A) ; ChkSum+=0x3A; RF12_SEND(0x3B) ; ChkSum+=0x3B; RF12_SEND(0x3C) ; ChkSum+=0x3C; RF12_SEND(0x3D) ; ChkSum+=0x3D; RF12_SEND(0x3E) ; ChkSum+=0x3E; RF12_SEND(0x3F); //DATA BYTE 15 ChkSum+=0x3F; RF12_SEND(ChkSum); //send chek sum RF12_SEND(0xAA) ;//DUMMY BYTE RF12_SEND(0xAA) ;//DUMMY BYTE RF12_SEND(0xAA) ;//DUMMY BYTE RFXX_WRT_CMD(0x8201) ; //LEDG_ON(); if (redWasLast==true){ LEDG_ON(); _delay_ms(200); LEDG_OFF(); _delay_ms(200); redWasLast=false; } else{ redWasLast=true; LEDR_ON(); _delay_ms(200); LEDR_OFF(); _delay_ms(200); } } ; } Die Empfängerseite ist wie gesagt das Pollin Evaluationsboard mit nem verlöteten RFM12 Modul Empfänger: /* * Main.cpp * * Created on: 07.06.2009 * Author: procrash */ #define F_CPU 8000000UL #include <avr/io.h> #include <compat/ina90.h> //#include <avr/interrupt.h> #include <stdint.h> #include <stdbool.h> // #include <avr/eeprom.h> #include <util/delay.h> /* In neueren Version der WinAVR/Mfile Makefile-Vorlage kann F_CPU im Makefile definiert werden, eine nochmalige Definition hier wuerde zu einer Compilerwarnung fuehren. Daher "Schutz" durch #ifndef/#endif Dieser "Schutz" kann zu Debugsessions führen, wenn AVRStudio verwendet wird und dort eine andere, nicht zur Hardware passende Taktrate eingestellt ist: Dann wird die folgende Definition nicht verwendet, sondern stattdessen der Defaultwert (8 MHz?) von AVRStudio - daher Ausgabe einer Warnung falls F_CPU noch nicht definiert: */ #ifndef F_CPU #warning "F_CPU war noch nicht definiert, wird nun nachgeholt mit 4000000" #define F_CPU 12000000UL // Systemtakt in Hz - Definition als unsigned long beachten >> Ohne ergeben Fehler in der Berechnung #endif #define BAUD 19200UL // Baudrate // Berechnungen #define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1) // clever runden #define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1))) // Reale Baudrate #define BAUD_ERROR ((BAUD_REAL*1000)/BAUD) // Fehler in Promille, 1000 = kein Fehler. #if ((BAUD_ERROR<990) || (BAUD_ERROR>1010)) #error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch! #endif void uartInit(void){ //UCR |= (1<<TXEN); UCSRB |= (1<<TXEN); // UART TX einschalten UCSRC |= (1<<URSEL)|(1 << UCSZ1)|(1 << UCSZ0); // Asynchron 8N1 UBRRH = UBRR_VAL >> 8; UBRRL = UBRR_VAL & 0xFF; } /* copyright Ce) 2006 ;Title RF12 TX simple example based on AVR C ;Company: Hope microelectronic Co.,Ltd. ;Author: Tank ;Current version: vl.O ;Date: 2006-11-13 ;processor ATMEGA48 ;Clock: ;Contact: ;E-MAIL: 10MHz Crystal +86-0755-86106557 hopefsk@hoperf.com Connections ATMEGA48 SIDE RF12 SIDE SCK---------------)SCK MISO---------------)SDO MOSI---------------)SDI SS---------------)nSEL INTO<---------------nIRQ PD6: LED GREEN PD7: LED RED */ // #include <mega48.h> // NIRQ -> PD2 // SCK -> PB5 // SDO -> PB4 // SDI -> PB3 // NSEL -> PD2 // FSK/DATA/NFFS -> PD7 // DLCK -> PD3 // NINT -> PB0 #define DDR_IN 0 #define DDR_OUT 1 #define PORT_SEL PORTB #define PIN_SEL PINB #define DDR_SEL DDRB #define PORT_SDI PORTB #define PIN_SDI PINB #define DDR_SDI DDRB #define PORT_SCK PORTB #define PIN_SCK PINB #define DDR_SCK DDRB #define PORT_SDO PORTB #define PIN_SDO PINB #define DDR_SDO DDRB #define PORT_DATA PORTD #define PIN_DATA PIND #define DDR_DATA DDRD #define PB7 7//--\ #define PB6 6// | #define RFXX_SCK 5// | #define RFXX_SDO 4// |RF_PORT #define RFXX_SDI 3// | #define RFXX_SEL 2// | #define NC 1// | #define PBO 0//--/ #define SEL_OUTPUT() DDR_SEL|= (1<<RFXX_SEL) #define HI_SEL() PORT_SEL|= (1<<RFXX_SEL) #define LOW_SEL() PORT_SEL&=~(1<<RFXX_SEL) #define SDI_OUTPUT() DDR_SDI|= (1<<RFXX_SDI) #define HI_SDI() PORT_SDI|= (1<<RFXX_SDI) #define LOW_SDI() PORT_SDI&=~(1<<RFXX_SDI) #define SDO_INPUT() DDR_SDO&= ~(1<<RFXX_SDO) #define SDO_HI() PIN_SDO&(1<<RFXX_SDO) #define SCK_OUTPUT() DDR_SCK|= (1<<RFXX_SCK) #define HI_SCK() PORT_SCK|= (1<<RFXX_SCK) #define LOW_SCK() PORT_SCK&=~(1<<RFXX_SCK) #define RF12_DATA 4//PD4 #define DATA_OUT DDR_DATA|=1<<RF12_DATA #define HI_DATA PORT_DATA|=1<<RF12_DATA #define RF12_IRQ 2 #define IRQ_IN() DDR_IRQ &=~(1<<RF12_IRQ) #define WAIT_IRQ_LOW() while(PIND&(1<<RF12_IRQ)) #define LEDG_OUTPUT() DDRD|=~(1<<6) #define LEDR_OUTPUT() DDRD|=~(1<<7) #define LED1_OUTPUT() DDRD|=~(1<<5) #define LED2_OUTPUT() DDRD|=~(1<<6) #define LEDG_ON() PORTD|=(1<<6) #define LEDG_OFF() PORTD&=~(1<<6) #define LED1_ON() PORTD|=(1<<5) #define LED1_OFF() PORTD&=~(1<<5) #define LED2_ON() PORTD|=(1<<6) #define LED2_OFF() PORTD&=~(1<<6) #define LEDR_ON() PORTD|=(1<<7) #define LEDR_OFF() PORTD&=~(1<<7) void RFXX_PORT_INIT(void) { HI_SEL(); HI_SDI(); LOW_SCK(); SEL_OUTPUT(); SDI_OUTPUT(); SDO_INPUT(); SCK_OUTPUT(); } unsigned int RFXX_WRT_CMD(unsigned int aCmd) { unsigned char i; unsigned int temp; LOW_SCK(); LOW_SEL(); for(i=0;i<16;i++) { temp<<=1; if (SDO_HI()) { temp |=0x0001; } LOW_SCK(); if(aCmd&0x8000) { HI_SDI(); }else { LOW_SDI(); } HI_SCK(); aCmd<<=1; }; LOW_SCK(); HI_SEL(); return (temp) ; } void RF12_INIT(void) { RFXX_WRT_CMD(0x80D7) ;//EL,EF, 433band, l2.0pF RFXX_WRT_CMD(0x8239) ;//!er, !ebb, ET, ES, EX, !eb, !ew,DC //82D) RFXX_WRT_CMD(0xA640) ;//A140=430.8MHz 434Mhz? RFXX_WRT_CMD(0xC647) ;//19.2kbps //C647 RFXX_WRT_CMD(0x94A0) ;//VDI,FAST, l34kHz,OdBm,-103dBm RFXX_WRT_CMD(0xC2AC) ;//AL, !ml,DIG,DQD4 RFXX_WRT_CMD(0xCA81) ;//FIFO8,SYNC, !ff,DR RFXX_WRT_CMD(0xC483) ;//@PWR,NO RSTRIC, !st, !fi,OE,EN RFXX_WRT_CMD(0x9850) ;//!mp,9810=30kHz,MAX OUT RFXX_WRT_CMD(0xE000) ;//NOT USE RFXX_WRT_CMD(0xC800) ;//NOT USE RFXX_WRT_CMD(0xC400) ;//1.66MHz, 2.2V } void RF12_SEND(unsigned char aByte) { while(PIND&(1<<2)) ;//wait for previously TX over RFXX_WRT_CMD(0xB800+aByte) ; } unsigned char RF12_RECV(void){ unsigned int FIFO_data; WAIT_IRQ_LOW(); RFXX_WRT_CMD(0x0000); FIFO_data=RFXX_WRT_CMD(0xB000); return(FIFO_data&0x00FF); } void sendUART(unsigned char b){ // bei neueren AVRs steht der Status in UCSRA/UCSR0A/UCSR1A, hier z.B. fuer ATmega16: // b=255; unsigned char hexMSB = b / 16; unsigned char hexLSB = b % 16; if (hexMSB<10) hexMSB+='0'; else hexMSB+=55; if (hexLSB<10) hexLSB+='0'; else hexLSB+=55; while (!(UCSRA & (1<<UDRE))) // warten bis Senden moeglich { } UDR = hexMSB; // schreibt das Zeichen x auf die Schnittstelle while (!(UCSRA & (1<<UDRE))) // warten bis Senden moeglich { } UDR = hexLSB; // schreibt das Zeichen x auf die Schnittstelle while (!(UCSRA & (1<<UDRE))) // warten bis Senden moeglich { } UDR = ' '; // schreibt das Zeichen x auf die Schnittstelle } int main(void){ uartInit(); unsigned char i; unsigned char ChkSum; asm volatile ("cli") ; DDRB=0x00;//PB INPUT; DDRD=0x00;//PD INPUT; //POWER ON indication: both LEDR and LEDG blink 3 times LED1_OUTPUT(); LED2_OUTPUT(); for(i=0;i<3;i++) { _delay_ms(200) ; LED1_ON(); LED2_ON(); _delay_ms(200) ; LED1_OFF(); LED2_OFF(); } bool redWasLast = true; RFXX_PORT_INIT(); RF12_INIT(); DDRD|= (1<<RF12_DATA) ; PORTD|= (1<<RF12_DATA) ;// SET nFFS pin HI when using TX register DDRD&=~(1<<2); //PD2(INTO) RFXX_WRT_CMD(0xCA81); unsigned char recvd; while(1) { RFXX_WRT_CMD(0xCA83); ChkSum=0; for (i=0;i<16;i++){ recvd=RF12_RECV(); sendUART(recvd); ChkSum+=recvd; } recvd=RF12_RECV(); i = recvd; sendUART(recvd); RFXX_WRT_CMD(0xCA81) ;//read status register if (ChkSum==i){ LED2_ON(); _delay_ms(200); LED2_OFF(); } else { LED1_ON(); _delay_ms(200); LED1_OFF(); } } ; }
> Wie kann ich a) erstmal überprüfen ob mein Rowalt Sendemodul > überhaupt sendet? Du koenntet deinen Spektrumanalyzer anschliessen. Solltest du gerade keinen da haben so kannst du auch einen HF-Tastkopf bauen. Oder du schaust mal ob du eine Frequenz hinbekommst die du mit einem TV-Tuner empfangen kannst. > und b) das mein Empfangsmodull empfängt? Sobald dein Sender erfolgreich sendet musst du nur schauen ob das auch aus deinem Empfaenger wieder rauskommt. > Als Quellcode für das ganze habe ich den Code im Datenblatt von > Hoppe verwendet: Ich glaube das muss uns nicht interessieren da du es doch selber machen wolltest. .-) Olaf
Hi Olaf, also in meinem Heimwerkerlabor habe ich höchstens noch ein Oszi zur Verfügung aber ich schätze da das ganze ja HF ist wird mir mein Oszi da nicht viel helfen oder? Nützt mir das was? Du solltest vielleicht wissen das ich das ganze nur Hobbymäßig mache und kein E-Technik Studium oder ne Ausbildung hinter mir habe. Das mit den Antennen passt soweit oder? Stimmt denn der Code den ich angegeben habe? Der ist 1:1 aus dem Datenblatt von Hoppe. Gruß Wolfgang
> Verfügung aber ich schätze da das ganze ja HF ist wird mir mein Oszi da > nicht viel helfen oder? Du hast dir nicht die Muehe gemacht mal herauszufinden was ein HF-Tastkopf ist? http://www.io.com/~n5fc/rfprobe1.htm > Das mit den Antennen passt soweit oder? Du hielst es bis jetzt nicht fuer noetig uns deine Frequenz mitzuteilen. Solange es aber erstmal nur darum geht ein paar cm auf deinem Schreibtisch zu ueberbruecken ist die Antenne ziemlich egal. > Stimmt denn der Code den ich angegeben habe? Glaubst du im ernst hier liesst sich einer mehrere Seiten Programmcode durch? Und glaubst du wirklich selbst wenn das einer macht das er dann mal eben so irgendeinen Fehler finden wuerde? Olaf
Ok Olaf, ich mach mich mal schlau bezüglich des HF Tastkopfes. Der Code ist übrigens eins zu eins bereits im Forum mal gepostet worden (RFM12_RX_TX). Weisst du zufälligerweise was bei dem Modul alles angeschlossen sein muss? Laut Datenblatt hab ich SDI, NSEL, NIRQ, VDD, SCK, SDO, DATA und GND angeschlossen. Warum muss Data eigentlich über nen 10k Widerstand an VDD angeschlossen werden? Weisst du das zufällig? Ich werde morgen mal das zweite Evaluationsboard zusammenlöten und mal sehen ob es mit dem Referenzbeispielcode klappt den ich für die Pollin Boards im Netz gefunden habe und hoffe dass das klappt. Und dann seh ich mir natürlich den HF-Tastkopf mal genauer an Olaf. Natürlich verlange ich nicht das Ihr euch seitenweise Code durchlest aber es wäre ja schonmal ganz nett gewesen zu wissen ob dieser Code der im Forum schonmal gepostet wurde und im Hoppe Datenblatt steht funktioniert oder ob das Ding wieder für den Anus ist. Weisst du da was drüber? Ansonsten immer mal locker bleiben... :-) Gruß Wolfgang
Ach ja die Frequenz liegt momentan noch auf 433Mhz laut Quellcode. Jaja nicht schon wieder fluchen, ich änder das noch...
Ach ja, der Quellcode war von Benedikt. Mittlerweile hab ich mir den RF-Probe Artikel von dem Link den du gepostet hast mal angesehen. So wie das aussieht kann ich damit jetzt HF-Spannungen messen, richtig? Mal ne sau blöde Frage: Wo greif ich die ab? An zwischen Antenne und GND?
Hallo, indirekt kannst Du auch die Stromaufnahme messen, wenn er den Sender einschaltet sind es so um 12-15mA. 0xA620 sind 433,92MHz, also da wo alle Senden. ;) Sener-Init habe ich keine hier für einen RFM12, nutze die im Moment nur als Empfänger, Sender sind RFM02. Antenn ist egal, solange der Kram relativ nahe beeinander ist. Mein Sensor aus dem Keller ist im 2. Stock auch noch ohne Antenne am Empfänger zu empfangen...
1 | rfm12_send_cmd(0x0000); // Status read |
2 | rfm12_send_cmd(0xC080); // CLK-Frequenz / Batterie-Level |
3 | rfm12_send_cmd(0x80D7); // FIFO ein, 433MHZ-Band, C = 12pF |
4 | rfm12_send_cmd(0xC2AB); // Clock Recovery Auto, Filter digital, DQD-Thresold 3 |
5 | rfm12_send_cmd(0xCA81); // FIFO-Level 8 Bit, Sync Pattern ein, High senity Reset aus |
6 | rfm12_send_cmd(0xE000); // WakeUp aus |
7 | rfm12_send_cmd(0xC800); // Low Duty Cycle aus |
8 | rfm12_send_cmd(0xC4F3); // AFC immer, +7,5 / -10kHz, Add Freq-Offset zur PLL, Berechne Freq. Offset aus AFC |
9 | rfm12_send_cmd(0xA620); // Frequenz 433,92MHz |
10 | rfm12_send_cmd(0x948C); // VDI Output, VDI Fast, Bandbreite 200kHz, LBA-Gain -6dB, RSSI-Thresold -79dB |
11 | rfm12_send_cmd(0xC610); // Baudrate 19200 |
12 | rfm12_send_cmd(0x8281); // Empfänger ein, Clock Out aus |
13 | rfm12_send_cmd(0xCA81); // set FIFO mode |
14 | rfm12_send_cmd(0xCA83); // enable FIFO |
Das sind die Werte des Empfängers mit dem RFM12. Dicht am RFM-Modul einen Elko 4,7-10µ über die Betriebsspannung legen, ich hatte mehrfach das Problem, daß die Module beim Schalten auf Senden abstürzten (RFM02) speziell auf dem Steckbrett mit den längeren Leitungen. Außerdem als erstes den Status lesen, ohne dem gab es manchmal den "geht - geht nicht" Effekt. ;) Vielleicht hilft Dir auch http://www.avr.roehres-home.de etwas weiter. Gruß aus Berlin Michael
Michael U. schrieb:
> 0xA620 sind 433,92MHz, also da wo alle Senden. ;)
Nein!
Die Radarfalle uP80 sendet vom Fahrzeug zur Fotoeinheit auf 434.600MHz!
Hallo Michael, danke für die Antwort. Einen Fehler hab ich inzwischen schon gefunden. mIch hatte den Data Port des Moduls nicht über nen 10k Widerstand an Vdd gelegt. Das mit dem Elko probier ich gleich mal aus. Gruß, Wolfgang
Hi nochmal, hab mir heute mal das Modul etwas sauberer auf ner Adapterplatine aufgebaut und die Stromaufnahme gemessen. Laut Multimeter zeigt er mir eine schwankende Stromaufnahme von 6-15ma an. Kann ich davon ausgehen dass er zumindest was sendet wenn dieser wert schwankt? Ich sende ein paar Byte, danach lass ich meine LED's blinken also denk ich mir ist in diesem Bereich die Stromaufnahme geringer da das Blinken und Senden nicht parallel abläuft. Welche Stromaufnahme hat das Ding wenn ich nichts durch die gegend Funke sondern nur Beispielsweise den Status die ganze Zeit abfrage?
Hallo, das müßtest Du Dir aus dem Datenblatt zusammensuchen (dem vollständigen, nicht den "Wurfzetteln". ;-) ca. 15mA ziehen meine RFM02-Sensoren zusammen mit einem Tiny45. ca. 5mA sind es, wenn der AVR läuft und der RFM halbwegs initialisiert ist und nicht sendet. Die Werte sind mit Mulitmeter geschätzt, weil ich sie nur bei der Fehlersuche mal gemessen habe, als der Kram nicht zuverlässig schlafen ging. Ich habe mit dem RFM12 noch nicht gesendet, da der RFM02 da ziemlich abweicht (kein Sendebuffer usw.) helfen Dir da meine Sourcen vermutlich wenig.
1 | rfm02_send_cmd(0xCC00); // Status read |
2 | rfm02_send_cmd(0xC0E0); // Power Settings: Quarz ein, Synthesizer und PA ein bei Send-Command |
3 | rfm02_send_cmd(0xC2A0); // low bat detector, TX Bit Sync, WakUp-Timer Calibrierung aus |
4 | rfm02_send_cmd(0x8883); // Control: 1MHz Clock Out, 12,5pF Last Quarz, 120kHz Shift |
5 | rfm02_send_cmd(0xA620); // Frequenz: 430MHz + (0,0025 * 0x620) -> 433,92MHz |
6 | rfm02_send_cmd(0xB200); // Power 2 * -3dBm -> -6dBm |
7 | rfm02_send_cmd(0xD2C0); // Set PLL: set 33% |
8 | rfm02_send_cmd(0xC810); // Baudrate: 344827 / 19200 = 17 - 1 -> 0x10 // Status read |
9 | rfm02_send_cmd(0xE500 + 200); // WakeUp-Timer 2^7 *234ms ~ 30s ???!! nicht 1ms sondern 10ms !!??? |
10 | rfm02_send_cmd(0xC002); // alles aus, WakeUp-Timer ein |
11 | rfm02_send_cmd(0xC440); // sleep, noch 64 Takte |
ich hänge die Parameter des RFM02 mal ran, ich bin jetzt nicht sicher, ob die Kommentare noch 100% stimmen, also die Kommandowerte notfalls nochmal mit dem RFM02 Datenblatt vergleichen und entsprechend auf den RFM12 übernehmen. Gruß aus Berlin Michael
@Olaf: Mal ne Frage: Laut Beschreibung kann die RF-Probe maximal 150Mhz (how accurate? +/-10% from 200 KHz to 150 MHz). Insofern wäre das Ding doch ungeeignet, zumindest mit den Bauteilwerten wenn ich ne HF mit 433Mhz messen will oder liege ich da falsch? Gruß Wolfgang
Hallo, ich weiß zwar nicht, woher die sehr große Vorliebe für die RFM-Module kommt, aber wir setzen seit Jahren die easy-radio-Module ein: die sind zwar etwas treuer, aber hier gilt wirklich; einbauen, Daten auf der einen Seite rein und wieder auf der anderen Seite raus. Das geht hierbei mit einem Drei-Zeiler, mehr ist nicht notwendig, also bei weitem nicht so ein imenser Aufwand wie bei den RFMs, die wir sehr schnell zur Seite gelegt haben. Ein Versuch mit den easy-radio Modulen schadet nicht und einfacher gehts wirklich nicht ! Gast
Hallo, @Gast (Gast): was verbraucht ein Easy-Radio-Modul als Sender im Sleep-Mode? Mehr oder weniger als ein RFM02 mit seinen 1,5µA? Ich habe dazu im Datenblatt auf Anhieb nichts gefunden. Gruß aus Berlin Michael
Hi nochmal, es funktioniert jetzt endlich. Es lag an nem fehlerhaften Kontakt und daran dass ich FSK nicht auf VDD sondern mit nem Widerstand in Reihe an VDD angeschlossen hatte. Das Modul hatte sich desshalb aufgehängt. Juhuuuuuuu!
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.