#include #include #include #define SET(sfr, bit) ({ __asm__ __volatile__ ("sbi %0, %1"::"I" _SFR_IO_ADDR(sfr),"n" (bit)); }) #define CLEAR(sfr, bit) ({ __asm__ __volatile__ ("cbi %0, %1"::"I" _SFR_IO_ADDR(sfr),"n" (bit)); }) #define SCK 5 // SPI clock #define SDO 4 // SPI Data output (RFM12B side) #define SDI 3 // SPI Data input (RFM12B side) #define SS 2 #define nSEL_INIT SET(DDRD,5) #define nSEL_HI SET(PORTD,5) #define nSEL_LOW CLEAR(PORTD,5) void portInit(void) { nSEL_HI; nSEL_INIT; SET(PORTB,SS); // Slave Select immer high halten, damit SPI im Master-Mode bleibt SET(PORTB,SDI); CLEAR(PORTB,SCK); DDRB = (1<> 8; while (!(SPSR & _BV(SPIF))) ; reply = SPDR << 8; SPDR = cmd; while (!(SPSR & _BV(SPIF))) ; reply |= SPDR; nSEL_HI; // SPI_SS High return reply; } void rfInit(void) { writeCmd(0xC000); // AVR CLK: 1MHz writeCmd(0x80D7); // Enable FIFO writeCmd(0xC2AB); // Data Filter: internal writeCmd(0xCA81); // Set FIFO mode writeCmd(0xE000); // disable wakeuptimer writeCmd(0xC800); // disable low duty cycle writeCmd(0xC4F7); // AFC settings: autotuning: -10kHz...+7,5kHz writeCmd(0xA620); // freq select writeCmd(0x9400|((4&7)<<5)|((1&3)<<3)|(4&7)); writeCmd(0xC600|((344828UL/19200)-1)); // R=344828/Baud-1 writeCmd(0x9800|(0&7)|((6&15)<<4)); } void send_RS232(unsigned int data) { unsigned char i; unsigned int nibble; for(i=0; i<4; i++) { nibble = data & 0xF000; nibble = nibble>>12; while ( !( UCSRA & (1<9) { UDR = 65+nibble-10; } else { UDR = 0x30+nibble; } data = data<<4; } while ( !( UCSRA & (1<>8); // Set the baudrate to 4800 bps using 1MHz system clock => 12 UBRRL = (unsigned char) 12; UCSRB = ( ( 1 << RXCIE ) | ( 1 << RXEN ) | ( 1 << TXEN ) ); // Enable UART receiver and transmitter UCSRC = (1< clk/4 is ok for the RF12's SPI for(k=0;k<1000;k++)for(j=0;j<123;j++); rfInit(); while(1) { writeCmd(0x82C8); // RX on writeCmd(0xCA81); // set FIFO mode writeCmd(0xCA83); // enable FIFO for (i=0; i<10; i++) { data = rfRecv(); } writeCmd(0x8208); // RX off } return 0; }