monos писал(а):
Может есть пример на си...
Код:
while(1){
temp_V_os_PWR = Get_V_os_PWR();
if(count_V_os > 0){
count_V_os--;
summ_V_os_PWR += temp_V_os_PWR;
}
else {
summ_V_os_PWR = summ_V_os_PWR / 20;
temp_V_os_PWR = (U8) ((U16) summ_V_os_PWR);
count_V_os = 20;
}
//это в main
//в прерывании:
#pragma vector = ADC_vect
__interrupt void ADC_interrupt(void);
__interrupt void ADC_interrupt(void){
unsigned char temp_adc_result = 0;
temp_adc_result = ((unsigned char)(ADCH));
if( temp_adc_result >0xf0) temp_adc_result =0xfc;
switch (gv_adc_state) {
gv_Vcc_tst = (unsigned char) ( ( (unsigned int)((unsigned char)(temp_adc_result) + (unsigned char)( gv_Vcc_tst)) ) >> 1 );//среднее с предыдущим
gv_adc_state = V_os_PWR_CONV;
Start_conv_channel(V_os_PWR_CHANNEL);
break;
case V_os_PWR_CONV :
gv_V_os_PWR = (unsigned char) ( ( (unsigned int)((unsigned char )(temp_adc_result) + (unsigned char)(gv_V_os_PWR)) ) >> 1 );
gv_adc_state = middleCurrent1_CONV ;
Start_conv_channel(V_middleCurrent1_CHANNEL);
break;
примерно так.
дальше заряжаем DAC скоммутированный внутри на вход компаратора и он с этой опрой живет до следующего раза/
! текст выдернут фрагментарно, для примера
вот прерывание для получения фактической ширины импулься, которы йполучился от внешнего воздействия ОС по току.
#pragma vector = PSC0_CAPT_vect
__interrupt void PSC0_capture_event_interrupt(void);
__interrupt void PSC0_capture_event_interrupt(void){
Disable_psc0_external_event_a_interrupt() ;
InputCaptureRegister_LO_0 =PICR0L;
}