CodeVision AVR в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение ARV »

DataLife писал(а):Как это сделать?
когда не знаешь, как поступить - поступай естественно :)))

1. у вас обработчик прерываний, реализующий динамическую индикацию, занимается расчетами выводимых символов - это не естественно. избавьтесь от вычислений в прерывании всего того, что непосредственно не требуется для индкации. на форуме об этом сказано очень много, и я кое-что по этой теме могу предложить

2. другой обработчик таймера у вас обращается к функции опроса АЦП - это тоже не совсем естественно, т.к. вызов других функций из обработчика прерываний, да еще с достаточно длительным временем исполнения - это моветон. избавьтесь от лишних действий в обработчике прерываний. цель таймера отсчитать время? вот и отсчитывайте и сигнализируйте об этом в главный цикл.

3. самый простой способ выводить не часто, это сделать так:

Код: Выделить всё

while(1){
   result = get_adc();
   output_to_display(result);
   delay_ms(1000);
}
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Реклама
amd9800
Опытный кот
Сообщения: 822
Зарегистрирован: Вс июн 02, 2013 12:23:03

Re: CodeVision AVR в вопросах и ответах

Сообщение amd9800 »

ARV писал(а): 3. самый простой способ выводить не часто, это сделать так:

Код: Выделить всё

while(1){
   result = get_adc();
   output_to_display(result);
   delay_ms(1000);
}
Это очень страшный код :))
Реклама
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение ARV »

amd9800 писал(а):Это очень страшный код :))
глаза боятся, а МК работает :)))
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
DataLife
Вымогатель припоя
Сообщения: 601
Зарегистрирован: Пт фев 13, 2009 20:58:13
Откуда: Донецк

Re: CodeVision AVR в вопросах и ответах

Сообщение DataLife »

ARV писал(а):когда не знаешь, как поступить - поступай естественно :)))

3. самый простой способ выводить не часто, это сделать так:

Код: Выделить всё

while(1){
   result = get_adc();
   output_to_display(result);
   delay_ms(1000);
}
Большое спасибо за ответ. Всё учту, всё попробую, но тем не менее - по порядку.
Изучил ещё немного вариантов реализации динамической индикации. Нашёл программу, перебрал под свои нужны и вот... Не работает :))) Перечитал код в доль и поперёк, глаза устали... Тыкните меня носом, пожалуйста :dont_know: Для пояснения своих мыслей, по ходу программы есть сноски...
Спойлер#include <mega8.h>
#include <delay.h>

//Объявляем переменные

//------------------0-----1-----2-----3-----4-----5-----6-----7-----8------9----dp
char SEGMENTE[] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F, 0x80};

volatile unsigned int adc_data[4] = {0,0,0,0};
volatile unsigned char ADC_volt;


/** ФУНКЦИЯ ПРЕОБРАЗОВАНИЯ **/

void data_convert(unsigned char value)
{
unsigned char tmp; // переменная для временного хранения данных преобразования

tmp = value / 1000;
adc_data[0] = SEGMENTE[tmp];
tmp = value % 1000 / 100;
adc_data[1] = SEGMENTE[tmp];
tmp = value % 100 / 10;
adc_data[2] = SEGMENTE[tmp];
tmp = value % 10;
adc_data[3] = SEGMENTE[tmp];
}

void ind_update (void)
{
static unsigned char count = 0;
PORTD = 0x00; // гасим все разряды
PORTD = adc_data[count]; // выводим в порт код цифры
if (count == 0) PORTB |= (1<<0);
if (count == 1) PORTB |= (1<<1); // перечисляем выводимые разряды
if (count == 2) PORTB |= (1<<2);
if (count == 3) PORTB |= (1<<3);
count++; // включаем следующий разряд
if (count == 4) count = 0;
}


void ADC_result(void)
{
unsigned char adc_tmp;
ADCSRA = 0x8E; //0b10001110 - предделитель на 64, прерывания разрешены, ADC включён
ADMUX = 0x40; //0b01000000 - AVCC , ACD0, ADLAR off
ADCSRA |= 0x40; //начинаем измерение
while((ADCSRA & 0x10)==0); //Ждём флаг окончания измерения
ADCSRA |=0x10;
adc_tmp=ADCW;
ADC_volt=adc_tmp*4.88;
}

// Обработчик прерывания по переполнению таймера2
interrupt [TIM2_OVF] void timer2_ovf_isr(void)
{
ind_update();
}

