Jingyuan Dong / Mbed 2 deprecated Part2_Slave

Dependencies:   mbed

Committer:
guruimage
Date:
Sat Dec 04 06:55:32 2010 +0000
Revision:
0:70a333fbe418
Part2 Slave

Who changed what in which revision?

UserRevisionLine numberNew contents of line
guruimage 0:70a333fbe418 1 #include "mbed.h"
guruimage 0:70a333fbe418 2
guruimage 0:70a333fbe418 3
guruimage 0:70a333fbe418 4 struct timeval
guruimage 0:70a333fbe418 5 {
guruimage 0:70a333fbe418 6 unsigned long long int tv_sec; /* Seconds. */
guruimage 0:70a333fbe418 7 unsigned long long int tv_usec; /* Microseconds. */
guruimage 0:70a333fbe418 8 };
guruimage 0:70a333fbe418 9 void sync(void);
guruimage 0:70a333fbe418 10 void getValue(void);
guruimage 0:70a333fbe418 11 //void readTime(void);
guruimage 0:70a333fbe418 12 //void SetupTimer1(void);
guruimage 0:70a333fbe418 13 void SetupTimer0(void);
guruimage 0:70a333fbe418 14 void Timer1_IRQHandler(void);
guruimage 0:70a333fbe418 15 void Timer0_IRQHandler(void);
guruimage 0:70a333fbe418 16
guruimage 0:70a333fbe418 17 unsigned long long int atoi1(char *str);
guruimage 0:70a333fbe418 18 void getTime(struct timeval *tv);
guruimage 0:70a333fbe418 19 void SetupTimer1(struct timeval *tv);
guruimage 0:70a333fbe418 20 void setTimeval(struct timeval *tv);
guruimage 0:70a333fbe418 21 void runAtTime (void (*schedFunc)(), struct timeval *tv);
guruimage 0:70a333fbe418 22 void schedFunc(void);
guruimage 0:70a333fbe418 23 void pinToggle(void);
guruimage 0:70a333fbe418 24
guruimage 0:70a333fbe418 25 DigitalOut toggle(p18);
guruimage 0:70a333fbe418 26 Serial device(p9, p10);
guruimage 0:70a333fbe418 27 Serial command(p13, p14);
guruimage 0:70a333fbe418 28 Serial pc(USBTX, USBRX);
guruimage 0:70a333fbe418 29 DigitalOut myled1(LED1);
guruimage 0:70a333fbe418 30 DigitalOut myled2(LED2);
guruimage 0:70a333fbe418 31 DigitalOut myled3(LED3);
guruimage 0:70a333fbe418 32 DigitalOut myled4(LED4);
guruimage 0:70a333fbe418 33 char* store=new char;
guruimage 0:70a333fbe418 34 int i=0;
guruimage 0:70a333fbe418 35 int k=0;
guruimage 0:70a333fbe418 36 int timeNum=0;
guruimage 0:70a333fbe418 37 unsigned long long int t1=0;
guruimage 0:70a333fbe418 38 unsigned long long int t2=0;
guruimage 0:70a333fbe418 39 unsigned long long int t3=0;
guruimage 0:70a333fbe418 40 unsigned long long int t4=0;
guruimage 0:70a333fbe418 41 long long int t11=0;
guruimage 0:70a333fbe418 42 long long int t22=0;
guruimage 0:70a333fbe418 43 long long int t33=0;
guruimage 0:70a333fbe418 44 long long int t44=0;
guruimage 0:70a333fbe418 45 long long int offset;
guruimage 0:70a333fbe418 46 char buffRx[100];
guruimage 0:70a333fbe418 47 int handleTrue = 0;
guruimage 0:70a333fbe418 48 int triggerTime;
guruimage 0:70a333fbe418 49 timeval trigTime;
guruimage 0:70a333fbe418 50
guruimage 0:70a333fbe418 51 int main() {
guruimage 0:70a333fbe418 52 wait(0.001);
guruimage 0:70a333fbe418 53 for(int i =0;i<100;i++){
guruimage 0:70a333fbe418 54 buffRx[i]=NULL;
guruimage 0:70a333fbe418 55 }
guruimage 0:70a333fbe418 56 timeval *currentTime = new timeval;
guruimage 0:70a333fbe418 57 triggerTime=5000;
guruimage 0:70a333fbe418 58 SetupTimer0();
guruimage 0:70a333fbe418 59 setTimeval(&trigTime);
guruimage 0:70a333fbe418 60 SetupTimer1(&trigTime);
guruimage 0:70a333fbe418 61 while(1){
guruimage 0:70a333fbe418 62 wait(2);
guruimage 0:70a333fbe418 63 sync();
guruimage 0:70a333fbe418 64 }
guruimage 0:70a333fbe418 65
guruimage 0:70a333fbe418 66
guruimage 0:70a333fbe418 67 }
guruimage 0:70a333fbe418 68 void pinToggle(void){
guruimage 0:70a333fbe418 69 toggle=!toggle;
guruimage 0:70a333fbe418 70 }
guruimage 0:70a333fbe418 71 void sync(void){
guruimage 0:70a333fbe418 72 char temp1[40];
guruimage 0:70a333fbe418 73 char temp2[40];
guruimage 0:70a333fbe418 74 int numcount=0;
guruimage 0:70a333fbe418 75 t1=(unsigned long long int)(LPC_TIM1->TC+4294967296*timeNum);
guruimage 0:70a333fbe418 76 device.putc('s');// send s to initialize synchronization.
guruimage 0:70a333fbe418 77 device.attach(&getValue);
guruimage 0:70a333fbe418 78 if(handleTrue == 1){
guruimage 0:70a333fbe418 79
guruimage 0:70a333fbe418 80 handleTrue = 0;
guruimage 0:70a333fbe418 81 k=0;
guruimage 0:70a333fbe418 82 if(buffRx[0] == 'd'){
guruimage 0:70a333fbe418 83 t4=(unsigned long long int)(LPC_TIM1->TC+4294967296*timeNum);
guruimage 0:70a333fbe418 84
guruimage 0:70a333fbe418 85 }
guruimage 0:70a333fbe418 86 for(int i=0; i<40;i++){
guruimage 0:70a333fbe418 87 temp1[i]=NULL;
guruimage 0:70a333fbe418 88 temp2[i]=NULL;
guruimage 0:70a333fbe418 89 }
guruimage 0:70a333fbe418 90 if(buffRx[1] == 'm'){
guruimage 0:70a333fbe418 91 for(int i=2;buffRx[i]!='f';i++){
guruimage 0:70a333fbe418 92 temp1[i-2]=buffRx[i];
guruimage 0:70a333fbe418 93 numcount = i;
guruimage 0:70a333fbe418 94 }
guruimage 0:70a333fbe418 95 t2=atoi1(temp1);
guruimage 0:70a333fbe418 96
guruimage 0:70a333fbe418 97 for(int i=0; i<40;i++){
guruimage 0:70a333fbe418 98 temp1[i]=NULL;
guruimage 0:70a333fbe418 99 }
guruimage 0:70a333fbe418 100 for(int i=numcount+2;buffRx[i]!='n';i++){
guruimage 0:70a333fbe418 101 temp2[i-numcount-2]=buffRx[i];
guruimage 0:70a333fbe418 102 }
guruimage 0:70a333fbe418 103 numcount=0;
guruimage 0:70a333fbe418 104 t3=atoi1(temp2);
guruimage 0:70a333fbe418 105 for(int i=0; i<40;i++){
guruimage 0:70a333fbe418 106 temp2[i]=NULL;
guruimage 0:70a333fbe418 107 }
guruimage 0:70a333fbe418 108 t11=(long long int)t1;
guruimage 0:70a333fbe418 109 t22=(long long int)t2;
guruimage 0:70a333fbe418 110 t33=(long long int)t3;
guruimage 0:70a333fbe418 111 t44=(long long int)t4;
guruimage 0:70a333fbe418 112 offset = (long long int)(((t22-t11)-(t44-t33))/2);
guruimage 0:70a333fbe418 113 for(int i=0;buffRx[i]!=NULL;i++){
guruimage 0:70a333fbe418 114 buffRx[i]=NULL;
guruimage 0:70a333fbe418 115 }
guruimage 0:70a333fbe418 116 }
guruimage 0:70a333fbe418 117 }
guruimage 0:70a333fbe418 118 pc.printf("\r\nT1: %llu, T2: %llu, T3: %llu T4: %llu timeNum:%d\r\nOffset is %lld!\r\n",t1,t2,t3,t4, timeNum,offset);
guruimage 0:70a333fbe418 119
guruimage 0:70a333fbe418 120 }
guruimage 0:70a333fbe418 121
guruimage 0:70a333fbe418 122 void getValue(void){
guruimage 0:70a333fbe418 123 buffRx[k]=device.getc();
guruimage 0:70a333fbe418 124 if(buffRx[k]=='n'){
guruimage 0:70a333fbe418 125 handleTrue = 1;
guruimage 0:70a333fbe418 126 }
guruimage 0:70a333fbe418 127 k++;
guruimage 0:70a333fbe418 128 }
guruimage 0:70a333fbe418 129
guruimage 0:70a333fbe418 130 void SetupTimer1(struct timeval *tv)
guruimage 0:70a333fbe418 131 {
guruimage 0:70a333fbe418 132 LPC_SC->PCONP |= 1 << 2; // Power on Timer`
guruimage 0:70a333fbe418 133 LPC_SC->PCLKSEL0 |= 1 << 4;
guruimage 0:70a333fbe418 134 LPC_TIM1->TCR = 0x2; // Reset and set to timer mode
guruimage 0:70a333fbe418 135 LPC_TIM1->CTCR = 0x0;
guruimage 0:70a333fbe418 136 LPC_TIM1->PR = 0; // No prescale
guruimage 0:70a333fbe418 137 LPC_TIM1->MR0 = 0xFFFFFFFF; // count overflow
guruimage 0:70a333fbe418 138 LPC_TIM1->MR1=((tv->tv_usec-1)*96000+offset); //trigger function at time in ms
guruimage 0:70a333fbe418 139 LPC_TIM1->MCR = 0x00000009; // If there is interrupt trigger it
guruimage 0:70a333fbe418 140 LPC_TIM1->TCR = 1; // Enable Timer
guruimage 0:70a333fbe418 141 LPC_TIM1->IR = 1;
guruimage 0:70a333fbe418 142 // Enable the ISR vector
guruimage 0:70a333fbe418 143 NVIC_SetVector (TIMER1_IRQn, (uint32_t)&Timer1_IRQHandler);
guruimage 0:70a333fbe418 144 NVIC_EnableIRQ(TIMER1_IRQn);
guruimage 0:70a333fbe418 145 }
guruimage 0:70a333fbe418 146 void Timer1_IRQHandler(void)
guruimage 0:70a333fbe418 147 {
guruimage 0:70a333fbe418 148 if((LPC_TIM1->IR|0xFFFFFFFE)==0xFFFFFFFF){//handle timer overflow
guruimage 0:70a333fbe418 149 myled1=!myled1;
guruimage 0:70a333fbe418 150 timeNum++;
guruimage 0:70a333fbe418 151
guruimage 0:70a333fbe418 152 LPC_TIM1->IR = 1<<0;
guruimage 0:70a333fbe418 153 }
guruimage 0:70a333fbe418 154
guruimage 0:70a333fbe418 155 if((LPC_TIM1->IR|0xFFFFFFFD)==0xFFFFFFFF){//trigger function at specific time
guruimage 0:70a333fbe418 156 runAtTime (schedFunc,&trigTime);
guruimage 0:70a333fbe418 157
guruimage 0:70a333fbe418 158 LPC_TIM1->IR = 1<<1;
guruimage 0:70a333fbe418 159 }
guruimage 0:70a333fbe418 160
guruimage 0:70a333fbe418 161 }
guruimage 0:70a333fbe418 162
guruimage 0:70a333fbe418 163 void SetupTimer0(void)
guruimage 0:70a333fbe418 164 {
guruimage 0:70a333fbe418 165 LPC_SC->PCONP |= 1 << 1; // Power on Timer`0
guruimage 0:70a333fbe418 166 LPC_SC->PCLKSEL0 |= 1 << 2;
guruimage 0:70a333fbe418 167 LPC_TIM0->TCR = 0x2; // Reset and set to timer mode
guruimage 0:70a333fbe418 168 LPC_TIM0->CTCR = 0x0;
guruimage 0:70a333fbe418 169 LPC_TIM0->PR = 0; // No prescale
guruimage 0:70a333fbe418 170
guruimage 0:70a333fbe418 171 LPC_TIM0->MR0 = 0x01000000; // Match count for 2S
guruimage 0:70a333fbe418 172 LPC_TIM0->MCR = 3; // Interrupt and Reset on Match
guruimage 0:70a333fbe418 173 LPC_TIM0->TCR = 1; // Enable Timer
guruimage 0:70a333fbe418 174
guruimage 0:70a333fbe418 175 // Enable the ISR vector
guruimage 0:70a333fbe418 176 NVIC_SetVector (TIMER0_IRQn, (uint32_t)&Timer0_IRQHandler);
guruimage 0:70a333fbe418 177 NVIC_EnableIRQ(TIMER0_IRQn);
guruimage 0:70a333fbe418 178 }
guruimage 0:70a333fbe418 179 void Timer0_IRQHandler(void)
guruimage 0:70a333fbe418 180 {
guruimage 0:70a333fbe418 181 myled2=!myled2;
guruimage 0:70a333fbe418 182 //sync();
guruimage 0:70a333fbe418 183 LPC_TIM0->IR = 1;
guruimage 0:70a333fbe418 184
guruimage 0:70a333fbe418 185 }
guruimage 0:70a333fbe418 186
guruimage 0:70a333fbe418 187 void getTime(struct timeval *tv) {
guruimage 0:70a333fbe418 188 tv->tv_sec=(unsigned long long int)((LPC_TIM1->TC+4294967296*timeNum+offset)/96000000);
guruimage 0:70a333fbe418 189 tv->tv_usec=(unsigned long long int)((LPC_TIM1->TC+4294967296*timeNum+offset)/96000);
guruimage 0:70a333fbe418 190 }
guruimage 0:70a333fbe418 191
guruimage 0:70a333fbe418 192 unsigned long long int atoi1(char *str){
guruimage 0:70a333fbe418 193 unsigned long long int result=0;
guruimage 0:70a333fbe418 194 for(int i =0;str[i]!=NULL;i++){
guruimage 0:70a333fbe418 195 int temp = str[i]-'0';
guruimage 0:70a333fbe418 196 result=result*10+temp;
guruimage 0:70a333fbe418 197 }
guruimage 0:70a333fbe418 198 return result;
guruimage 0:70a333fbe418 199 }
guruimage 0:70a333fbe418 200
guruimage 0:70a333fbe418 201 void schedFunc(void){
guruimage 0:70a333fbe418 202 myled3=!myled3;
guruimage 0:70a333fbe418 203 pinToggle();
guruimage 0:70a333fbe418 204 }
guruimage 0:70a333fbe418 205
guruimage 0:70a333fbe418 206 void runAtTime(void (*scheFunc)(),struct timeval *tv){
guruimage 0:70a333fbe418 207 (*scheFunc)();
guruimage 0:70a333fbe418 208 LPC_TIM1->MR0=(tv->tv_usec-1)*96000+offset;
guruimage 0:70a333fbe418 209 }
guruimage 0:70a333fbe418 210
guruimage 0:70a333fbe418 211 void setTimeval(struct timeval *tv){
guruimage 0:70a333fbe418 212 tv->tv_sec=triggerTime/1000;
guruimage 0:70a333fbe418 213 tv->tv_usec=triggerTime;
guruimage 0:70a333fbe418 214 }