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@0:e5d6563899d5, 2014-10-23 (annotated)
- Committer:
- flatcat
- Date:
- Thu Oct 23 00:08:09 2014 +0000
- Revision:
- 0:e5d6563899d5
- Child:
- 1:37f04be9c0fa
good starting point... nice structure and very clean..;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
flatcat | 0:e5d6563899d5 | 1 | #include "mbed.h" |
flatcat | 0:e5d6563899d5 | 2 | #include "cmsis_os.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 | 0:e5d6563899d5 | 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 | 0:e5d6563899d5 | 46 | #define transition_8 8 // t1 masterHigh 1000 |
flatcat | 0:e5d6563899d5 | 47 | #define transition_9 0 // t2 masterLow 0000 |
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 | 0:e5d6563899d5 | 52 | int pixelCount; |
flatcat | 0:e5d6563899d5 | 53 | int sensitivity = 1; |
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 | 0:e5d6563899d5 | 89 | osSignalWait(0x1, osWaitForever); |
flatcat | 0:e5d6563899d5 | 90 | redLED = 1; |
flatcat | 0:e5d6563899d5 | 91 | // for (int pixelNumber=0; pixelNumber<signalElements; pixelNumber++) { |
flatcat | 0:e5d6563899d5 | 92 | // raspi.printf("%i\t%4.12f\r\n", pixelNumber, 5 - ((pixelValue[pixelNumber - 1] * 5) / 4096.0)); |
flatcat | 0:e5d6563899d5 | 93 | // osDelay(100); |
flatcat | 0:e5d6563899d5 | 94 | // } |
flatcat | 0:e5d6563899d5 | 95 | printInfo(); |
flatcat | 0:e5d6563899d5 | 96 | osDelay(1000); |
flatcat | 0:e5d6563899d5 | 97 | redLED = 0; |
flatcat | 0:e5d6563899d5 | 98 | } |
flatcat | 0:e5d6563899d5 | 99 | } |
flatcat | 0:e5d6563899d5 | 100 | |
flatcat | 0:e5d6563899d5 | 101 | void imaging_thread(void const *args){ |
flatcat | 0:e5d6563899d5 | 102 | while(1){ |
flatcat | 0:e5d6563899d5 | 103 | osSignalWait(0x1, osWaitForever); |
flatcat | 0:e5d6563899d5 | 104 | blueLED = !blueLED; |
flatcat | 0:e5d6563899d5 | 105 | osDelay(30); |
flatcat | 0:e5d6563899d5 | 106 | } |
flatcat | 0:e5d6563899d5 | 107 | } |
flatcat | 0:e5d6563899d5 | 108 | |
flatcat | 0:e5d6563899d5 | 109 | //define threads for imaging and data transfer |
flatcat | 0:e5d6563899d5 | 110 | osThreadDef(imaging_thread, osPriorityRealtime, DEFAULT_STACK_SIZE); |
flatcat | 0:e5d6563899d5 | 111 | osThreadDef(dataXfer_thread, osPriorityNormal, DEFAULT_STACK_SIZE); |
flatcat | 0:e5d6563899d5 | 112 | |
flatcat | 0:e5d6563899d5 | 113 | void init(){ |
flatcat | 0:e5d6563899d5 | 114 | tp_signalElements = 0; |
flatcat | 0:e5d6563899d5 | 115 | tp_leadingWaste = 0; |
flatcat | 0:e5d6563899d5 | 116 | tp_trailingWaste = 0; |
flatcat | 0:e5d6563899d5 | 117 | tp_t_INT = 0; |
flatcat | 0:e5d6563899d5 | 118 | tp_dump = 0; |
flatcat | 0:e5d6563899d5 | 119 | illuminator = 0; |
flatcat | 0:e5d6563899d5 | 120 | redLED = 0; |
flatcat | 0:e5d6563899d5 | 121 | blueLED = 0; |
flatcat | 0:e5d6563899d5 | 122 | } |
flatcat | 0:e5d6563899d5 | 123 | |
flatcat | 0:e5d6563899d5 | 124 | int main(){ |
flatcat | 0:e5d6563899d5 | 125 | set_time(1256729737); |
flatcat | 0:e5d6563899d5 | 126 | tcd1304dg_clocks = 0; |
flatcat | 0:e5d6563899d5 | 127 | init(); |
flatcat | 0:e5d6563899d5 | 128 | raspi.baud(921600); |
flatcat | 0:e5d6563899d5 | 129 | osThreadId img = osThreadCreate(osThread(imaging_thread), NULL); |
flatcat | 0:e5d6563899d5 | 130 | osThreadId xfr = osThreadCreate(osThread(dataXfer_thread), NULL); |
flatcat | 0:e5d6563899d5 | 131 | |
flatcat | 0:e5d6563899d5 | 132 | //command interpreter |
flatcat | 0:e5d6563899d5 | 133 | while(true){ |
flatcat | 0:e5d6563899d5 | 134 | led =!led; |
flatcat | 0:e5d6563899d5 | 135 | char c = raspi.getc(); |
flatcat | 0:e5d6563899d5 | 136 | switch (c) { |
flatcat | 0:e5d6563899d5 | 137 | case 'r': |
flatcat | 0:e5d6563899d5 | 138 | osSignalSet(img, 0x1); |
flatcat | 0:e5d6563899d5 | 139 | break; |
flatcat | 0:e5d6563899d5 | 140 | case 'i': |
flatcat | 0:e5d6563899d5 | 141 | osSignalSet(xfr, 0x1); |
flatcat | 0:e5d6563899d5 | 142 | break; |
flatcat | 0:e5d6563899d5 | 143 | default: |
flatcat | 0:e5d6563899d5 | 144 | break; |
flatcat | 0:e5d6563899d5 | 145 | } |
flatcat | 0:e5d6563899d5 | 146 | osDelay(10); |
flatcat | 0:e5d6563899d5 | 147 | } |
flatcat | 0:e5d6563899d5 | 148 | } |