APP Team
/
app3
led example with 2 timers
Revision 5:726d7857fd33, committed 2014-02-12
- Comitter:
- passelin
- Date:
- Wed Feb 12 07:07:48 2014 +0000
- Parent:
- 4:af325c921e79
- Commit message:
- 02:07
Changed in this revision
--- a/main.h Tue Feb 11 20:38:43 2014 +0000 +++ b/main.h Wed Feb 12 07:07:48 2014 +0000 @@ -15,6 +15,8 @@ #define TYPE 0x00 #define STOP 0x3E +#define TIME 600000 // 100 ms + typedef struct { string trame; char size; @@ -28,7 +30,7 @@ void Sender_thread(void const *args); void Receiver_thread(void const *args); -extern "C" void TIMER0_IRQHandler (void); +extern "C" void TIMER3_IRQHandler (void); extern "C" void TIMER2_IRQHandler (void);
--- a/reader.cpp Tue Feb 11 20:38:43 2014 +0000 +++ b/reader.cpp Wed Feb 12 07:07:48 2014 +0000 @@ -3,17 +3,11 @@ extern Serial pc; extern Queue<string, 16> ReaderQueue; -void Reader_init() -{ - -} - void Reader_thread(void const *args) { string message= ""; char c; unsigned int count = 0; - Reader_init(); while(1) {
--- a/receiver.cpp Tue Feb 11 20:38:43 2014 +0000 +++ b/receiver.cpp Wed Feb 12 07:07:48 2014 +0000 @@ -1,34 +1,109 @@ #include "main.h" extern Serial pc; -DigitalOut myled2(LED2); +DigitalOut myled2(LED2); +char s[300]; +enum steps {STEP_A,STEP_B,STEP_C}; +steps state; +int t[7]; +int temps; +int b_count; +int last_value; + +// TEST +bool msgReady; +string testString; void Receiver_init(void) { myled2 = 0; + // s = ""; + msgReady = false; + state = STEP_A; - LPC_SC->PCONP |=1<<22; //timer1 power on - LPC_TIM2->MR0 = 2398000; //100 msec - LPC_TIM2->MCR = 3; //interrupt and reset control - //3 = Interrupt & reset timer1 on match - //1 = Interrupt only, no reset of timer0 - NVIC_EnableIRQ(TIMER2_IRQn); //enable timer1 interrupt - LPC_TIM2->TCR = 1; //enable Timer1 + + + // Enable the pins on the device to use TIMER CAP2.0 on pin 30 + LPC_PINCON->PINSEL0 |= 3<<8; + + NVIC_SetVector(TIMER2_IRQn, uint32_t(TIMER2_IRQHandler)); + + // init Timer 2 (cap2.0 = DIP30, cap2.1 = DIP29) + LPC_SC->PCONP |= (1 << 22); // Timer2 power on + //LPC_SC->PCLKSEL1 |= (1 << 12); // Divide CCLK by 1 for Timer2 + LPC_TIM2->TC = 0; // clear timer counter + LPC_TIM2->PC = 0; // clear prescale counter + LPC_TIM2->PR = 0; // clear prescale register + LPC_TIM2->TCR = (1 << 1); // reset timer + LPC_TIM2->IR |= 1 << 0; // Clear MR0 interrupt flag + LPC_TIM2->CCR |= (7 << 0); // enable cap2.0 rising-edge capture and falling-edge; interrupt on cap2.0 + //LPC_TIM2->TCR = 1; // start Timer2 + + NVIC_EnableIRQ(TIMER2_IRQn); //enable timer2 interrupt + + b_count = 0; } extern "C" void TIMER2_IRQHandler (void) -{ - - - if((LPC_TIM2->IR & 0x01) == 0x01) // if MR0 interrupt, proceed - { - LPC_TIM2->IR |= 1 << 0; // Clear MR0 interrupt flag +{ + int ecart = 0; + char buffer[1]; + myled2 =!myled2; + string endChar; + + LPC_TIM2->IR |= 1 << 0; // Clear MR0 interrupt flag + + switch (state) + { + case STEP_A: LPC_TIM2->TCR = 1; // start Timer2 + state = STEP_B; + b_count = 0; + s[0] = '0'; + break; + + case STEP_B: t[b_count-1] = LPC_TIM2->CR0; + LPC_TIM2->TCR = (1 << 1); + LPC_TIM2->TCR = 1; + if(b_count>6) + { + state = STEP_C; + //temps = (t[0] + t[1] + t[2] + t[3] + t[4] + t[5] + t[6])/7; + temps = TIME; + s[1] = '1';s[2] = '0';s[3] = '1';s[4] = '0';s[5] = '1';s[6] = '0';s[7] = '1'; + last_value = 1; + } + + + break; + case STEP_C: /*ecart = LPC_TIM2->CR0; + if(ecart*1.5<temps) + { + sprintf(buffer, "%d", last_value); + s+= buffer[0]; + } + else + { + last_value = 1-last_value; + sprintf(buffer, "%d", last_value); + s+= buffer[0]; + } - - myled2 =!myled2; - - } + endChar = s.substr((s.size()-8), 8); + if(endChar == "00111110") + {*/ + state = STEP_A; + testString = s; + // s = ""; + msgReady= true; + // } + + LPC_TIM2->TCR = (1 << 1); + LPC_TIM2->TCR = 1; + + break; + } + b_count++; } void Receiver_thread(void const *args) @@ -37,6 +112,11 @@ while(1) { - // wait forever... + if(msgReady == true) + { + pc.printf("\n\rmessage recu: %d", b_count); + b_count =0; + msgReady= false; + } } } \ No newline at end of file
--- a/sender.cpp Tue Feb 11 20:38:43 2014 +0000 +++ b/sender.cpp Wed Feb 12 07:07:48 2014 +0000 @@ -3,61 +3,84 @@ extern Serial pc; extern Mail<message_t, 16> mailBox; DigitalOut myled(LED1); -DigitalOut M0(p26); -volatile unsigned short timer_count; -unsigned int trameSize = 0; -unsigned int trameCounter = 0; +unsigned int trameSize; +unsigned int trameCounter; char trameArray[696]; bool trameReady; - void Sender_init(void) { myled = 0; - trameCounter = 0; + trameCounter = 1; + trameSize = 0; trameReady = false; - LPC_SC->PCONP |=1<1; //timer0 power on - LPC_TIM0->MR0 = 2398000; //100 msec ?? - LPC_TIM0->MCR = 3; //interrupt and reset control - //3 = Interrupt & reset timer0 on match - //1 = Interrupt only, no reset of timer0 - NVIC_EnableIRQ(TIMER0_IRQn); //enable timer0 interrupt - LPC_TIM0->TCR = 1; //enable Timer0 + // Enable the pins on the device to use TIMER MAT3.0 + LPC_PINCON->PINSEL0 |= 3<<20; + + NVIC_SetVector(TIMER3_IRQn, uint32_t(TIMER3_IRQHandler)); + + LPC_SC->PCONP |=1<<23; //timer3 power on + LPC_TIM3->MR0 = TIME; //100 msec ?? + LPC_TIM3->MCR |= 3; //interrupt and reset control + //3 = Interrupt & reset timer3 on match + //1 = Interrupt only, no reset of timer3 + LPC_TIM3->TC = 0; // clear timer counter + LPC_TIM3->PC = 0; // clear prescale counter + LPC_TIM3->PR = 0; // clear prescale register + LPC_TIM3->TCR = (1 << 1); //reset Timer3 + LPC_TIM3->IR |= 1 << 0; // Clear MR0 interrupt flag + LPC_TIM3->EMR |= (3 << 4); // enable MAT 3.0 + + + NVIC_EnableIRQ(TIMER3_IRQn); //enable timer3 interrupt + } -extern "C" void TIMER0_IRQHandler (void) +extern "C" void TIMER3_IRQHandler (void) { - if((LPC_TIM0->IR & 0x01) == 0x01) // if MR0 interrupt, proceed - { - LPC_TIM0->IR |= 1 << 0; // Clear MR0 interrupt flag + char current = 0; + char previous = 0; - - if(trameReady == true) - { - if(trameCounter <= trameSize) - { - if(trameArray[trameCounter] == 0x30) - { - M0 = 0; - } + if((LPC_TIM3->IR & 0x01) == 0x01) // if MR0 interrupt, proceed + { + LPC_TIM3->IR |= 1 << 0; // Clear MR0 interrupt flag + + myled =!myled; + + if(trameReady == true) + { + + if(trameCounter <= trameSize) + { + current = trameArray[trameCounter]; + previous = trameArray[trameCounter-1]; + + if(current == previous) + { + LPC_TIM3->MR0 = (TIME/2); + } + else + { + LPC_TIM3->MR0 = (TIME); + } + + // next caracter + trameCounter++; + + // Activity light + myled =!myled; + } else { - M0 = 1; + // Trame send, wait until a new trame is ready to send + trameReady = false; + LPC_TIM3->TCR = 0; + trameCounter = 1; + myled= 0; } - myled =!myled; - trameCounter++; - } - else - { - trameReady = false; - trameCounter = 0; - M0 =0; - myled= 0; - } - } - } + } } void Sender_thread(void const *args) @@ -79,8 +102,9 @@ pc.printf("\n\r%s", trameArray); pc.printf("\n\r%d", trameSize); - - trameReady = true; + + trameReady = true; + LPC_TIM3->TCR = 1; } } }