Codificación del DEMOQE128 - Gianluque/Osciloscopio GitHub Wiki

La codificación encargada del procesamiento y entramado de la data se realizó en Code Warrior con la herramienta de apoyo Processor Expert. El microcontrolador debe ser capaz de realizar el muestreo a 2KHz, y transmitir la data a 115200 baudios.

Muestreo y lectura de la data

El código consiste básicamente en un ciclo el cual estará revisando constantemente un flag que al activarse leerá la data proveniente del circuito de protección y realizará el entramado y transmisión de la data. El flag es activado mediante una interrupción de tiempo, el cual fue configurado para que se active a la frecuencia de muestreo.

 for(;;){
	 
	 if(flag){
		  flag=0;
		  //Muestreo del ADC de todos los canales que esten en uso
		  AD1_Measure(TRUE);  
		  AD1_GetValue(byte);
		 
		  // Proceso de enmascarado de la señal y adquisicion de la señal digital
		  Masksignal(byte);
		  DigitalSig(byte);
		  // Envio de la data
		  SendData(byte);
		  
		  
		}
	  
}

Para la lectura de los canales analógicos, se habilitaron dos canales del ADC, los cuales pertenecen a los puertos PTF0 y PTF1, estos se encargarán de tomar la data y guardarla en la variable declarada como “char byte [4]”, donde cada casilla del arreglo es 1 byte y la data que representa 1 canal analógico es de 2 bytes, por lo que dicha variable almacenará la data de ambos canales.

Protocolo de comunicación:

Antes de enviar la data mediante puerto serial fue necesario establecer un protocolo de comunicación de manera que se pueda garantizar que la data sea enviada de la forma correcta. EL ADC almacena por defecto la data de la siguiente manera:

imagen

Para poder enviar la data de forma segura, se tomó como protocolo de comunicación la siguiente estructura:

imagen

El bit mas significativo del byte 1 se tomó como 0 para indicar el comienzo de la información a enviar, de esta forma se puede sincronizar fácilmente la data cuando ésta sea recibida, el segundo bit más significativo queda libre, por lo que se utilizaron para representar el canal digital, que, al ser solo dos canales, se usó el byte 1 y el byte 3 para cumplir con este propósito. Finalmente, el resto de los bits representa la data.

void Masksignal(char signal[]){
	
	
	           signal[0]   = (signal[0] << 2 | signal[1]>>6);  		
		   signal[0]   = (signal[0] & 0b00111111);				
		   signal[1]   = (signal[1] & 0b00111111) | 0b10000000;  
                   signal[2]   = (signal[2] << 2 | signal[3]>>6);		
		   signal[2]   = (signal[2] | 0b10000000);				
		   signal[3]   = (signal[3] & 0b00111111) | 0b10000000;	
}

La función Masksignal se encarga de realizar las operaciones lógicas necesarias para el entramado de la data. La función toma el primer byte y lo shiftea para luego guardar los 2 bits mas significativos del byte 2 en los menos significativos del byte 1 y luego con un AND le asigna el 0 en el MSB para indicar cual es el inicio de la data. Para el byte 2, se eliminan los 2 MSB que se guardaron en byte 1 con un AND y luego se le asigna 1 al MSB del byte 2, el mismo proceso se repite para el byte 3 y el byte 4 pertenecientes al canal 2, con la diferencia de que el MSB de éste llevará un 1 para no perder la sincronía de la data a la hora de ser enviada.

Canal Digital:

Para la adquisición de los canales digitales se asignaron los pines PTC6 y PTC7, la función DigitalSig se encarga de este procedimiento y consiste en un simple condicional que revisa si se está recibiendo una señal por los respectivos pines de entrada, al cumplirse el condicional agrega con un OR un 1 en el segundo bit mas significativo en los respectivos bytes asignados, para los cuales se escogieron el byte 1 y el byte 3.

void DigitalSig (char Signal []){
	
	if (Bit1_GetVal()) Signal[0]=Signal[0] | 0b01000000;    
	
	if (Bit2_GetVal()) Signal[2]=Signal[2] | 0b01000000;
}

Envio de la data:

SendData se encargará de transmitir mediante serial la data ya enmascarada. Se utilizo la función AS1_SendBlock para enviar el bloque completo de 4 bytes y se verifica si la data fue enviada correctamente.

void SendData(char block[]){
	char error;   							
	char ptr;     							
	
	do{
		error=AS1_SendBlock(block,4,&ptr);	 
		
	}while(error!=ERR_OK); 					 
}