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:
Damit übersetzt sich
zu
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
Lesezeichen