Éric Bisson / Mbed 2 deprecated S5info_APP4

Dependencies:   mbed-rtos mbed CRC16

Fork of S5info_APP2 by Éric Bisson

Files at this revision

API Documentation at this revision

Comitter:
ericbisson
Date:
Tue Mar 07 04:54:45 2017 +0000
Parent:
13:a436ba0b78e8
Parent:
14:bd909277eb13
Child:
16:f2661759714c
Commit message:
merged

Changed in this revision

bit.h Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
main.cpp.orig Show annotated file Show diff for this revision Revisions of this file
read.h Show diff for this revision Revisions of this file
--- a/bit.h	Tue Mar 07 04:37:39 2017 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,7 +0,0 @@
-int bit0 = 1;
-int bit1 = 1<<1;
-int bit2 = 1<<2;
-int bit3 = 1<<3;
-int bit16 = 1<<16;
-int bit26 = 1<<26;
-int bit27 = 1<<27;
\ No newline at end of file
--- a/main.cpp	Tue Mar 07 04:37:39 2017 +0000
+++ b/main.cpp	Tue Mar 07 04:54:45 2017 +0000
@@ -1,68 +1,30 @@
+#include "CRC16.h"
 #include "mbed.h"
 #include "rtos.h"
-#include "bit.h"
-#include "uart.h"
-
-const float HALF_PERIOD = 0.05; // secondes
-
-Serial pc(USBTX, USBRX, 9600);
-DigitalIn in(p14);
-DigitalOut out(p13);
+#include <vector>
+using std::vector;
+DigitalIn in(p30);
 Thread ThreadLecture;
+const int PREAMBULE = 0b01010101;
+const int START = 0b01111110;
+const int END = 0b01111110;
+Serial pc(USBTX, USBRX);
+DigitalOut out(p8);
 
 bool transmit = false;      //faux pour le debut de demi-periode d'envoie d'un bit, vrai pour la 2ème demi-periode
 char trame_sent[80];        //tableau de la trame à envoyer
 uint8_t byte_sent_pos,      //position de l'octet dans le tableau d'envoi
         bit_sent,           //position du bit de l'octet en cours d'envoi (du MSB au LSB) 7..0
         trame_length;       //longueur de la trame complete
-//test
 
