www.freertos.org
Dependents: mbed_freeRTOS_send
Fork of FreeRTOS by
main.cpp@1:6db425da9b9e, 2016-05-18 (annotated)
- 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?
User | Revision | Line number | New 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 | } |