лег спать в 2 часа тут было пусот. встал - полно.
не серчайте, если чего не понял в лет. я с просонок смотрю ваш текст и пытаюсь вьехать..
nomos , Си он и в африке Си. действительно, применяя доплнительное прерывание во время обработки предыдущего можно наскочить. он их конечно в конвеер организует. ничего страшного, когда знаешь, что делать. но как-то настораживает. т.к. макросов и директив предпроцессора не видишь. ну да бог с ним. наверное знаете то делать.
у меня несколько другое пожелание, что-ли...
делать длИнные обработчики прерываний, ну как-то не очень красиво, что ли...
таймер разделили на ТИКИ - это в приципе хорошо.
Код:
count_r++; //
if (count_r == 12) count_r=0; //
тут навреное коррктнее так:
if(++ count_r > 11) {}мало ли чего.
----
Вы выводите, как я понял по SPI в 595 8 битовый . беря маску с массива. т.е. разрядность и т.д. Вам до лампочки. теперь смотрите...
скорость вывода и количество сегментов соотносятся так, что Вы успеете вывести несколько тысяь раз. а на выходе защелки..
более того, этому регистру похрен clock как таковой были бы фронты и чтоб они соотносились по времени с др. т.е. всё весьма относительно . с любой частотой и пр. простая ж логика.
куда торопитесть? индикация статическая. т.е. в прерывании этого можно было не делать. достаточно позвать функцию в любом другом месте.
у меня в одном из вариантов, как всегда надо было быстро..
Код:
for( bN =0; bN <15; bN++)
{ _WDR();
switch (insr)
{
case 0:
OuByte = decode_znac[ Inp_string[bN]-0x30];
break;
case 1:
OuByte = decode_znac[ Inp_string1[bN]-0x30];
break;
case 2:
OuByte = decode_znac[ Inp_string2[bN]-0x30];
break;
case 3:
OuByte = decode_znac[ Inp_string3[bN]-0x30];
break;
case 4:
OuByte = decode_znac[ Inp_string4[bN]-0x30];
break;
}
//OuByte = decode_znac[ Inp_string[bN]-0x30];
for( btN =0; btN < 8; btN++) //биты выталкиваем младшим вперед
{ //т.к. массив перекодировки в прямом коде, а индикатор с ОА
// то выводить надо инверсно. еденицу - нулем.
if ((OuByte & Bit( btN ) ) != 0) Clr_DS(); //Set_DS();
else Set_DS(); //Clr_DS();
Strobicus(); // стробируем бит
_WDR();
}
}
Clr_Clock() ; Clr_DS(); //успокоимся
//ну и теперь переносим в выходные триггера то чего натолкали в эту колбасу из 15ти регистров
storage_register_clock_input(); //вывели. ужаснулись.
}
это делается, когда совсем уже делать нечего. заметте, 15*8 сегментов.
тут ещё кусочек вывода на ЖКИ рядом со своей таблицей перекодировки . кириллица ж де попало.
так вот , зовется вся эта ерунда, когда таймер время нащелкает
это в таймере.
if( clock_count > 0 )clock_count--;т.е. спешить точно некуда. и возиться с SPI особого смысла нет.
ну это мое мнение.
не знаю , как работает АЦПатор, но не увидел компенсации плавающего разряда.
мож не по глазам
у меня так.
фрагмент. (комментарии переносятся крякозябушками, ну и так понятно)
Код:
interrupt void ADC_interrupt(void){
U8 temp_adc_result = 0;
temp_adc_result = Adc_get_8_bits_result();
if( temp_adc_result >0xf0) temp_adc_result =0xf0;
switch (gv_adc_state) {
case Vcc_tst_CONV:
gv_Vcc_tst = (U8) ( ( (U16)((U8)(temp_adc_result) + (U8)( 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 = (U8) ( ( (U16)((U8)(temp_adc_result) + (U8)(gv_V_os_PWR)) ) >> 1 );
gv_adc_state = middleCurrent_0_CONV ;
Start_conv_channel(V_middleCurrent_0_CHANNEL);
break;
case middleCurrent_0_CONV: // middleCurrent 1 canal
gv__middleCurrent_0 = (U8) ( ( (U16)((U8)(temp_adc_result) + (U8)( gv__middleCurrent_0)) ) >> 1 );
gv_adc_state = middleCurrent_1_CONV ;
Start_conv_channel(V_middleCurrent_1_CHANNEL); //0x0A
break;
case middleCurrent_1_CONV: // middleCurrent 2 c
gv__middleCurrent_1 = (U8) (((U16)((U8)(temp_adc_result)+(U8)( gv__middleCurrent_1))) >>1);
gv_adc_state = SetUrovenUI_CONV ;
Start_conv_channel(V_SetUrovenUI_CHANNEL); //0x08
break;
case SetUrovenUI_CONV: // U ser R user
gv_V_SetUrovenUI = (U8) (((U16)((U8)(temp_adc_result)+(U8)( gv_V_SetUrovenUI))) >>1);
gv_adc_state = V_os_PWR_CONV;
Start_conv_channel(V_os_PWR_CHANNEL);
break;
default:
.......
break;
}
т.е. усреднение тут
gv_V_os_PWR = (U8) ( ( (U16)((U8)(temp_adc_result) + (U8)(gv_V_os_PWR)) ) >> 1 );
вот это вызвало сомнение в действенности
GODONE=1;//çàï
while (GODONE);//æä
setIfors = ADRESH;
}
т.к. читать, как работает ШИМ нет охоты. пора тело завтраком кормить.
то по шиму ничего гавкнуть (мавкнуть, пардон, не могу)
=====
сухой остаток.
может лучше клоки формировать независимые. а в майн асинхронно звать кого надо. прерывания на что нить сгодятся и так.
пример писать сейчас не буду. есть хочу.