|
|
/*
|
|
|
* acquisitiond.c
|
|
|
*
|
|
|
* Created on: Mar 24, 2015
|
|
|
* Author: shinobi
|
|
|
*/
|
|
|
|
|
|
#include "acquisitiond.h"
|
|
|
#include "fpgaport.h"
|
|
|
|
|
|
volatile uint8_t is_acquiring = 0;
|
|
|
volatile uint8_t send_flg = 0;
|
|
|
|
|
|
// Comandos para el ADC
|
|
|
#define CMD_ACTV 0
|
|
|
#define CMD_DACTV 1
|
|
|
#define CMD_RATE 2
|
|
|
#define CMD_RPARAM 3
|
|
|
#define CMD_WPARAM 4
|
|
|
#define CMD_START 5
|
|
|
#define CMD_STOP 6
|
|
|
#define CMD_INFO 7
|
|
|
#define CMD_GAIN 8
|
|
|
#define CMD_ID 9
|
|
|
#define CMD_STATUS 10
|
|
|
#define CMD_PPS 11
|
|
|
|
|
|
|
|
|
/*!
|
|
|
* \fn acq_chn_activate
|
|
|
* \breif activa la comunicacion con el IC ADC
|
|
|
* \see acq_chn_deactivate
|
|
|
*/
|
|
|
void acq_chn_activate(){
|
|
|
adcport_open();
|
|
|
}
|
|
|
|
|
|
|
|
|
/*!
|
|
|
* \fn acq_chn_deactivate
|
|
|
* \breif desactiva la comunicacion con el IC ADC
|
|
|
* \see acq_chn_activate
|
|
|
*/
|
|
|
void acq_chn_deactivate(){
|
|
|
adcport_close();
|
|
|
}
|
|
|
|
|
|
|
|
|
/*!
|
|
|
* \fn acq_chn_datarate
|
|
|
* \breif Configura el datarate del ADC
|
|
|
* \param datarate El datarate deseado
|
|
|
*/
|
|
|
void acq_chn_datarate(uint16_t datarate){
|
|
|
if(is_acquiring==1){
|
|
|
acq_stop_acquisiton();
|
|
|
}
|
|
|
acq_set_param_to_adc(CMD_RATE,datarate);
|
|
|
}
|
|
|
|
|
|
|
|
|
/*!
|
|
|
* \fn acq_send_information
|
|
|
* \breif Envia informacion relevante al Embebido (a traves de FPGA)
|
|
|
*/
|
|
|
void acq_send_information(){
|
|
|
if(is_acquiring==1){
|
|
|
acq_stop_acquisiton();
|
|
|
}
|
|
|
acq_send_param(CMD_RATE);
|
|
|
acq_send_param(CMD_GAIN);
|
|
|
acq_send_param(CMD_ID);
|
|
|
acq_send_param(CMD_STATUS);
|
|
|
acq_send_param(CMD_PPS);
|
|
|
}
|
|
|
|
|
|
|
|
|
/*!
|
|
|
* \fn acq_chn_datarate
|
|
|
* \breif Envia parametros al embebido a traves del FPGA (este se debe encargar
|
|
|
* de hacer el puente al embebido)
|
|
|
* \param param El parametro que se quiere enviar al embebido
|
|
|
*/
|
|
|
void acq_send_param(uint8_t param){
|
|
|
uint8_t data;
|
|
|
fpgaport_open();
|
|
|
fpgaport_write(param);
|
|
|
switch(param){
|
|
|
case CMD_RATE:
|
|
|
// TODO secuencia de comandos para obtener el datarate del ADC
|
|
|
break;
|
|
|
case CMD_GAIN:
|
|
|
data=adcport_get_param(GAIN0);
|
|
|
break;
|
|
|
case CMD_ID:
|
|
|
data=adcport_get_param(ID);
|
|
|
break;
|
|
|
case CMD_STATUS:
|
|
|
data=adcport_get_param(STATUS);
|
|
|
break;
|
|
|
case CMD_PPS:
|
|
|
break;// TODO
|
|
|
default:
|
|
|
// con esta opcion se puede leer los registros del ADC definidos en
|
|
|
// "adcpot.h" y enviarlos al embebido
|
|
|
data= adcport_get_param(param);
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
fpgaport_write(data);
|
|
|
fpgaport_close();
|
|
|
}
|
|
|
|
|
|
|
|
|
/*!
|
|
|
* \fn acq_send_buff
|
|
|
* \breif Envia el contenido de un buffer de datos hacia el
|
|
|
* FPGA para que sean pre-procesados.
|
|
|
*/
|
|
|
/*
|
|
|
* Esta funcion debe ser ejecutada con la señal de una interrupcion externa
|
|
|
* manejada por software, que le indicara que hay un buffer lleno listo
|
|
|
* para pre-procesar (vea adcport.c ).
|
|
|
*/
|
|
|
void acq_send_buff(){
|
|
|
uint8_t i=0;
|
|
|
uint32_t* pbuff = adcport_getbuff();
|
|
|
fpgaport_open();
|
|
|
while(!(i==BUFF_SIZE)){
|
|
|
fpgaport_write(pbuff[i]);
|
|
|
i++;
|
|
|
}
|
|
|
fpgaport_close();
|
|
|
}
|
|
|
|
|
|
|
|
|
/*!
|
|
|
* \fn acq_chn_set_datarate
|
|
|
* \breif configura edl datarate del ADC
|
|
|
* \param datarate
|
|
|
*/
|
|
|
void acq_chn_set_datarate(uint8_t datarate){
|
|
|
// TODO secuencia de comandos para configurar el data rate
|
|
|
}
|
|
|
|
|
|
|
|
|
/*!
|
|
|
* \fn acq_process_cmd
|
|
|
* \breif Procesa todos los comandos enviados desde el FPGA.
|
|
|
* \param cmd Comando a procesar.
|
|
|
*/
|
|
|
/*
|
|
|
* Esta funcion debe ejecutarse al haber una interrupcion en el puerto que
|
|
|
* conecta al FPGA
|
|
|
*/
|
|
|
void acq_process_cmd(uint8_t cmd){
|
|
|
static uint8_t param;
|
|
|
static uint8_t data;
|
|
|
cli();// desactiva interrupciones
|
|
|
fpgaport_open();
|
|
|
switch(cmd){
|
|
|
case CMD_ACTV: acq_chn_activate();
|
|
|
break;
|
|
|
case CMD_DACTV:acq_chn_deactivate();
|
|
|
break;
|
|
|
case CMD_RATE:
|
|
|
param=fpgaport_read();
|
|
|
acq_chn_set_datarate(param);
|
|
|
break;
|
|
|
case CMD_RPARAM:
|
|
|
param=fpgaport_read();
|
|
|
acq_send_param(param);
|
|
|
break;
|
|
|
case CMD_WPARAM:
|
|
|
cmd=fpgaport_read();//lee
|
|
|
data=fpgaport_read();//lee valor
|
|
|
acq_set_param_to_adc(cmd,data);
|
|
|
break;
|
|
|
case CMD_START:
|
|
|
acq_start_acquisition();
|
|
|
break;
|
|
|
case CMD_STOP:
|
|
|
acq_stop_acquisition();
|
|
|
break;
|
|
|
case CMD_INFO:
|
|
|
acq_send_information();
|
|
|
break;
|
|
|
default: break;
|
|
|
}
|
|
|
fpgaport_close();
|
|
|
sei();//acvtiva interrupciones
|
|
|
}
|
|
|
|
|
|
|
|
|
/*!
|
|
|
* \fn acq_set_param
|
|
|
* \breif Procesa todos los comandos enviados desde el FPGA.
|
|
|
* \param param Parametro a configurar.
|
|
|
* \param value Valor del parametro
|
|
|
*/
|
|
|
void acq_set_param(uint8_t param, uint8_t value){
|
|
|
adcport_tranceiv(param);
|
|
|
adcport_tranceiv(value);
|
|
|
}
|
|
|
|
|
|
|
|
|
/*!
|
|
|
* \fn acq_start_acquisition
|
|
|
* \breif Inicia la adquisicion de datos, esta se hara a traves de interrupciones
|
|
|
* "software" (ver adcport.c)
|
|
|
*/
|
|
|
void acq_start_acquisition(){
|
|
|
is_acquiring = 1;
|
|
|
adcport_start();
|
|
|
}
|
|
|
|
|
|
/*!
|
|
|
* \fn acq_stop_acquisition
|
|
|
* \breif Para la adquisicion de datos. Las interrupciones utilizadas para
|
|
|
* este fin son desactivadas.
|
|
|
*/
|
|
|
void acq_stop_acquisition(){
|
|
|
is_acquiring=0;
|
|
|
adcport_stop();
|
|
|
}
|
|
|
|
|
|
|
|
|
/*
|
|
|
* interrupcion en algun pin que no se este usdando.
|
|
|
* Interrupcion software. No puede ser PORTC_INT0_vect
|
|
|
* Se usara para le indiquen que ya hay un buffer lleno
|
|
|
* (ver adcport.c)
|
|
|
*/
|
|
|
ISR(PORTx_INTx_vect){ // FIXME
|
|
|
send_flg=1;
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
* interrupcion en algun pin que no se este usdando.
|
|
|
* Interrupcion software. No puede ser PORTC_INT0_vect
|
|
|
* Se usara para le indiquen que ya hay un buffer lleno
|
|
|
* (ver adcport.c)
|
|
|
*/
|
|
|
ISR(PORTx_INTx_vect){ // FIXME
|
|
|
send_flg=1;
|
|
|
}
|
|
|
|
|
|
/*!
|
|
|
* \brief Espera que un buffer este lleno para enviarlo al fpga
|
|
|
*/
|
|
|
int main(){
|
|
|
do{
|
|
|
if(send_flg==1){
|
|
|
send_flg=0;
|
|
|
acq_send_buff();
|
|
|
}
|
|
|
}while(1);
|
|
|
return 0;
|
|
|
}
|
|
|
|