Ich habe jetzt dieses Tutorial benutzt: http://www.mikrocontroller.net/artic...24L01_Tutorial
In der Wl-Module.c hab ich noch den Interrupt für den Atmega2560 hinzugefügt.
Code:
#if defined(__AVR_ATmega2560__)
// Initialize external interrupt on port PK6 (PCINT22)
DDRK &= ~(1<<PK6);
PCMSK2 = (1<<PCINT22);
PCICR = (1<<PCIE2);
#endif
Bei dem Sender habe ich
Code:
#if defined(__AVR_ATmega8__)
ISR(INT0_vect)
#endif // __AVR_ATmega8__
#if defined(__AVR_ATmega88A__)
ISR(INT0_vect)
#endif // __AVR_ATmega88A__
#if defined(__AVR_ATmega168__)
ISR(PCINT2_vect)
#endif // __AVR_ATmega168__
durch
ersetzt.
Mein Sender sieht jetzt so aus:
Code:
#define F_CPU 16000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <stdlib.h>
#include <spi.h>
#include <spi.c>
#include <wl_module.h>
#include <wl_module.c>
#include <nRF24L01.h>
volatile uint8_t timercounter;
int main(void)
{
uint8_t payload[wl_module_PAYLOAD]; //Array for Payload
wl_module_init(); //initialize nRF24L01+ Module
_delay_ms(50); //wait for nRF24L01+ Module
sei();
wl_module_tx_config(wl_module_TX_NR_0); //Config Module
while(1)
{
_delay_ms(1000);
payload[0] = 5;
wl_module_send(payload,wl_module_PAYLOAD);
}
}
ISR(PCINT2_vect)
{
uint8_t status;
// Read wl_module status
wl_module_CSN_lo; // Pull down chip select
status = spi_fast_shift(NOP); // Read status register
wl_module_CSN_hi; // Pull up chip select
if (status & (1<<TX_DS)) // IRQ: Package has been sent
{
wl_module_config_register(STATUS, (1<<TX_DS)); //Clear Interrupt Bit
PTX=0;
}
if (status & (1<<MAX_RT)) // IRQ: Package has not been sent, send again
{
wl_module_config_register(STATUS, (1<<MAX_RT)); // Clear Interrupt Bit
wl_module_CE_hi; // Start transmission
_delay_us(10);
wl_module_CE_lo;
}
if (status & (1<<TX_FULL)) //TX_FIFO Full <-- this is not an IRQ
{
wl_module_CSN_lo; // Pull down chip select
spi_fast_shift(FLUSH_TX); // Flush TX-FIFO
wl_module_CSN_hi; // Pull up chip select
}
}
Under der Empfänger so:
Code:
#define F_CPU 16000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <stdlib.h>
#include <spi.h>
#include <spi.c>
#include <wl_module.h>
#include <wl_module.c>
#include <nRF24L01.h>
volatile uint8_t PTX; //Global Variable
char itoabuffer[20];
int main(void)
{
DDRB |= (1<<PB5);
uint8_t payload[wl_module_PAYLOAD]; //holds the payload
uint8_t nRF_status; //STATUS information of nRF24L01+
wl_module_init(); //Init nRF Module
_delay_ms(50); //wait for Module
sei(); //activate Interrupts
wl_module_config(); //config nRF as RX Module, simple Version
while(1)
{
while (!wl_module_data_ready()); //waits for RX_DR Flag in STATUS
nRF_status = wl_module_get_data(payload); //reads the incoming Data to Array payload
if (payload[0] == 5)
{
PORTB |= (1<<PB5);
}
}
}
Nach der Übertragung soll eine LED auf PB5 geschaltet werden allerdings tut sich nichts.
Hoffe mir kann jemand helfen.
Mfg Dennis
Lesezeichen