void main(void)
{
PORTB=0x00;
DDRB|=(1<<0)|(1<<1)|(1<<2)|(1<<3); // настройка на выход. 4 разряда

PORTD=0x00;
DDRD=0xFF; // настройка на выход всего порта

TIMSK |= (1 << TOIE2); // разрешение прерывания по таймеру2
TCCR2 |= (1 << CS21); // предделитель таймера2 на 8


#asm ("sei") // глобально разрешаем прерывания.
while (1)
{
ADC_result();
data_convert(ADC_volt);
delay_ms(200);
}

}
Как по-мне - должно работать, но, увы ... Если раньше индикатор выводил хоть что-то, то сейчас просто молчит :?
Последний раз редактировалось DataLife Сб авг 02, 2014 12:25:03, всего редактировалось 1 раз.
Только те, кто предпринимают абсурдные попытки, смогут достичь невозможного.
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение WiseLord »

Не должно оно работать. Что-то, возможно, и будет выводиться, но не то что планировалось.

Навскидку, не сильно вникая в код:

а) void data_convert() - делает не пойми что, но только не разбиение числа на цифры.

б) ADC_volt=adc_tmp*4.88; - это просто странно - умножать 8-битные числа на double. Погрешности будут большие. Да и каков смысл? Почему именно 4,88?

в) ADCW - это для меня что-то непонятное. Возможно, какая-то очередная неудачная примочка CodeVision, возвращающая 16-битный результат измерения. Хотя вообще-то результат (10-битный) хранится в двух регистрах, ADCH и ADCL, причём первым нужно вычитывать именно ADCL. А присваивать 16-битный ADCW (если это то, что я думаю) 8-битной переменной adc_tmp - это явно неправильно. Если так уж не нужна точность измерения - выравнивайте результат вправо (ADLAR) и читайте ADCH.

P.S. В архиве я приложил небольшой свой проектик электронного вольтметра (для автомобиля). Там почти всё что надо - и измерение напряжение с помощью АЦП ATmega8, и вывод на трёхпозиционный светодиодный семисегментник. Применена маленькая хитрость - напряжению 25.5В соответствует максимальное значение ADCH=255 (используется подстроечник со входа на вход АЦП, делящий входные 25.5В к уровню внутреннего опорного 2.7В.) Поэтому выводить число - очень просто, только точку деятичную в 1-м разряде не забыть поставить.
Вложения
voltmeter.zip
(2.96 КБ) 169 скачиваний
Реклама
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: CodeVision AVR в вопросах и ответах

Сообщение oleg110592 »

ADCW - это для меня что-то непонятное. Возможно, какая-то очередная неудачная примочка CodeVision
в IAR AVR та же примочка, после компиляции return ADC; такой листинг:
LDS R16, _A_ADC
LDS R17, (_A_ADC + 1)
RET
вполне удобно
4.88 получается при vref = 5V: 5000/1024=4.8828125
в меге8 флэша много можно и double применить, хотя тут все легко с целыми числами делается 
Реклама
amd9800
Опытный кот
Сообщения: 822
Зарегистрирован: Вс июн 02, 2013 12:23:03

Re: CodeVision AVR в вопросах и ответах

Сообщение amd9800 »

Подскажите пож. что это такое Bit Variables Size.
Неужели это размер битовой переменной?

Изображение
Вложения
bitvariablesize.JPG
(61.75 КБ) 845 скачиваний
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: CodeVision AVR в вопросах и ответах

Сообщение oleg110592 »

в Codevision есть нестандартный тип переменных - bit, там задано что их может быть 24
в более "свежих" микроконтроллерах AVR для этого можно использовать регистры GPIOR - их три штуки, значит будет 32-е битовых переменных
Аватара пользователя
DataLife
Вымогатель припоя
Сообщения: 601
Зарегистрирован: Пт фев 13, 2009 20:58:13
Откуда: Донецк

Re: CodeVision AVR в вопросах и ответах

Сообщение DataLife »

WiseLord писал(а):а) void data_convert() - делает не пойми что, но только не разбиение числа на цифры.
Немного подправил расчёт, но всё же.
А как по мне, всё очень даже логично тут. Для примера, представим, что расчёт напряжения у нас вышел 1263 (или же 12,63В. Именно так задумано, без точки): во временную переменную tmp записываем значение деления на 1000 ADC_res (оно же value), итого tmp=1; переменной adc_data[0] присваиваем значение переменной из массива SEGMENTE[1].
Далее те же пляски с бубном: берём остаток при делении на 1000 (это выходит 263) и делим целочисленно на 100, итого tmp=2; Присваиваем значение переменной из массива SEGMENTE[2] переменной adc_data[1] ... Ну, и так далее.

