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
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
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?
Ich habe es endlich hinbekommen. Ich werde jetzt nach der genauen Ursache suchen. Ich melde mich wieder, wenn ich mehr weiß.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.