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

Dependencies:   mbed

Committer:
manujose
Date:
Sat Dec 04 05:09:15 2010 +0000
Revision:
0:e6964ff1bbcc
Child:
1:9efda6a3f83c

        

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 0:e6964ff1bbcc 8
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 0:e6964ff1bbcc 36 LPC_TIM2->CCR |= 0x07;// doing capture register for now, so use timer 2
manujose 0:e6964ff1bbcc 37
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 0:e6964ff1bbcc 77 if (LPC_TIM2->IR&1) {
manujose 0:e6964ff1bbcc 78 gTime++;
manujose 0:e6964ff1bbcc 79 // pc.printf("\ngtime = %X",LPC_TIM2->IR);
manujose 0:e6964ff1bbcc 80 } if ( (LPC_TIM2->IR >> 1)&1 ){ //RUN THE RUNAT TIME HIT
manujose 0:e6964ff1bbcc 81 qEle *ele = pop(&globalQ);
manujose 0:e6964ff1bbcc 82
manujose 0:e6964ff1bbcc 83
manujose 0:e6964ff1bbcc 84 ele->foo();
manujose 0:e6964ff1bbcc 85
manujose 0:e6964ff1bbcc 86 free(ele);
manujose 0:e6964ff1bbcc 87
manujose 0:e6964ff1bbcc 88 }
manujose 0:e6964ff1bbcc 89 if( (LPC_TIM2->IR >> 4 )& 1){ // run report toggle
manujose 0:e6964ff1bbcc 90 timeval curT;
manujose 0:e6964ff1bbcc 91 unsigned int nMSec = (LPC_TIM2->CR0)/CLK_FRQ;
manujose 0:e6964ff1bbcc 92 unsigned int nSec = nMSec/1000000;
manujose 0:e6964ff1bbcc 93 curT.tv_sec = gTime*42 + nSec;
manujose 0:e6964ff1bbcc 94 curT.tv_usec = nMSec-(nSec*1000000);
manujose 0:e6964ff1bbcc 95 gtrigFunc(&curT);
manujose 0:e6964ff1bbcc 96
manujose 0:e6964ff1bbcc 97 }
manujose 0:e6964ff1bbcc 98
manujose 0:e6964ff1bbcc 99 //check if more ele for schedule this time ?
manujose 0:e6964ff1bbcc 100 if ((globalQ.numEle >0) && (globalQ.head->sched ==0)&& (globalQ.head->t.tv_sec <((gTime+1)*42))) {
manujose 0:e6964ff1bbcc 101 globalQ.head->sched = 1;
manujose 0:e6964ff1bbcc 102
manujose 0:e6964ff1bbcc 103 // LPC_TIM0->MR1 = (globalQ.head->t.tv_sec-gTime*42)*96000000 +globalQ.head->t.tv_usec*96;
manujose 0:e6964ff1bbcc 104 LPC_TIM2->MR1 = (globalQ.head->t.tv_sec-gTime*42)*CLK_FREQUENCY +globalQ.head->t.tv_usec*CLK_FRQ;
manujose 0:e6964ff1bbcc 105 LPC_TIM2->MCR |= 8;
manujose 0:e6964ff1bbcc 106 pc.printf("\n MR1 = %X",LPC_TIM2->MR1);
manujose 0:e6964ff1bbcc 107
manujose 0:e6964ff1bbcc 108
manujose 0:e6964ff1bbcc 109 } else if (globalQ.head->sched == 0) //NO events in this gTime update yet .
manujose 0:e6964ff1bbcc 110 { //turn off the match regiester 1 interrupts.
manujose 0:e6964ff1bbcc 111 LPC_TIM2->MCR &= 3;
manujose 0:e6964ff1bbcc 112 }
manujose 0:e6964ff1bbcc 113
manujose 0:e6964ff1bbcc 114 timeval t;
manujose 0:e6964ff1bbcc 115 getTime(&t);
manujose 0:e6964ff1bbcc 116 LPC_TIM2->IR = 0xff;
manujose 0:e6964ff1bbcc 117 // pc.printf("INCREMENTING COUNTER or event %d \n",t.tv_sec);
manujose 0:e6964ff1bbcc 118 }
manujose 0:e6964ff1bbcc 119
manujose 0:e6964ff1bbcc 120
manujose 0:e6964ff1bbcc 121 void getTime(timeval *tv) {
manujose 0:e6964ff1bbcc 122 unsigned int nMSec = (LPC_TIM2->TC)/CLK_FRQ; //gives num of micro sec
manujose 0:e6964ff1bbcc 123 // unsigned int nMSec = (LPC_TIM0->TC + offset)/72;
manujose 0:e6964ff1bbcc 124 unsigned int nSec = nMSec/1000000;
manujose 0:e6964ff1bbcc 125 tv->tv_sec = gTime*42 + nSec;
manujose 0:e6964ff1bbcc 126 // tv->tv_usec = (LPC_TIM0->TC)*1000 + (float)(LPC_TIM0->PC)/( CLK_FREQUENCY * 1000000);
manujose 0:e6964ff1bbcc 127 tv->tv_usec = nMSec-(nSec*1000000);
manujose 0:e6964ff1bbcc 128 }
manujose 0:e6964ff1bbcc 129
manujose 0:e6964ff1bbcc 130 int curTimeEqualGR(timeval *tv) {
manujose 0:e6964ff1bbcc 131 timeval curT;
manujose 0:e6964ff1bbcc 132 getTime(&curT);
manujose 0:e6964ff1bbcc 133 if (curT.tv_sec == tv->tv_sec) {
manujose 0:e6964ff1bbcc 134 if (curT.tv_usec == tv->tv_usec)
manujose 0:e6964ff1bbcc 135 return 1;
manujose 0:e6964ff1bbcc 136 else
manujose 0:e6964ff1bbcc 137 pc.printf("WROING MICRO CALIBERATION\n");
manujose 0:e6964ff1bbcc 138 return 1;
manujose 0:e6964ff1bbcc 139 } else if (curT.tv_sec > tv->tv_sec) {
manujose 0:e6964ff1bbcc 140 pc.printf("WRONG cur = %d and req = %d \n",curT.tv_sec, tv->tv_sec);
manujose 0:e6964ff1bbcc 141 return 1;
manujose 0:e6964ff1bbcc 142 }
manujose 0:e6964ff1bbcc 143 return 0;
manujose 0:e6964ff1bbcc 144 }
manujose 0:e6964ff1bbcc 145 int runAtTime(void (*schedFunc)(void), timeval *tv) {
manujose 0:e6964ff1bbcc 146 int ret =0;
manujose 0:e6964ff1bbcc 147 ret = enqueue(&globalQ, *tv, schedFunc);
manujose 0:e6964ff1bbcc 148 if (tv->tv_sec < (gTime+1)*42) {
manujose 0:e6964ff1bbcc 149
manujose 0:e6964ff1bbcc 150 if (globalQ.head->sched == 0) {
manujose 0:e6964ff1bbcc 151
manujose 0:e6964ff1bbcc 152 LPC_TIM2->MR1 = ((globalQ.head->t.tv_sec%42 )*CLK_FREQUENCY+(globalQ.head->t.tv_usec*CLK_FRQ));
manujose 0:e6964ff1bbcc 153 globalQ.head->sched = 1;
manujose 0:e6964ff1bbcc 154 LPC_TIM2->MCR |= 8;
manujose 0:e6964ff1bbcc 155 }
manujose 0:e6964ff1bbcc 156 }
manujose 0:e6964ff1bbcc 157 return ret;
manujose 0:e6964ff1bbcc 158 }
manujose 0:e6964ff1bbcc 159 void trigEX(timeval *tv) {
manujose 0:e6964ff1bbcc 160 pc.printf(" Triggered at %d\n",tv->tv_sec);
manujose 0:e6964ff1bbcc 161 }
manujose 0:e6964ff1bbcc 162 void trigger(void) {
manujose 0:e6964ff1bbcc 163 timeval curT;
manujose 0:e6964ff1bbcc 164 unsigned int nMSec = (LPC_TIM2->CR0)/CLK_FRQ;
manujose 0:e6964ff1bbcc 165 unsigned int nSec = nMSec/1000000;
manujose 0:e6964ff1bbcc 166 curT.tv_sec = gTime*42 + nSec;
manujose 0:e6964ff1bbcc 167 curT.tv_usec = nMSec-(nSec*1000000);
manujose 0:e6964ff1bbcc 168 gtrigFunc(&curT);
manujose 0:e6964ff1bbcc 169 }
manujose 0:e6964ff1bbcc 170 void runAtTrigger(void(*trigFunc)(timeval *tv)) {
manujose 0:e6964ff1bbcc 171 gtrigFunc = trigFunc;
manujose 0:e6964ff1bbcc 172 trig.rise(&trigger);
manujose 0:e6964ff1bbcc 173 trig.fall(&trigger);
manujose 0:e6964ff1bbcc 174 // pc.printf("Runing runAtTrigger\n");
manujose 0:e6964ff1bbcc 175 }
manujose 0:e6964ff1bbcc 176
manujose 0:e6964ff1bbcc 177
manujose 0:e6964ff1bbcc 178 void resp_sync_request(void) {
manujose 0:e6964ff1bbcc 179 union {
manujose 0:e6964ff1bbcc 180 unsigned int t;
manujose 0:e6964ff1bbcc 181 char BYTE[4];
manujose 0:e6964ff1bbcc 182 } t2,t3;
manujose 0:e6964ff1bbcc 183
manujose 0:e6964ff1bbcc 184 t2.t = LPC_TIM2->TC;
manujose 0:e6964ff1bbcc 185
manujose 0:e6964ff1bbcc 186 // read the byte ;
manujose 0:e6964ff1bbcc 187 sync.getc();
manujose 0:e6964ff1bbcc 188 // pc.printf(" \n resp_sync_request t2 = %X \n",t2.t);
manujose 0:e6964ff1bbcc 189
manujose 0:e6964ff1bbcc 190 wait(0.5);
manujose 0:e6964ff1bbcc 191 // read the present time
manujose 0:e6964ff1bbcc 192 // serially send out the data over to the slave
manujose 0:e6964ff1bbcc 193
manujose 0:e6964ff1bbcc 194 sync.putc(t2.BYTE[0]);
manujose 0:e6964ff1bbcc 195 sync.putc(t2.BYTE[1]);
manujose 0:e6964ff1bbcc 196 sync.putc(t2.BYTE[2]);
manujose 0:e6964ff1bbcc 197 sync.putc(t2.BYTE[3]);
manujose 0:e6964ff1bbcc 198
manujose 0:e6964ff1bbcc 199 // Get the present time;
manujose 0:e6964ff1bbcc 200
manujose 0:e6964ff1bbcc 201 t3.t = LPC_TIM2->TC;
manujose 0:e6964ff1bbcc 202 sync.putc(t3.BYTE[0]);
manujose 0:e6964ff1bbcc 203 sync.putc(t3.BYTE[1]);
manujose 0:e6964ff1bbcc 204 sync.putc(t3.BYTE[2]);
manujose 0:e6964ff1bbcc 205 sync.putc(t3.BYTE[3]);
manujose 0:e6964ff1bbcc 206 B+=8;
manujose 0:e6964ff1bbcc 207 // pc.printf(" Sync request %X & %X",t2.t, t3.t);
manujose 0:e6964ff1bbcc 208 }
manujose 0:e6964ff1bbcc 209
manujose 0:e6964ff1bbcc 210 void pinToggle(void)
manujose 0:e6964ff1bbcc 211 {
manujose 0:e6964ff1bbcc 212 toggle = !toggle;
manujose 0:e6964ff1bbcc 213 pc.putc('T');
manujose 0:e6964ff1bbcc 214 pps.tv_sec++;
manujose 0:e6964ff1bbcc 215 runAtTime(&pinToggle,&pps);
manujose 0:e6964ff1bbcc 216 }
manujose 0:e6964ff1bbcc 217
manujose 0:e6964ff1bbcc 218
manujose 0:e6964ff1bbcc 219 void reportToggle(timeval *rt)
manujose 0:e6964ff1bbcc 220 {
manujose 0:e6964ff1bbcc 221 int slv_trg_val = 0;
manujose 0:e6964ff1bbcc 222 //slv_trg_val = LPC_TIM2->CR;
manujose 0:e6964ff1bbcc 223
manujose 0:e6964ff1bbcc 224 //pc.putc('T');
manujose 0:e6964ff1bbcc 225
manujose 0:e6964ff1bbcc 226 int slv_diff;
manujose 0:e6964ff1bbcc 227 // load the CR0 value
manujose 0:e6964ff1bbcc 228
manujose 0:e6964ff1bbcc 229 // slv_diff = (rt->tv_sec - ideal_trg_time[ideal_trg_time_index].tv_sec)*1000000 +
manujose 0:e6964ff1bbcc 230 // rt->tv_usec - ideal_trg_time[ideal_trg_time_index].tv_usec;
manujose 0:e6964ff1bbcc 231
manujose 0:e6964ff1bbcc 232 // pc.printf("\n %d %d %d %d ", rt->tv_sec, rt->tv_usec, ideal_trg_time[ideal_trg_time_index].tv_sec, \
manujose 0:e6964ff1bbcc 233 // ideal_trg_time[ideal_trg_time_index].tv_usec);
manujose 0:e6964ff1bbcc 234
manujose 0:e6964ff1bbcc 235 ideal_trg_time_index++;
manujose 0:e6964ff1bbcc 236 //1 pps part.
manujose 0:e6964ff1bbcc 237 slv_diff = rt->tv_usec -ideal_trg_time[0].tv_usec;
manujose 0:e6964ff1bbcc 238 //ideal_trg_time[0].tv_sec++ ;
manujose 0:e6964ff1bbcc 239 ideal_trg_time_index--;
manujose 0:e6964ff1bbcc 240
manujose 0:e6964ff1bbcc 241
manujose 0:e6964ff1bbcc 242 pc.printf("%\n diff = %d",slv_diff);
manujose 0:e6964ff1bbcc 243
manujose 0:e6964ff1bbcc 244
manujose 0:e6964ff1bbcc 245 }
manujose 0:e6964ff1bbcc 246
manujose 0:e6964ff1bbcc 247
manujose 0:e6964ff1bbcc 248
manujose 0:e6964ff1bbcc 249
manujose 0:e6964ff1bbcc 250 #endif