/* значение напряжения, а затем преобразует результат в коды ASCII для */
/* вывода на экран */
/*---------------------------------------------------------------------*/
void ADC_convert(void) {
unsigned int sumadr;
unsigned int avg_bin_voltage;
unsigned int int_voltage;
unsigned int ones_int;
unsigned int tenths_int;
unsigned int hundreths_int;
char ones;
char tenths;
char hundreths;
ATDCTL5 = 0х06; /*4 преобразования в последовательности, канал 6*/
/* Ожидать завершения измерительной последовательности*/
while((ATDSTAT & 0х8000) != 0х8000) {
;
}
/* Вывести коды преобразования на экран для контроля */
printf("%x %x %х %х\n" , ADR0H, ADR1H, ADR2H, АDR3Н);
/* Взять среднее от 4 измерений для устранения шума*/
sumadr = ADR0H + ADR1H + ADR2H + ADR3H;
avg_bin_voltage = sumadr/4;
/*Преобразовать результат из двоичного кода к абсолютному значению,*/
/* умноженному на 100 D, получится число в диапазоне от 0 до 500 D*/
int_voltage = (100*avg_bin_voltage/255) * 5;
/*Выделить старший разряд результата и преобразовать в код ASCII */
/* Правило преобразования: десятичная цифра +48*/
ones_int = int_voltage/100;
ones = (char) (ones_int + 48);
/*Выделить второй разряд результата (десятые доли) и преобразовать в
код*/
/* ASCII */
tenths_int = (int_voltage ones_int*100)/10;
tenths = (char) (tenths_int + 48);
/*Выделить третий разряд результата (сотые доли) и преобразовать в
код*/
/* ASCII */
hundreths_int = (int_voltage ones_int*100 tenths_int*10) / 1;
hundreths = (char) (hundreths_int + 48);
/*Вывести значение измеренного напряжения на экран */
printf("%c.%c%cV\n", ones, tenths, hundreths);
}
/*-----------------------------------------------------------------------*/
/* Функция delay_100us формирует задержку в 100 мкс, частота тактирования*/
/* межмодульных магистралей МК составляет 8 МГц */
/*-----------------------------------------------------------------------*/
void delay_100us(void) {
int i;
for (i=0; i<50; i++) {
asm("nop");
}
}
/*------------------------------------------------------------------*/
/* Функция delay_5ms формирует задержку в 5мс, частота тактирования */
/* межмодульных магистралей МК составляет 8 МГц */
/*------------------------------------------------------------------*/
void delay_5ms(void) {
int i;
for (i=0; i<50; i++) {
delay_100us();
}
}
/*------------------------------------------------------------------*/
4.22.4. Обслуживание прерываний от модуля ATD