Forum: Mikrocontroller und Digitale Elektronik NRF24L01 scheint nicht zu senden (MAX_RT)


von Thomas (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Leute,

ich bin jetztt schon ewig dabei, einen Fehler zu suchen und komme 
alleine nicht drauf. Ich möchte gernen eine Funkbrücke über zwei 
NRF24L01+ Modulen realisierenh, über welche ich UART Daten übertragen 
kann. Dazu habe ich unter

https://github.com/pvishal/nrf24l01-rc

einen Sourcecode gefunden, den ich für mein Atmega32 Board entsprechend 
angepasst habe. Stand ist jetzt, dass ich bereits DEBUG Ausgaben über 
UART an den PC sende, um zu analysierenh, wo der Fehler liegt.

Sol#bald ich etwas senden möchte, bekommt der Atmega einen Interrupt, 
was ja auch so sein muss. Allerdings wird in der Interrupt Routine 
nichts gesendet, da er aus dem Statusregister vom NRF 1E ausliest...... 
Diesen Wert kann ich aber nicht wiklich analysieren.

Folgenden Codeausschnitt zeigt mein Problem denk ich:

Sobald ich etwas sende, bekomme ich folgende Ausgabe über UART:
1
ISR(INT0_vect)
2
{
3
    uint8_t status;
4
    uint8_t pipe_number;
5
6
    uart_puts("Interrupt\r\n");
7
    CE_LOW();
8
9
    status = get_status();      // Hier wird der status auf UART ausgegeben
10
11
12
    if (status & _BV(RX_DR))
13
    {
14
        uart_puts("Empfang\r\n");
15
        pipe_number =  (status & 0xE) >> 1;
16
        radio_rxhandler(pipe_number);
17
    }
18
    // We can get the TX_DS or the MAX_RT interrupt, but not both.
19
    if (status & _BV(TX_DS))
20
    {
21
        uart_puts("Senden\r\n");
22
        // if there's nothing left to transmit, switch back to receive mode.
23
        transmit_lock = 0;
24
        reset_pipe0_address();
25
        set_rx_mode();
26
27
        // indicate in the history that a packet was transmitted successfully by appending a 1.
28
        tx_history <<= 1;
29
        tx_history |= 1;
30
31
        tx_last_status = RADIO_TX_SUCCESS;
32
33
        // finally, notify the application.
34
        radio_txhandler();
35
    }
36
    else if (status & _BV(MAX_RT))
37
    {
38
        uart_puts("MAX_RT\r\n");
39
        send_instruction(FLUSH_TX, NULL, NULL, 0);
40
41
        transmit_lock = 0;
42
        reset_pipe0_address();
43
        set_rx_mode();
44
        // indicate in the history that a packet was dropped by appending a 0.
45
        tx_history <<= 1;
46
47
        tx_last_status = RADIO_TX_MAX_RT;
48
    }
49
50
    // clear the interrupt flags.
51
    status = _BV(RX_DR) | _BV(TX_DS) | _BV(MAX_RT);
52
    set_register(STATUS, &status, 1);
53
54
    CE_HIGH();
55
}

Sobald ich etwas sende, bekomme ich folgende Ausgabe über UART:

<\0>Device Ready for RX/TX!<\r><\n>
Interrupt<\r><\n>
30MAX_RT<\r><\n>
Data not transmitted. Max retry.Interrupt<\r><\n>
30MAX_RT<\r><\n>
Data not transmitted. Max retry.Interrupt<\r><\n>
30MAX_RT<\r><\n>
Data not transmitted. Max retry.Interrupt<\r><\n>
30MAX_RT<\r><\n>
Data not transmitted. Max retry.Interrupt<\r><\n>
30MAX_RT<\r><\n>
Data not transmitted. Max retry.Interrupt<\r><\n>
30MAX_RT<\r><\n>
Data not transmitted. Max retry.

Könnt ihr mir noch einen Denkanstoss geben, wo der Fehler liegen könnte?

main und radio. c habe ich in den Anhang gepackt.

von Ulrich F. (Gast)


Lesenswert?

Was tust du denn da alles in der ISR?
Das ist doch mit Sicherheit Suboptimal.

von 123 (Gast)


Lesenswert?

Hast du denn alles richtig angeschlossen? Ich habe mir mal ein NRF24L01 
Modul zerschossen, als ich es aus versehen an 5V angeschlossen habe.

von Thomas (Gast)


Lesenswert?

Ich glaube, dass die paar Abfragen in der ISR nicht der Auslöser sind.

Wegen dem Zerschiessen vom Modul das glaueb ich nicht, da ich komplett 
alles auf 3,3V Vcc laufen habe und außerdem bekomme ich ja einen 
Interrupt vom NRF Modul zurück. Aber anscheinend passen die 
zurücjkgegebenen Werte nicht...

von Möbelhändler (Gast)


Lesenswert?

Thomas schrieb:
> Ich glaube, dass die paar Abfragen in der ISR nicht der Auslöser sind.

Entweder du weißt es oder du weißt es nicht. Glauben hilft nicht weiter.

Den Chip kenne ich nicht, daher die Frage: unter welchen Bedingungen 
werden die Interrupt ausgelöst.

von Thomas (Gast)


Lesenswert?

Also,

ich habe grade einmal die Abfragen aus der ISR geschmissen und nur das 
Register ausgelesen und über UART ausgegeben. Es ist immer noch das 
gleiche Problem.

Der Interrupt wird ausgelöst, sobald eine Nachricht empfangen oder 
gesendet worden ist. Dieser kommt dann vom NRF Modul und löst eben den 
Interrupt beim Atmega32 aus.

von Bastler (Gast)


Lesenswert?

Funktioniert das Lesen. Zum Init laut Programm wird zwar gelesen, aber 
wenn dort das falsche Ergebnis kommt, dann hat das keine Auswirkungen. 
Das Lesen der Nutzdaten ist da anspruchsvoller.
Also nochmal: kann man Daten von nRF lesen?

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.