-bool clockTick = false;
-  
-extern "C" void RIT_IRQHandler(void) {
-    //clear flag
-    LPC_RIT->RICTRL |= bit0; //write 1 to clear bit
-    
-    //bIsHalfPeriod = !bIsHalfPeriod;
-}
-
-void p14_interrupt()
-{    
-    // On turn off les interrupts de lecture une fois qu'on a détecter un message
-    //uart.attach(NULL, uart.RxIrq);
-
-    // On envoie le signal au thread de lecture
-    ThreadLecture.signal_set(1);
-};
-
-void read()
-{
-    while(true) 
-    {
-        // Attente passive d'un message entrant
-        //uart.attach(&p14_interrupt, uart.RxIrq);
-        ThreadLecture.signal_wait(1);
-        
-        // Lis le message. Retourne une exception si il y a une erreur
-        //vector<char> message = uart_read(uart);
-        
-        //if (!message.empty())
-        //{
-            // Affiche le message à l'écran
-            //pc.printf(&message[0], message.size());
-        //}
-    }
-};
-
-void rit_init()
+void initTimers()
 {
     //Timer 1 (match)
     LPC_SC->PCLKSEL0 |= (1 << 4);           // pclk = cclk timer1
     LPC_SC->PCONP |= (1 << 2);              // timer1 power on
-    LPC_TIM1->MR0 = CLOCKS_TO_SECOND / 100; // 10 ms
+    LPC_TIM1->MR0 = 960000;                 // 100 ms
     LPC_TIM1->MCR = 3;                      // interrupt and reset control
-                                            // Interrupt & reset timer on match
-    LPC_TIM1->EMR = (3 << 4);
+    LPC_TIM1->EMR = (3 << 4);               // Interrupt & reset timer on match
     NVIC_EnableIRQ(TIMER1_IRQn);            // enable timer interrupt
     LPC_TIM1->TCR = 1;                      // enable Timer
  
@@ -75,10 +37,54 @@
     LPC_TIM2->TCR |= (1 << 1);              // reset timer
     LPC_TIM2->TCR &= ~(1 << 1);             // release reset
     LPC_TIM2->IR = 0xFFFFFFFF;              // clear interrupt register
-    LPC_TIM2->CCR |= 0x0000007;             // enable rising-edge and falling-edge capture on 2.0
+    LPC_TIM2->CCR |= 0x0000007;             // enable rising-edge and falling-edge capture
     NVIC_EnableIRQ(TIMER2_IRQn);            // enable timer interrupt
     LPC_TIM2->TCR = 1;                      // start Timer
-};
+}
+
+bool bTimer1 = false;
+extern "C" void TIMER1_IRQHandler()
+{
+    if ((LPC_TIM1->IR & 0x01) == 0x01)
+    {
+        bTimer1 = !bTimer1;
+        
+        LPC_TIM1->IR |= 1 << 0; // clear
+    }
+}
+
+int sumClocks = 0;
+int PeriodLength = 0;
+bool bReceivedFirstBit = false;
+extern "C" void TIMER2_IRQHandler()
+{
+    if (PeriodLength > 0)
+    {
+        if (LPC_TIM2->CR0 >= PeriodLength*1.5 || (sumClocks + LPC_TIM2->CR0) >= PeriodLength*1.5)
+        {
+            sumClocks = 0;
+            
+            ThreadLecture.signal_set(1);
+        }
+        else
+        {
+            sumClocks += LPC_TIM2->CR0;
+        }
+    }
+    else if (bReceivedFirstBit)
+    {
+        PeriodLength = LPC_TIM2->CR0 / 2;
+        ThreadLecture.signal_set(1);
+    }
+    else
+    {
+        bReceivedFirstBit = true;
+        ThreadLecture.signal_set(1);
+    }
+    
+    LPC_TIM2->TC = 0;
+    LPC_TIM2->IR |= 0xFFFFFFFF; // clear
+}
 
 bool codeManchester(bool bit, bool clock)
 {
@@ -87,18 +93,18 @@
 
 void send_data()
 {
-    out = codeManchester(((trame_sent[byte_sent_pos] >> bit_sent) & 0x01), clockTick);  // Encodage Manchester
-    if(clockTick)
+    out = codeManchester(((trame_sent[byte_sent_pos] >> bit_sent) & 0x01), bTimer1);  // Encodage Manchester
+    if(bTimer1)
     {
         bit_sent--;
     }
-    clockTick = !clockTick;       //varier entre la 1ere et 2eme partie de demi-periode
+    bTimer1 = !bTimer1;       //varier entre la 1ere et 2eme partie de demi-periode
     if (bit_sent < 0) {     //Si l'octet a ete envoye
         bit_sent = 7;       //remettre la position initiale pour le prochain octet
         byte_sent_pos++;    //incrementer l'octet
         if (byte_sent_pos >= trame_length) {  //Si la trame a ete envoyee
             byte_sent_pos = 0;
-            clockTick = false;
+            bTimer1 = false;
         }
     }
 }
@@ -149,21 +155,37 @@
 {
     byte_sent_pos = 0;
     bit_sent = 7;
-    clockTick = false;
+    bTimer1 = false;
     //TODO start interrupt timer 1 
     //LPC_RIT->MCR = 1;                      //Permettre les interruption du MAT
     //LPC_RIT->MR0 = LPC_RIT->TC + HALF_PERIOD;  //Faire une interruption a la prochaine demi-periode
 }
 
+void read()
+{
+    char byte;
+    vector<char> bytes;
+    char shift = 0;
+    while (true)
+    {
+        ThreadLecture.signal_wait(1);
+        
+        byte = (byte << 1) + in;
+        
+        shift++;
+        if (shift == 8)
+        {
+            bytes.push_back(byte);
+            shift = 0;
+        }
+    }
+}
+
 int main() {
-    rit_init();
-    
+    LPC_PINCON->PINSEL0 |= (3 << 8); // pin30
+    initTimers();
     ThreadLecture.start(read);
     
     while(true) {
-        get_text();
-        write();
-        //uart.printf("12345");
-        wait_ms(100);
     }
 };
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp.orig	Tue Mar 07 04:54:45 2017 +0000
@@ -0,0 +1,169 @@
+#include "mbed.h"
+#include "rtos.h"
+#include "bit.h"
+#include "uart.h"
+
+const float HALF_PERIOD = 0.05; // secondes
+
+Serial pc(USBTX, USBRX, 9600);
+DigitalIn in(p14);
+DigitalOut out(p13);
+Thread ThreadLecture;
+
+bool transmit = false;      //faux pour le debut de demi-periode d'envoie d'un bit, vrai pour la 2ème demi-periode
+char trame_sent[80];        //tableau de la trame à envoyer
+uint8_t byte_sent_pos,      //position de l'octet dans le tableau d'envoi
+        bit_sent,           //position du bit de l'octet en cours d'envoi (du MSB au LSB) 7..0
+        trame_length;       //longueur de la trame complete
+//test
+
+bool clockTick = false;
+  
+extern "C" void RIT_IRQHandler(void) {
+    //clear flag
+    LPC_RIT->RICTRL |= bit0; //write 1 to clear bit
+    
+    //bIsHalfPeriod = !bIsHalfPeriod;
+}
+
+void p14_interrupt()
+{    
+    // On turn off les interrupts de lecture une fois qu'on a détecter un message
+    //uart.attach(NULL, uart.RxIrq);
+
+    // On envoie le signal au thread de lecture
+    ThreadLecture.signal_set(1);
+};
+
+void read()
+{
+    while(true) 
+    {
+        // Attente passive d'un message entrant
+        //uart.attach(&p14_interrupt, uart.RxIrq);
+        ThreadLecture.signal_wait(1);
+        
+        // Lis le message. Retourne une exception si il y a une erreur
+        //vector<char> message = uart_read(uart);
+        
+        //if (!message.empty())
+        //{
+            // Affiche le message à l'écran
+            //pc.printf(&message[0], message.size());
+        //}
+    }
+};
+
+void rit_init()
+{
+    //Timer 1 (match)
+    LPC_SC->PCLKSEL0 |= (1 << 4);           // pclk = cclk timer1
+    LPC_SC->PCONP |= (1 << 2);              // timer1 power on
+    LPC_TIM1->MR0 = CLOCKS_TO_SECOND / 100; // 10 ms
+    LPC_TIM1->MCR = 3;                      // interrupt and reset control
+                                            // Interrupt & reset timer on match
+    LPC_TIM1->EMR = (3 << 4);
+    NVIC_EnableIRQ(TIMER1_IRQn);            // enable timer interrupt
+    LPC_TIM1->TCR = 1;                      // enable Timer
+ 
+    //Timer 2 (cap)
+    LPC_SC->PCLKSEL1 |= (1 << 12);          // pclk = cclk timer2
+    LPC_SC->PCONP |= (1 << 22);             // timer2 power on
+    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->TCR &= ~(1 << 1);             // release reset
+    LPC_TIM2->IR = 0xFFFFFFFF;              // clear interrupt register
+    LPC_TIM2->CCR |= 0x0000007;             // enable rising-edge and falling-edge capture on 2.0
+    NVIC_EnableIRQ(TIMER2_IRQn);            // enable timer interrupt
+    LPC_TIM2->TCR = 1;                      // start Timer
+};
+
+bool codeManchester(bool bit, bool clock)
+{
+    return (bit == clock);
+}
+
+void send_data()
+{
+    out = codeManchester(((trame_sent[byte_sent_pos] >> bit_sent) & 0x01), clockTick);  // Encodage Manchester
+    if(clockTick)
+    {
+        bit_sent--;
+    }
+    clockTick = !clockTick;       //varier entre la 1ere et 2eme partie de demi-periode
+    if (bit_sent < 0) {     //Si l'octet a ete envoye
+        bit_sent = 7;       //remettre la position initiale pour le prochain octet
+        byte_sent_pos++;    //incrementer l'octet
+        if (byte_sent_pos >= trame_length) {  //Si la trame a ete envoyee
+            byte_sent_pos = 0;
+            clockTick = false;
+        }
+    }
+}
+
+//création de la trame
+void create_trame(char message[],int taille)
+{
+    CRC16 *myCRC = new CRC16();
+    unsigned short resultCRC = myCRC->calculateCRC16(message,taille); 
+    
+    trame_sent[0] = 0x55;    //Preambule
+    trame_sent[1] = 0x7E;    //Start
+    trame_sent[2] = 0x00;    //Type + Flag mis a 0x00
+    trame_sent[3] = (char)taille;     //Longueur du message (Max 33 caractères)
+    
+    //message
+    for (int i=0;i<taille;i++)
+    {
+        trame_sent[taille + 4] = message[i];
+    }
+        
+    //CRC16
+    trame_sent[taille + 4] = (resultCRC >> 8) & 0xFF;
+    trame_sent[taille + 5] = resultCRC & 0xFF;
+    
+    trame_sent[taille + 6] = 0x7E;    //End
+    trame_length = taille + 7;        //Longueur de la trame
+}
+
+//obtention du texte
+void get_text()
+{
+    pc.printf("\n\rYour text : ");
+    int count = 0;
+    char c = 0x00;
+    char text[73];
+    while(c != 0x0D && count < 73) { //Tant que c'est different de '\r' et pour un maximum de 73 caractères 
+        c = pc.getc();
+        text[count] = c;
+        pc.putc(c);
+        count++;
+    }
+    
+    create_trame(text,count);
+}
+
+void write()
+{
+    byte_sent_pos = 0;
+    bit_sent = 7;
+    clockTick = false;
+    //TODO start interrupt timer 1 
+    //LPC_RIT->MCR = 1;                      //Permettre les interruption du MAT
+    //LPC_RIT->MR0 = LPC_RIT->TC + HALF_PERIOD;  //Faire une interruption a la prochaine demi-periode
+}
+
+int main() {
+    rit_init();
+    
+    ThreadLecture.start(read);
+    
+    while(true) {
+        get_text();
+        write();
+        //uart.printf("12345");
+        wait_ms(100);
+    }
+};
\ No newline at end of file