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..

Dependencies:   mbed-rtos mbed

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?

UserRevisionLine numberNew 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 }