Master 1 hr . takes input form the serial connection of PC

Dependencies:   mbed

Committer:
manujose
Date:
Sat Dec 04 06:10:16 2010 +0000
Revision:
0:219eacd4c264

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
manujose 0:219eacd4c264 1 #ifndef PROBLEMB1_H_
manujose 0:219eacd4c264 2 #define PROBLEMB1_H_
manujose 0:219eacd4c264 3 #include "mbed.h"
manujose 0:219eacd4c264 4 #include "decl.h"
manujose 0:219eacd4c264 5 #include "pqueue.h"
manujose 0:219eacd4c264 6
manujose 0:219eacd4c264 7 pQueue globalQ;
manujose 0:219eacd4c264 8 unsigned int gTime =0;
manujose 0:219eacd4c264 9 int B;
manujose 0:219eacd4c264 10
manujose 0:219eacd4c264 11
manujose 0:219eacd4c264 12 timeval ideal_trg_time[100];
manujose 0:219eacd4c264 13 int ideal_trg_time_index = 0;
manujose 0:219eacd4c264 14
manujose 0:219eacd4c264 15 timeval pps;
manujose 0:219eacd4c264 16
manujose 0:219eacd4c264 17 union {
manujose 0:219eacd4c264 18 unsigned int t;
manujose 0:219eacd4c264 19 char BYTE[4];
manujose 0:219eacd4c264 20 }t1,t2,t3,t4;
manujose 0:219eacd4c264 21
manujose 0:219eacd4c264 22
manujose 0:219eacd4c264 23
manujose 0:219eacd4c264 24 void initialSetup(void) {
manujose 0:219eacd4c264 25 // doing capture register for now, so use timer 2
manujose 0:219eacd4c264 26 LPC_SC->PCLKSEL1 |= (0x01 << 12); //set the frequency REF: USER MANULA TAB 40,41,42 ?? check
manujose 0:219eacd4c264 27 LPC_SC-> PCONP |= (0x3 << 22); // timer 2
manujose 0:219eacd4c264 28
manujose 0:219eacd4c264 29 //LPC_TIM2->TCR = 0x2; // Reset and set to timer mode
manujose 0:219eacd4c264 30
manujose 0:219eacd4c264 31 // Select PIN
manujose 0:219eacd4c264 32
manujose 0:219eacd4c264 33 LPC_PINCON->PINSEL0 |= (0xf << 8);
manujose 0:219eacd4c264 34 LPC_TIM2->CCR |= 0x07;// doing capture register for now, so use timer 2
manujose 0:219eacd4c264 35
manujose 0:219eacd4c264 36 LPC_TIM2->MR0 = RESET_42;
manujose 0:219eacd4c264 37 LPC_TIM2->MCR = 3; // Interrupt, Stop, and Reset on match
manujose 0:219eacd4c264 38
manujose 0:219eacd4c264 39 //LPC_TIM2->TCR = 0x2; // Reset and set to timer mode
manujose 0:219eacd4c264 40
manujose 0:219eacd4c264 41 LPC_TIM2->TCR = 0x1;
manujose 0:219eacd4c264 42
manujose 0:219eacd4c264 43
manujose 0:219eacd4c264 44 // ================ //
manujose 0:219eacd4c264 45
manujose 0:219eacd4c264 46
manujose 0:219eacd4c264 47
manujose 0:219eacd4c264 48
manujose 0:219eacd4c264 49 /*LPC_SC->PCLKSEL0 |= 0x04; //set the frequency REF: USER MANULA TAB 40,41,42 ?? check
manujose 0:219eacd4c264 50
manujose 0:219eacd4c264 51 LPC_SC-> PCONP |= 1 << 1; // Power on Timer0
manujose 0:219eacd4c264 52
manujose 0:219eacd4c264 53 LPC_TIM0->TCR = 0x2; // Reset and set to timer mode
manujose 0:219eacd4c264 54 LPC_TIM0->CTCR = 0x0;
manujose 0:219eacd4c264 55 LPC_TIM0->PR = 0; // No prescale
manujose 0:219eacd4c264 56 //LPC_TIM0->MR0 = 0xF0537000 ; // Match count for 100mS
manujose 0:219eacd4c264 57 LPC_TIM0->MR0 = RESET_42;
manujose 0:219eacd4c264 58 LPC_TIM0->MCR = 3; // Interrupt, Stop, and Reset on match
manujose 0:219eacd4c264 59
manujose 0:219eacd4c264 60
manujose 0:219eacd4c264 61 LPC_TIM0->TCR = 1; // Enable Timer0
manujose 0:219eacd4c264 62 // Enable the ISR vector
manujose 0:219eacd4c264 63 */
manujose 0:219eacd4c264 64 NVIC_SetVector (TIMER2_IRQn, (uint32_t)&Timer0_IRQHandler);
manujose 0:219eacd4c264 65 NVIC_EnableIRQ(TIMER2_IRQn);
manujose 0:219eacd4c264 66
manujose 0:219eacd4c264 67 // LPC_TIM0->MCR |= 11; //for mr1 and mr0
manujose 0:219eacd4c264 68 //queue set up
manujose 0:219eacd4c264 69 globalQ.numEle = 0;
manujose 0:219eacd4c264 70 globalQ.head = NULL;
manujose 0:219eacd4c264 71 }
manujose 0:219eacd4c264 72 void Timer0_IRQHandler(void) {
manujose 0:219eacd4c264 73 // LPC_TIM0->IR=0xff;
manujose 0:219eacd4c264 74 //LPC_TIM0->MR0 = 0x5370;
manujose 0:219eacd4c264 75 if (LPC_TIM2->IR&1) {
manujose 0:219eacd4c264 76 gTime++;
manujose 0:219eacd4c264 77 // pc.printf("\ngtime = %X",LPC_TIM2->IR);
manujose 0:219eacd4c264 78 }
manujose 0:219eacd4c264 79 if ( (LPC_TIM2->IR >> 1)&1 ) { //RUN THE RUNAT TIME HIT
manujose 0:219eacd4c264 80 qEle *ele = pop(&globalQ);
manujose 0:219eacd4c264 81
manujose 0:219eacd4c264 82
manujose 0:219eacd4c264 83 ele->foo();
manujose 0:219eacd4c264 84
manujose 0:219eacd4c264 85 free(ele);
manujose 0:219eacd4c264 86
manujose 0:219eacd4c264 87 }
manujose 0:219eacd4c264 88 if ( (LPC_TIM2->IR >> 4 )& 1) { // run report toggle
manujose 0:219eacd4c264 89 timeval curT;
manujose 0:219eacd4c264 90 unsigned int nMSec = (LPC_TIM2->CR0)/CLK_FRQ;
manujose 0:219eacd4c264 91 // pc.printf(" THE mMSec = %d \n",nMSec);
manujose 0:219eacd4c264 92 unsigned int nSec = nMSec/1000000;
manujose 0:219eacd4c264 93 curT.tv_sec = gTime*42 + nSec;
manujose 0:219eacd4c264 94 curT.tv_usec = nMSec-(nSec*1000000);
manujose 0:219eacd4c264 95 gtrigFunc(&curT);
manujose 0:219eacd4c264 96
manujose 0:219eacd4c264 97 }
manujose 0:219eacd4c264 98
manujose 0:219eacd4c264 99 //check if more ele for schedule this time ?
manujose 0:219eacd4c264 100 //C if ((globalQ.numEle >0) && (globalQ.head->sched ==0)&& (globalQ.head->t.tv_sec <((gTime+1)*42))) {
manujose 0:219eacd4c264 101 //C globalQ.head->sched = 1;
manujose 0:219eacd4c264 102
manujose 0:219eacd4c264 103 // LPC_TIM0->MR1 = (globalQ.head->t.tv_sec-gTime*42)*96000000 +globalQ.head->t.tv_usec*96;
manujose 0:219eacd4c264 104 //C LPC_TIM2->MR1 = (globalQ.head->t.tv_sec-gTime*42)*CLK_FREQUENCY +globalQ.head->t.tv_usec*CLK_FRQ;
manujose 0:219eacd4c264 105 //C LPC_TIM2->MCR |= 8;
manujose 0:219eacd4c264 106 // pc.printf("\n MR1 = %X",LPC_TIM2->MR1);
manujose 0:219eacd4c264 107
manujose 0:219eacd4c264 108
manujose 0:219eacd4c264 109 //C } else if (globalQ.head->sched == 0) //NO events in this gTime update yet .
manujose 0:219eacd4c264 110 //C { //turn off the match regiester 1 interrupts.
manujose 0:219eacd4c264 111 //C LPC_TIM2->MCR &= 3;
manujose 0:219eacd4c264 112 //C }
manujose 0:219eacd4c264 113
manujose 0:219eacd4c264 114 //Ctimeval t;
manujose 0:219eacd4c264 115 //C getTime(&t);
manujose 0:219eacd4c264 116 LPC_TIM2->IR = 0xff;
manujose 0:219eacd4c264 117 // pc.printf("INCREMENTING COUNTER or event %d \n",t.tv_sec);
manujose 0:219eacd4c264 118 }
manujose 0:219eacd4c264 119
manujose 0:219eacd4c264 120
manujose 0:219eacd4c264 121 void getTime(timeval *tv) {
manujose 0:219eacd4c264 122 unsigned int nMSec = (LPC_TIM2->TC)/CLK_FRQ; //gives num of micro sec
manujose 0:219eacd4c264 123 // unsigned int nMSec = (LPC_TIM0->TC + offset)/72;
manujose 0:219eacd4c264 124 unsigned int nSec = nMSec/1000000;
manujose 0:219eacd4c264 125 tv->tv_sec = gTime*42 + nSec;
manujose 0:219eacd4c264 126 // tv->tv_usec = (LPC_TIM0->TC)*1000 + (float)(LPC_TIM0->PC)/( CLK_FREQUENCY * 1000000);
manujose 0:219eacd4c264 127 tv->tv_usec = nMSec-(nSec*1000000);
manujose 0:219eacd4c264 128 }
manujose 0:219eacd4c264 129
manujose 0:219eacd4c264 130 int curTimeEqualGR(timeval *tv) {
manujose 0:219eacd4c264 131 timeval curT;
manujose 0:219eacd4c264 132 getTime(&curT);
manujose 0:219eacd4c264 133 if (curT.tv_sec == tv->tv_sec) {
manujose 0:219eacd4c264 134 if (curT.tv_usec == tv->tv_usec)
manujose 0:219eacd4c264 135 return 1;
manujose 0:219eacd4c264 136 else
manujose 0:219eacd4c264 137 pc.printf("WROING MICRO CALIBERATION\n");
manujose 0:219eacd4c264 138 return 1;
manujose 0:219eacd4c264 139 } else if (curT.tv_sec > tv->tv_sec) {
manujose 0:219eacd4c264 140 pc.printf("WRONG cur = %d and req = %d \n",curT.tv_sec, tv->tv_sec);
manujose 0:219eacd4c264 141 return 1;
manujose 0:219eacd4c264 142 }
manujose 0:219eacd4c264 143 return 0;
manujose 0:219eacd4c264 144 }
manujose 0:219eacd4c264 145 int runAtTime(void (*schedFunc)(void), timeval *tv) {
manujose 0:219eacd4c264 146 int ret =0;
manujose 0:219eacd4c264 147 ret = enqueue(&globalQ, *tv, schedFunc);
manujose 0:219eacd4c264 148 //C if (tv->tv_sec < (gTime+1)*42) {
manujose 0:219eacd4c264 149
manujose 0:219eacd4c264 150 //C if (globalQ.head->sched == 0) {
manujose 0:219eacd4c264 151
manujose 0:219eacd4c264 152 //C LPC_TIM2->MR1 = ((globalQ.head->t.tv_sec%42 )*CLK_FREQUENCY+(globalQ.head->t.tv_usec*CLK_FRQ));
manujose 0:219eacd4c264 153 //C globalQ.head->sched = 1;
manujose 0:219eacd4c264 154 //C LPC_TIM2->MCR |= 8;
manujose 0:219eacd4c264 155 //C }
manujose 0:219eacd4c264 156 //C }
manujose 0:219eacd4c264 157 return ret;
manujose 0:219eacd4c264 158 }
manujose 0:219eacd4c264 159 void trigEX(timeval *tv) {
manujose 0:219eacd4c264 160 pc.printf(" Triggered at %d\n",tv->tv_sec);
manujose 0:219eacd4c264 161 }
manujose 0:219eacd4c264 162 void trigger(void) {
manujose 0:219eacd4c264 163 timeval curT;
manujose 0:219eacd4c264 164 unsigned int nMSec = (LPC_TIM2->CR0)/CLK_FRQ;
manujose 0:219eacd4c264 165 unsigned int nSec = nMSec/1000000;
manujose 0:219eacd4c264 166 curT.tv_sec = gTime*42 + nSec;
manujose 0:219eacd4c264 167 curT.tv_usec = nMSec-(nSec*1000000);
manujose 0:219eacd4c264 168 gtrigFunc(&curT);
manujose 0:219eacd4c264 169 }
manujose 0:219eacd4c264 170 void runAtTrigger(void(*trigFunc)(timeval *tv)) {
manujose 0:219eacd4c264 171 gtrigFunc = trigFunc;
manujose 0:219eacd4c264 172 // trig.rise(&trigger);
manujose 0:219eacd4c264 173 // trig.fall(&trigger);
manujose 0:219eacd4c264 174 // pc.printf("Runing runAtTrigger\n");
manujose 0:219eacd4c264 175 }
manujose 0:219eacd4c264 176
manujose 0:219eacd4c264 177
manujose 0:219eacd4c264 178 void resp_sync_request(void) {
manujose 0:219eacd4c264 179 union {
manujose 0:219eacd4c264 180 unsigned int t;
manujose 0:219eacd4c264 181 char BYTE[4];
manujose 0:219eacd4c264 182 } t2,t3;
manujose 0:219eacd4c264 183
manujose 0:219eacd4c264 184 t2.t = LPC_TIM2->TC;
manujose 0:219eacd4c264 185
manujose 0:219eacd4c264 186 // read the byte ;
manujose 0:219eacd4c264 187 sync.getc();
manujose 0:219eacd4c264 188 // pc.printf(" \n resp_sync_request t2 = %X \n",t2.t);
manujose 0:219eacd4c264 189
manujose 0:219eacd4c264 190 wait(0.5);
manujose 0:219eacd4c264 191 // read the present time
manujose 0:219eacd4c264 192 // serially send out the data over to the slave
manujose 0:219eacd4c264 193
manujose 0:219eacd4c264 194 sync.putc(t2.BYTE[0]);
manujose 0:219eacd4c264 195 sync.putc(t2.BYTE[1]);
manujose 0:219eacd4c264 196 sync.putc(t2.BYTE[2]);
manujose 0:219eacd4c264 197 sync.putc(t2.BYTE[3]);
manujose 0:219eacd4c264 198
manujose 0:219eacd4c264 199 // Get the present time;
manujose 0:219eacd4c264 200
manujose 0:219eacd4c264 201 t3.t = LPC_TIM2->TC;
manujose 0:219eacd4c264 202 sync.putc(t3.BYTE[0]);
manujose 0:219eacd4c264 203 sync.putc(t3.BYTE[1]);
manujose 0:219eacd4c264 204 sync.putc(t3.BYTE[2]);
manujose 0:219eacd4c264 205 sync.putc(t3.BYTE[3]);
manujose 0:219eacd4c264 206 B+=8;
manujose 0:219eacd4c264 207 // pc.printf(" Sync request %X & %X",t2.t, t3.t);
manujose 0:219eacd4c264 208 }
manujose 0:219eacd4c264 209
manujose 0:219eacd4c264 210 void pinToggle(void) {
manujose 0:219eacd4c264 211 toggle = !toggle;
manujose 0:219eacd4c264 212 //C pc.putc('T');
manujose 0:219eacd4c264 213 //C pps.tv_sec++;
manujose 0:219eacd4c264 214 //C runAtTime(&pinToggle,&pps);
manujose 0:219eacd4c264 215 }
manujose 0:219eacd4c264 216
manujose 0:219eacd4c264 217
manujose 0:219eacd4c264 218 void reportToggle(timeval *rt) {
manujose 0:219eacd4c264 219 int slv_trg_val = 0;
manujose 0:219eacd4c264 220 //slv_trg_val = LPC_TIM2->CR;
manujose 0:219eacd4c264 221
manujose 0:219eacd4c264 222 //pc.putc('T');
manujose 0:219eacd4c264 223
manujose 0:219eacd4c264 224 int slv_diff;
manujose 0:219eacd4c264 225 // load the CR0 value
manujose 0:219eacd4c264 226
manujose 0:219eacd4c264 227 // slv_diff = (rt->tv_sec - ideal_trg_time[ideal_trg_time_index].tv_sec)*1000000 +
manujose 0:219eacd4c264 228 // rt->tv_usec - ideal_trg_time[ideal_trg_time_index].tv_usec;
manujose 0:219eacd4c264 229
manujose 0:219eacd4c264 230 // pc.printf("\n %d %d %d %d ", rt->tv_sec, rt->tv_usec, ideal_trg_time[ideal_trg_time_index].tv_sec, \
manujose 0:219eacd4c264 231 // ideal_trg_time[ideal_trg_time_index].tv_usec);
manujose 0:219eacd4c264 232
manujose 0:219eacd4c264 233 // ideal_trg_time_index++;
manujose 0:219eacd4c264 234 //1 pps part.
manujose 0:219eacd4c264 235 //slv_diff = rt->tv_usec -ideal_trg_time[0].tv_usec;
manujose 0:219eacd4c264 236 timeval t;
manujose 0:219eacd4c264 237 getTime(&t);
manujose 0:219eacd4c264 238 if((globalQ.head->t.tv_sec > t.tv_sec) )
manujose 0:219eacd4c264 239 pc.printf(" NOT POPING ele = %d and usec =%d\n", globalQ.head->t.tv_sec, globalQ.head->t.tv_usec);
manujose 0:219eacd4c264 240
manujose 0:219eacd4c264 241 else
manujose 0:219eacd4c264 242 {
manujose 0:219eacd4c264 243 qEle *ele = pop(&globalQ);
manujose 0:219eacd4c264 244 if (ele) {
manujose 0:219eacd4c264 245 ele->foo();
manujose 0:219eacd4c264 246 free(ele);
manujose 0:219eacd4c264 247 slv_diff = rt->tv_usec - ele->t.tv_usec;
manujose 0:219eacd4c264 248 // pc.printf("THE DIFF is %d at sec =q %d --oc %d and usec = q %d --oc %d\n",slv_diff, ele->t.tv_sec,rt->tv_sec, ele->t.tv_usec,rt->tv_usec);
manujose 0:219eacd4c264 249 timeval t;
manujose 0:219eacd4c264 250 getTime(&t);
manujose 0:219eacd4c264 251 pc.printf(" %d and sec %d and usec = %d and from there %d \n",slv_diff,t.tv_sec, t.tv_usec,rt->tv_usec);
manujose 0:219eacd4c264 252 }
manujose 0:219eacd4c264 253 }
manujose 0:219eacd4c264 254
manujose 0:219eacd4c264 255 }
manujose 0:219eacd4c264 256
manujose 0:219eacd4c264 257
manujose 0:219eacd4c264 258
manujose 0:219eacd4c264 259
manujose 0:219eacd4c264 260 #endif