B.3 PROGRAM .SLAVE

Dependencies:   mbed

Committer:
manujose
Date:
Tue Dec 14 23:26:42 2010 +0000
Revision:
1:695db1757630
Parent:
0:9092ea8d9a6c

        

Who changed what in which revision?

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