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.
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;
}
}
}