one hour slave program this waits for entry from master and initialize queue in the begninng and execute the data.

Dependencies:   mbed

Committer:
manujose
Date:
Sat Dec 04 06:09:47 2010 +0000
Revision:
0:6be670be8b35

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
manujose 0:6be670be8b35 1 #ifndef PROBLEMB1_H_
manujose 0:6be670be8b35 2 #define PROBLEMB1_H_
manujose 0:6be670be8b35 3 #include "mbed.h"
manujose 0:6be670be8b35 4 #include "decl.h"
manujose 0:6be670be8b35 5 #include "pqueue.h"
manujose 0:6be670be8b35 6
manujose 0:6be670be8b35 7 pQueue globalQ;
manujose 0:6be670be8b35 8 unsigned int gTime =0;
manujose 0:6be670be8b35 9 timeval pps;
manujose 0:6be670be8b35 10
manujose 0:6be670be8b35 11 union {
manujose 0:6be670be8b35 12 unsigned int t;
manujose 0:6be670be8b35 13 char BYTE[4];
manujose 0:6be670be8b35 14 }t1,t2,t3,t4;
manujose 0:6be670be8b35 15 signed int offset;
manujose 0:6be670be8b35 16
manujose 0:6be670be8b35 17 void initialSetup(void) {
manujose 0:6be670be8b35 18 LPC_SC->PCLKSEL0 |= 0x04; //set the frequency REF: USER MANULA TAB 40,41,42 ?? check
manujose 0:6be670be8b35 19
manujose 0:6be670be8b35 20 LPC_SC-> PCONP |= 1 << 1; // Power on Timer0
manujose 0:6be670be8b35 21
manujose 0:6be670be8b35 22 LPC_TIM0->TCR = 0x2; // Reset and set to timer mode
manujose 0:6be670be8b35 23 LPC_TIM0->CTCR = 0x0;
manujose 0:6be670be8b35 24 LPC_TIM0->PR = 0; // No prescale
manujose 0:6be670be8b35 25 //LPC_TIM0->MR0 = 0xF0537000 ; // Match count for 100mS
manujose 0:6be670be8b35 26 LPC_TIM0->MR0 = RESET_42;
manujose 0:6be670be8b35 27 LPC_TIM0->MCR = 3; // Interrupt, Stop, and Reset on match
manujose 0:6be670be8b35 28
manujose 0:6be670be8b35 29
manujose 0:6be670be8b35 30 LPC_TIM0->TCR = 1; // Enable Timer0
manujose 0:6be670be8b35 31 // Enable the ISR vector
manujose 0:6be670be8b35 32 NVIC_SetVector (TIMER0_IRQn, (uint32_t)&Timer0_IRQHandler);
manujose 0:6be670be8b35 33 NVIC_EnableIRQ(TIMER0_IRQn);
manujose 0:6be670be8b35 34
manujose 0:6be670be8b35 35 // LPC_TIM0->MCR |= 11; //for mr1 and mr0
manujose 0:6be670be8b35 36 //queue set up
manujose 0:6be670be8b35 37 globalQ.numEle = 0;
manujose 0:6be670be8b35 38 globalQ.head = NULL;
manujose 0:6be670be8b35 39 }
manujose 0:6be670be8b35 40 void Timer0_IRQHandler(void) {
manujose 0:6be670be8b35 41 // LPC_TIM0->IR=0xff;
manujose 0:6be670be8b35 42 //LPC_TIM0->MR0 = 0x5370;
manujose 0:6be670be8b35 43 if (LPC_TIM0->IR&1) {
manujose 0:6be670be8b35 44 gTime++;
manujose 0:6be670be8b35 45 // pc.printf("gtime++ %X",LPC_TIM0->IR);
manujose 0:6be670be8b35 46 }
manujose 0:6be670be8b35 47
manujose 0:6be670be8b35 48 if((LPC_TIM0->IR >> 1)&1 ){ //RUN THE RUNAT TIME HIT
manujose 0:6be670be8b35 49 qEle *ele = pop(&globalQ);
manujose 0:6be670be8b35 50 // pc.putc('1');
manujose 0:6be670be8b35 51 // pc.printf("ACtual time = %d and %d\n",ele->t.tv_sec, ele->t.tv_usec);
manujose 0:6be670be8b35 52 ele->foo();
manujose 0:6be670be8b35 53 free(ele);
manujose 0:6be670be8b35 54 }
manujose 0:6be670be8b35 55 //check if more ele for schedule this time ?
manujose 0:6be670be8b35 56 if ((globalQ.numEle >0) && (globalQ.head->sched ==0)&& (globalQ.head->t.tv_sec <((gTime+1)*42))) {
manujose 0:6be670be8b35 57 globalQ.head->sched = 1;
manujose 0:6be670be8b35 58
manujose 0:6be670be8b35 59 LPC_TIM0->MR1 = (globalQ.head->t.tv_sec-(gTime*42))*CLK_FREQUENCY +globalQ.head->t.tv_usec*CLK_FRQ;
manujose 0:6be670be8b35 60 LPC_TIM0->MCR |= 8;
manujose 0:6be670be8b35 61
manujose 0:6be670be8b35 62 } else if (globalQ.head->sched == 0) //NO events in this gTime update yet .
manujose 0:6be670be8b35 63 { //turn off the match regiester 1 interrupts.
manujose 0:6be670be8b35 64 LPC_TIM0->MCR &= 3;
manujose 0:6be670be8b35 65 }
manujose 0:6be670be8b35 66
manujose 0:6be670be8b35 67 // timeval t;
manujose 0:6be670be8b35 68 // getTime(&t);
manujose 0:6be670be8b35 69 LPC_TIM0->IR = 0xff;
manujose 0:6be670be8b35 70 // pc.printf("INCREMENTING COUNTER or event %d \n",t.tv_sec);
manujose 0:6be670be8b35 71 }
manujose 0:6be670be8b35 72
manujose 0:6be670be8b35 73
manujose 0:6be670be8b35 74 void getTime(timeval *tv) {
manujose 0:6be670be8b35 75 unsigned int nMSec = (LPC_TIM0->TC)/CLK_FRQ; //gives num of micro sec
manujose 0:6be670be8b35 76 // unsigned int nMSec = (LPC_TIM0->TC + offset)/72;
manujose 0:6be670be8b35 77 unsigned int nSec = nMSec/1000000;
manujose 0:6be670be8b35 78 tv->tv_sec = gTime*42 + nSec;
manujose 0:6be670be8b35 79 // tv->tv_usec = (LPC_TIM0->TC)*1000 + (float)(LPC_TIM0->PC)/( CLK_FREQUENCY * 1000000);
manujose 0:6be670be8b35 80 tv->tv_usec = nMSec-(nSec*1000000);
manujose 0:6be670be8b35 81 }
manujose 0:6be670be8b35 82
manujose 0:6be670be8b35 83 int curTimeEqualGR(timeval *tv) {
manujose 0:6be670be8b35 84 timeval curT;
manujose 0:6be670be8b35 85 getTime(&curT);
manujose 0:6be670be8b35 86 if (curT.tv_sec == tv->tv_sec) {
manujose 0:6be670be8b35 87 if (curT.tv_usec == tv->tv_usec)
manujose 0:6be670be8b35 88 return 1;
manujose 0:6be670be8b35 89 else
manujose 0:6be670be8b35 90 pc.printf("WROING MICRO CALIBERATION\n");
manujose 0:6be670be8b35 91 return 1;
manujose 0:6be670be8b35 92 } else if (curT.tv_sec > tv->tv_sec) {
manujose 0:6be670be8b35 93 pc.printf("WRONG cur = %d and req = %d \n",curT.tv_sec, tv->tv_sec);
manujose 0:6be670be8b35 94 return 1;
manujose 0:6be670be8b35 95 }
manujose 0:6be670be8b35 96 return 0;
manujose 0:6be670be8b35 97 }
manujose 0:6be670be8b35 98
manujose 0:6be670be8b35 99 int runAtTime(void (*schedFunc)(void), timeval *tv) {
manujose 0:6be670be8b35 100 int ret =0;
manujose 0:6be670be8b35 101 ret = enqueue(&globalQ, *tv, schedFunc);
manujose 0:6be670be8b35 102 if (tv->tv_sec < (gTime+1)*42) {
manujose 0:6be670be8b35 103
manujose 0:6be670be8b35 104 if (globalQ.head->sched == 0) {
manujose 0:6be670be8b35 105
manujose 0:6be670be8b35 106 LPC_TIM0->MR1 = ((globalQ.head->t.tv_sec%42 )*CLK_FREQUENCY+(globalQ.head->t.tv_usec*CLK_FRQ));
manujose 0:6be670be8b35 107 globalQ.head->sched = 1;
manujose 0:6be670be8b35 108 LPC_TIM0->MCR |= 8;
manujose 0:6be670be8b35 109 }
manujose 0:6be670be8b35 110 }
manujose 0:6be670be8b35 111 return ret;
manujose 0:6be670be8b35 112 }
manujose 0:6be670be8b35 113 void trigEX(timeval *tv) {
manujose 0:6be670be8b35 114 pc.printf(" Triggered at %d\n",tv->tv_sec);
manujose 0:6be670be8b35 115 }
manujose 0:6be670be8b35 116 void trigger(void) {
manujose 0:6be670be8b35 117 timeval curT;
manujose 0:6be670be8b35 118 getTime(&curT);
manujose 0:6be670be8b35 119 gtrigFunc(&curT);
manujose 0:6be670be8b35 120 }
manujose 0:6be670be8b35 121 void runAtTrigger(void(*trigFunc)(timeval *tv)) {
manujose 0:6be670be8b35 122 gtrigFunc = trigFunc;
manujose 0:6be670be8b35 123 trig.rise(&trigger);
manujose 0:6be670be8b35 124 // pc.printf("Runing runAtTrigger\n");
manujose 0:6be670be8b35 125 }
manujose 0:6be670be8b35 126
manujose 0:6be670be8b35 127
manujose 0:6be670be8b35 128 void sync_with_master(void) {
manujose 0:6be670be8b35 129 t1.t = LPC_TIM0->TC ;
manujose 0:6be670be8b35 130
manujose 0:6be670be8b35 131 // trigger the master
manujose 0:6be670be8b35 132
manujose 0:6be670be8b35 133 sync.putc('x');
manujose 0:6be670be8b35 134 // pc.printf("\n sync_with_master t1.t=%X\n", t1.t);
manujose 0:6be670be8b35 135 }
manujose 0:6be670be8b35 136
manujose 0:6be670be8b35 137 void calculate_offset(void) {
manujose 0:6be670be8b35 138
manujose 0:6be670be8b35 139 llong t2minust1, t4minust3;
manujose 0:6be670be8b35 140 t4.t = LPC_TIM0->TC;
manujose 0:6be670be8b35 141
manujose 0:6be670be8b35 142 sync.attach(NULL);
manujose 0:6be670be8b35 143
manujose 0:6be670be8b35 144 // serially receive data from master
manujose 0:6be670be8b35 145
manujose 0:6be670be8b35 146 //t2.t = 0;
manujose 0:6be670be8b35 147 //t3.t = 0;
manujose 0:6be670be8b35 148
manujose 0:6be670be8b35 149 t2.BYTE[0] = sync.getc();
manujose 0:6be670be8b35 150 t2.BYTE[1] = sync.getc();
manujose 0:6be670be8b35 151 t2.BYTE[2] = sync.getc();
manujose 0:6be670be8b35 152 t2.BYTE[3] = sync.getc();
manujose 0:6be670be8b35 153
manujose 0:6be670be8b35 154 t3.BYTE[0] = sync.getc();
manujose 0:6be670be8b35 155 t3.BYTE[1] = sync.getc();
manujose 0:6be670be8b35 156 t3.BYTE[2] = sync.getc();
manujose 0:6be670be8b35 157 t3.BYTE[3] = sync.getc();
manujose 0:6be670be8b35 158
manujose 0:6be670be8b35 159
manujose 0:6be670be8b35 160
manujose 0:6be670be8b35 161 //exhaust buffer
manujose 0:6be670be8b35 162
manujose 0:6be670be8b35 163 sync.attach(&calculate_offset);
manujose 0:6be670be8b35 164
manujose 0:6be670be8b35 165 //pc.printf(" \n t1= %X, t2 = %X, t3 = %X, t4 = %X",t1.t,t2.t,t3.t,t4.t);
manujose 0:6be670be8b35 166
manujose 0:6be670be8b35 167 // account for the case where the TC has overflowed.
manujose 0:6be670be8b35 168
manujose 0:6be670be8b35 169 if ( t1.t > t4.t )
manujose 0:6be670be8b35 170 {
manujose 0:6be670be8b35 171 t4.t = RESET_42 + t4.t;
manujose 0:6be670be8b35 172 }
manujose 0:6be670be8b35 173 if (t2.t > t3.t)
manujose 0:6be670be8b35 174 {
manujose 0:6be670be8b35 175 t3.t = RESET_42 + t3.t;
manujose 0:6be670be8b35 176 }
manujose 0:6be670be8b35 177
manujose 0:6be670be8b35 178 t2minust1 = (llong)t2.t-t1.t;
manujose 0:6be670be8b35 179 t4minust3 = (llong)t4.t-t3.t;
manujose 0:6be670be8b35 180
manujose 0:6be670be8b35 181 // pc.printf(" \n t2-t1 = %X, t4-t3 = %X",t2minust1, t4minust3);
manujose 0:6be670be8b35 182
manujose 0:6be670be8b35 183 offset =(int) ((t2minust1-t4minust3)/2);
manujose 0:6be670be8b35 184
manujose 0:6be670be8b35 185 LPC_TIM0->TC = (LPC_TIM0->TC + offset);
manujose 0:6be670be8b35 186 if(LPC_TIM0->TC > RESET_42)
manujose 0:6be670be8b35 187 LPC_TIM0->TC = LPC_TIM0->TC - RESET_42;
manujose 0:6be670be8b35 188
manujose 0:6be670be8b35 189 offset = 0;
manujose 0:6be670be8b35 190 while(sync.readable())
manujose 0:6be670be8b35 191 sync.getc();
manujose 0:6be670be8b35 192
manujose 0:6be670be8b35 193 //pc.printf(" offset = %d\n",offset);
manujose 0:6be670be8b35 194 }
manujose 0:6be670be8b35 195
manujose 0:6be670be8b35 196
manujose 0:6be670be8b35 197 void pinToggle(void)
manujose 0:6be670be8b35 198 {
manujose 0:6be670be8b35 199 toggle = !toggle;
manujose 0:6be670be8b35 200 // timeval t;
manujose 0:6be670be8b35 201 // getTime(&t);
manujose 0:6be670be8b35 202 // pc.printf(" THE TOGGLE TIME = %d and %d \n",t.tv_sec, t.tv_usec);
manujose 0:6be670be8b35 203 // myLED = !myLED;
manujose 0:6be670be8b35 204 // pc.printf("\nToggle");
manujose 0:6be670be8b35 205 // pps.tv_sec++;
manujose 0:6be670be8b35 206 //runAtTime(&pinToggle,&pps);
manujose 0:6be670be8b35 207
manujose 0:6be670be8b35 208 }
manujose 0:6be670be8b35 209
manujose 0:6be670be8b35 210
manujose 0:6be670be8b35 211
manujose 0:6be670be8b35 212 #endif