manu jose
/
6hrslave
B.3 PROGRAM .SLAVE
problemb1.h@1:695db1757630, 2010-12-14 (annotated)
- Committer:
- manujose
- Date:
- Tue Dec 14 23:26:42 2010 +0000
- Revision:
- 1:695db1757630
- Parent:
- 0:9092ea8d9a6c
Who changed what in which revision?
User | Revision | Line number | New 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 |