3#include "tutti_gli_header.h"
244 if( scheda_su_scheda_giu) scheda_su_scheda_giu =6;
249 if (scrivi_1_leggi_0){
258 while( I2C_mux->GetStatus().busy){};
263 while( I2C_mux->GetStatus().busy){};
284 uint8_t valore, uint8_t scrivi_1_leggi_0 ){
286 if( scheda_su_scheda_giu >=1) scheda_su_scheda_giu=6;
292 if (scrivi_1_leggi_0){
301 while( I2C_mux->GetStatus().busy){};
305 while( I2C_mux->GetStatus().busy){};
321 uint8_t canale,internalADC_0_externalADC_1=(
tx_data[4] & 1), canale_selezionato=10;
322 uint8_t trimmer_old[4], PGA_Gain_old[12], trimmer_fine_test, trimmer_coarse_test;
323 uint8_t *dati_da_scrivere,dati_da_leggere[]={0,0,0,0};
325 int32_t pendenza_fine=0,pendenza_coarse=0,trimmer_riferimento_fine = (*(uint16_t *)&
tx_data[0]);
326 int32_t ADC_misura_fatta_first,ADC_misura_fatta_last,trimmer_riferimento_coarse= (*(uint16_t *)&
tx_data[2] ) *10;
329 scheda_su_scheda_giu = ((
tx_data[6] >> 7) & 1)*6;
331 for(canale=0;canale<6;canale++){
333 canale_selezionato=canale;
338 for(canale=0;canale<4;canale++){
342 for(canale=0;canale<6;canale++){
360 if( (ADC_misura_fatta_first > trimmer_max_voltage_per_trimmer_calibration) || \
361 (ADC_misura_fatta_first <-trimmer_max_voltage_per_trimmer_calibration)){
370 trimmer_fine_test= 0;
372 trimmer_fine_test =255;
385 pendenza_fine = (ADC_misura_fatta_first - ADC_misura_fatta_last) \
387 if( (pendenza_fine > ((trimmer_riferimento_fine *12)/10)) \
388 || (pendenza_fine <((trimmer_riferimento_fine *10)/12) )){
390 pendenza_fine = trimmer_riferimento_fine;
394 dati_da_scrivere= (uint8_t *)&pendenza_fine;
396 ADC_misura_fatta_first = ADC_misura_fatta_last;
398 if(dati_da_leggere[0]>3){
399 dati_da_leggere[0]=1;
401 dati_da_leggere[0] |=1;
403 dati_da_leggere[1]=0;dati_da_leggere[2]=0;dati_da_leggere[3]=0;
424 pendenza_coarse = (ADC_misura_fatta_first - ADC_misura_fatta_last) \
426 if( (pendenza_coarse > ((trimmer_riferimento_coarse *12)/10)) \
427 || (pendenza_coarse <((trimmer_riferimento_coarse *10)/12) )){
429 pendenza_coarse = trimmer_riferimento_coarse;
433 dati_da_scrivere= (uint8_t *)&pendenza_coarse;
437 if(dati_da_leggere[0]>3){
438 dati_da_leggere[0]=2;
440 dati_da_leggere[0] |=2;
442 dati_da_leggere[1]=0;dati_da_leggere[2]=0;dati_da_leggere[3]=0;
447 if(dati_da_leggere[0]==3){
448 dati_da_leggere[0]=0;
449 dati_da_leggere[1]=0;dati_da_leggere[2]=0;dati_da_leggere[3]=0;
453 pendenza_fine = pendenza_fine;
454 tx_data[0]= pendenza_fine & 0xff;
455 tx_data[1] =(pendenza_fine >> 8) & 0xff;
456 pendenza_coarse = pendenza_coarse /10 ;
457 tx_data[2]= pendenza_coarse & 0xff;
458 tx_data[3]= ( pendenza_coarse >> 8) & 0xff;
460 for(canale=0;canale<4;canale++){
465 for(canale=0;canale<6;canale++){
466 PGA_GAIN_CROSS( scheda_su_scheda_giu, canale, PGA_Gain_old[canale] );
481 uint8_t canale,internalADC_0_externalADC_1=(
tx_data[4] & 1), canale_selezionato=10;
482 uint8_t trimmer_old[4], PGA_Gain_old[12], trimmer_fine_test, trimmer_coarse_test;
483 uint8_t *dati_da_scrivere,dati_per_switch[]={0,0,0,0}, delta_trimmer, divisore;
484 int32_t target_slope = *(int32_t *)
tx_data, tampone;
486 int32_t pendenza[]={0,0,0,0,},trimmer_riferimento_fine = (*(uint16_t *)&
tx_data[0]);
487 int32_t ADC_misura_fatta_first[]={0,0,0,0},ADC_misura_fatta_last[]={0,0,0,0}, risul_vof;
490 scheda_su_scheda_giu = ((
tx_data[6] >> 7) & 1)*6;
491 for(canale=0;canale<6;canale++){
493 canale_selezionato=canale;
501 uint16_t memoria_trimmer;
502 uint16_t memoria_switch_trimmer;
503 int32_t segno_uscita;
504 uint8_t nodo_lettura;
505 }trimmer_da_lavorare_;
516 trimmer_da_lavorare_ trimmer_da_lavorare_mainboard_CH0[]={
522 uint8_t ii, trimmer_coarse_o_fine=10;
527 trimmer_coarse_o_fine=2;
531 trimmer_coarse_o_fine=0;
539 for(canale=0;canale<4;canale++){
544 for(canale=0;canale<6;canale++){
552 for(ii= trimmer_coarse_o_fine; ii<(2+trimmer_coarse_o_fine);ii++){
556 128+trimmer_da_lavorare[ii].segno_uscita*delta_trimmer, 1);
559 for(ii= trimmer_coarse_o_fine; ii<(2+trimmer_coarse_o_fine);ii++){
562 for(ii= trimmer_coarse_o_fine; ii<(2+trimmer_coarse_o_fine);ii++){
563 pendenza[ii]=( (ADC_misura_fatta_last[ii] - ADC_misura_fatta_first[ii]) * (trimmer_da_lavorare[ii].segno_uscita ) )/ ( (
int)delta_trimmer) ;
564 tampone = ((int)100*pendenza[ii]) / target_slope;
566 if ( (tampone >130) || (tampone<70)){
568 pendenza[ii]=target_slope;
569 tx_data[5]=3 + ii -trimmer_coarse_o_fine;
574 for(ii= trimmer_coarse_o_fine; ii<(2+trimmer_coarse_o_fine);ii++){
575 dati_da_scrivere= (uint8_t *)&pendenza[ii];
576 EPROM_scrittura_M24C32_64( scheda_su_scheda_giu,I2C_mainboard, canale_selezionato, (trimmer_da_lavorare[ii].memoria_trimmer <<2) , dati_da_scrivere);
579 ((trimmer_da_lavorare_mainboard_CH0[ii].memoria_trimmer+6*canale_selezionato) <<2), dati_da_scrivere);
580 dati_per_switch[0]=0;
582 dati_per_switch[0]=0xFF;
584 EPROM_scrittura_M24C32_64( scheda_su_scheda_giu, I2C_mainboard, canale_selezionato, (trimmer_da_lavorare[ii].memoria_switch_trimmer << 2) , dati_per_switch);
587 ((trimmer_da_lavorare_mainboard_CH0[ii].memoria_switch_trimmer+6*canale_selezionato) <<2), dati_per_switch);
589 pendenza[ trimmer_coarse_o_fine] = (pendenza[ trimmer_coarse_o_fine] / divisore );
590 tx_data[0]= (pendenza[ trimmer_coarse_o_fine] )& 0xff;
591 tx_data[1] =(( pendenza[ trimmer_coarse_o_fine] )>>8)& 0xff;
592 pendenza[ trimmer_coarse_o_fine+1]= (pendenza[ trimmer_coarse_o_fine+1] / divisore );
593 tx_data[2]= (pendenza[ trimmer_coarse_o_fine+1] )& 0xff;
594 tx_data[3]=( ( pendenza[ trimmer_coarse_o_fine+1])>>8)& 0xff;
598 for(canale=0;canale<4;canale++){
603 for(canale=0;canale<6;canale++){
604 PGA_GAIN_CROSS( scheda_su_scheda_giu, canale, PGA_Gain_old[canale] );
621 Trimmer_offset_preampli[]={0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80};
626 Trimmer_CMRR_JFET_COLD={0x80,0x80,0x80,0x80};
629int coarse_Trimmer_offset_step_actual[]={coarse_Trimmer_offset_step,coarse_Trimmer_offset_step};
630int fine_Trimmer_offset_step_actual[]={fine_Trimmer_offset_step,fine_Trimmer_offset_step};
631int fine_Trimmer_thermal_step_actual[]={fine_Trimmer_thermal_step,fine_Trimmer_thermal_step};
632int coarse_Trimmer_thermal_step_actual[]={coarse_Trimmer_thermal_step,coarse_Trimmer_thermal_step};
633int reference_thermal_drift_actual=reference_thermal_drift;
634char numero_offset_per_impostazione_deriva[]= {17,17};
635char numero_temperature_impostazione_deriva[]= {9,9};
636unsigned char coefficiente_termico_trimmer_deriva[]= {200,200};
637signed char valori_offset_per_impostazione_deriva[2][20];
638unsigned char valori_temperature_impostazione_deriva[2][12];
639char temperatura_di_lavoro[2];
640char offset_di_lavoro[2];
645void Imposta_wiper_a_meta_scala_canale_0_I2CA(
void )
648 uint8_t dati_scrittura[2];
649 dati_scrittura[0] = 0<<5;
650 dati_scrittura[1] = 0x80;
652 I2CAdrv->MasterTransmit (addr, dati_scrittura, 2,
false);
653 while (I2CAdrv->GetStatus().busy);
655 dati_scrittura[0] = 1<<5;
656 I2CAdrv->MasterTransmit (addr, dati_scrittura, 2,
false);
657 while (I2CAdrv->GetStatus().busy);
659 dati_scrittura[0] = 2<<5;
660 I2CAdrv->MasterTransmit (addr, dati_scrittura, 2,
false);
661 while (I2CAdrv->GetStatus().busy);
663 dati_scrittura[0] = 3<<5;
664 I2CAdrv->MasterTransmit (addr, dati_scrittura, 2,
false);
665 while (I2CAdrv->GetStatus().busy);
672void Imposta_wiper_a_meta_scala_canale_1_I2CA(
void )
675 uint8_t dati_scrittura[2];
676 dati_scrittura[0] = 0<<5;
677 dati_scrittura[1] = 0x80;
679 I2CAdrv->MasterTransmit (addr, dati_scrittura, 2,
false);
680 while (I2CAdrv->GetStatus().busy);
682 dati_scrittura[0] = 1<<5;
683 I2CAdrv->MasterTransmit (addr, dati_scrittura, 2,
false);
684 while (I2CAdrv->GetStatus().busy);
686 dati_scrittura[0] = 2<<5;
687 I2CAdrv->MasterTransmit (addr, dati_scrittura, 2,
false);
688 while (I2CAdrv->GetStatus().busy);
690 dati_scrittura[0] = 3<<5;
691 I2CAdrv->MasterTransmit (addr, dati_scrittura, 2,
false);
692 while (I2CAdrv->GetStatus().busy);
699void Imposta_canale_del_trimmer_ennesimo_al_valore_I2CA (uint8_t numero_canale, uint8_t numero_trimmer, uint8_t valore_dato)
702 uint8_t dati_scrittura[2];
704 if(numero_canale == 0)
706 addr = I2C_addres_trimmer_pre_ch0;
708 if(numero_canale == 1)
710 addr = I2C_addres_trimmer_pre_ch1;
713 dati_scrittura[0] = numero_trimmer<<5;
714 dati_scrittura[1] = valore_dato;
716 I2CAdrv->MasterTransmit (addr, dati_scrittura, 2,
false);
717 while (I2CAdrv->GetStatus().busy);
721void Imposta_trimmer_common_mode_I2CB ( uint8_t numero_trimmer, uint8_t valore_dato)
724 uint8_t dati_scrittura[2];
727 addr = I2C_addres_trimmer_common_mode_cold ;
730 dati_scrittura[0] = numero_trimmer<<5;
731 dati_scrittura[1] = valore_dato;
733 I2CBdrv->MasterTransmit (addr, dati_scrittura, 2,
false);
734 while (I2CBdrv->GetStatus().busy);
740void Imposta_wiper_a_meta_scala_canale_0_I2CB(
void )
743 uint8_t dati_scrittura[2];
744 dati_scrittura[0] = 0<<5;
745 dati_scrittura[1] = 0x80;
747 I2CBdrv->MasterTransmit (addr, dati_scrittura, 2,
false);
748 while (I2CBdrv->GetStatus().busy);
750 dati_scrittura[0] = 1<<5;
751 I2CBdrv->MasterTransmit (addr, dati_scrittura, 2,
false);
752 while (I2CBdrv->GetStatus().busy);
754 dati_scrittura[0] = 2<<5;
755 I2CBdrv->MasterTransmit (addr, dati_scrittura, 2,
false);
756 while (I2CBdrv->GetStatus().busy);
758 dati_scrittura[0] = 3<<5;
759 I2CBdrv->MasterTransmit (addr, dati_scrittura, 2,
false);
760 while (I2CBdrv->GetStatus().busy);
767void Imposta_wiper_a_meta_scala_canale_1_I2CB(
void )
770 uint8_t dati_scrittura[2];
771 dati_scrittura[0] = 0<<5;
772 dati_scrittura[1] = 0x80;
774 I2CBdrv->MasterTransmit (addr, dati_scrittura, 2,
false);
775 while (I2CBdrv->GetStatus().busy);
777 dati_scrittura[0] = 1<<5;
778 I2CBdrv->MasterTransmit (addr, dati_scrittura, 2,
false);
779 while (I2CBdrv->GetStatus().busy);
781 dati_scrittura[0] = 2<<5;
782 I2CBdrv->MasterTransmit (addr, dati_scrittura, 2,
false);
783 while (I2CBdrv->GetStatus().busy);
785 dati_scrittura[0] = 3<<5;
786 I2CBdrv->MasterTransmit (addr, dati_scrittura, 2,
false);
787 while (I2CBdrv->GetStatus().busy);
794void Imposta_canale_del_trimmer_ennesimo_al_valore_I2CB (uint8_t numero_canale, uint8_t numero_trimmer, uint8_t valore_dato)
797 uint8_t dati_scrittura[2];
799 if(numero_canale == 0)
801 addr = I2C_addres_trimmer_bias_ch0;
803 if(numero_canale == 1)
805 addr = I2C_addres_trimmer_bias_ch1;
808 dati_scrittura[0] = numero_trimmer<<5;
809 dati_scrittura[1] = valore_dato;
811 I2CBdrv->MasterTransmit (addr, dati_scrittura, 2,
false);
812 while (I2CBdrv->GetStatus().busy);
819long int Arrotonda(
float temp)
821 long int valore_finale;
825 if(temp - (
long int) temp >=0.5)
827 valore_finale = (
long int) temp + 1;
831 valore_finale = (
long int) temp;
836 if(-(temp - (
long int) temp )>=0.5)
838 valore_finale = (
long int) temp - 1;
842 valore_finale = (
long int) temp;
879void Trova_valori_trimmer_per_offset_preamplificatore (
long int offset,
struct trimmer_type *Valori_per_i_trimmer,
int coarse_trimmer_step,
int fine_trimmer_step)
884 float temp = offset / coarse_trimmer_step;
885 Tr0 = Arrotonda(temp);
888 long int tensione_rimasta[1];
889 tensione_rimasta[0] = offset - coarse_Trimmer_offset_step * Tr0;
891 temp = tensione_rimasta[0] / fine_trimmer_step;
892 Tr1 = Arrotonda(temp);
894 Valori_per_i_trimmer->coarse_offset += Tr0;
895 if (Valori_per_i_trimmer->coarse_offset > 0xFF) Valori_per_i_trimmer->coarse_offset=0xFF;
896 if( Valori_per_i_trimmer->coarse_offset <0) Valori_per_i_trimmer->coarse_offset=0;
897 Valori_per_i_trimmer->fine_offset += Tr1;
898 if (Valori_per_i_trimmer->fine_offset > 0xFF) Valori_per_i_trimmer->fine_offset=0x80;
899 if(Valori_per_i_trimmer->fine_offset <0) Valori_per_i_trimmer->fine_offset=0x80;
909void Trova_valori_trimmer_per_deriva_termica_preamplificatore (
long int deriva, int16_t *Valori_per_i_trimmer)
912 float temp = deriva*2.7*256/5.1/2560*2;
913 long int x = Arrotonda(temp);
918 long int tensione_rimasta[1];
919 tensione_rimasta[0] = deriva - 5.1*2560/2*x/2.7/256;
921 temp = tensione_rimasta[0]*470*256/5.1/2560*2;
925 Valori_per_i_trimmer[0] = Tr0;
926 Valori_per_i_trimmer[1]= Tr1+128;
int32_t ADC_misura_differenziale_con_media_generico(uint8_t scheda_su_scheda_giu_, uint8_t preamplifier_externalADC_1_onboardADC_0, uint8_t nodo_da_misurare, uint8_t differenziale_1_single_0)
This function sets the original gain when a few LSb have to be determined. The umber of bits is bit_t...
volatile uint16_t ADC_medie_per_misura
the number of ADC readings to average, the maximum is 400
uint8_t tx_data[8]
Transmission data vector.
void PGA_GAIN_CROSS(uint8_t scheda_su_scheda_giu, uint8_t canale, uint8_t PGA_gain_to_set)
Here the 2 digital signals from the trimmer are exploited to set the gain of the input stage of the P...
uint8_t PGA_settled_gain[12]
PGA set gain.
#define Detector_trimmer_fine_bias_pos
#define Detector_trimmer_coarse_bias_pos
#define Detector_trimmer_fine_bias_neg
#define Detector_trimmer_coarse_bias_neg
#define Detector_scrivi_il_trimmer
void Error_imposta_la_istruzione(void)
Function to be located at the end of every instruction to mark the error, if any.
volatile uint32_t Error_bad_operation
exploited to mark the errors
void ERROR_codifica_errore(uint8_t scheda_su_scheda_giu, unsigned char error_addres, unsigned char code_to_shift, uint8_t reset_count_se_0)
If an error is found its flag is codified here.
@ I2C_error_trimmer_bias_0
trimmer_bias ch0
@ I2C_error_termometro_0
termometro ch0
@ error_address_I2C1_B
Error register B for I2C1
void I2C_mux_select_ch(uint8_t scheda_su_scheda_giu, uint8_t mainboard_postmainboard, uint8_t canale_da_abilitare)
The I2C mux.
#define I2C_mux_abilita_2
Enable channel 2.
#define I2C_mux_abilita_1
Enable channel 1.
#define I2C_mux_abilita_0
Enable channel 0.
@ node_voltage_PGA_ch_0
Node voltage selection of PGA differential or positive.
void EPROM_lettura_M24C32_64(uint8_t scheda_su_scheda_giu_, uint8_t mainboard_postmainboard, uint8_t canale, short indirizzo_memoria, uint8_t *dati_letti)
Read from preamplifier and on-board flashes.
void EPROM_scrittura_M24C32_64(uint8_t scheda_su_scheda_giu, uint8_t mainboard_postmainboard, uint8_t canale, short indirizzo_memoria, uint8_t *dati_da_scrivere)
Wriring the EEPROM.
@ Memory_mainboard_det_coa_slope_cali_ON_0_OFF_ff_ch0
slope detector positive trimmer active if zero
@ Memory_mainboard_det_positive_ad_coarse_trim_slope_bias_ch0
coarse slope for detector positive trimmer bias
@ Memory_mainboard_det_fin_slope_cali_ON_0_OFF_ff_ch0
slope detector negative trimmer active if zero
@ Memory_mainboard_det_positive_ad_fine_trim_slope_bias_ch0
fine slope for detector positive trimmer bias
@ Memory_mainboard_det_negative_ad_coarse_trim_slope_bias_ch0
coarse slope for detector negative trimmer bias
@ Memory_mainboard_det_negative_ad_fine_trim_slope_bias_ch0
fine slope for detector negative trimmer bias
@ Memory_detector_negative_address_coarse_trimmer_slope_bias
coarse slope for detector negative trimmer bias
@ Memory_preamplifier_slope_calibration_ON_0_OFF_ff
slope trimmer active if zero
@ Memory_detector_positive_address_coarse_trimmer_slope_bias
coarse slope for detector positive trimmer bias
@ Memory_detector_negative_address_fine_trimmer_slope_bias
fine slope for detector negative trimmer bias
@ Memory_detector_fine_slope_calibration_ON_0_OFF_ff
slope detector negative trimmer active if zero
@ Memory_detector_coarse_slope_calibration_ON_0_OFF_ff
slope detector positive trimmer active if zero
@ Memory_preamplifier_address_fine_trimmer_slope_offset
fine slope for trimmer offset
@ Memory_preamplifier_address_coarse_trimmer_slope_offset
coarse slope for trimmer offset
@ Memory_detector_positive_address_fine_trimmer_slope_bias
fine slope for detector positive trimmer bias
@ node_voltage_Analog_Mux_0_offset
Starting Offset for this set of nodes, 32.
#define preamplifier_scrivi_il_trimmer
void Aspetta_tanti_ms(int millisecondi)
The timing function.
void instr_DetBias_trimmer_calibration_function(void)
The fine and coarse trimmers for Detector bias adjustment are calibrated here
void instr_offset_trimmer_calibration_function(void)
The fine and coarse trimmers for offset adjustment are calibrated here
const struct address_detector_bias_trimmer_type address_preamplifier_trimmer[6]
Preamplifier trimmer addresses
const struct address_detector_bias_trimmer_type address_PGA_a_trimmer[6]
Preamplifier trimmer addresses
const struct address_detector_bias_trimmer_type address_detector_bias_trimmer[6]
Detector trimmer addresses.
uint8_t contenuto_trimmer_detector[12][4]
Content of the trimmer for detector bias system.
void detector_scrittura_lettura_trimmer_bias(uint8_t scheda_su_scheda_giu, uint8_t canale, uint8_t trimmer, uint8_t valore, uint8_t scrivi_1_leggi_0)
Setting the value of any trimmer for detector biasing, the contents of the trimmers are stored in the...
uint8_t volatile attenuatori_PGA_a_trimmer[12]
uint8_t volatile contenuto_trimmer_PGA_a_trimmer[6][4]
uint8_t volatile contenuto_trimmer_preamplifier[12][4]
void preamplifier_scrittura_lettura_trimmer(uint8_t scheda_su_scheda_giu, uint8_t canale, uint8_t trimmer, uint8_t valore, uint8_t scrivi_1_leggi_0)
Setting the value of any trimmer for preamplifier trimmer, the contents of the trimmers are stored in...
#define trimmer_fine_offset
#define trimmer_coarse_offset
#define I2C_address_ch_pari
#define I2C_address_ch_dispari
I2C address of the detecor trimmers.
#define maschera_solo_bit_di_scrittura_trimmer
Mask for command of the trimmer.
#define I2C_addres_trimmer_PGA
Coordinates for the preamplifier and onboard EPROMs.