Probier die mal:
Die habe ich irgendwo auf http://www.mikrocontroller.net/articles/RFM12 gefunden. und ein bisschen an der Konfiguration rumgespielt.Code:#include <avr/io.h> #include <avr/interrupt.h> #include "rfm12.h" #define F_CPU 1000000UL #include <util/delay.h> #ifndef cbi #define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit)) #endif #ifndef sbi #define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit)) #endif #define IRQ_Port PORTD #define IRQ_Pin PIND #define IRQ_DDR DDRD #define IRQ 2 #define IRQ_Output() IRQ_DDR |= (1<<IRQ) #define IRQ_Input() IRQ_DDR&=~ (1<<IRQ) #define IRQ_High() IRQ_Port|= (1<<IRQ) #define IRQ_Low() IRQ_Port&=~(1<<IRQ) #define IRQ_Wait_Low() while(IRQ_Pin&(1<<IRQ)) #define RF_PORT PORTB #define RF_DDR DDRB #define RF_PIN PINB #define SDI 5 #define SCK 7 #define CS 4 #define SDO 6 void _delay_s(int s) { for (unsigned char i=0; i<s*100; i++) _delay_ms(10); } unsigned short rf12_trans(unsigned short wert) { unsigned short werti=0; unsigned char i; cbi(RF_PORT, CS); for (i=0; i<16; i++) { if (wert&32768) sbi(RF_PORT, SDI); else cbi(RF_PORT, SDI); werti<<=1; if (RF_PIN&(1<<SDO)) werti|=1; sbi(RF_PORT, SCK); wert<<=1; _delay_us(0.3); cbi(RF_PORT, SCK); } sbi(RF_PORT, CS); return werti; } void rf12_init(void) { RF_DDR=(1<<SDI)|(1<<SCK)|(1<<CS); RF_PORT=(1<<CS); IRQ_Input(); for (unsigned char i=0; i<10; i++) _delay_ms(10); // wait until POR done rf12_trans(0xC0E0); // AVR CLK: 10MHz rf12_trans(0x80D7); // Enable FIFO rf12_trans(0xC2AC); // Data Filter: internal rf12_trans(0xCA81); // Set FIFO mode rf12_trans(0xE000); // disable wakeuptimer rf12_trans(0xC800); // disable low duty cycle rf12_trans(0xC4F7); // AFC settings: autotuning: -10kHz...+7,5kHz rf12_trans(0x9850); // 0 dB, fsk:15kHz rf12_trans(0xC623); // 10 kbps } void rf12_ready(void) { cbi(RF_PORT, CS); while (!(RF_PIN&(1<<SDO))); // wait until FIFO ready } void rf12_txdata(unsigned char *data, unsigned char number) { unsigned char i; rf12_trans(0x8238); // TX on rf12_ready(); rf12_trans(0xB8AA); rf12_ready(); rf12_trans(0xB8AA); rf12_ready(); rf12_trans(0xB8AA); rf12_ready(); rf12_trans(0xB82D); rf12_ready(); rf12_trans(0xB8D4); for (i=0; i<number; i++) { rf12_ready(); rf12_trans(0xB800|(*data++)); } rf12_ready(); rf12_trans(0xB8AA); rf12_ready(); rf12_trans(0x8208); // TX off } void rf12_rxdata(unsigned char *data, unsigned char number) { unsigned char i; rf12_trans(0x82C8); // RX on rf12_trans(0xCA81); // set FIFO mode rf12_trans(0xCA83); // enable FIFO for (i=0; i<number; i++) { rf12_ready(); *data++=rf12_trans(0xB000); } rf12_trans(0x8208); // RX off }







Zitieren


Lesezeichen