manu jose
/
6hrmaster
B.3 : THE 6 HOUR PROGRAM WITH 1 PPS SIGNAL THE MASTER TO BE CONNECTED TO 11 PIN.
Diff: problemb1.h
- Revision:
- 0:e6964ff1bbcc
- Child:
- 1:9efda6a3f83c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/problemb1.h Sat Dec 04 05:09:15 2010 +0000 @@ -0,0 +1,250 @@ +#ifndef PROBLEMB1_H_ +#define PROBLEMB1_H_ +#include "mbed.h" +#include "pt.h" +#include "pt-sem.h" +#include "decl.h" +#include "pqueue.h" + +pQueue globalQ; +unsigned int gTime =0; +int B; + + +timeval ideal_trg_time[100]; +int ideal_trg_time_index = 0; + +timeval pps; + +union { + unsigned int t; + char BYTE[4]; + }t1,t2,t3,t4; + + + +void initialSetup(void) { + // doing capture register for now, so use timer 2 + LPC_SC->PCLKSEL1 |= (0x01 << 12); //set the frequency REF: USER MANULA TAB 40,41,42 ?? check + LPC_SC-> PCONP |= (0x3 << 22); // timer 2 + + //LPC_TIM2->TCR = 0x2; // Reset and set to timer mode + + // Select PIN + + LPC_PINCON->PINSEL0 |= (0xf << 8); + LPC_TIM2->CCR |= 0x07;// doing capture register for now, so use timer 2 + + LPC_TIM2->MR0 = RESET_42; + LPC_TIM2->MCR = 3; // Interrupt, Stop, and Reset on match + + //LPC_TIM2->TCR = 0x2; // Reset and set to timer mode + + LPC_TIM2->TCR = 0x1; + + + // ================ // + + + + + /*LPC_SC->PCLKSEL0 |= 0x04; //set the frequency REF: USER MANULA TAB 40,41,42 ?? check + + LPC_SC-> PCONP |= 1 << 1; // Power on Timer0 + + LPC_TIM0->TCR = 0x2; // Reset and set to timer mode + LPC_TIM0->CTCR = 0x0; + LPC_TIM0->PR = 0; // No prescale + //LPC_TIM0->MR0 = 0xF0537000 ; // Match count for 100mS + LPC_TIM0->MR0 = RESET_42; + LPC_TIM0->MCR = 3; // Interrupt, Stop, and Reset on match + + + LPC_TIM0->TCR = 1; // Enable Timer0 + // Enable the ISR vector + */ + NVIC_SetVector (TIMER2_IRQn, (uint32_t)&Timer0_IRQHandler); + NVIC_EnableIRQ(TIMER2_IRQn); + + // LPC_TIM0->MCR |= 11; //for mr1 and mr0 + //queue set up + globalQ.numEle = 0; + globalQ.head = NULL; +} +void Timer0_IRQHandler(void) { + // LPC_TIM0->IR=0xff; + //LPC_TIM0->MR0 = 0x5370; + if (LPC_TIM2->IR&1) { + gTime++; + // pc.printf("\ngtime = %X",LPC_TIM2->IR); + } if ( (LPC_TIM2->IR >> 1)&1 ){ //RUN THE RUNAT TIME HIT + qEle *ele = pop(&globalQ); + + + ele->foo(); + + free(ele); + + } + if( (LPC_TIM2->IR >> 4 )& 1){ // run report toggle + timeval curT; + unsigned int nMSec = (LPC_TIM2->CR0)/CLK_FRQ; + unsigned int nSec = nMSec/1000000; + curT.tv_sec = gTime*42 + nSec; + curT.tv_usec = nMSec-(nSec*1000000); + gtrigFunc(&curT); + + } + + //check if more ele for schedule this time ? + if ((globalQ.numEle >0) && (globalQ.head->sched ==0)&& (globalQ.head->t.tv_sec <((gTime+1)*42))) { + globalQ.head->sched = 1; + + // LPC_TIM0->MR1 = (globalQ.head->t.tv_sec-gTime*42)*96000000 +globalQ.head->t.tv_usec*96; + LPC_TIM2->MR1 = (globalQ.head->t.tv_sec-gTime*42)*CLK_FREQUENCY +globalQ.head->t.tv_usec*CLK_FRQ; + LPC_TIM2->MCR |= 8; + pc.printf("\n MR1 = %X",LPC_TIM2->MR1); + + + } else if (globalQ.head->sched == 0) //NO events in this gTime update yet . + { //turn off the match regiester 1 interrupts. + LPC_TIM2->MCR &= 3; + } + + timeval t; + getTime(&t); + LPC_TIM2->IR = 0xff; + // pc.printf("INCREMENTING COUNTER or event %d \n",t.tv_sec); +} + + +void getTime(timeval *tv) { + unsigned int nMSec = (LPC_TIM2->TC)/CLK_FRQ; //gives num of micro sec + // unsigned int nMSec = (LPC_TIM0->TC + offset)/72; + unsigned int nSec = nMSec/1000000; + tv->tv_sec = gTime*42 + nSec; + // tv->tv_usec = (LPC_TIM0->TC)*1000 + (float)(LPC_TIM0->PC)/( CLK_FREQUENCY * 1000000); + tv->tv_usec = nMSec-(nSec*1000000); +} + +int curTimeEqualGR(timeval *tv) { + timeval curT; + getTime(&curT); + if (curT.tv_sec == tv->tv_sec) { + if (curT.tv_usec == tv->tv_usec) + return 1; + else + pc.printf("WROING MICRO CALIBERATION\n"); + return 1; + } else if (curT.tv_sec > tv->tv_sec) { + pc.printf("WRONG cur = %d and req = %d \n",curT.tv_sec, tv->tv_sec); + return 1; + } + return 0; +} +int runAtTime(void (*schedFunc)(void), timeval *tv) { + int ret =0; + ret = enqueue(&globalQ, *tv, schedFunc); + if (tv->tv_sec < (gTime+1)*42) { + + if (globalQ.head->sched == 0) { + + LPC_TIM2->MR1 = ((globalQ.head->t.tv_sec%42 )*CLK_FREQUENCY+(globalQ.head->t.tv_usec*CLK_FRQ)); + globalQ.head->sched = 1; + LPC_TIM2->MCR |= 8; + } + } + return ret; +} +void trigEX(timeval *tv) { + pc.printf(" Triggered at %d\n",tv->tv_sec); +} +void trigger(void) { + timeval curT; + unsigned int nMSec = (LPC_TIM2->CR0)/CLK_FRQ; + unsigned int nSec = nMSec/1000000; + curT.tv_sec = gTime*42 + nSec; + curT.tv_usec = nMSec-(nSec*1000000); + gtrigFunc(&curT); +} +void runAtTrigger(void(*trigFunc)(timeval *tv)) { + gtrigFunc = trigFunc; + trig.rise(&trigger); + trig.fall(&trigger); + // pc.printf("Runing runAtTrigger\n"); +} + + +void resp_sync_request(void) { +union { + unsigned int t; + char BYTE[4]; + } t2,t3; + + t2.t = LPC_TIM2->TC; + +// read the byte ; + sync.getc(); +// pc.printf(" \n resp_sync_request t2 = %X \n",t2.t); + + wait(0.5); +// read the present time +// serially send out the data over to the slave + + sync.putc(t2.BYTE[0]); + sync.putc(t2.BYTE[1]); + sync.putc(t2.BYTE[2]); + sync.putc(t2.BYTE[3]); + + // Get the present time; + + t3.t = LPC_TIM2->TC; + sync.putc(t3.BYTE[0]); + sync.putc(t3.BYTE[1]); + sync.putc(t3.BYTE[2]); + sync.putc(t3.BYTE[3]); + B+=8; + // pc.printf(" Sync request %X & %X",t2.t, t3.t); +} + +void pinToggle(void) +{ + toggle = !toggle; + pc.putc('T'); + pps.tv_sec++; + runAtTime(&pinToggle,&pps); +} + + +void reportToggle(timeval *rt) +{ + int slv_trg_val = 0; + //slv_trg_val = LPC_TIM2->CR; + + //pc.putc('T'); + + int slv_diff; + // load the CR0 value + + // slv_diff = (rt->tv_sec - ideal_trg_time[ideal_trg_time_index].tv_sec)*1000000 + + // rt->tv_usec - ideal_trg_time[ideal_trg_time_index].tv_usec; + + // pc.printf("\n %d %d %d %d ", rt->tv_sec, rt->tv_usec, ideal_trg_time[ideal_trg_time_index].tv_sec, \ + // ideal_trg_time[ideal_trg_time_index].tv_usec); + + ideal_trg_time_index++; +//1 pps part. +slv_diff = rt->tv_usec -ideal_trg_time[0].tv_usec; +//ideal_trg_time[0].tv_sec++ ; +ideal_trg_time_index--; + + + pc.printf("%\n diff = %d",slv_diff); + + +} + + + + +#endif \ No newline at end of file