PS. код подправил, да именно с разбивкой на цифры немного кракозябра была. Сейчас правильно:
Спойлер/** ФУНКЦИЯ ПРЕОБРАЗОВАНИЯ **/

void data_convert(unsigned int value)
{
unsigned char tmp; // переменная для временного хранения данных преобразования

tmp = value / 1000;
adc_data[0] = SEGMENTE[tmp];
tmp = value % 1000 / 100;
adc_data[1] = SEGMENTE[tmp];
tmp = value % 100 / 10;
adc_data[2] = SEGMENTE[tmp];
tmp = value % 10;
adc_data[3] = SEGMENTE[tmp];
}

WiseLord писал(а): б) ADC_volt=adc_tmp*4.88; - это просто странно - умножать 8-битные числа на double. Погрешности будут большие. Да и каков смысл? Почему именно 4,88?
Всё очень просто. Расчёт напряжения идёт исходя из 5v максимум (не смотрите, что выше я привёл пример для 12,63 Вольт). Выходит, что цена одной единицы измерения АЦП будет равна 5/1023 = 0,004887585. Однако, для того, чтобы нормально рассчитать вывод значения на индикатор - мне нужно умножить это значение на 1000 (точность до сотых, перед точкой 2 целых). Отсюда и вышло 4,88
WiseLord писал(а): в) ADCW - это для меня что-то непонятное. Возможно, какая-то очередная неудачная примочка CodeVision, возвращающая 16-битный результат измерения. Хотя вообще-то результат (10-битный) хранится в двух регистрах, ADCH и ADCL, причём первым нужно вычитывать именно ADCL. А присваивать 16-битный ADCW (если это то, что я думаю) 8-битной переменной adc_tmp - это явно неправильно. Если так уж не нужна точность измерения - выравнивайте результат вправо (ADLAR) и читайте ADCH.
По этому поводу уже ответили. ADCW - 10-битное значение ADC. По поводу переменных, спасибо. Тут я тоже напортачил, подправил char на int в необходимых местах...

Тем не менее. даже после моих переделок, программа не завелась... :dont_know:
Спойлер#include <mega8.h>
#include <delay.h>

//Объявляем переменные

//------------------0-----1-----2-----3-----4-----5-----6-----7-----8------9----dp
char SEGMENTE[] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F, 0x80};

volatile unsigned int adc_data[4] = {0,0,0,0};
volatile unsigned int ADC_volt;


/** ФУНКЦИЯ ПРЕОБРАЗОВАНИЯ **/

void data_convert(unsigned int value)
{
unsigned char tmp; // переменная для временного хранения данных преобразования

tmp = value / 1000;
adc_data[0] = SEGMENTE[tmp];
tmp = value % 1000 / 100;
adc_data[1] = SEGMENTE[tmp];
tmp = value % 100 / 10;
adc_data[2] = SEGMENTE[tmp];
tmp = value % 10;
adc_data[3] = SEGMENTE[tmp];
}

void ind_update (void)
{
static unsigned char count = 0;
PORTD = 0x00; // гасим все разряды
PORTD = adc_data[count]; // выводим в порт код цифры
if (count == 0) PORTB |= (1<<0);
if (count == 1) PORTB |= (1<<1); // перечисляем выводимые разряды
if (count == 2) PORTB |= (1<<2);
if (count == 3) PORTB |= (1<<3);
count++; // включаем следующий разряд
if (count == 4) count = 0;
}


void ADC_result(void)
{
unsigned int adc_tmp;

ADCSRA |= 0x40; //начинаем измерение
while((ADCSRA & 0x10)==0); //Ждём флаг окончания измерения
ADCSRA |=0x10;
adc_tmp=ADCW;
ADC_volt=adc_tmp*4.88;
}

// Обработчик прерывания по переполнению таймера2
interrupt [TIM2_OVF] void timer2_ovf_isr(void)
{
ind_update();
}

void main(void)
{
PORTB=0x00;
DDRB|=(1<<0)|(1<<1)|(1<<2)|(1<<3); // настройка на выход. 4 разряда

PORTD=0x00;
DDRD=0xFF; // настройка на выход всего порта

ADCSRA = 0x8E; //0b10001110 - предделитель на 64, прерывания разрешены, ADC включён
ADMUX = 0x40; //0b01000000 - AVCC , ACD0, ADLAR off

TIMSK |= (1 << TOIE2); // разрешение прерывания по таймеру2
TCCR2 |= (1 << CS21); // предделитель таймера2 на 8


#asm ("sei") // глобально разрешаем прерывания.
while (1)
{
ADC_result();
data_convert(ADC_volt);
delay_ms(200);
}

}
Только те, кто предпринимают абсурдные попытки, смогут достичь невозможного.
amd9800
Опытный кот
Сообщения: 822
Зарегистрирован: Вс июн 02, 2013 12:23:03

