Paso 9: Algunos incompletos código de arduino
Este código viene con todos los descargos de responsabilidad generalmente...#include < stdio.h >
#include "pins_arduino.h"
uart de archivo estático = {0};
#define RADIO_MAX_BYTES 27
#define RADIO_CHANNELS 9
#define RADIO_IDLE 0xFF
byte radio_bytes [RADIO_MAX_BYTES];
radio_len de bytes;
radio_ok de bytes;
radio_channels corta sin signo [RADIO_CHANNELS];
byte debug_bytes [RADIO_MAX_BYTES];
debug_len de bytes;
la rutina de instalación se ejecuta una vez al presionar reset:
void setup() {}
Inicializa el pin digital como salida.
pinMode (led, salida);
debug_len = 0;
radio_ok = 0;
debug_len = 0;
noInterrupts();
Serial.Begin(9600);
TCCR2A = 0; no hay salidas de la T2
TCCR2B = 5; div1024, 64uS, 16ms tiempo de espera
OCR2A = 8; SPI recibe 512uS de reset después de último byte recibido
TIMSK2 | = _BV(OCIE2A);
TIMSK2 | = _BV(TOIE2);
TCCR1A = 0;
TCCR1B = 5; Temporizador estándar, Ck = / 1024 = 4s de 64uS resolución, tiempo de espera
TCCR1C = 0;
pinMode (MISO, entrada);
pinMode (MOSI, entrada);
pinMode (SCK, entrada);
pinMode (SS, entrada);
Activar el modo de esclavo SPI
SPCR | = _BV(SPE);
Habilitar interrupciones del spi
SPCR | = _BV(SPIE);
Interrupts();
}
Interrupción de datos SPI
ISR (SPI_STC_vect)
{
c byte = SPDR;
Si (radio_len < RADIO_MAX_BYTES)
{
radio_bytes [radio_len] = c;
radio_len = radio_len + 1;
}
restablecer el TIMER2 para que no tiempo de espera y restablecer el SPI
TCNT2 = 0;
}
Aprox. 0.5ms después del último byte SPI recibida
ISR (TIMER2_COMPA_vect)
{
SPCR & = ~ _BV(SPE);
Si (radio_len == RADIO_MAX_BYTES)
{
para (byte b = 0; b < RADIO_CHANNELS; b ++)
{
radio_channels [b] = (radio_bytes [(b << 1) + 8 + 1] << 8) + radio_bytes [(b << 1) + 8];
}
Copiar hacia fuera del marco SPI a las variables...
radio_ok = 1;
}
debug_len = radio_len;
para (byte b = 0; b < radio_len; b ++)
{
debug_bytes [b] = radio_bytes [b];
}
radio_len = 0;
SPCR | = _BV(SPE);
}
Aprox. 16ms después del último byte SPI recibida
ISR (TIMER2_OVF_vect)
{
Radio está desconectada!
radio_ok = 0;
}
una y otra vez funciona para siempre la rutina bucle:
void loop()
{
c byte = 0;
int n = 0;
Delay(200);
Si (radio_ok == 1)
{
para (n = 0; n < 8; n ++)
{
Serial.Print (debug_bytes [n], DEC);
Serial.Print (radio_channels [n], DEC);
Serial.Print (",");
}
}
otra cosa
{
Serial.Print ("sin datos");
}
Serial.println("");
}