Forum: Mikrocontroller und Digitale Elektronik Zwischen Senden und Empfangen umschalten


von Cetin A. (exaware)


Angehängte Dateien:

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

: Verschoben durch User
von Cetin A. (exaware)


Lesenswert?

Also es scheint nicht an den Modulen zu liegen. Wenn ich diese abstecke 
und wieder anstecke, tut sich nichts. Erst wenn ich die ATmegas resete, 
tut sich was. Ob ich mit dem Taster resete oder per ISP-Programmer oder 
sogar per Watchdog, alles geht. Muss ich irgendwas an meinem SPI ändern?

: Bearbeitet durch User
von Cetin A. (exaware)


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?

von Cetin A. (exaware)


Lesenswert?

Ich habe es endlich hinbekommen. Ich werde jetzt nach der genauen 
Ursache suchen. Ich melde mich wieder, wenn ich mehr weiß.

von Cetin A. (exaware)


Angehängte Dateien:

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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.