Re: CodeVision AVR в вопросах и ответах

Сообщение amd9800 »

oleg110592 писал(а):регистры GPIOR - их три штуки, значит будет 32-е битовых переменных
три штуки это значит?
GPIOR0
GPIOR1
GPIOR2

И раз вы говорите 32 битовых переменных значит один из них 16 битный?

А как привязывать их к битовым переменным?
bit True=1;
bit False=0;

где тут указать что они привязаны к такому регистру?
Аватара пользователя
Pink-Pank
Опытный кот
Сообщения: 721
Зарегистрирован: Ср июн 11, 2014 09:43:13
Откуда: США
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение Pink-Pank »

8-битные все. обшибся просто человек. Смотрите Даташит на свой кристалл - у Вас вообще ни одного может не быть. И не обязательно, что Code Vision использует именно эти регистры. Он может просто пользовать несколько байт ОЗУ для хранения битовых переменных.
А как привязывать их к битовым переменным?
Так, как Вы и записали. Объявляете переменную типа бит - она автоматически распределяется в адресном пространстве. Названия True и False лучше не использовать, так как они сходны с зарезервированными словами true и false - можете ошибиться.
где тут указать что они привязаны к такому регистру?
А вот это Вам вообще не зачем - компилятор сам все распределит.
Fucking static initialization order fiasco
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: CodeVision AVR в вопросах и ответах

Сообщение oleg110592 »

не ошибся - переменные однобитные, могут быть или 0 или 1 другого не дано
например
bit FLAG0;
FLAG0=1; //значит нулевой бит регистра GPIOR0 равен 1, все равно что написать GPIOR0.0=1
FLAG0=0; //значит нулевой бит регистра GPIOR0 равен 0, все равно что написать GPIOR0.0=0

для DataLife програмку покурочил для общего катода, в протеусе работает:
Спойлер

Код: Выделить всё

#include <mega8.h>
#include <delay.h>

//------------------0-----1-----2-----3-----4-----5-----6-----7-----8------9----dp
unsigned char SEGMENTE[] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F, 0x80};

unsigned int adc_data[4] = {0,0,0,0};
unsigned char count = 0;

// Voltage Reference: AVCC pin
#define ADC_VREF_TYPE ((0<<REFS1) | (1<<REFS0) | (0<<ADLAR))

void data_convert(unsigned int value)
{
    adc_data[0] = SEGMENTE[value%10];
    value /= 10;
    adc_data[1] = SEGMENTE[value%10];
    value /= 10;
    adc_data[2] = SEGMENTE[value%10];
    value /= 10;
    adc_data[3] = SEGMENTE[value%10];
}

// Read the AD conversion result
unsigned int read_adc(unsigned char adc_input)
{
    ADMUX=adc_input | ADC_VREF_TYPE;
    // Delay needed for the stabilization of the ADC input voltage
    delay_us(10);
    // Start the AD conversion
    ADCSRA|=(1<<ADSC);
    // Wait for the AD conversion to complete
    while ((ADCSRA & (1<<ADIF))==0);
    ADCSRA|=(1<<ADIF);
    return ADCW;
}

// Обработчик прерывания по переполнению таймера2
interrupt [TIM2_OVF] void timer2_ovf_isr(void)
{
    PORTB |= ((1<<3)|(1<<2)|(1<<1)|(1<<0)); // гасим все разряды
    PORTD = adc_data[count]; // выводим в порт код цифры
    if (count == 0) PORTB &= ~(1<<0);
    if (count == 1) PORTB &= ~(1<<1); // перечисляем выводимые разряды
    if (count == 2) PORTB &= ~(1<<2);
    if (count == 3) PORTB &= ~(1<<3);
    if (++count == 4) count = 0;
}

