Hallo Stefan,

Ich bin mir ziemlich sicher, dass dies nicht dein Problem auslöst, aber mir ist in deinem Sender-Programm-Auszug folgendes aufgefallen. Du verwendest für die Variable i um festzustellen, ob eine gewisse Zeitspanne vergangen ist. In der Hauptschleife des Programms fragst du dann unter Verwendung des == Operators ab, ob diese Variable einen gewissen Wert (in dem gezeigten Codebeispiel den Wert 61) beträgt. Da du die Variable i in der Hauptschleife liest, aber im Interrupt beschreibst könnte es beim Auslesen zu einer sogenannten Race-Condition kommen. Dadurch kann ein falscher Wert ausgelesen und im worst case der Fall i = 61 überhaupt nicht oder erst verspätet eintreten. Um die Race-Condition zu verhinden gibt es zwei Möglichkeiten:

1) Temporäres Abschalten der Interrupts beim Auslesen der Variable i (Am Besten)
Code:
while(1)
{
  cli(); // disable interrupts
  int const tmp_i = i;
  sei(); // enable interrupts

  if(tmp_i==61)
  { 
  // ... do stuff
Dadurch wird die Race-Condition verhindert.

2) Den >= Operator verwenden (Besser als nichts)
Code:
while(1) {

  if(i>=61)
  { 
  // ... do stuff
Damit werden die Effekte der Race-Condition vermindert. Dennoch sollte man Variante 1 bevorzugen.

Im Empfänger-Programm ist mir aufgefallen, dass du die nSEL-Leitung vor der Hauptschleife auf '0' setzt.
Code:
	// - Baudrate  auf 2400bps einstellen
	UBRRH = 0x01;																	// UBRRH mit Baudrate für 2400bps (Bits 8 - 11) -416
	UBRRL = 0xA0;																	// UBRRL mit Baudrate für 2400bps (Bits 0 - 7)
	
	
	
	PORTB &= ~(1<<PB4);																//nSel auf 0 -> RFM12 wird selektiert
	_delay_us(100);																	//100µs warten
	
	while(1)
Die nSEL Leitung ist beim RFM12b meines Wissens nach aber kein Eingang, mit dem der RFM12b an sich ein- bzw. ausgeschalten wird sondern dient zur Aus/Anwahl des RFM12b während der SPI-Kommunikation mit dem RFM12B. Notwendig wird dies z.B. in einem System, in dem mehrere SPI-Slaves mit dem Microcontroller verbunden sind. Die Auswahl, mit welchem SPI-Slave der Mikrocontroller-SPI-Master kommunizieren will, erfolgt dann über das Setzen der "nSEL"-Leitung des jeweiligen SPI-Slave.

Und beim weiteren Analysieren des Empfängers ist mir noch aufgefallen, dass du nur dann versuchst, etwas aus dem RFM12b auszulesen, wenn die Bedingung PB6 == 1 erfüllt ist. Abgesehen davon, dass ich den Sinn der Bedingung nicht verstehe (Denn PB6 = MISO = Eingang der SPI-Schnittstelle am SPI-Master und sollte daher mit SDO des RFM12b verbunden sein - Wie soll die Abfrage ob dieser Pin = 1 ist damit zusammenhängen, ob ein Byte empfangen wurde?) sehe ich noch ein ganz anderes Problem: PB6 ist in der Datei iom32.h so definiert:
Code:
#define PB6     6
Damit übersetzt sich
Code:
if(PB6 == 1)
zu
Code:
if(6 == 1)
Diese Bedingung kann niemals wahr sein, daher wird der zugehörige Code nie ausgeführt und keine Daten über die serielle Schnittstelle versendet. Wenn du wirklich abfragen willst, ob am Pin 6 von PORTB der Wert 1 anliegt so funktioniert das so:
Code:
if(PINB & (1<<PB6))
Hoffe, dir damit weitergeholfen zu haben. Viel Erfolg