Paso 2: Código de prueba
El código completo puede ser (mamba_pcduino) para descargar aquí.Las principales del programa como sigue:
/******************************************************************************************
* Código de biblioteca plm1.
*
*
*
* Descripción del proyecto:
* Este programa actúa como puente de RS-232 a Powerline y Powerline
a la RS-232. Cuenta con un simple bucle principal y 4 ISR; 2 para el UART
* una para la interrupción externa de PLM-1 y otra para un temporizador de 10 ms.
*
* La interrupción para la interrupción externa de PLM-1 es obligatoria. Esto
* ISR maneja las interrupciones necesarias para la transmisión y recepción.
* Cuanto mayor sea la configuración de la velocidad en baudios PLM-1 tasa, más rápido
* las interrupciones se producirán.
*
* Archivos de proyecto:
* plm1.h las declaraciones de las funciones de biblioteca plm1 y definiciones de usuario
* parámetros para la configuración del plm1.
* plmcfg.h contiene las definiciones de cadenas de configuración de referencia para el PLM-1.
* ports.h las definiciones de macros utilizadas para la manipulación de I/O.
* serial.h las declaraciones de funciones utilizadas para la comunicación serial.
* spi.h las enumeraciones y las macros que se utiliza para la comunicación SPI con el PLM-1.
*
* main.c principal función y la interrupción de los controladores del programa.
* plm.c biblioteca de Libplm. Contiene todas las funciones utilizadas por la biblioteca y la
* Función de inicialización SPI para el uso con el PLM-1.
* serial.c funciones utilizadas para la comunicación serial.
******************************************************************************************/
#include < stdio.h >
#include < stdbool.h >
#include < string.h >
#include < core.h >
#include "spi.h"
#include "plm1.h"
#define ledpin 6
#define MOSI 11
#define MISO 12
#define SCK 13
/ * Configuración del timer 0 * /
#define TIMER0_CLOCK_SRC_HZ (F_CPU / 1024) / * Nb garrapatas por segundo = 6144000 / 1024 = 6000 * / //15626
#define TIMER0_NB_INT_FOR_100_MS 10 //10 / * Nb garrapatas por 100ms = 600 * /
#define TIMER0_NB_TICKS_FOR_100_MS 156 //60 / * Nb garrapatas por 100 ms = (10 * 60) * /
#define TIMER0_RESET_VALUE (255 - TIMER0_NB_TICKS_FOR_100_MS)
estático volátil bool uart_tx_flag = false; / * Bandera de interrupción Tx UART. */
estático volátil bool uart_rx_flag = false; / * Bandera de interrupción UART Rx. */
estático volátil bool timer_flag = false; / * Bandera de la interrupción de temporizador. */
uart_rx_data de uint8_t estática; / * Lectura de datos UART Rx. */
rx_packet de uint8_t [PLM_RX_MAX_PACKET_SIZE];
uint8_t rx_length = 0;
tx_packet de uint8_t [PLM_TX_MAX_PACKET_SIZE];
uint8_t tx_length = 0;
uint32_t timecount4, timecount;
extern char e;
bool time_e;
void delay_us(int t)
{
int i;
int j;
para (j = 0; j < t; j ++)
para (i = 0; i < 1000; i ++);
}
void setup()
{
pinMode(MOSI,OUTPUT);
pinMode(SCK,OUTPUT);
pinMode(nPLM_RESET,OUTPUT);
pinMode(PLM_CS,OUTPUT);
pinMode(MISO,INPUT);
pinMode(ledpin,OUTPUT);
serial_init();
spi_init (SPI_SPEED_F16);
/ * Inicialización de la biblioteca plm1. */
digitalWrite (ledpin, LOW);
plm1_init (); //send_next_nibble
/ * Inicialización de la comunicación serial. */
digitalWrite (ledpin, HIGH);
attachInterrupt(0,SIGNAL,RISING);
/ * Activar interrupción externa 0 para PLM-1 * /
Serial.Print(5);
}
void loop(void)
{
Si ((timecount>100) & & (time_e))
{
time_e = false;
timecount4 = 0;
timer_flag = true;
timecount = 0;
}
if(time_e) más
{
if(timecount4>50)
{
timecount4 = 0;
timecount ++;
}
otra cosa
timecount4 ++;
}
Si (Serial.available())
{
uart_rx_data = Serial.read();
Serial.Write(uart_rx_data);
uart_rx_flag = true;
}
if(uart_tx_flag)
{
uart_tx_flag = false;
serial_tx_buffer_empty();
}
/ * True bandera si se produjo una interrupción de UART Rx. */
if(uart_rx_flag)
{
/ * Activa bandera si fue expresada interrupción UART Rx datos disponibles.
Cuando se recibieron los datos en serie, se inicia un temporizador de 10 ms.
* Si el temporizador expira antes de que se recibieron datos adicionales de la
* UART, una transmisión es iniciado. */
uart_rx_flag = false;
timer_flag = false;
timecount4 = 0;
timecount = 0;
& & (time_e)
/ * Deshabilitar la interrupción de temporizador. */
TIMSK0 = 0 X 00;
/ * Rellena el búfer con los datos de la UART. */
tx_packet [tx_length ++] = uart_rx_data;
/ * Iniciar el temporizador de 10 ms. Si la interrupción de temporizador se produce antes el siguiente byte de datos,
* enviar el paquete. De lo contrario, el temporizador se restablece. */
Si (tx_length < PLM_TX_MAX_PACKET_SIZE - 10)
{
time_e = true;
TCNT0 = 0 X 00; / * Contador de reset. */
TIMSK0 = _BV(OCIE0A); / * Habilitar partido comparar A interrupción. */
}
/ * Si el tamaño del paquete se está cerca del máximo, iniciar inmediatamente la transmisión. */
otra cosa
{
time_e = false;
/ * plm1_send_data devuelve true si la biblioteca ha en cola los paquetes correctamente. */
Si (plm1_send_data(tx_packet, tx_length)) / /
{
/ * Resetear el buffer tx si el paquete fue transferido con éxito a la biblioteca de PLM-1. */
tx_length = 0;
}
otra cosa
// {
TCNT0 = 0 X 00;
TIMSK0 = _BV(OCIE0A);
// }
}
}
/ * Tue la bandera si se produjo una interrupción de temporizador. */
if(timer_flag)
{
timer_flag = false;
Serial.Write(0xdd);
/ * plm1_send_data devuelve true si la biblioteca ha en cola los paquetes correctamente. */
Si (plm1_send_data(tx_packet, tx_length))
{
Serial.Write(tx_length);
tx_length = 0;
TIMSK0 = 0 X 00; / * Deshabilitar la interrupción de temporizador. */
}
}
/ * Cuando se recibe un paquete, plm1_receive devuelve la longitud de la
* paquetes y copias el contenido del paquete en rx_packet. */
Si ((rx_length = plm1_receive(rx_packet)))
{
output_serial_data (rx_packet, rx_length);
PLM.RX.write_next=0;
PLM.RX.read_next=0;
PLM.RX.pkt_end=0;
}
// }
return 0; / * La función main() no devolverá. */
}
/ * Interrumpir la rutina de servicio derivados de la ligne d'interruption du PLM. */
void SIGNAL(void)
{
plm1_interrupt();
}
/ * interrupción de temporizador de 10 ms ISR */
Signal(TIMER0_COMPA_vect)
//{
Serial.Write(0x33);
timer_flag = true;
//}
UART RX
//*********************************************
/*Signal(USART_RX_vect)
{
uart_rx_flag = true;
uart_rx_data = UDR0;
}*/
/ * USART Tx Buffer vacío ISR. */
/*Signal(USART_UDRE_vect)
{
uart_tx_flag = true;
}*/