void main(void)
{
PORTB=0x00;
DDRB|=(1<<0)|(1<<1)|(1<<2)|(1<<3); // настройка на выход. 4 разряда

PORTD=0x00;
DDRD=0xFF; // настройка на выход всего порта

// Analog Comparator initialization
// Analog Comparator: Off
ACSR=(1<<ACD) | (0<<ACBG) | (0<<ACO) | (0<<ACI) | (0<<ACIE) | (0<<ACIC) | (0<<ACIS1) | (0<<ACIS0);

// ADC initialization
ADMUX=ADC_VREF_TYPE;
ADCSRA=(1<<ADEN) | (0<<ADSC) | (0<<ADFR) | (0<<ADIF) | (0<<ADIE) | (1<<ADPS2) | (1<<ADPS1) | (0<<ADPS0);
SFIOR=(0<<ACME);

TIMSK |= (1 << TOIE2); // разрешение прерывания по таймеру2
TCCR2 |= (1 << CS21); // предделитель таймера2 на 8

#asm ("sei") // глобально разрешаем прерывания.
    while (1)
    {
        data_convert(read_adc(0)*4.88);
        delay_ms(200);
    }
}
Аватара пользователя
Pink-Pank
Опытный кот
Сообщения: 721
Зарегистрирован: Ср июн 11, 2014 09:43:13
Откуда: США
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение Pink-Pank »

не ошибся
я про 3 регистра * 8 бит = 32 бита. ;)
Fucking static initialization order fiasco
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: CodeVision AVR в вопросах и ответах

Сообщение oleg110592 »

так вроде и написал
для этого можно использовать регистры GPIOR - их три штуки, значит будет 32-е битовых переменных
32-е = тридцать две
для сомневающихся листинг:
Спойлер

Код: Выделить всё

// Declare your global variables here
bit FLAG0;
bit FLAG1;

; 0000 009B while (1)
_0x3:
; 0000 009C       {
; 0000 009D         FLAG0=1;
	SBI  0x1E,0
; 0000 009E         FLAG0=0;
	CBI  0x1E,0
; 0000 009F         FLAG1=1;
	SBI  0x1E,1
; 0000 00A0         FLAG1=0;
	CBI  0x1E,1
; 0000 00A1         GPIOR0.0=1;
	SBI  0x1E,0
; 0000 00A2         GPIOR0.0=0;
	CBI  0x1E,0
; 0000 00A3       }
	RJMP _0x3
; 0000 00A4 }
Последний раз редактировалось oleg110592 Сб авг 02, 2014 14:45:35, всего редактировалось 1 раз.
Аватара пользователя
Pink-Pank
Опытный кот
Сообщения: 721
Зарегистрирован: Ср июн 11, 2014 09:43:13
Откуда: США
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение Pink-Pank »

3*8=24
Fucking static initialization order fiasco
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: CodeVision AVR в вопросах и ответах

Сообщение oleg110592 »

а да ошибся, сейчас с стм32 работаю - там регистры или 16 бит или 32
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение WiseLord »

DataLife писал(а): while((ADCSRA & 0x10)==0); //Ждём флаг окончания измерения
ADCSRA |=0x10;
Тут как-то мутно.

Ждёте, пока не наступит прерывание, которое вроде бы, да, разрешили при инициализации ADC. Цикл крутится, возникает прерывание (0x10), а потом Вы вместо того, чтобы в обработчике (отсутствующем) этого прерывания что-то сделать, ещё раз делаете этот бит (ADIF) единицей (0x10), и на этом всё. Так этот флаг, похоже, и висит вечно, т.к. обработчика прерывания, в котором бы он сбросился, не существует в природе.

Лучше избавиться от этого прерывания, а ждать окончания измерений проще как-то так:

Код: Выделить всё

ADCSRA |= 0x40; //начинаем измерение
while((ADCSRA & 0x40)); // Ждём, пока измерение в процессе
// Выполняем что надо.
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: CodeVision AVR в вопросах и ответах

Сообщение oleg110592 »

Это визард codevision так генерит, выше я привел рабочий код - где codevision v3 так нагенерил:

Код: Выделить всё

   // Wait for the AD conversion to complete
    while ((ADCSRA & (1<<ADIF))==0);
    ADCSRA|=(1<<ADIF);
    return ADCW;
нормально работает, а что в исходном варианте прерывания от ацп разрешены а обработчика нет это не правильно
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение WiseLord »

Всё равно код странный. Висим в цикле, пока бит равен 0. Когда бит становится равен 1 - выходим из цикла... и зачем-то ставим этот бит в 1. В чём великий смысл этого действия? Очередной баг поделия под названием CodeVision?
Аватара пользователя
Pink-Pank
Опытный кот
Сообщения: 721
Зарегистрирован: Ср июн 11, 2014 09:43:13
Откуда: США
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение Pink-Pank »

Это для одиночных измерений. Следующая установка этого бита в 1-цу - его сброс (флага окончания преобразования). Читать даташит нужно, а не пытаться умничать не обладая для этого соответствующими знаниями.
Последний раз редактировалось Pink-Pank Сб авг 02, 2014 19:34:34, всего редактировалось 1 раз.
Fucking static initialization order fiasco
Ответить

Вернуться в «AVR»