Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
main.cpp@0:70a333fbe418, 2010-12-04 (annotated)
- Committer:
- guruimage
- Date:
- Sat Dec 04 06:55:32 2010 +0000
- Revision:
- 0:70a333fbe418
Part2 Slave
Who changed what in which revision?
| User | Revision | Line number | New 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 | } |