works pretty well... integration time actually works.. need to work on the analog read stuff.. need to also work on data compression.... need to also work on making a continuous read and data dump......should be possible since the threads don't conflict..
main.cpp@2:75c8a8b6b872, 2014-10-23 (annotated)
- Committer:
- flatcat
- Date:
- Thu Oct 23 02:06:24 2014 +0000
- Revision:
- 2:75c8a8b6b872
- Parent:
- 1:37f04be9c0fa
Just need to get the analog values right
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
flatcat | 0:e5d6563899d5 | 1 | #include "mbed.h" |
flatcat | 2:75c8a8b6b872 | 2 | #include "rtos.h" |
flatcat | 0:e5d6563899d5 | 3 | |
flatcat | 0:e5d6563899d5 | 4 | //configure I/O |
flatcat | 0:e5d6563899d5 | 5 | InterruptIn masterClock_int(PB_14); |
flatcat | 0:e5d6563899d5 | 6 | InterruptIn shiftGate_int(PC_6); |
flatcat | 0:e5d6563899d5 | 7 | AnalogIn pixelIn(A0); |
flatcat | 0:e5d6563899d5 | 8 | DigitalOut led(LED1); |
flatcat | 0:e5d6563899d5 | 9 | DigitalOut illuminator(PA_8); |
flatcat | 0:e5d6563899d5 | 10 | DigitalOut blueLED(PB_5); |
flatcat | 0:e5d6563899d5 | 11 | DigitalOut redLED(PB_10); |
flatcat | 0:e5d6563899d5 | 12 | Serial raspi(USBTX, USBRX); |
flatcat | 0:e5d6563899d5 | 13 | |
flatcat | 0:e5d6563899d5 | 14 | //testPin indicators - for use with logic analyzer to determine timing states |
flatcat | 0:e5d6563899d5 | 15 | DigitalOut tp_signalElements(PC_3); |
flatcat | 0:e5d6563899d5 | 16 | DigitalOut tp_leadingWaste(PC_2); |
flatcat | 0:e5d6563899d5 | 17 | DigitalOut tp_trailingWaste(PH_1); |
flatcat | 0:e5d6563899d5 | 18 | DigitalOut tp_t_INT(PH_0); |
flatcat | 0:e5d6563899d5 | 19 | DigitalOut tp_dump(PC_15); |
flatcat | 0:e5d6563899d5 | 20 | |
flatcat | 0:e5d6563899d5 | 21 | //define pin configuration for CCD control signals |
flatcat | 0:e5d6563899d5 | 22 | #define trigger PB_13 |
flatcat | 0:e5d6563899d5 | 23 | #define shiftGate PB_8 |
flatcat | 0:e5d6563899d5 | 24 | #define icg PB_3 |
flatcat | 0:e5d6563899d5 | 25 | #define masterClock PB_4 |
flatcat | 0:e5d6563899d5 | 26 | |
flatcat | 0:e5d6563899d5 | 27 | //Set up control signals as a bus (reversed) |
flatcat | 0:e5d6563899d5 | 28 | BusOut tcd1304dg_clocks(trigger, shiftGate, icg, masterClock); |
flatcat | 0:e5d6563899d5 | 29 | |
flatcat | 0:e5d6563899d5 | 30 | //define TCD1304AP/DG Characteristics |
flatcat | 0:e5d6563899d5 | 31 | #define signalElements 3648 |
flatcat | 0:e5d6563899d5 | 32 | #define pixelTotal 3694 |
flatcat | 0:e5d6563899d5 | 33 | #define leadingDummyElements 16 |
flatcat | 0:e5d6563899d5 | 34 | #define leadShieldedElements 13 |
flatcat | 0:e5d6563899d5 | 35 | #define headerElements 3 |
flatcat | 0:e5d6563899d5 | 36 | #define trailingDummyElements 14 |
flatcat | 2:75c8a8b6b872 | 37 | //#define MV(x) ((0xFFF*x)/3300) |
flatcat | 0:e5d6563899d5 | 38 | // MIST -- masterClock, icg, shiftGate, tigger |
flatcat | 0:e5d6563899d5 | 39 | #define transition_1 4 // beginning 0100 |
flatcat | 0:e5d6563899d5 | 40 | #define transition_2 12 // clock_1 1100 |
flatcat | 0:e5d6563899d5 | 41 | #define transition_3 4 // just before t2 0100 |
flatcat | 0:e5d6563899d5 | 42 | #define transition_4 8 // icg fall 1000 |
flatcat | 0:e5d6563899d5 | 43 | #define transition_5 2 // rise of sh for t3 0010 -- stretch here to increase integration time (must cycle masterClock) |
flatcat | 0:e5d6563899d5 | 44 | #define transition_6 10 // t3 masterHigh 1010 -- stretch here to increase integration time (must cycle masterClock) |
flatcat | 0:e5d6563899d5 | 45 | #define transition_7 2 // t3 masterLow 0010 |
flatcat | 1:37f04be9c0fa | 46 | #define transition_8 8 // t1 masterHigh 1000 -- repeat |
flatcat | 1:37f04be9c0fa | 47 | #define transition_9 0 // t1 masterLow 0000 -- repeat |
flatcat | 0:e5d6563899d5 | 48 | #define transition_10 12 // t4 masterHigh 1100 |
flatcat | 0:e5d6563899d5 | 49 | #define transition_11 4 // t4 masterLow 0100 -- repeat from here |
flatcat | 0:e5d6563899d5 | 50 | |
flatcat | 0:e5d6563899d5 | 51 | //define variables |
flatcat | 2:75c8a8b6b872 | 52 | long pixelCount; |
flatcat | 1:37f04be9c0fa | 53 | int sensitivity = 10000; |
flatcat | 0:e5d6563899d5 | 54 | double pixelData; |
flatcat | 0:e5d6563899d5 | 55 | float firmwareVersion = 0.5; |
flatcat | 0:e5d6563899d5 | 56 | double pixelValue[signalElements] = { 0 }; |
flatcat | 0:e5d6563899d5 | 57 | |
flatcat | 0:e5d6563899d5 | 58 | void delta_encode(char *buffer, int length){ |
flatcat | 0:e5d6563899d5 | 59 | char last = 0; |
flatcat | 0:e5d6563899d5 | 60 | for (int i = 0; i < length; i++){ |
flatcat | 0:e5d6563899d5 | 61 | char current = buffer[i]; |
flatcat | 0:e5d6563899d5 | 62 | buffer[i] = buffer[i] - last; |
flatcat | 0:e5d6563899d5 | 63 | last = current; |
flatcat | 0:e5d6563899d5 | 64 | } |
flatcat | 0:e5d6563899d5 | 65 | } |
flatcat | 0:e5d6563899d5 | 66 | |
flatcat | 0:e5d6563899d5 | 67 | void delta_decode(char *buffer, int length){ |
flatcat | 0:e5d6563899d5 | 68 | char last = 0; |
flatcat | 0:e5d6563899d5 | 69 | for (int i = 0; i < length; i++){ |
flatcat | 0:e5d6563899d5 | 70 | buffer[i] = buffer[i] + last; |
flatcat | 0:e5d6563899d5 | 71 | last = buffer[i]; |
flatcat | 0:e5d6563899d5 | 72 | } |
flatcat | 0:e5d6563899d5 | 73 | } |
flatcat | 0:e5d6563899d5 | 74 | |
flatcat | 0:e5d6563899d5 | 75 | void printInfo(){ |
flatcat | 0:e5d6563899d5 | 76 | time_t seconds = time(NULL); |
flatcat | 0:e5d6563899d5 | 77 | char buffer[32]; |
flatcat | 0:e5d6563899d5 | 78 | strftime(buffer, 32, "%I:%M %p\n", localtime(&seconds)); |
flatcat | 0:e5d6563899d5 | 79 | raspi.printf("meridianScientific\r\n"); |
flatcat | 0:e5d6563899d5 | 80 | raspi.printf("ramanPi - The DIY 3D Printable RaspberryPi Raman Spectrometer\r\n"); |
flatcat | 0:e5d6563899d5 | 81 | raspi.printf("Spectrometer imagingBoard %s\r\n", buffer); |
flatcat | 0:e5d6563899d5 | 82 | raspi.printf("-------------------------------------------------------------\r\n"); |
flatcat | 0:e5d6563899d5 | 83 | raspi.printf("Firmware Version: %f\r\n",firmwareVersion); |
flatcat | 0:e5d6563899d5 | 84 | raspi.printf("Current Sensitivity: %d\r\n\r\n\r\n", sensitivity); |
flatcat | 0:e5d6563899d5 | 85 | } |
flatcat | 0:e5d6563899d5 | 86 | |
flatcat | 0:e5d6563899d5 | 87 | void dataXfer_thread(void const *args){ |
flatcat | 0:e5d6563899d5 | 88 | while(1){ |
flatcat | 1:37f04be9c0fa | 89 | osSignalWait(0x2, osWaitForever); |
flatcat | 2:75c8a8b6b872 | 90 | // for (int pixelNumber=0; pixelNumber<signalElements; pixelNumber++) { |
flatcat | 2:75c8a8b6b872 | 91 | // raspi.printf("%i\t%4.12f\r\n", pixelNumber, 5 - ((pixelValue[pixelNumber - 1] * 5) / 4096.0)); |
flatcat | 1:37f04be9c0fa | 92 | // } |
flatcat | 2:75c8a8b6b872 | 93 | osDelay(100); |
flatcat | 2:75c8a8b6b872 | 94 | printf("Done.\r\n"); |
flatcat | 2:75c8a8b6b872 | 95 | // osDelay(5000); |
flatcat | 0:e5d6563899d5 | 96 | } |
flatcat | 0:e5d6563899d5 | 97 | } |
flatcat | 0:e5d6563899d5 | 98 | |
flatcat | 0:e5d6563899d5 | 99 | void imaging_thread(void const *args){ |
flatcat | 0:e5d6563899d5 | 100 | while(1){ |
flatcat | 1:37f04be9c0fa | 101 | osSignalWait(0x1, osWaitForever);// m icg sh trg |
flatcat | 2:75c8a8b6b872 | 102 | blueLED = 1; |
flatcat | 1:37f04be9c0fa | 103 | tcd1304dg_clocks = transition_1; // | | | | |
flatcat | 1:37f04be9c0fa | 104 | tcd1304dg_clocks = transition_2; // | | | | |
flatcat | 1:37f04be9c0fa | 105 | tcd1304dg_clocks = transition_3; // | | | | |
flatcat | 1:37f04be9c0fa | 106 | tcd1304dg_clocks = transition_4; // | | | | |
flatcat | 1:37f04be9c0fa | 107 | for(int mcInc = 1; mcInc < sensitivity; mcInc++ ){ |
flatcat | 1:37f04be9c0fa | 108 | tcd1304dg_clocks = transition_5; // | | | | |
flatcat | 1:37f04be9c0fa | 109 | tcd1304dg_clocks = transition_6; // | | | | |
flatcat | 1:37f04be9c0fa | 110 | } |
flatcat | 1:37f04be9c0fa | 111 | tcd1304dg_clocks = transition_7; // | | | | |
flatcat | 1:37f04be9c0fa | 112 | for(int mcInc = 1; mcInc < 80; mcInc++ ){ |
flatcat | 1:37f04be9c0fa | 113 | tcd1304dg_clocks = transition_8; // | | | | |
flatcat | 1:37f04be9c0fa | 114 | tcd1304dg_clocks = transition_9; // | | | | |
flatcat | 1:37f04be9c0fa | 115 | } |
flatcat | 1:37f04be9c0fa | 116 | for(int mcInc = 1; mcInc < pixelTotal; mcInc++ ){ |
flatcat | 1:37f04be9c0fa | 117 | tcd1304dg_clocks = transition_10; // | | | | |
flatcat | 1:37f04be9c0fa | 118 | tcd1304dg_clocks = transition_11; // | | | | |
flatcat | 2:75c8a8b6b872 | 119 | // FLAG FOR PIXEL READ HERE |
flatcat | 2:75c8a8b6b872 | 120 | // pixelCount++; |
flatcat | 2:75c8a8b6b872 | 121 | // pixelValue[pixelCount] = pixelIn.read_u16(); |
flatcat | 2:75c8a8b6b872 | 122 | raspi.printf("%i\t%4.12f\r\n", mcInc, (((pixelIn.read_u16()*5)/4096.0))); |
flatcat | 1:37f04be9c0fa | 123 | tcd1304dg_clocks = transition_10; // | | | | |
flatcat | 1:37f04be9c0fa | 124 | tcd1304dg_clocks = transition_11; // | | | | |
flatcat | 1:37f04be9c0fa | 125 | } |
flatcat | 1:37f04be9c0fa | 126 | tcd1304dg_clocks = 13; |
flatcat | 2:75c8a8b6b872 | 127 | blueLED = 0; |
flatcat | 0:e5d6563899d5 | 128 | } |
flatcat | 0:e5d6563899d5 | 129 | } |
flatcat | 0:e5d6563899d5 | 130 | |
flatcat | 0:e5d6563899d5 | 131 | //define threads for imaging and data transfer |
flatcat | 0:e5d6563899d5 | 132 | osThreadDef(imaging_thread, osPriorityRealtime, DEFAULT_STACK_SIZE); |
flatcat | 0:e5d6563899d5 | 133 | osThreadDef(dataXfer_thread, osPriorityNormal, DEFAULT_STACK_SIZE); |
flatcat | 0:e5d6563899d5 | 134 | |
flatcat | 0:e5d6563899d5 | 135 | void init(){ |
flatcat | 0:e5d6563899d5 | 136 | tp_signalElements = 0; |
flatcat | 0:e5d6563899d5 | 137 | tp_leadingWaste = 0; |
flatcat | 0:e5d6563899d5 | 138 | tp_trailingWaste = 0; |
flatcat | 0:e5d6563899d5 | 139 | tp_t_INT = 0; |
flatcat | 0:e5d6563899d5 | 140 | tp_dump = 0; |
flatcat | 0:e5d6563899d5 | 141 | illuminator = 0; |
flatcat | 0:e5d6563899d5 | 142 | redLED = 0; |
flatcat | 0:e5d6563899d5 | 143 | blueLED = 0; |
flatcat | 2:75c8a8b6b872 | 144 | pixelCount = 0; |
flatcat | 0:e5d6563899d5 | 145 | } |
flatcat | 0:e5d6563899d5 | 146 | |
flatcat | 0:e5d6563899d5 | 147 | int main(){ |
flatcat | 0:e5d6563899d5 | 148 | set_time(1256729737); |
flatcat | 0:e5d6563899d5 | 149 | tcd1304dg_clocks = 0; |
flatcat | 0:e5d6563899d5 | 150 | init(); |
flatcat | 0:e5d6563899d5 | 151 | raspi.baud(921600); |
flatcat | 2:75c8a8b6b872 | 152 | raspi.printf("Greetings.\r\n\r\n"); |
flatcat | 0:e5d6563899d5 | 153 | osThreadId img = osThreadCreate(osThread(imaging_thread), NULL); |
flatcat | 0:e5d6563899d5 | 154 | osThreadId xfr = osThreadCreate(osThread(dataXfer_thread), NULL); |
flatcat | 0:e5d6563899d5 | 155 | |
flatcat | 0:e5d6563899d5 | 156 | //command interpreter |
flatcat | 0:e5d6563899d5 | 157 | while(true){ |
flatcat | 0:e5d6563899d5 | 158 | char c = raspi.getc(); |
flatcat | 0:e5d6563899d5 | 159 | switch (c) { |
flatcat | 0:e5d6563899d5 | 160 | case 'r': |
flatcat | 0:e5d6563899d5 | 161 | osSignalSet(img, 0x1); |
flatcat | 0:e5d6563899d5 | 162 | break; |
flatcat | 0:e5d6563899d5 | 163 | case 'i': |
flatcat | 1:37f04be9c0fa | 164 | osSignalSet(xfr, 0x2); |
flatcat | 0:e5d6563899d5 | 165 | break; |
flatcat | 0:e5d6563899d5 | 166 | default: |
flatcat | 0:e5d6563899d5 | 167 | break; |
flatcat | 0:e5d6563899d5 | 168 | } |
flatcat | 1:37f04be9c0fa | 169 | // osDelay(10); |
flatcat | 0:e5d6563899d5 | 170 | } |
flatcat | 0:e5d6563899d5 | 171 | } |