NucleoF401RE A/D test. 5msec sampling (by timer interrupt), transmit via XBee with 7 bytes message format.
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 }
Generated on Sun Jul 17 2022 08:59:06 by 1.7.2