Buon pomeriggio,
ho un grosso problema di conflitto tra il Timer1 dell'Atmega2560 e il trasmettitore di radio frequenza (433Mhz).
Vorrei far comunicare due arduino (un arduino MEGA - trasmettitore, un arduino nano - ricevitore) affinchè possa comandare un relè in modo wireless con distanza di circa 10 metri.
Passiamo al dunque. Leggendo nel forum tempo fa, ho trovato molto utile un post di dalubar dove riusciva a generare un interrupt ogni secondo tramite il timer1 dell'atmega328. Grandissima cosa per me.
Utilizzando un arduino mega come trasmettitore con questi collegamenti:
ARDUINO TRASMETTITORE
Vcc Vcc
GND GND
24 DATA
e caricandogli questo programma:
//PROGRAMMA TRASMETTITORE RF
#include <RH_ASK.h>
int variabile = 1;
RH_ASK rf(2000, 11, 24); //(speed, pinRx, pinTx);
const char *msgON = "ON";
const char *msgOFF = "OFF";
void setup() {
rf.init();
}
void loop(){
if (variabile == 1)
{
rf.send((uint8_t *) msgON, strlen(msgON));
rf.waitPacketSent();
delay(50);
}
}
sono riuscito a trasmettere il messaggio ad un arduino nano collegando il ricevitore:
ARDUINO RICEVITORE
Vcc Vcc
GND GND
11 DATA
e caricandogli questo programma:
//PROGRAMMA RICEVITORE RF
#include <RH_ASK.h>
RH_ASK rf(2000, 11, 24); //(speed, pinRx, pinTx);
void setup() {
Serial.begin(9600);
rf.init();
}
void loop() {
uint8_t buffer[RH_ASK_MAX_MESSAGE_LEN];
uint8_t bufferLength = sizeof(buffer);
if (rf.recv(buffer, &bufferLength)) {
buffer[bufferLength] = '\0';
if (strncmp((char *) buffer, "ON", bufferLength) == 0) {
Serial.println("ok..on");;
} else {
Serial.println("ok..off");
}
}
delay(10);
}
Fin qui, funziona tutto.
Il problema si pone quando nel trasmettitore vado a manipolare registri del timer1 affinchè possa generare un interrupt ogni secondo, quindi in setup aggiungo la manipolazione e divenendo il programma cosi':
//PROGRAMMA MODIFICATO CON MANIPOLAZIONE REGISTRI TIMER1 PER TRASMETTITORE RF
#include <RH_ASK.h>
int variabile = 1;
RH_ASK rf(2000, 11, 24); //(speed, pinRx, pinTx);
const char *msgON = "ON";
const char *msgOFF = "OFF";
void setup() {
TIMSK1 &= ~(1 << TOIE1);
TCCR1A &= ~((1 << WGM11) | (1 << WGM10));
TCCR1B &= ~((1 << WGM12) | (1 << WGM13));
TIMSK1 &= ~(1 << OCIE1A);
TCCR1B |= (1 << CS12) | (1 << CS10);
TCCR1B &= ~(1 << CS11);
TCNT1H = 0xC2;
TCNT1L = 0xF7;
TIMSK1 |= (1 << TOIE1);
rf.init();
}
void loop() {
if (variabile == 1)
{
rf.send((uint8_t *) msgON, strlen(msgON));
rf.waitPacketSent();
delay(50);
}
}
arduino cosi s'impalla e non funziona più.
E' possibile far funzionare sia il timer1 che la radio frequenza? ![]()
Spero vivamente possiate aiutarmi e spero anche di aver dato info sufficienti al problema.
Grazie!!!