TP1 codificacion manchester lauckner y lipari

Dependencies:   mbed

Revision:
0:8eea1bdbb84a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Wed May 23 23:26:28 2018 +0000
@@ -0,0 +1,82 @@
+#include "mbed.h"
+#define CANT_BITS 8  //Constante que se define por si se necesita codificar mas bits 
+
+unsigned char dato[CANT_BITS]= {1, 0, 1, 0, 0, 0, 1, 1}; //Datos a codificar
+
+enum {ESPERA, XOR}; //Estados de nuestra maquina
+
+DigitalOut rled(PTA5); //Señal de salida codificada
+DigitalOut signal_out(PTA4); //Señal de clock para observar en el osciloscopio
+
+Ticker timer; //Timer para controlar los tiempos de clk y cambio de bit de la trama a codificar
+
+//Prototipos de funciones
+void manchester_code(void);
+void timerTIC(void);
+void timer_init(void);
+
+int main()
+{
+    timer_init(); //Configuracion del timer
+    while(1) {
+        manchester_code(); //Maquina de estados de codificacion
+    }
+}
+
+void timer_init(void)
+{
+    timer.attach(&timerTIC, 0.001);       //TIMER cada 1mSeg
+}
+
+
+unsigned short manchester_tic = 500, clock_tic = 250; //Variables de tiempos que se decrementan cada vez que se ejecuta timerTIC
+
+//Funcion que se ejecuta cada 1mSeg
+void timerTIC(void)
+{
+    if(manchester_tic > 0)
+        manchester_tic--;
+
+    if(clock_tic > 0)
+        clock_tic--;
+}
+
+unsigned char manchester_state = ESPERA, clk = 0, bit = 0, out = 0; //Variables utilizadas en la ME
+
+//Maquina de estados para codificar en Manchester
+void manchester_code(void)
+{
+    switch(manchester_state) {
+        default:  //Si no se definio estado, es ESPERA
+        case ESPERA: //Estado ESPERA
+            if(clock_tic > 0) //Hasta que no pase el tiempo, sale de la funcion
+                break;
+            else {
+                clk = !clk; //Se niega la señal de clk
+                signal_out = clk; //Se asigna a la salida el valor de la variable
+                manchester_state = XOR; //Proximo estado
+            }
+            break;
+
+        case XOR: //Estado XOR
+            out = dato[bit] ^ clk;  // la variable toma el valor de una XOR entre el valor de la posicion del vector y el valor de clk
+            printf("%d", out);     //Se imprime para observar el valor con Hercules
+            rled = out;           //Se asigna a la salida el valor de la variable
+
+            if(manchester_tic <= 0) {    //Si la variable de tiempo es menor o igual a 0...
+                bit++;                  //Aumenta en 1 la variable que controla la posicion del vector dato
+                manchester_tic = 500;  //Se reinicia el valor de la variable de tiempo
+            }
+
+            if(bit > (CANT_BITS-1)) {    //Si la variable bit es mayor a CANT_BITS menos 1 (Ya que el vector inicia en la posicion cero)...
+                printf("\n");           //Se imprime un \n para observar con Hercules que ya se termino de codificar la trama
+                bit = 0;               //Se reinicia el valor de la variable bit debido a que ya se terminaron los valores del vector
+            }
+
+            clock_tic = 250;             //Se reinicia el valor de la variable de tiempo
+            manchester_state = ESPERA;  //Proximo estado
+            break;
+
+
+    }
+}