##// END OF EJS Templates

File last commit:

r220:221
r220:221
Show More
acquisitiond.c
261 lines | 5.1 KiB | text/x-c | CLexer
/*
* 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;
}