CodeVision AVR в вопросах и ответах
- ibiza11
- Поставщик валерьянки для Кота
- Сообщения: 1900
- Зарегистрирован: Сб фев 21, 2009 13:11:40
- Откуда: Москва
Re: CodeVision AVR в вопросах и ответах
Если вопрос озвученный ТС прозвучал для Вас именно так и не вызвал никаких подозрений по поводу его корректности, то пожалуй это лишь Ваше мнение и меня прошу не впутывать в это. Я задал уточняющий вопрос ТС и хотел бы получить именно его коментарий по этому поводу, в том числе и по поводу уместности моих рассуждений.
Ставим плюсы: )
Re: CodeVision AVR в вопросах и ответах
День добрый, подскажите плз, в чем косяк, в трех соснах запутался
Есть АЦП, с шумоподавлением, если запускаем преобразование вызывая ф-цию read_adc(0) - выдает значение напряжения с выводом в UART как положено. А вот если используем getchar, то по нажатию клавишы "а" вместо результата выдает какую-то чепуху а не значения напряжения.
Т.е. сам по себе кусок программы
работает, а в цикле с getchar и case нет.
Цикл с getchar и case сам по себе тоже чудесно работает.
А если делаю задержку в 80мС после printf("\rCase1 \r"), то по нажатию "а" выводит как положено.
Почему без задержки не работает?
Есть АЦП, с шумоподавлением, если запускаем преобразование вызывая ф-цию read_adc(0) - выдает значение напряжения с выводом в UART как положено. А вот если используем getchar, то по нажатию клавишы "а" вместо результата выдает какую-то чепуху а не значения напряжения.
Т.е. сам по себе кусок программы
Код: Выделить всё
x=read_adc(0);
PORTB=x;
adc_data_dec = (ADCL|ADCH<<8);
i = adc_data_dec*2.56; // пересчет значения 12-тибитной величины
printf("\rResult = %d \r", x);
delay_ms(200); работает, а в цикле с getchar и case нет.
Код: Выделить всё
while (1)
{
y=getchar();
switch (y)
{
case 'a': printf("\rCase1 \r");
//delay_ms(80);
x=read_adc(0);
PORTB=x;
adc_data_dec = (ADCL|ADCH<<8);
i = adc_data_dec*2.56; // пересчет значения 12-тибитной величины
printf("\rResult = %d \r", i);
break;
case 'b': printf("\rCase2 \r");
break;
default: printf("\rError \r");
break;
};
};
}А если делаю задержку в 80мС после printf("\rCase1 \r"), то по нажатию "а" выводит как положено.
Код: Выделить всё
while (1)
{
y=getchar();
switch (y)
{
case 'a': printf("\rCase1 \r");
delay_ms(80);
x=read_adc(0);
PORTB=x;
adc_data_dec = (ADCL|ADCH<<8);
i = adc_data_dec*2.56; // пересчет значения 12-тибитной величины
printf("\rResult = %d \r", i);
break;
case 'b': printf("\rCase2 \r");
break;
default: printf("\rError \r");
break;
};
};
}Почему без задержки не работает?
Последний раз редактировалось v000va Сб фев 04, 2012 01:27:42, всего редактировалось 1 раз.
-
demiurg301
- Опытный кот
- Сообщения: 812
- Зарегистрирован: Ср мар 18, 2009 21:14:33
Re: CodeVision AVR в вопросах и ответах
А накой вам и прерывание и getchar в одном флаконе. Вы уж определитесь 
Re: CodeVision AVR в вопросах и ответах
demiurg301 писал(а):А накой вам и прерывание и getchar в одном флаконе. Вы уж определитесь
В смысле?
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
vOOOva,я не понял,а зачем вы вызываете функцию,а потом делаете то же самое,что в этой функции только что сделали?
В поисках истины человек развивается.
Re: CodeVision AVR в вопросах и ответах
можна ли при открытии чужого проэкта открыть вот эти закладки, чтобы посмотреть какие настройки автор делал при создании проэкта ?
- Вложения
-
- 5676777777777777777.jpg
- (54.31 КБ) 367 скачиваний
Tell Me The Truth
Re: CodeVision AVR в вопросах и ответах
Смысла нет. Поскольку это не настройки проекта, а программа-мастер, которая автоматически создаёт текст программы на C, на основании того, какие галки и где в этом мастере расставил...
Настройки проекта в другом месте.
Настройки проекта в другом месте.
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
можна ли при открытии чужого проэкта открыть вот эти закладки
нет нельзя,но можно внимательно почитать комментарии к коду,если автор этим пользовался и не стер их.генератор кода создает подробные комментарии о настройке портов и другой перифериий
В поисках истины человек развивается.
Re: CodeVision AVR в вопросах и ответах
а как узнать напремер насколько в проге выставлен регистр совпадения ?
Tell Me The Truth
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Читать документ про ваш камень.Вообще ищем OCR1A/B
The Timer/Counter (TCNT1), Output Compare Registers (OCR1A/B), and Input Capture Regis-
ter (ICR1) are all 16-bit registers. Special procedures must be followed when accessing the 16-
bit registers. These procedures are described in the section “Accessing 16-bit Registers” on
page 79. The Timer/Counter Control Registers (TCCR1A/B) are 8-bit registers and have no CPU
access restrictions. Interrupt requests (abbreviated to Int.Req. in the figure) signals are all visible
in the Timer Interrupt Flag Register (TIFR). All interrupts are individually masked with the Timer
Interrupt Mask Register (TIMSK). TIFR and TIMSK are not shown in the figure since these regis-
ters are shared by other timer units.
В поисках истины человек развивается.
Re: CodeVision AVR в вопросах и ответах
vitalik_1984 писал(а):vOOOva,я не понял,а зачем вы вызываете функцию,а потом делаете то же самое,что в этой функции только что сделали?
Я что-то туплю, ткните меня, в чем прикол?
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Ой,простите не так посмотрел.
А что делает ваша функция read_adc(0)?
читает состояние ноги 0?
и зачем вы присваиваете значение функции порту?
А что делает ваша функция read_adc(0)?
читает состояние ноги 0?
и зачем вы присваиваете значение функции порту?
В поисках истины человек развивается.
-
demiurg301
- Опытный кот
- Сообщения: 812
- Зарегистрирован: Ср мар 18, 2009 21:14:33
Re: CodeVision AVR в вопросах и ответах
v000va писал(а):В смысле?
Зачем вам и прерывание по приёму байта и getchar? Это чо за изврат?
А если делаю задержку в 80мС после printf("\rCase1 \r"), то по нажатию "а" выводит как положено.
А скорость порта какая? Вы там случаем для АЦП "noice cancel" не включили?
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
demiurg301 писал(а):Зачем вам и прерывание по приёму байта и getchar? Это чо за изврат?
чего то я не увидел где тут прерывание по приему байта...
demiurg301 писал(а):А скорость порта какая? Вы там случаем для АЦП "noice cancel" не включили?
Так ведь пауза то у него стоит внутри switch (y), то есть уже после приема байта сюда попадаем.
А про get_char действительно лишнее каждый раз этой функцией пользоваться.
В поисках истины человек развивается.
-
demiurg301
- Опытный кот
- Сообщения: 812
- Зарегистрирован: Ср мар 18, 2009 21:14:33
Re: CodeVision AVR в вопросах и ответах
vitalik_1984 писал(а):чего то я не увидел где тут прерывание по приему байта...
Там сверху писал, что у него прерывание по RX - потом отредактировал - а я не посмотрел.
vitalik_1984 писал(а):Так ведь пауза то у него стоит внутри switch (y), то есть уже после приема байта сюда попадаем.
А про get_char действительно лишнее каждый раз этой функцией пользоваться.
Там вообще не понятно "чего НЕ ТАК "
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
demiurg301 писал(а):Там вообще не понятно "чего НЕ ТАК "
да тут всё не так !
Разберем смысл представленного алгоритма
Код: Выделить всё
x=read_adc(0);// прочитали функцией read_adc,присвоили значение переменной х
PORTB=x;// ЗАЧЕМ ТО присвоили ПОРТУ значение переменной х
adc_data_dec = (ADCL|ADCH<<8);// считываем в переменную adc_data_dec данные регистров АЦП
//А нельзя было просто adc_data использовать, которую CVAVR уже для этого применения создал?!!
i = adc_data_dec*2.56; // (пересчет значения 12-тибитной величины) зачем? все равно не используем
printf("\rResult = %d \r", x); //выводим результат ПЕРЕМЕННОЙ Х!!!! зачем??
delay_ms(200); //ну тут понятноэто первый кусок
Предлагаю эту кашу заменить на другой код
Код: Выделить всё
adc_data=read_adc(0);
adc_data*=2.56;
printf("\rResult = %d \r", adc_data);
А в цикле с char уже другая история.
Код: Выделить всё
printf("\rResult = %d \r", i); //выводим результат преременной i!Зачем тогда сначала считали в переменную х?
vitalik_1984 писал(а):vOOOva,я не понял,а зачем вы вызываете функцию,а потом делаете то же самое,что в этой функции только что сделали?
Получается правильно спросил
Для справки
Код: Выделить всё
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
// Delay needed for the stabilization of the ADC input voltage
delay_us(10);
// Start the AD conversion
ADCSRA|=0x40;
// Wait for the AD conversion to complete
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCW;
}то есть функция read_adc уже делает то, что вы пытаетесь своим
Код: Выделить всё
adc_data_dec = (ADCL|ADCH<<8);По гет_чар могу предложить использовать прерывание,а за ним делать уже чтение и вывод на дисплей.
v000va,Скажите что вы пытаетесь вообще сделать своим чтением через нажатие клавиши?
Что должен делать прибор в то время, когда ничего не приходит?
В поисках истины человек развивается.
- totty
- Первый раз сказал Мяу!
- Сообщения: 39
- Зарегистрирован: Ср авг 03, 2011 22:26:02
- Откуда: Севастополь
Re: CodeVision AVR в вопросах и ответах
Подскажите пожалуйста, имеется мк tiny2313, в нем 2 таймера, один 8 бит, второй 16.
что требуется:
16-битный работает как источник тактового сигнала для 8-битного таймера с возможностью регулировки частоты, т е частота в очень широком пределе будет меняться програмно, так вот, как мне подключить его к 8-битному?
это можно както сделать програмно или нужно вывести наружу и подать на какуюто ногу? если да то на какую?
заранее спасибо
что требуется:
16-битный работает как источник тактового сигнала для 8-битного таймера с возможностью регулировки частоты, т е частота в очень широком пределе будет меняться програмно, так вот, как мне подключить его к 8-битному?
это можно както сделать програмно или нужно вывести наружу и подать на какуюто ногу? если да то на какую?
заранее спасибо
- totty
- Первый раз сказал Мяу!
- Сообщения: 39
- Зарегистрирован: Ср авг 03, 2011 22:26:02
- Откуда: Севастополь
Re: CodeVision AVR в вопросах и ответах
pyzhman писал(а):В прерывании от timer1 записать ++TCNT0.
понял, а источником тактового сигнала на таймера 0 что выставить? 000 - нет тактовой частоты или 111 - неинвертир сигнал с внешней ноги (Т0 или Т1)
- pyzhman
- Друг Кота
- Сообщения: 7016
- Зарегистрирован: Вс июл 12, 2009 19:15:29
- Откуда: Ижевск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Оставить заглушенным, т.е. 000. Не забыть разрешить прерывание по переполнению.
Вообще говоря, что за изврат? Для чего? Если событие по условиям, формируемым в таймере1, то там и обрабатывать. Или флажок взвести.
Вообще говоря, что за изврат? Для чего? Если событие по условиям, формируемым в таймере1, то там и обрабатывать. Или флажок взвести.
Docendo discimus