www.freertos.org

Dependents:   mbed_freeRTOS_send

Fork of FreeRTOS by Rohit Grover

Committer:
ser1516
Date:
Wed May 18 21:25:21 2016 +0000
Revision:
1:6db425da9b9e
queue implementada com accelarometro e pot a enviar para o can -  ainda nao testado

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ser1516 1:6db425da9b9e 1 #include "mbed.h"
ser1516 1:6db425da9b9e 2
ser1516 1:6db425da9b9e 3
ser1516 1:6db425da9b9e 4 #include "C12832.h"
ser1516 1:6db425da9b9e 5 #include "LPC17xx.h"
ser1516 1:6db425da9b9e 6 #include "AnalogIn.h"
ser1516 1:6db425da9b9e 7 #include "FreeRTOS.h"
ser1516 1:6db425da9b9e 8 #include "task.h"
ser1516 1:6db425da9b9e 9 #include "LM75B.h"
ser1516 1:6db425da9b9e 10 #include "semphr.h"
ser1516 1:6db425da9b9e 11 #include "MMA7660.h"
ser1516 1:6db425da9b9e 12
ser1516 1:6db425da9b9e 13 #define LED1_GPIO 18
ser1516 1:6db425da9b9e 14 #define LED2_GPIO 20
ser1516 1:6db425da9b9e 15 #define LED3_GPIO 21
ser1516 1:6db425da9b9e 16 #define LED4_GPIO 23
ser1516 1:6db425da9b9e 17
ser1516 1:6db425da9b9e 18 #define LED_GPIO LED1_GPIO
ser1516 1:6db425da9b9e 19
ser1516 1:6db425da9b9e 20
ser1516 1:6db425da9b9e 21 // LED Config
ser1516 1:6db425da9b9e 22 DigitalOut led1(LED1);
ser1516 1:6db425da9b9e 23 DigitalOut led2(LED2);
ser1516 1:6db425da9b9e 24 DigitalOut led3(LED3);
ser1516 1:6db425da9b9e 25 DigitalOut led4(LED4);
ser1516 1:6db425da9b9e 26
ser1516 1:6db425da9b9e 27 // CAN Config
ser1516 1:6db425da9b9e 28 CAN can(p9, p10);
ser1516 1:6db425da9b9e 29 char temp = 0;
ser1516 1:6db425da9b9e 30 typedef union can_union {
ser1516 1:6db425da9b9e 31 float fl;
ser1516 1:6db425da9b9e 32 char bytes[4];
ser1516 1:6db425da9b9e 33 } data2send;
ser1516 1:6db425da9b9e 34
ser1516 1:6db425da9b9e 35 // Accelerometer
ser1516 1:6db425da9b9e 36 MMA7660 MMA(p28, p27);
ser1516 1:6db425da9b9e 37 DigitalOut connectionLed(LED1);
ser1516 1:6db425da9b9e 38 //PwmOut Zaxis_p(LED2);
ser1516 1:6db425da9b9e 39 //PwmOut Zaxis_n(LED3);
ser1516 1:6db425da9b9e 40
ser1516 1:6db425da9b9e 41 // Temperature sensor config
ser1516 1:6db425da9b9e 42 LM75B tmp(p28,p27);
ser1516 1:6db425da9b9e 43
ser1516 1:6db425da9b9e 44 //LCD configs
ser1516 1:6db425da9b9e 45 C12832 lcd(p5, p7, p6, p8, p11);
ser1516 1:6db425da9b9e 46
ser1516 1:6db425da9b9e 47 // File System Config
ser1516 1:6db425da9b9e 48 //MSCFileSystem fs("fs");
ser1516 1:6db425da9b9e 49
ser1516 1:6db425da9b9e 50 // Potenciometer Config
ser1516 1:6db425da9b9e 51 AnalogIn pot1(p19);
ser1516 1:6db425da9b9e 52 float pot = 0;
ser1516 1:6db425da9b9e 53
ser1516 1:6db425da9b9e 54 // Queue
ser1516 1:6db425da9b9e 55 xQueueHandle MyQueue;
ser1516 1:6db425da9b9e 56
ser1516 1:6db425da9b9e 57 typedef enum {
ser1516 1:6db425da9b9e 58 INT,
ser1516 1:6db425da9b9e 59 FLOAT,
ser1516 1:6db425da9b9e 60 CHAR
ser1516 1:6db425da9b9e 61 } DATA_TYPE;
ser1516 1:6db425da9b9e 62
ser1516 1:6db425da9b9e 63 typedef struct queueData {
ser1516 1:6db425da9b9e 64 DATA_TYPE type;
ser1516 1:6db425da9b9e 65 void* pointer;
ser1516 1:6db425da9b9e 66 int id;
ser1516 1:6db425da9b9e 67 } queueData;
ser1516 1:6db425da9b9e 68
ser1516 1:6db425da9b9e 69
ser1516 1:6db425da9b9e 70 // Semaphores
ser1516 1:6db425da9b9e 71 xSemaphoreHandle xMutexLCD;
ser1516 1:6db425da9b9e 72 xSemaphoreHandle xMutexI2C;
ser1516 1:6db425da9b9e 73
ser1516 1:6db425da9b9e 74 void init_hardware()
ser1516 1:6db425da9b9e 75 {
ser1516 1:6db425da9b9e 76 /* set system tick for 1ms interrupt */
ser1516 1:6db425da9b9e 77 SystemCoreClockUpdate();
ser1516 1:6db425da9b9e 78 }
ser1516 1:6db425da9b9e 79
ser1516 1:6db425da9b9e 80 void blink_led1_task(void *pvParameters)
ser1516 1:6db425da9b9e 81 {
ser1516 1:6db425da9b9e 82 while(1) {
ser1516 1:6db425da9b9e 83 led1 = !led1;
ser1516 1:6db425da9b9e 84 vTaskDelay(1000/portTICK_RATE_MS);
ser1516 1:6db425da9b9e 85 }
ser1516 1:6db425da9b9e 86 }
ser1516 1:6db425da9b9e 87
ser1516 1:6db425da9b9e 88 /*
ser1516 1:6db425da9b9e 89 void blink_led2_task(void *pvParameters)
ser1516 1:6db425da9b9e 90 {
ser1516 1:6db425da9b9e 91 while(1) {
ser1516 1:6db425da9b9e 92 led2 = !led2;
ser1516 1:6db425da9b9e 93 vTaskDelay(500/portTICK_RATE_MS);
ser1516 1:6db425da9b9e 94 }
ser1516 1:6db425da9b9e 95 }
ser1516 1:6db425da9b9e 96 */
ser1516 1:6db425da9b9e 97
ser1516 1:6db425da9b9e 98 void can_send(void *pvParameters)
ser1516 1:6db425da9b9e 99 {
ser1516 1:6db425da9b9e 100 int err;
ser1516 1:6db425da9b9e 101 data2send data;
ser1516 1:6db425da9b9e 102 queueData msg;
ser1516 1:6db425da9b9e 103 for(;;) {
ser1516 1:6db425da9b9e 104 xQueueReceive(MyQueue,&msg,portMAX_DELAY);
ser1516 1:6db425da9b9e 105 //ATENÇÃO:Na leitura dos sensores apenas enviar os dados quando houver uma variação significativa, e.g. a temp variar 1ºC
ser1516 1:6db425da9b9e 106
ser1516 1:6db425da9b9e 107 if(msg.type==FLOAT || msg.type==INT) {
ser1516 1:6db425da9b9e 108 data.fl=*(float *)msg.pointer;
ser1516 1:6db425da9b9e 109 can.write(CANMessage(msg.id, &data.bytes[0], 5));
ser1516 1:6db425da9b9e 110 } else if(msg.type==CHAR)
ser1516 1:6db425da9b9e 111 can.write(CANMessage(msg.id, (char *)msg.pointer, 2));
ser1516 1:6db425da9b9e 112 if(!err) {
ser1516 1:6db425da9b9e 113 led4=1;//error led
ser1516 1:6db425da9b9e 114 xSemaphoreTake(xMutexLCD,portMAX_DELAY);
ser1516 1:6db425da9b9e 115 lcd.locate(1,1); // row 1, col 1
ser1516 1:6db425da9b9e 116 lcd.printf("Message sent: ERROR");
ser1516 1:6db425da9b9e 117 xSemaphoreGive(xMutexLCD);
ser1516 1:6db425da9b9e 118 }
ser1516 1:6db425da9b9e 119 led2 = !led2;
ser1516 1:6db425da9b9e 120 /* if(can.write(CANMessage(1337, &data.bytes[0], 5))) {
ser1516 1:6db425da9b9e 121 xSemaphoreTake(xMutexLCD,portMAX_DELAY);
ser1516 1:6db425da9b9e 122 lcd.locate(1,1); // row 1, col 1
ser1516 1:6db425da9b9e 123 lcd.printf("Message sent: %f\n", data.fl);
ser1516 1:6db425da9b9e 124 xSemaphoreGive(xMutexLCD);
ser1516 1:6db425da9b9e 125 led2 = !led2;
ser1516 1:6db425da9b9e 126 } */
ser1516 1:6db425da9b9e 127 }
ser1516 1:6db425da9b9e 128
ser1516 1:6db425da9b9e 129 }
ser1516 1:6db425da9b9e 130
ser1516 1:6db425da9b9e 131 /*
ser1516 1:6db425da9b9e 132 void can_recv(void *pvParameters){
ser1516 1:6db425da9b9e 133 CANMessage msg;
ser1516 1:6db425da9b9e 134 //lcd.cls();
ser1516 1:6db425da9b9e 135 for(;;){
ser1516 1:6db425da9b9e 136 if(can2.read(msg)) {
ser1516 1:6db425da9b9e 137 xSemaphoreTake(xMutexLCD,portMAX_DELAY);
ser1516 1:6db425da9b9e 138 lcd.locate(1,10); // row 10, col 1
ser1516 1:6db425da9b9e 139 lcd.printf("Message received: %d\n", msg.data[0]);
ser1516 1:6db425da9b9e 140 xSemaphoreGive(xMutexLCD);
ser1516 1:6db425da9b9e 141 led2 = !led2;
ser1516 1:6db425da9b9e 142 }
ser1516 1:6db425da9b9e 143
ser1516 1:6db425da9b9e 144 vTaskDelay(200/portTICK_RATE_MS);
ser1516 1:6db425da9b9e 145 }
ser1516 1:6db425da9b9e 146
ser1516 1:6db425da9b9e 147 }
ser1516 1:6db425da9b9e 148 */
ser1516 1:6db425da9b9e 149
ser1516 1:6db425da9b9e 150 void acc_read (void *pvParameters)
ser1516 1:6db425da9b9e 151 {
ser1516 1:6db425da9b9e 152 float acc[3];
ser1516 1:6db425da9b9e 153 queueData msg_acc;
ser1516 1:6db425da9b9e 154 int aux[3];
ser1516 1:6db425da9b9e 155 //if (MMA.testConnection())
ser1516 1:6db425da9b9e 156 // led3 = !led3;
ser1516 1:6db425da9b9e 157
ser1516 1:6db425da9b9e 158 while(1) {
ser1516 1:6db425da9b9e 159
ser1516 1:6db425da9b9e 160 xSemaphoreTake(xMutexI2C,portMAX_DELAY);
ser1516 1:6db425da9b9e 161 MMA.readData(acc);
ser1516 1:6db425da9b9e 162 xSemaphoreGive(xMutexI2C);
ser1516 1:6db425da9b9e 163
ser1516 1:6db425da9b9e 164 aux[0]=acc[0];
ser1516 1:6db425da9b9e 165 aux[1]=acc[1];
ser1516 1:6db425da9b9e 166 aux[2]=acc[2];
ser1516 1:6db425da9b9e 167 msg_acc.type=INT;
ser1516 1:6db425da9b9e 168 msg_acc.id=1337;
ser1516 1:6db425da9b9e 169 msg_acc.pointer=(void *)&aux[0];
ser1516 1:6db425da9b9e 170
ser1516 1:6db425da9b9e 171 xQueueSend(MyQueue,&msg_acc,10);
ser1516 1:6db425da9b9e 172 /*xSemaphoreTake(xMutexLCD,portMAX_DELAY);
ser1516 1:6db425da9b9e 173 lcd.locate(1,18); // row 18, col 1
ser1516 1:6db425da9b9e 174 lcd.printf("X-Y-Z: %2.2f %2.2f %2.2f", acc[0], acc[1], acc[2]);
ser1516 1:6db425da9b9e 175 xSemaphoreGive(xMutexLCD);*/
ser1516 1:6db425da9b9e 176 }
ser1516 1:6db425da9b9e 177
ser1516 1:6db425da9b9e 178 }
ser1516 1:6db425da9b9e 179
ser1516 1:6db425da9b9e 180 void readPot(void *pvParameters)
ser1516 1:6db425da9b9e 181 {
ser1516 1:6db425da9b9e 182 queueData msg_pot;
ser1516 1:6db425da9b9e 183 float *aux;
ser1516 1:6db425da9b9e 184 while(1) {
ser1516 1:6db425da9b9e 185 msg_pot.type=FLOAT;
ser1516 1:6db425da9b9e 186 msg_pot.id=1337;
ser1516 1:6db425da9b9e 187 *aux=pot1.read()*10;
ser1516 1:6db425da9b9e 188 msg_pot.pointer=(void *)aux;
ser1516 1:6db425da9b9e 189 xQueueSend(MyQueue,&msg_pot,10);
ser1516 1:6db425da9b9e 190 vTaskDelay(10/portTICK_RATE_MS);
ser1516 1:6db425da9b9e 191 }
ser1516 1:6db425da9b9e 192 }
ser1516 1:6db425da9b9e 193
ser1516 1:6db425da9b9e 194
ser1516 1:6db425da9b9e 195 int main(void)
ser1516 1:6db425da9b9e 196 {
ser1516 1:6db425da9b9e 197 xTaskHandle blink_led1_task_handle = NULL;
ser1516 1:6db425da9b9e 198 xTaskHandle can_send_handle = NULL;
ser1516 1:6db425da9b9e 199 xTaskHandle can_recv_handle = NULL;
ser1516 1:6db425da9b9e 200 xTaskHandle acc_recv_handle = NULL;
ser1516 1:6db425da9b9e 201 xTaskHandle readPot_handle = NULL;
ser1516 1:6db425da9b9e 202
ser1516 1:6db425da9b9e 203 xMutexLCD = xSemaphoreCreateMutex();
ser1516 1:6db425da9b9e 204 xMutexI2C = xSemaphoreCreateMutex();
ser1516 1:6db425da9b9e 205 MyQueue = xQueueCreate( 20, sizeof(queueData) );
ser1516 1:6db425da9b9e 206 if(MyQueue == NULL) led4=1;//error code
ser1516 1:6db425da9b9e 207
ser1516 1:6db425da9b9e 208
ser1516 1:6db425da9b9e 209 can.frequency(1000000);
ser1516 1:6db425da9b9e 210
ser1516 1:6db425da9b9e 211 int task_error;
ser1516 1:6db425da9b9e 212
ser1516 1:6db425da9b9e 213 /* initialize hardware */
ser1516 1:6db425da9b9e 214 init_hardware();
ser1516 1:6db425da9b9e 215
ser1516 1:6db425da9b9e 216 // create task to heartbeat LED
ser1516 1:6db425da9b9e 217 task_error = xTaskCreate(blink_led1_task, "heartbeat", 2*configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY+1, &blink_led1_task_handle);
ser1516 1:6db425da9b9e 218 if(task_error == errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY) {
ser1516 1:6db425da9b9e 219 led4=1;
ser1516 1:6db425da9b9e 220 }
ser1516 1:6db425da9b9e 221
ser1516 1:6db425da9b9e 222 // create task to send through CAN
ser1516 1:6db425da9b9e 223 task_error = xTaskCreate(can_send, "CAN Send", 4*configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY+2, &can_send_handle);
ser1516 1:6db425da9b9e 224 if(task_error == errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY) {
ser1516 1:6db425da9b9e 225 led4=1;
ser1516 1:6db425da9b9e 226 }
ser1516 1:6db425da9b9e 227
ser1516 1:6db425da9b9e 228 //create task to receive through CAN
ser1516 1:6db425da9b9e 229 //xTaskCreate(can_recv, "CAN Recv", 2*configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY+2, &can_recv_handle);
ser1516 1:6db425da9b9e 230
ser1516 1:6db425da9b9e 231 //create task to read accelerometer
ser1516 1:6db425da9b9e 232 task_error = xTaskCreate(acc_read, "ACC Read", 2*configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY+1, &acc_recv_handle);
ser1516 1:6db425da9b9e 233 if(task_error == errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY) {
ser1516 1:6db425da9b9e 234 led4=1;
ser1516 1:6db425da9b9e 235 }
ser1516 1:6db425da9b9e 236
ser1516 1:6db425da9b9e 237 //create task to write value of pot to usb
ser1516 1:6db425da9b9e 238 task_error = xTaskCreate(readPot, "Read Pot", 2*configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY+1, &readPot_handle);
ser1516 1:6db425da9b9e 239 if(task_error == errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY) {
ser1516 1:6db425da9b9e 240 led4=1;
ser1516 1:6db425da9b9e 241 }
ser1516 1:6db425da9b9e 242
ser1516 1:6db425da9b9e 243
ser1516 1:6db425da9b9e 244
ser1516 1:6db425da9b9e 245 /* Start the scheduler. */
ser1516 1:6db425da9b9e 246 vTaskStartScheduler();
ser1516 1:6db425da9b9e 247
ser1516 1:6db425da9b9e 248 /* should never reach here! */
ser1516 1:6db425da9b9e 249 for(;;);
ser1516 1:6db425da9b9e 250 }