Mamba av LinkSprite inser smalt band powerline kommunikation på pcDuino (2 / 4 steg)
Steg 2: Testa koden
Komplett exempelkoden kan vara (mamba_pcduino) att ladda ner här.Viktigaste program enligt följande:
/******************************************************************************************
* Exempelkod för plm1 bibliotek.
*
*
*
* Projektbeskrivning:
* Detta program fungerar som en bro från RS-232 till Powerline och Powerline
*-RS-232. Det har en enkel huvudloop och 4 ISR; 2 för UART
* en för PLM-1 externa mellanjobbet och en för en 10 ms timer.
*
* Avbrottet för PLM-1 externa avbrottet är obligatoriskt. Detta
* ISR hanterar avbrotten krävs för sändning och mottagning.
* Ju högre konfigurationen av PLM-1 baud klassar, desto snabbare
* avbrotten inträffar.
*
* Projektet filer:
* plm1.h deklarationer av plm1 bibliotekets funktioner och definitioner av användaren
* parametrar för konfigurationen av plm1.
* plmcfg.h innehåller definitioner av referens konfiguration strängar för PLM-1.
* ports.h definitioner av makron används för I/O manipulation.
* serial.h deklarationer av funktioner som används för seriell kommunikation.
* spi.h uppräkningar och makron används för SPI kommunikation med PLM-1.
*
* main.c Main funktion och avbryta hanterare av programmet.
* plm.c Libplm bibliotek. Innehåller alla funktioner som används av biblioteket och den
* SPI initiering funktion för användning med PLM-1.
* serial.c funktioner som används för seriell kommunikation.
******************************************************************************************/
#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
/ * Timer 0 konfiguration * /
#define TIMER0_CLOCK_SRC_HZ (F_CPU / 1024) / * Nb fästingar per sekund = 6144000 / 1024 = 6000 * / //15626
#define TIMER0_NB_INT_FOR_100_MS 10 //10 / * Nb fästingar per 100ms = 600 * /
#define TIMER0_NB_TICKS_FOR_100_MS 156 //60 / * Nb fästingar per 100ms = (10 * 60) * /
#define TIMER0_RESET_VALUE (255 - TIMER0_NB_TICKS_FOR_100_MS)
statiska flyktiga bool uart_tx_flag = false; / * Flagga för Tx UART-avbrott. */
statiska flyktiga bool uart_rx_flag = false; / * Flagga för Rx UART-avbrott. */
statiska flyktiga bool timer_flag = false; / * Flagga för Timer avbrott. */
statisk uint8_t uart_rx_data; / * Rx UART data läses. */
uint8_t rx_packet [PLM_RX_MAX_PACKET_SIZE];
uint8_t rx_length = 0;
uint8_t tx_packet [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;
för (j = 0; j < t; j ++)
för (jag = 0; jag < 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);
/ * Initieringen av plm1 bibliotek. */
digitalWrite (ledpin, låg);
plm1_init (); //send_next_nibble
/ * Initieringen av seriell kommunikation. */
digitalWrite (ledpin, hög);
attachInterrupt(0,SIGNAL,RISING);
/ * Aktivera externa avbrott 0 för PLM-1 * /
Serial.Print(5);
}
void loop(void)
{
om ((timecount>100) & & (time_e))
{
time_e = false;
timecount4 = 0;
timer_flag = sant;
timecount = 0;
}
annat if(time_e)
{
IF(timecount4>50)
{
timecount4 = 0;
timecount ++;
}
annat
timecount4 ++;
}
om (Serial.available())
{
uart_rx_data = Serial.read();
Serial.write(uart_rx_data);
uart_rx_flag = sant;
}
IF(uart_tx_flag)
{
uart_tx_flag = false;
serial_tx_buffer_empty();
}
/ * Flaggan true om en Rx UART avbryta uppstod. */
IF(uart_rx_flag)
{
/ * Flagga aktiv om avbrott UART Rx Data tillgängliga var reaised.
* När seriella data tas emot, startas en 10 ms timer.
* Om timern går ut innan ytterligare data tas emot från den
* UART, en överföring startas. */
uart_rx_flag = false;
timer_flag = false;
timecount4 = 0;
timecount = 0;
& & (time_e)
/ * Inaktivera timern avbrott. */
TIMSK0 = 0X00;
/ * Fylla bufferten med data från UART. */
tx_packet [tx_length ++] = uart_rx_data;
/ * Starta 10ms timern. Om timern avbrottet inträffar innan nästa databyte,
* Skicka paketet. I annat fall återställs timern. */
om (tx_length < PLM_TX_MAX_PACKET_SIZE - 10)
{
time_e = sant;
TCNT0 = 0X00; / * Reset timer. */
TIMSK0 = _BV(OCIE0A); / * Aktivera jämför Match A-avbrott. */
}
/ * Om paketstorleken blir nära maximalt, starta direkt överföring. */
annat
{
time_e = false;
/ * plm1_send_data returnerar true om biblioteket har kö paket sucessfully. */
om (plm1_send_data(tx_packet, tx_length)) / /
{
/ * Återställa tx buffert om paketet överfördes framgångsrikt i PLM-1 biblioteket. */
tx_length = 0;
}
annat
// {
TCNT0 = 0X00;
TIMSK0 = _BV(OCIE0A);
// }
}
}
/ * Flagga tis om en timer avbryta uppstod. */
IF(timer_flag)
{
timer_flag = false;
Serial.write(0xdd);
/ * plm1_send_data returnerar true om biblioteket har kö paket sucessfully. */
om (plm1_send_data(tx_packet, tx_length))
{
Serial.write(tx_length);
tx_length = 0;
TIMSK0 = 0X00; / * Inaktivera timern avbrott. */
}
}
/ * När ett paket tas emot, plm1_receive returnerar längden av den
* paket och kopierar innehållet i paketet i rx_packet. */
om ((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; / * Funktionen Main () kommer aldrig tillbaka. */
}
/ * Avbryta tjänsten rutinmässiga provenant de la ligne d'interruption du PLM. */
void SIGNAL(void)
{
plm1_interrupt();
}
/ * 10 ms timer avbrott ISR. */
SIGNAL(TIMER0_COMPA_vect)
//{
Serial.write(0x33);
timer_flag = sant;
//}
UART RX
//*********************************************
/*SIGNAL(USART_RX_vect)
{
uart_rx_flag = sant;
uart_rx_data = UDR0;
}*/
/ * USART Tx buffert Tom ISR. */
/*SIGNAL(USART_UDRE_vect)
{
uart_tx_flag = sant;
}*/