one hour slave program this waits for entry from master and initialize queue in the begninng and execute the data.
problemb1.h@0:6be670be8b35, 2010-12-04 (annotated)
- Committer:
- manujose
- Date:
- Sat Dec 04 06:09:47 2010 +0000
- Revision:
- 0:6be670be8b35
Who changed what in which revision?
User | Revision | Line number | New 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 |