Stap 2: Test Code
De volledige voorbeeldcode kan worden (mamba_pcduino) hier downloaden.De belangrijkste programma als volgt:
/******************************************************************************************
* Voorbeeldcode voor plm1 bibliotheek.
*
*
*
-Project beschrijving:
* Dit programma fungeert als een brug van RS-232 naar Powerline en Powerline
* tot en met RS-232. Het beschikt over een eenvoudige hoofdlus en 4 ISR; 2 voor de UART
* een voor de externe interrupt van PLM-1 en een voor een 10 ms-timer.
*
-Onderbreekt voor de PLM-1 externe interrupt is verplicht. Dit
* ISR behandelt de interrupts die nodig zijn voor de transmissie en ontvangst.
* Hoe hoger de configuratie van de PLM-1 baud rate, des te sneller
* de interrupts zal optreden.
*
-Project bestanden:
* de plm1.h van de plm1 bibliotheekfuncties declaraties en definities van gebruiker
* parameters voor de configuratie van plm1.
* plmcfg.h bevat definities van referentie configuratie tekenreeksen voor de PLM-1.
* ports.h definities van macro's gebruikt voor I/O manipulatie.
* serial.h verklaringen van functies die worden gebruikt voor seriële communicatie.
* spi.h opsommingen en macro's die zijn gebruikt voor SPI communicatie met de PLM-1.
*
* main.c Main functie en interrupt handlers van het programma.
* plm.c Libplm bibliotheek. Bevat alle functies die worden gebruikt door de bibliotheek en de
* SPI initialisatie functie voor gebruik met de PLM-1.
* serial.c functies gebruikt voor seriële communicatie.
******************************************************************************************/
#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 configuratie * /
#define TIMER0_CLOCK_SRC_HZ (F_CPU / 1024) / * Nb teken per seconde = 6144000 / 1024 = 6000 * / //15626
#define TIMER0_NB_INT_FOR_100_MS 10 //10 / * Nb teken per 100ms = 600 * /
#define TIMER0_NB_TICKS_FOR_100_MS 156 //60 / * Nb teken per 100ms = (10 * 60) * /
#define TIMER0_RESET_VALUE (255 - TIMER0_NB_TICKS_FOR_100_MS)
statische vluchtige bool uart_tx_flag = false; / * Vlag voor Tx UART-interrupt. */
statische vluchtige bool uart_rx_flag = false; / * Vlag voor Rx UART-interrupt. */
statische vluchtige bool timer_flag = false; / * Vlag voor Timer interrupts. */
statische uint8_t uart_rx_data; / * Rx UART-gegevens lezen. */
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;
voor (j = 0; j < t; j ++)
voor (ik = 0; ik < 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);
/ * Initialisatie van de plm1 bibliotheek. */
digitalWrite (ledpin, laag);
plm1_init (); //send_next_nibble
/ * Initialisatie van de seriële communicatie. */
digitalWrite (ledpin, hoge);
attachInterrupt(0,SIGNAL,RISING);
/ * Activeren van externe interrupt 0 voor PLM-1 * /
Serial.Print(5);
}
void loop(void)
{
Als ((timecount>100) & & (time_e))
{
time_e = false;
timecount4 = 0;
timer_flag = true;
timecount = 0;
}
anders if(time_e)
{
if(timecount4>50)
{
timecount4 = 0;
timecount ++;
}
anders
timecount4 ++;
}
Als (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();
}
/ * Vlag true als een Rx UART-interrupt is opgetreden. */
if(uart_rx_flag)
{
/ * Vlag actief als interrupt UART Rx Data beschikbaar was reaised.
* Wanneer de seriële gegevens worden ontvangen, wordt een 10 ms timer gestart.
* Als de timer is afgelopen voordat aanvullende gegevens wordt ontvangen van de
* UART, een transmissie wordt gestart. */
uart_rx_flag = false;
timer_flag = false;
timecount4 = 0;
timecount = 0;
& & (time_e)
/ * Timer onderbreken uitschakelen. */
TIMSK0 = 0X00;
/ * De buffer te vullen met gegevens van de UART. */
tx_packet [tx_length ++] = uart_rx_data;
/ * De 10ms timer te starten. Als de timer interrupt treedt op voordat de volgende gegevensbyte,
* Stuur het pakket. Anders is de tijd op beginstand zetten. */
Als (tx_length < PLM_TX_MAX_PACKET_SIZE - 10)
{
time_e = true;
TCNT0 = 0X00; / * Reset-timer. */
TIMSK0 = _BV(OCIE0A); / * Enable vergelijken Match A interrupt. */
}
/ * Als de pakketgrootte wordt steeds in de buurt van het maximum, onmiddellijk de overdracht starten. */
anders
{
time_e = false;
/ * plm1_send_data retourneert de waarde true als de bibliotheek is in de wachtrij de packet sucessfully. */
Als (plm1_send_data(tx_packet, tx_length)) / /
{
/ * Tx buffer's resetten indien ze het pakket werd met succes overgebracht naar de bibliotheek van PLM-1. */
tx_length = 0;
}
anders
// {
TCNT0 = 0X00;
TIMSK0 = _BV(OCIE0A);
// }
}
}
/ * Vlag tue als een interrupt timer is opgetreden. */
if(timer_flag)
{
timer_flag = false;
Serial.write(0xdd);
/ * plm1_send_data retourneert de waarde true als de bibliotheek is in de wachtrij de packet sucessfully. */
Als (plm1_send_data(tx_packet, tx_length))
{
Serial.write(tx_length);
tx_length = 0;
TIMSK0 = 0X00; / * Timer onderbreken uitschakelen. */
}
}
/ * Als een pakket wordt ontvangen, plm1_receive geeft de lengte van de
* pakket en kopieën van de inhoud van het pakket in rx_packet. */
Als ((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;
}
// }
keren 0; / * De main() functie zal nooit meer terugkeren. */
}
/ * Interrupt Service Routine provenant de la ligne d'interruption du PLM. */
VOID SIGNAL(void)
{
plm1_interrupt();
}
/ * 10 ms timer onderbreken 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 leeg ISR. */
/*Signal(USART_UDRE_vect)
{
uart_tx_flag = true;
}*/