Boston Univeristy Rocket Team
/
BURTDAQ
IRQ fix
main.cpp@1:6fddb8411725, 2012-04-09 (annotated)
- Committer:
- burocketteam
- Date:
- Mon Apr 09 23:31:30 2012 +0000
- Revision:
- 1:6fddb8411725
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
burocketteam | 1:6fddb8411725 | 1 | #include "mbed.h" |
burocketteam | 1:6fddb8411725 | 2 | #include "rtos.h" |
burocketteam | 1:6fddb8411725 | 3 | #include "burtdaq.h" |
burocketteam | 1:6fddb8411725 | 4 | #include <vector> |
burocketteam | 1:6fddb8411725 | 5 | #include "FastIO.h" |
burocketteam | 1:6fddb8411725 | 6 | #include <stdio.h> // printf |
burocketteam | 1:6fddb8411725 | 7 | #include <string.h> // strcat |
burocketteam | 1:6fddb8411725 | 8 | #include <stdlib.h> // strtol |
burocketteam | 1:6fddb8411725 | 9 | |
burocketteam | 1:6fddb8411725 | 10 | DigitalOut led1(LED1); |
burocketteam | 1:6fddb8411725 | 11 | DigitalOut led2(LED2); |
burocketteam | 1:6fddb8411725 | 12 | DigitalOut led3(LED3); |
burocketteam | 1:6fddb8411725 | 13 | DigitalOut led4(LED4); |
burocketteam | 1:6fddb8411725 | 14 | Serial pc(USBTX,USBRX); |
burocketteam | 1:6fddb8411725 | 15 | //Serial xbee(XBEETX,XBEERX); |
burocketteam | 1:6fddb8411725 | 16 | |
burocketteam | 1:6fddb8411725 | 17 | bool led4_FLAG; |
burocketteam | 1:6fddb8411725 | 18 | |
burocketteam | 1:6fddb8411725 | 19 | //Queue<uint8_t, 50> queue; |
burocketteam | 1:6fddb8411725 | 20 | |
burocketteam | 1:6fddb8411725 | 21 | #define kDisplayWidth 32 |
burocketteam | 1:6fddb8411725 | 22 | char* pBinFill(long int x,char *so, char fillChar) |
burocketteam | 1:6fddb8411725 | 23 | { // fill in array from right to left |
burocketteam | 1:6fddb8411725 | 24 | char s[kDisplayWidth+1]; |
burocketteam | 1:6fddb8411725 | 25 | int i=kDisplayWidth; |
burocketteam | 1:6fddb8411725 | 26 | s[i--]=0x00; // terminate string |
burocketteam | 1:6fddb8411725 | 27 | do |
burocketteam | 1:6fddb8411725 | 28 | { // fill in array from right to left |
burocketteam | 1:6fddb8411725 | 29 | s[i--]=(x & 1) ? '1':'0'; |
burocketteam | 1:6fddb8411725 | 30 | x>>=1; // shift right 1 bit |
burocketteam | 1:6fddb8411725 | 31 | } while( x > 0); |
burocketteam | 1:6fddb8411725 | 32 | while(i>=0) s[i--]=fillChar; // fill with fillChar |
burocketteam | 1:6fddb8411725 | 33 | sprintf(so,"%s",s); |
burocketteam | 1:6fddb8411725 | 34 | return so; |
burocketteam | 1:6fddb8411725 | 35 | } |
burocketteam | 1:6fddb8411725 | 36 | |
burocketteam | 1:6fddb8411725 | 37 | |
burocketteam | 1:6fddb8411725 | 38 | void bridgeReader(void const *argument) { |
burocketteam | 1:6fddb8411725 | 39 | SPI spia(NC, SPIA_MISO, SPIA_CLK); |
burocketteam | 1:6fddb8411725 | 40 | spia.format(16); |
burocketteam | 1:6fddb8411725 | 41 | spia.frequency(1000000); |
burocketteam | 1:6fddb8411725 | 42 | //DigitalOut spia_mosi(SPIA_MOSI); |
burocketteam | 1:6fddb8411725 | 43 | FastOut<SPIA_MOSI> spia_mosi; |
burocketteam | 1:6fddb8411725 | 44 | |
burocketteam | 1:6fddb8411725 | 45 | FastPortOut<Port0, SPIA_CS_PORT_MASK> spiaCSPort; |
burocketteam | 1:6fddb8411725 | 46 | //PortOut spiaCSPort(Port0, SPIA_CS_PORT_MASK); |
burocketteam | 1:6fddb8411725 | 47 | unsigned int bridgeCSPinMasks[5] = {SPIA_P1_CS_PORT_MASK, SPIA_P2_CS_PORT_MASK, SPIA_P3_CS_PORT_MASK, SPIA_P4_CS_PORT_MASK}; |
burocketteam | 1:6fddb8411725 | 48 | int deviceCount = 4; |
burocketteam | 1:6fddb8411725 | 49 | |
burocketteam | 1:6fddb8411725 | 50 | spiaCSPort = SPIA_CS_PORT_MASK; |
burocketteam | 1:6fddb8411725 | 51 | |
burocketteam | 1:6fddb8411725 | 52 | uint16_t outputs[4] = {0x0f0f, 0xf0f0, 0x0000, 0x0000}; |
burocketteam | 1:6fddb8411725 | 53 | //bridgeCSPins = 3; |
burocketteam | 1:6fddb8411725 | 54 | printf("ENTERING READ LOOP\n"); |
burocketteam | 1:6fddb8411725 | 55 | while(true) { |
burocketteam | 1:6fddb8411725 | 56 | __disable_irq(); |
burocketteam | 1:6fddb8411725 | 57 | led2 = 1; |
burocketteam | 1:6fddb8411725 | 58 | // READ BRIDGES |
burocketteam | 1:6fddb8411725 | 59 | spia_mosi = 1; |
burocketteam | 1:6fddb8411725 | 60 | int i = 0; // This constitutes ROUGHLY a 500ns delay |
burocketteam | 1:6fddb8411725 | 61 | while(i<10) |
burocketteam | 1:6fddb8411725 | 62 | i++; |
burocketteam | 1:6fddb8411725 | 63 | for(i=0; i<deviceCount; i++){ |
burocketteam | 1:6fddb8411725 | 64 | spiaCSPort = ~bridgeCSPinMasks[i]; |
burocketteam | 1:6fddb8411725 | 65 | outputs[i] = spia.write(0x0); |
burocketteam | 1:6fddb8411725 | 66 | } |
burocketteam | 1:6fddb8411725 | 67 | spiaCSPort = SPIA_CS_PORT_MASK; |
burocketteam | 1:6fddb8411725 | 68 | //spiaCSPort = 1; |
burocketteam | 1:6fddb8411725 | 69 | spia_mosi = 0; |
burocketteam | 1:6fddb8411725 | 70 | // END READING |
burocketteam | 1:6fddb8411725 | 71 | |
burocketteam | 1:6fddb8411725 | 72 | printf("%u, %u, %u, %u\n",outputs[0],outputs[1],outputs[2],outputs[3]); |
burocketteam | 1:6fddb8411725 | 73 | led2 = 0; |
burocketteam | 1:6fddb8411725 | 74 | __enable_irq(); |
burocketteam | 1:6fddb8411725 | 75 | Thread::wait(5000); |
burocketteam | 1:6fddb8411725 | 76 | } |
burocketteam | 1:6fddb8411725 | 77 | } |
burocketteam | 1:6fddb8411725 | 78 | void tcReader(void const *argument) { |
burocketteam | 1:6fddb8411725 | 79 | SPI spib(SPIB_MOSI, SPIB_MISO, SPIB_CLK); |
burocketteam | 1:6fddb8411725 | 80 | spib.format(16); |
burocketteam | 1:6fddb8411725 | 81 | spib.frequency(1000000); |
burocketteam | 1:6fddb8411725 | 82 | |
burocketteam | 1:6fddb8411725 | 83 | DigitalOut spibCSPins[] = {SPIB_P1_CS, SPIB_P2_CS, SPIB_P3_CS}; |
burocketteam | 1:6fddb8411725 | 84 | spibCSPins[0]=1; |
burocketteam | 1:6fddb8411725 | 85 | spibCSPins[1]=1; |
burocketteam | 1:6fddb8411725 | 86 | spibCSPins[2]=1; |
burocketteam | 1:6fddb8411725 | 87 | |
burocketteam | 1:6fddb8411725 | 88 | int numTCs = 3; |
burocketteam | 1:6fddb8411725 | 89 | uint32_t rawTcData[3] = {0,0,0}; |
burocketteam | 1:6fddb8411725 | 90 | uint32_t tcData[3] = {0,0,0}; |
burocketteam | 1:6fddb8411725 | 91 | uint32_t ambientData[3] = {0,0,0}; |
burocketteam | 1:6fddb8411725 | 92 | |
burocketteam | 1:6fddb8411725 | 93 | float humanTcData[3] = {0,0,0}; |
burocketteam | 1:6fddb8411725 | 94 | float humanAmbientData[3] = {0,0,0}; |
burocketteam | 1:6fddb8411725 | 95 | |
burocketteam | 1:6fddb8411725 | 96 | uint32_t buffer = 0; |
burocketteam | 1:6fddb8411725 | 97 | char so[kDisplayWidth+1]; |
burocketteam | 1:6fddb8411725 | 98 | while (true) { |
burocketteam | 1:6fddb8411725 | 99 | __disable_irq(); |
burocketteam | 1:6fddb8411725 | 100 | led3 = 1; |
burocketteam | 1:6fddb8411725 | 101 | for(int i=0; i<numTCs; i++){ |
burocketteam | 1:6fddb8411725 | 102 | rawTcData[i] = 0; |
burocketteam | 1:6fddb8411725 | 103 | spibCSPins[i] = 0; |
burocketteam | 1:6fddb8411725 | 104 | buffer = spib.write(0); |
burocketteam | 1:6fddb8411725 | 105 | //printf("%s\n",binary_fmt(buffer,tmp)); |
burocketteam | 1:6fddb8411725 | 106 | rawTcData[i] = (buffer << 16); |
burocketteam | 1:6fddb8411725 | 107 | buffer = spib.write(0); |
burocketteam | 1:6fddb8411725 | 108 | rawTcData[i] |= (buffer); |
burocketteam | 1:6fddb8411725 | 109 | spibCSPins[i] = 1; |
burocketteam | 1:6fddb8411725 | 110 | } |
burocketteam | 1:6fddb8411725 | 111 | //printf("%s %s %s\n", byte_to_binary(tcData[0]), byte_to_binary(tcData[1]), byte_to_binary(tcData[2])); |
burocketteam | 1:6fddb8411725 | 112 | //printf("Data is: %s %s %s\n",pBinFill(tcData[0], so, '0'), pBinFill(tcData[1], so, '0'), pBinFill(tcData[2], so, '0')); |
burocketteam | 1:6fddb8411725 | 113 | |
burocketteam | 1:6fddb8411725 | 114 | for(int i=0; i<numTCs; i++){ |
burocketteam | 1:6fddb8411725 | 115 | tcData[i] = ((rawTcData[i] & 0xFFFC0000) >> 18); |
burocketteam | 1:6fddb8411725 | 116 | ambientData[i] = ((rawTcData[i] & 0xFFF0) >> 4); |
burocketteam | 1:6fddb8411725 | 117 | humanTcData[i] = (float) tcData[i] * .25; |
burocketteam | 1:6fddb8411725 | 118 | humanAmbientData[i] = (float) ambientData[i]*.0625; |
burocketteam | 1:6fddb8411725 | 119 | printf("Thermocouple %d ambient: %f, tc:%f\n",i,humanAmbientData[i],humanTcData[i]); |
burocketteam | 1:6fddb8411725 | 120 | } |
burocketteam | 1:6fddb8411725 | 121 | led3=0; |
burocketteam | 1:6fddb8411725 | 122 | __enable_irq(); |
burocketteam | 1:6fddb8411725 | 123 | Thread::wait(2000); |
burocketteam | 1:6fddb8411725 | 124 | } |
burocketteam | 1:6fddb8411725 | 125 | } |
burocketteam | 1:6fddb8411725 | 126 | |
burocketteam | 1:6fddb8411725 | 127 | |
burocketteam | 1:6fddb8411725 | 128 | void xbeeISR() { |
burocketteam | 1:6fddb8411725 | 129 | |
burocketteam | 1:6fddb8411725 | 130 | NVIC_DisableIRQ(UART0_IRQn); |
burocketteam | 1:6fddb8411725 | 131 | led4=!led4; |
burocketteam | 1:6fddb8411725 | 132 | uint32_t iir = LPC_UART0->RBR; |
burocketteam | 1:6fddb8411725 | 133 | NVIC_EnableIRQ(UART0_IRQn); |
burocketteam | 1:6fddb8411725 | 134 | return; |
burocketteam | 1:6fddb8411725 | 135 | } |
burocketteam | 1:6fddb8411725 | 136 | |
burocketteam | 1:6fddb8411725 | 137 | void blinkThread(void const *argument) |
burocketteam | 1:6fddb8411725 | 138 | { |
burocketteam | 1:6fddb8411725 | 139 | while(1) |
burocketteam | 1:6fddb8411725 | 140 | { |
burocketteam | 1:6fddb8411725 | 141 | led1=!led1; |
burocketteam | 1:6fddb8411725 | 142 | Thread::wait(500); |
burocketteam | 1:6fddb8411725 | 143 | } |
burocketteam | 1:6fddb8411725 | 144 | |
burocketteam | 1:6fddb8411725 | 145 | |
burocketteam | 1:6fddb8411725 | 146 | return; |
burocketteam | 1:6fddb8411725 | 147 | } |
burocketteam | 1:6fddb8411725 | 148 | void xbeeTestThread(void const *argument) |
burocketteam | 1:6fddb8411725 | 149 | { |
burocketteam | 1:6fddb8411725 | 150 | pc.attach(&xbeeISR,Serial::RxIrq); |
burocketteam | 1:6fddb8411725 | 151 | while(1) |
burocketteam | 1:6fddb8411725 | 152 | { |
burocketteam | 1:6fddb8411725 | 153 | Thread::wait(500); |
burocketteam | 1:6fddb8411725 | 154 | } |
burocketteam | 1:6fddb8411725 | 155 | |
burocketteam | 1:6fddb8411725 | 156 | } |
burocketteam | 1:6fddb8411725 | 157 | int main() { |
burocketteam | 1:6fddb8411725 | 158 | // Serial pc(USBTX,USBRX); |
burocketteam | 1:6fddb8411725 | 159 | led4_FLAG = false; |
burocketteam | 1:6fddb8411725 | 160 | pc.printf("Starting reader\n"); |
burocketteam | 1:6fddb8411725 | 161 | pc.attach(&xbeeISR,Serial::RxIrq); |
burocketteam | 1:6fddb8411725 | 162 | //Ticker ticker; |
burocketteam | 1:6fddb8411725 | 163 | //ticker.attach(blinkThread,1.0); |
burocketteam | 1:6fddb8411725 | 164 | // Thread bridgeReader1(bridgeReader); |
burocketteam | 1:6fddb8411725 | 165 | // Thread tcReader1(tcReader); |
burocketteam | 1:6fddb8411725 | 166 | //Thread actuatorController1(actuatorController); |
burocketteam | 1:6fddb8411725 | 167 | //Thread xbeeTest(xbeeTestThread); |
burocketteam | 1:6fddb8411725 | 168 | //xbee.baud(115200); |
burocketteam | 1:6fddb8411725 | 169 | Thread blinkTest(blinkThread); |
burocketteam | 1:6fddb8411725 | 170 | //Thread xbeeTest(xbeeTestThread); |
burocketteam | 1:6fddb8411725 | 171 | |
burocketteam | 1:6fddb8411725 | 172 | // xbee.printf("test"); |
burocketteam | 1:6fddb8411725 | 173 | |
burocketteam | 1:6fddb8411725 | 174 | Thread::wait(osWaitForever); |
burocketteam | 1:6fddb8411725 | 175 | pc.printf("exiting\n"); |
burocketteam | 1:6fddb8411725 | 176 | } |