Trying to log data from UM6 sensor with GPS receiver LS20031. I have two problems: - I can't log to file at a fast rate (<0.5s) without data values freezing to a fixed value. Print to pc screen it works fine. Ideally I would do this with an interrupt (e.g. ticker) so that the time of each reading is a fixed interval - I removed this as I thought this was causing the problem. - I want to record GPS lat and long. I have setup the GPS ground speed so I know the sensor are communicating. So I possibly havent set the config file to correctly interpet these two signals.
Fork of UM6_IMU_AHRS_2012 by
MODSERIAL/example2.cpp@6:43029c69b9ac, 2013-05-04 (annotated)
- Committer:
- njewin
- Date:
- Sat May 04 09:34:15 2013 +0000
- Revision:
- 6:43029c69b9ac
- Parent:
- 0:03c649c76388
publish version ; bugs need correcting for:; - logging to file at 10ms rate; - reading GPS lat and long data
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
lhiggs | 0:03c649c76388 | 1 | /* |
lhiggs | 0:03c649c76388 | 2 | Copyright (c) 2011 Andy Kirkham |
lhiggs | 0:03c649c76388 | 3 | |
lhiggs | 0:03c649c76388 | 4 | Permission is hereby granted, free of charge, to any person obtaining a copy |
lhiggs | 0:03c649c76388 | 5 | of this software and associated documentation files (the "Software"), to deal |
lhiggs | 0:03c649c76388 | 6 | in the Software without restriction, including without limitation the rights |
lhiggs | 0:03c649c76388 | 7 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
lhiggs | 0:03c649c76388 | 8 | copies of the Software, and to permit persons to whom the Software is |
lhiggs | 0:03c649c76388 | 9 | furnished to do so, subject to the following conditions: |
lhiggs | 0:03c649c76388 | 10 | |
lhiggs | 0:03c649c76388 | 11 | The above copyright notice and this permission notice shall be included in |
lhiggs | 0:03c649c76388 | 12 | all copies or substantial portions of the Software. |
lhiggs | 0:03c649c76388 | 13 | |
lhiggs | 0:03c649c76388 | 14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
lhiggs | 0:03c649c76388 | 15 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
lhiggs | 0:03c649c76388 | 16 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
lhiggs | 0:03c649c76388 | 17 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
lhiggs | 0:03c649c76388 | 18 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
lhiggs | 0:03c649c76388 | 19 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
lhiggs | 0:03c649c76388 | 20 | THE SOFTWARE. |
lhiggs | 0:03c649c76388 | 21 | |
lhiggs | 0:03c649c76388 | 22 | @file example2.cpp |
lhiggs | 0:03c649c76388 | 23 | @purpose Demos a simple messaging system. |
lhiggs | 0:03c649c76388 | 24 | @version see ChangeLog.c |
lhiggs | 0:03c649c76388 | 25 | @date Jan 2011 |
lhiggs | 0:03c649c76388 | 26 | @author Andy Kirkham |
lhiggs | 0:03c649c76388 | 27 | */ |
lhiggs | 0:03c649c76388 | 28 | |
lhiggs | 0:03c649c76388 | 29 | /* |
lhiggs | 0:03c649c76388 | 30 | This example demostrates a simple "messaging" system. You can use it with |
lhiggs | 0:03c649c76388 | 31 | a terminal program to test it out or write a cusom C#/C++/VB/etc program |
lhiggs | 0:03c649c76388 | 32 | to read and write messages to or from the Mbed. The default baud rate in |
lhiggs | 0:03c649c76388 | 33 | this example is 115200. |
lhiggs | 0:03c649c76388 | 34 | |
lhiggs | 0:03c649c76388 | 35 | In this example, the LEDs are controlled and pins p21 to p24 are set as |
lhiggs | 0:03c649c76388 | 36 | InterruptIn and send messages out when their value changes. |
lhiggs | 0:03c649c76388 | 37 | |
lhiggs | 0:03c649c76388 | 38 | To use, hook up the MBed USB and open your fav terminal. All messages |
lhiggs | 0:03c649c76388 | 39 | end with the \n character, don't forget to hit carriage return!. |
lhiggs | 0:03c649c76388 | 40 | As an example:- |
lhiggs | 0:03c649c76388 | 41 | |
lhiggs | 0:03c649c76388 | 42 | to switch on LED1 send LED1:1\n, off is LED1:0\n and toggle is LED1:2\n |
lhiggs | 0:03c649c76388 | 43 | to switch on LED2 send LED2:1\n, off is LED2:0\n and toggle is LED2:2\n |
lhiggs | 0:03c649c76388 | 44 | to switch on LED3 send LED3:1\n, off is LED3:0\n and toggle is LED3:2\n |
lhiggs | 0:03c649c76388 | 45 | to switch on LED4 send LED4:1\n, off is LED4:0\n and toggle is LED4:2\n |
lhiggs | 0:03c649c76388 | 46 | |
lhiggs | 0:03c649c76388 | 47 | When a pin change on p21 to p24 happens, a message is sent. As an example |
lhiggs | 0:03c649c76388 | 48 | when p21 goes low PIN21:0\n is sent, when goes high PIN21:1\n is sent. |
lhiggs | 0:03c649c76388 | 49 | |
lhiggs | 0:03c649c76388 | 50 | Note, the InterruptIn pins p21 to p24 are setup to have pullups. This means |
lhiggs | 0:03c649c76388 | 51 | they are high. To activate them use a wire to short the pin to 0volts. |
lhiggs | 0:03c649c76388 | 52 | |
lhiggs | 0:03c649c76388 | 53 | If you find that p21 to p24 sent a lot of on/off/on/off then it's probably |
lhiggs | 0:03c649c76388 | 54 | due to "bounce". If you are connecting a mechanical switch to a pin you |
lhiggs | 0:03c649c76388 | 55 | may prefer to use the PinDetect library rather than using InterruptIn. |
lhiggs | 0:03c649c76388 | 56 | @see http://mbed.org/users/AjK/libraries/PinDetect/latest |
lhiggs | 0:03c649c76388 | 57 | |
lhiggs | 0:03c649c76388 | 58 | One point you may notice. Incoming messages are processed via main()'s |
lhiggs | 0:03c649c76388 | 59 | while(1) loop whereas pin changes have their messages directly sent. |
lhiggs | 0:03c649c76388 | 60 | The reason for this is when MODSERIAL makes callbacks to your application |
lhiggs | 0:03c649c76388 | 61 | it is in "interrupt context". And one thing you want to avoid is spending |
lhiggs | 0:03c649c76388 | 62 | lots of CPU time in that context. So, the callback moves the message from |
lhiggs | 0:03c649c76388 | 63 | the input buffer to a local holding buffer and it then sets a bool flag |
lhiggs | 0:03c649c76388 | 64 | which tells main()'s while(1) loop to process that buffer. This means the |
lhiggs | 0:03c649c76388 | 65 | time spent doing the real incoming message handing is within your program |
lhiggs | 0:03c649c76388 | 66 | and not within MODSERIAL's interrupt context. So you may ask, why not do |
lhiggs | 0:03c649c76388 | 67 | the same for out going messages? Well, because MODSERIAL output buffers |
lhiggs | 0:03c649c76388 | 68 | all your sent content then sending chars is very fast. MODSERIAL handles |
lhiggs | 0:03c649c76388 | 69 | all the nitty gritty bits for you. You can just send. This example uses |
lhiggs | 0:03c649c76388 | 70 | puts() to send the message. If you can, always try and use sprintf()+puts() |
lhiggs | 0:03c649c76388 | 71 | rathe than printf(), printf() is known to often screw things up when used |
lhiggs | 0:03c649c76388 | 72 | within an interrupt context. Better still, just use puts() and do away |
lhiggs | 0:03c649c76388 | 73 | with any of the crappy ?printf() calls if possible. But I found the code |
lhiggs | 0:03c649c76388 | 74 | below to work fine even at 115200baud. |
lhiggs | 0:03c649c76388 | 75 | |
lhiggs | 0:03c649c76388 | 76 | */ |
lhiggs | 0:03c649c76388 | 77 | |
lhiggs | 0:03c649c76388 | 78 | |
lhiggs | 0:03c649c76388 | 79 | #ifdef COMPILE_EXAMPLE1_CODE_MODSERIAL |
lhiggs | 0:03c649c76388 | 80 | |
lhiggs | 0:03c649c76388 | 81 | #include "mbed.h" |
lhiggs | 0:03c649c76388 | 82 | #include "MODSERIAL.h" |
lhiggs | 0:03c649c76388 | 83 | |
lhiggs | 0:03c649c76388 | 84 | #define MESSAGE_BUFFER_SIZE 32 |
lhiggs | 0:03c649c76388 | 85 | |
lhiggs | 0:03c649c76388 | 86 | DigitalOut led1(LED1); |
lhiggs | 0:03c649c76388 | 87 | DigitalOut led2(LED2); |
lhiggs | 0:03c649c76388 | 88 | DigitalOut led3(LED3); |
lhiggs | 0:03c649c76388 | 89 | DigitalOut led4(LED4); |
lhiggs | 0:03c649c76388 | 90 | |
lhiggs | 0:03c649c76388 | 91 | InterruptIn P21(p21); |
lhiggs | 0:03c649c76388 | 92 | InterruptIn P22(p22); |
lhiggs | 0:03c649c76388 | 93 | InterruptIn P23(p23); |
lhiggs | 0:03c649c76388 | 94 | InterruptIn P24(p24); |
lhiggs | 0:03c649c76388 | 95 | |
lhiggs | 0:03c649c76388 | 96 | MODSERIAL messageSystem(USBTX, USBRX); |
lhiggs | 0:03c649c76388 | 97 | |
lhiggs | 0:03c649c76388 | 98 | char messageBufferIncoming[MESSAGE_BUFFER_SIZE]; |
lhiggs | 0:03c649c76388 | 99 | char messageBufferOutgoing[MESSAGE_BUFFER_SIZE]; |
lhiggs | 0:03c649c76388 | 100 | bool messageReceived; |
lhiggs | 0:03c649c76388 | 101 | |
lhiggs | 0:03c649c76388 | 102 | void messageReceive(MODSERIAL_IRQ_INFO *q) { |
lhiggs | 0:03c649c76388 | 103 | MODSERIAL *sys = q->serial; |
lhiggs | 0:03c649c76388 | 104 | sys->move(messageBufferIncoming, MESSAGE_BUFFER_SIZE); |
lhiggs | 0:03c649c76388 | 105 | messageReceived = true; |
lhiggs | 0:03c649c76388 | 106 | return 0; |
lhiggs | 0:03c649c76388 | 107 | } |
lhiggs | 0:03c649c76388 | 108 | |
lhiggs | 0:03c649c76388 | 109 | void messageProcess(void) { |
lhiggs | 0:03c649c76388 | 110 | if (!strncmp(messageBufferIncoming, "LED1:1", sizeof("LED1:1")-1)) led1 = 1; |
lhiggs | 0:03c649c76388 | 111 | else if (!strncmp(messageBufferIncoming, "LED1:0", sizeof("LED1:0")-1)) led1 = 0; |
lhiggs | 0:03c649c76388 | 112 | else if (!strncmp(messageBufferIncoming, "LED1:2", sizeof("LED1:2")-1)) led1 = !led1; |
lhiggs | 0:03c649c76388 | 113 | |
lhiggs | 0:03c649c76388 | 114 | else if (!strncmp(messageBufferIncoming, "LED2:1", sizeof("LED2:1")-1)) led2 = 1; |
lhiggs | 0:03c649c76388 | 115 | else if (!strncmp(messageBufferIncoming, "LED2:0", sizeof("LED2:0")-1)) led2 = 0; |
lhiggs | 0:03c649c76388 | 116 | else if (!strncmp(messageBufferIncoming, "LED2:2", sizeof("LED2:2")-1)) led2 = !led2; |
lhiggs | 0:03c649c76388 | 117 | |
lhiggs | 0:03c649c76388 | 118 | else if (!strncmp(messageBufferIncoming, "LED3:1", sizeof("LED3:1")-1)) led3 = 1; |
lhiggs | 0:03c649c76388 | 119 | else if (!strncmp(messageBufferIncoming, "LED3:0", sizeof("LED3:0")-1)) led3 = 0; |
lhiggs | 0:03c649c76388 | 120 | else if (!strncmp(messageBufferIncoming, "LED3:2", sizeof("LED3:2")-1)) led3 = !led3; |
lhiggs | 0:03c649c76388 | 121 | |
lhiggs | 0:03c649c76388 | 122 | else if (!strncmp(messageBufferIncoming, "LED4:1", sizeof("LED4:1")-1)) led4 = 1; |
lhiggs | 0:03c649c76388 | 123 | else if (!strncmp(messageBufferIncoming, "LED4:0", sizeof("LED4:0")-1)) led4 = 0; |
lhiggs | 0:03c649c76388 | 124 | else if (!strncmp(messageBufferIncoming, "LED4:2", sizeof("LED4:2")-1)) led4 = !led4; |
lhiggs | 0:03c649c76388 | 125 | |
lhiggs | 0:03c649c76388 | 126 | messageReceived = false; |
lhiggs | 0:03c649c76388 | 127 | } |
lhiggs | 0:03c649c76388 | 128 | |
lhiggs | 0:03c649c76388 | 129 | #define PIN_MESSAGE_SEND(x,y) \ |
lhiggs | 0:03c649c76388 | 130 | sprintf(messageBufferOutgoing,"PIN%02d:%d\n",x,y);\ |
lhiggs | 0:03c649c76388 | 131 | messageSystem.puts(messageBufferOutgoing); |
lhiggs | 0:03c649c76388 | 132 | |
lhiggs | 0:03c649c76388 | 133 | void pin21Rise(void) { PIN_MESSAGE_SEND(21, 1); } |
lhiggs | 0:03c649c76388 | 134 | void pin21Fall(void) { PIN_MESSAGE_SEND(21, 0); } |
lhiggs | 0:03c649c76388 | 135 | void pin22Rise(void) { PIN_MESSAGE_SEND(22, 1); } |
lhiggs | 0:03c649c76388 | 136 | void pin22Fall(void) { PIN_MESSAGE_SEND(22, 0); } |
lhiggs | 0:03c649c76388 | 137 | void pin23Rise(void) { PIN_MESSAGE_SEND(23, 1); } |
lhiggs | 0:03c649c76388 | 138 | void pin23Fall(void) { PIN_MESSAGE_SEND(23, 0); } |
lhiggs | 0:03c649c76388 | 139 | void pin24Rise(void) { PIN_MESSAGE_SEND(24, 1); } |
lhiggs | 0:03c649c76388 | 140 | void pin24Fall(void) { PIN_MESSAGE_SEND(24, 0); } |
lhiggs | 0:03c649c76388 | 141 | |
lhiggs | 0:03c649c76388 | 142 | int main() { |
lhiggs | 0:03c649c76388 | 143 | |
lhiggs | 0:03c649c76388 | 144 | messageReceived = false; |
lhiggs | 0:03c649c76388 | 145 | messageSystem.baud(115200); |
lhiggs | 0:03c649c76388 | 146 | messageSystem.attach(&messageReceive, MODSERIAL::RxAutoDetect); |
lhiggs | 0:03c649c76388 | 147 | messageSystem.autoDetectChar('\n'); |
lhiggs | 0:03c649c76388 | 148 | |
lhiggs | 0:03c649c76388 | 149 | // Enable pullup resistors on pins. |
lhiggs | 0:03c649c76388 | 150 | P21.mode(PullUp); P22.mode(PullUp); P23.mode(PullUp); P24.mode(PullUp); |
lhiggs | 0:03c649c76388 | 151 | |
lhiggs | 0:03c649c76388 | 152 | // Fix Mbed library bug, see http://mbed.org/forum/bugs-suggestions/topic/1498 |
lhiggs | 0:03c649c76388 | 153 | LPC_GPIOINT->IO2IntClr = (1UL << 5) | (1UL << 4) | (1UL << 3) | (1UL << 2); |
lhiggs | 0:03c649c76388 | 154 | |
lhiggs | 0:03c649c76388 | 155 | // Attach InterruptIn pin callbacks. |
lhiggs | 0:03c649c76388 | 156 | P21.rise(&pin21Rise); P21.fall(&pin21Fall); |
lhiggs | 0:03c649c76388 | 157 | P22.rise(&pin22Rise); P22.fall(&pin22Fall); |
lhiggs | 0:03c649c76388 | 158 | P23.rise(&pin23Rise); P23.fall(&pin23Fall); |
lhiggs | 0:03c649c76388 | 159 | P24.rise(&pin24Rise); P24.fall(&pin24Fall); |
lhiggs | 0:03c649c76388 | 160 | |
lhiggs | 0:03c649c76388 | 161 | while(1) { |
lhiggs | 0:03c649c76388 | 162 | // Process incoming messages. |
lhiggs | 0:03c649c76388 | 163 | if (messageReceived) messageProcess(); |
lhiggs | 0:03c649c76388 | 164 | } |
lhiggs | 0:03c649c76388 | 165 | } |
lhiggs | 0:03c649c76388 | 166 | |
lhiggs | 0:03c649c76388 | 167 | #endif |