NucleoF401RE A/D test. 5msec sampling (by timer interrupt), transmit via XBee with 7 bytes message format.

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 #include "mbed.h"
00002 
00003 unsigned char rxFIFO[256], txFIFO[256], raw_data[6];
00004 unsigned char rx_top, rx_end, tx_top, tx_end, phase;
00005 int timer_value[6];
00006 
00007 RawSerial xbee(PA_2, PA_3);
00008 Ticker timer_setup;
00009 DigitalOut myled(LED1);
00010 AnalogIn analog_value0(A0);
00011 AnalogIn analog_value1(A1);
00012 AnalogIn analog_value2(A2);
00013 AnalogIn analog_value3(A3);
00014 
00015 void timer_interrupt(){
00016     int i;
00017     for (i=0; i<6; i++) ++timer_value[i] &= 65535;
00018 }
00019 
00020 void tx_fifo_check(){
00021     if(xbee.writeable() == 1){
00022         if(tx_top != tx_end){
00023             xbee.putc(txFIFO[tx_end]);
00024             ++tx_end &= 255;
00025         }
00026     }
00027 }
00028 
00029 int rx_fifo_check(){
00030     unsigned char data;
00031     if(rx_top != rx_end){
00032         data = rxFIFO[rx_end];
00033         ++rx_end &= 255;
00034         if (data < 33){
00035             phase = 0;
00036             return(1);
00037         }
00038         raw_data[phase] = data;
00039         if(++phase > 5) phase = 0;
00040         return(0);
00041     }
00042     return(0);
00043 }
00044 
00045 void rx_fifoset(void){
00046     rxFIFO[rx_top] = xbee.getc();
00047     ++rx_top &= 255;
00048 }
00049 
00050 void tx_fifoset(unsigned char data){
00051     txFIFO[tx_top] = data;
00052     ++tx_top &= 255;
00053 }
00054 
00055 unsigned char hex_conv(unsigned char data){
00056     data &= 15;
00057     if(data < 10) return(data+48);
00058     else return(data+55);
00059 }
00060 
00061 unsigned char conv_hex(unsigned char data){
00062     if((data > 47) && (data < 58)) return(data-48);
00063     else if((data > 64) && (data < 71)) return(data-55);
00064     return(0);
00065 }
00066 
00067 void tx_message(int data){
00068     int i;
00069     for (i=0; i<6; i++) tx_fifoset(hex_conv((data>>(4*(5-i))) & 15));
00070     tx_fifoset(13);
00071 }
00072 
00073 int main(){
00074     int i, sum;
00075     i = 0;
00076     rx_top = rx_end = tx_top = tx_end = phase = 0; 
00077     for (i=0; i<5; i++) timer_value[i] = 0;
00078     xbee.baud(38400);
00079     xbee.attach(&rx_fifoset, xbee.RxIrq);
00080     timer_setup.attach_us(&timer_interrupt, 50);
00081     while(1){
00082         if(timer_value[2] > 99){
00083             timer_value[2] = 0;
00084             uint16_t data = analog_value3.read_u16();
00085             tx_message(data);
00086         }
00087         if(timer_value[0] > 9999){
00088             timer_value[0] = 0;
00089             myled = !myled;
00090         }
00091         tx_fifo_check();
00092         if(rx_fifo_check() == 1){
00093             sum = 0;
00094             for (i=0; i<6; i++) sum += conv_hex(raw_data[i])<<(4*(5-i));
00095             tx_message(sum); /* Echo Back */
00096         }
00097     }
00098 }