B.3 : THE 6 HOUR PROGRAM WITH 1 PPS SIGNAL THE MASTER TO BE CONNECTED TO 11 PIN.

Dependencies:   mbed

Committer:
manujose
Date:
Tue Dec 14 23:26:02 2010 +0000
Revision:
1:9efda6a3f83c
Parent:
0:e6964ff1bbcc
hello

Who changed what in which revision?

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