So Ich hab es jetzt nach einer Pause endlich geschafft die Funkmodule zum funken zu bringen. 
Dabei benutze ich eine abgeänderte Software von Benedikt K. http://www.mikrocontroller.net/topic/67273
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(0xC2AB); // 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
}
void rf12_ready(void)
{ cbi(RF_PORT, CS);
while (!(RF_PIN&(1<<SDO))); // wait until FIFO ready
}
void rf12_txdata(unsigned char data)
{
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);
rf12_ready();
rf12_trans(0xB800|(data));
rf12_ready();
rf12_trans(0x8208); // TX off
}
char rf12_rxdata(void)
{
unsigned char data;
rf12_trans(0x82C8); // RX on
rf12_trans(0xCA81); // set FIFO mode
rf12_trans(0xCA83); // enable FIFO
rf12_ready();
data=rf12_trans(0xB000);
rf12_trans(0x8208); // RX off
return data;
}
Leider hat das ganze keine hohe Effektivität. (um die 10%)
Deswegen wollte ich fragen, was ich machen kann um die Genauigkeit zu verbessern?
Dafür spielt ja wahrscheinlich die Funktion rf12_ready() eine Rolle und auch diese
"Dummy Bytes".
Wie genau funktioniert das eigentlich?
rf12_trans(0xB8AA);
rf12_ready();
rf12_trans(0xB8AA);
rf12_ready();
rf12_trans(0xB8AA);
rf12_ready();
rf12_trans(0xB82D);
rf12_ready();
rf12_trans(0xB8D4);
Lesezeichen