Zwischen Senden und Empfangen umschalten

#3471855
Lesenswert?

Hallo zusammen,

ich habe hier zwei Pollin-Boards mit jeweils einem RFM12 zur 
Kommunikation.
Auf den Boards ist der ATmega8 drauf. Auf beiden Boards ist der gleiche 
Code drauf, mit dem ich senden oder empfangen kann. Beide Boards leiten 
die empfangenen Daten über die UART-Schnittstelle an den PC weiter.
Auf Tastendruck wird der Text "Hello World" gesendet. Die Übertragung 
ist soweit stabil und die gewünschten Daten kommen an.

Nun zu meinem Problem:
Wenn ich nun z.B. auf Board 1 den Taster drücke, so sendet dieser an 
Board 2 den Text "Hello World". Board 2 bekommt den Text und zeigt ihn 
an. Nun kann ich aber nur noch mit Board 1 senden und mit Board 2 
empfangen. Wenn ich jedoch z.B. von Board 2 senden möchte, muss ich 
beide Boards reseten. Dann kann ich von Board 2 senden, dann aber nicht 
anders rum bis zum nächsten Reset. Wenn ich also zwischen Senden und 
Empfangen umschalten möchte, muss ich die Boards reseten.

Ich habe bereits einige Dinge, die ich hier im Forum gefunden habe, 
leider ohne Erfolg probiert. Könnt ihr euch bitte mal meinen Code 
anschauen, und mir sagen was ich falsch mache?

Gruß
Cetin
Angehängte Dateien:
#3472455
Lesenswert?

So habe nun was gefunden, das Programm bleibt an folgender
Zeile hängen:

while(PIND & (1<<PIND2));
1
unsigned char RFM12_Read(void)
2
{
3
  unsigned short FIFO_data;              // Typendeklaration
4
  RFM12_Write(0x0000);                // Status Register lesen (Interrupts werden gelöscht)
5
  while(PIND & (1<<PIND2));              // Warten bis Modul bereit
6
  FIFO_data=RFM12_Write(0xB000);            // FIFO-Daten einlesen (16Bit)
7
  return(FIFO_data&0x00FF);              // LOW-Byte der FIFO-Daten zurückgeben (Datenbyte)
8
}

Hat jemand einen Tip?
#3473426
Lesenswert?

Da bin ich wider. Der Fehler hatte mehrere Faktoren. Habe nun folgendes
gemacht:

1. Empfangsroutine in die Hauptschleife verlagert. In der ISR wird nur 
noch ein Flag gesetzt. Somit blieb das Programm nicht mehr an folgender 
Zeile hängen:
1
while(PIND & (1<<PIND2));

2. Dann habe ich es nochmal mit folgenden Sequenzen probiert um den 
Sender bzw. Empfänger ein/auszuschalten.
1
void rfm12_rx_on()
2
{
3
  rfm12_write(0x82C8);                  // Empfänger einschalten
4
  _delay_ms(1);                         // Warten bis Empfänger an ist
5
  rfm12_write(0xCA81);                  // FIFO initialisieren
6
  rfm12_write(0xCA83);                  // FIFO aktivieren
7
}
8

9
void rfm12_tx_on()
10
{
11
  rfm12_write(0x8208);                  // Empfänger ausschalten
12
  _delay_ms(1);                         // Warten bis Empfänger aus ist
13
  rfm12_write(0x0000);                  // Status Register lesen (Interrupts werden gelöscht)
14
  rfm12_write(0x8271);                  // Sender aktivieren
15
}

Das wars eigentlich schon. Im Anhang nun meine neue Version die 
funktioniert.

Gruß
Cetin
Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren