Страница 244 из 421
Re: CodeVision AVR в вопросах и ответах
Добавлено: Сб мар 02, 2013 15:03:02
Аlex
servo писал(а):Как правильно это сделать не могли бы Вы примерчик накидать

Код: Выделить всё
char* func(){
static char arr[16]; // Создаём массив
............ // Работаем с массивом
............ //
............ //
return arr; // Возвращаем указатель на массив
}
Re: CodeVision AVR в вопросах и ответах
Добавлено: Сб мар 02, 2013 15:08:10
Аlex
Valek3306 писал(а):можно примерчик?
Код: Выделить всё
static char fl=0;
/***************************************************************/
// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void){
fl=1;
}
/***************************************************************/
/***************************************************************/
void func(){
fl=0;
while(1){
..........
..........
if(fl) break; // Выходим из цикла по флагу
//if(fl) return; // Или так, если хотим выйти совсем из функции
..........
..........
}
}
/***************************************************************/
Re: CodeVision AVR в вопросах и ответах
Добавлено: Сб мар 02, 2013 15:10:55
Аlex
Одного не пойму, почему вы постите в этой ветке ? Есть же тема, специально для этого, -
Вопросы по С/С++ (СИ)
Re: CodeVision AVR в вопросах и ответах
Добавлено: Сб мар 02, 2013 18:53:34
MS24
Создал в кодгенераторе код, для работы с DS1370, пытаюсь компильнуть, говорит что не найден ds1370.h, это как? Может подскажите в чем проблема? Версия не бесплатная.
UP версия оказалось безплатная( Проблемма решена.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс мар 03, 2013 06:51:22
pokk
Читаю книгу "Лебедев М.Б. - CodeVisionAVR. Пособие для начинающих. - 2008"
так на стр 269 приведён перечень математических функций. А в библиотеке math.h некоторых нету
где можно скачать более полную библиотеку?
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс мар 03, 2013 09:38:42
servo
Valek3306 писал(а):Аlex писал(а):Устанавливать в прерывании флаг и по нему выходить из цикла через break.
можно примерчик?
bit flag;
в прерывании поставить флаг
flag =1; //сработал флаг
в цикле:
flag=0;//сбрасываем флаг
while(1){
if (flag==1) break;
}
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс мар 03, 2013 09:41:22
servo
Аlex писал(а):servo писал(а):Как правильно это сделать не могли бы Вы примерчик накидать

Код: Выделить всё
char* func(){
static char arr[16]; // Создаём массив
............ // Работаем с массивом
............ //
............ //
return arr; // Возвращаем указатель на массив
}
спасибо !
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс мар 03, 2013 11:07:29
pokk
Не как понять не могу что за регистр заблокирован и почему.
Код: Выделить всё
#define ADC_1() ADMUX=(0<<REFS1) |(0<<REFS0) | (0<<ADLAR)|(0<<MUX4)|(0<<MUX3)|(0<<MUX2)|(0<<MUX1)|(0<<MUX0);
#define ADC_6() ADMUX=(0<<REFS1) |(0<<REFS0) | (0<<ADLAR)|(0<<MUX4)|(0<<MUX3)|(1<<MUX2)|(1<<MUX1)|(0<<MUX0);
interrupt [ADC_INT] void adc_isr(void)
{
switch (chanel){
case 0:{
chanel1=ADCW;
ADC_6();
chanel=6;
break;
}
case 6:{
chanel6=ADCW;
ADC_1();
chanel=0;
break;
}
}
}
#asm("sei")
while (1){
LCD_FIST_STR(0);
LCD_SEND("ADC1:=");
LCD_BDC(chanel1);
delay_ms(1);
LCD_SEND(mass); //вывод на дисплей данных из массива
LCD_SECOND_STR();
LCD_SEND("ADC6:=");
LCD_BDC(chanel6);
LCD_SEND(mass); //вывод на дисплей данных из массива
}
Тестирую всё в протеусе должно выводится в первой строке значение первого канала во второй шестого
а в итоге получаем что в обоих строчках выводится значение первого канала вот не как понять не могу как оно по подает в переменную chanel6.
И ещё протеус ругается на то что регистр ADC заблокирован. И мне может записать туда чего-то.
это видимо из за того нету задержки, но я так не могу понять, где она нужна.

Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс мар 03, 2013 14:16:30
ChipKiller
Не как понять не могу что за регистр заблокирован и почему.
... потому что нет проверки завершения преобразования ADC (бит ADIF)
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс мар 03, 2013 14:19:07
pokk
А когда его проверять надо ? перед считывании ? в прерывании что ли ?
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс мар 03, 2013 14:20:59
ChipKiller
после запуска преобразования
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс мар 03, 2013 14:27:23
pokk
Что-то до меня не как не доходит. Можете сказать, где в моём коде надо это сделать ?
Единственное место, где я обращаюсь к регистру это в прерывании chanel1=ADCW;
Как он может быть там заблокированным ? Ведь по биту ADIF и возникает прерывание.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс мар 03, 2013 14:40:45
ChipKiller
Ведь по биту ADIF и возникает прерывание.
... возникает, если установлен бит ADFR.
PS. перед тем как начать кодировать, посмотрите в datasheet
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс мар 03, 2013 14:50:36
pokk
Смотрел datasheet.

Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс мар 03, 2013 14:57:11
ChipKiller
может чего-то не вижу, но вся работа с АЦП в приведенном примере у вас ограничивается регистром ADMUX - этого не достаточно
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс мар 03, 2013 15:05:30
pokk
Извините инициализацию АЦП я забыл показать. Я полагаю что там должно быть всё в порядке, по сообщениям из протеусе видно что прерывание запускается и каналы изменяются. Вот только считывается всё нормально 1 раз.
Код: Выделить всё
ADMUX=(0<<REFS1) |(0<<REFS0) | (0<<ADLAR)|(0<<MUX4)|(0<<MUX3)|(0<<MUX2)|(0<<MUX1)|(0<<MUX0);
ADCSRA=(1<<ADEN) | (0<<ADSC) | (0<<ADFR) | (0<<ADIF) | (1<<ADIE) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0);
и запускается всё от таймера
Код: Выделить всё
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
ADCSRA|=(1<<ADSC); // включения АЦП частота дискретизации 4КГц
}
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс мар 03, 2013 15:11:01
ChipKiller
Вот только считывается всё нормально 1 раз.
... по тому мизеру информации. что приведена - предположу, что перед сменой канала вы не выключаете АЦП (бит ADEN).
... я не телепат, так что пардон .......
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс мар 03, 2013 15:18:44
pokk
... по тому мизеру информации. что приведена
Сейчас вроде всё привёл про АЦП.
Да вы правы АЦП я не выключаю, а зачем это надо делать?
Сделал но это всё равно не помогло. Хотя я может его после рано включаю
Код: Выделить всё
#define ADC_1() ADMUX=(0<<REFS1) |(0<<REFS0) | (0<<ADLAR)|(0<<MUX4)|(0<<MUX3)|(0<<MUX2)|(0<<MUX1)|(0<<MUX0);
#define ADC_6() ADMUX=(0<<REFS1) |(0<<REFS0) | (0<<ADLAR)|(0<<MUX4)|(0<<MUX3)|(1<<MUX2)|(1<<MUX1)|(0<<MUX0);
#define ADEN_OFF() ADCSRA=(0<<ADEN) | (0<<ADSC) | (0<<ADFR) | (0<<ADIF) | (1<<ADIE) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0);
#define ADEN_ON() ADCSRA=(1<<ADEN) | (0<<ADSC) | (0<<ADFR) | (0<<ADIF) | (1<<ADIE) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0);
interrupt [ADC_INT] void adc_isr(void)
{
switch (chanel){
case 0:{
chanel1=ADCW;
ADEN_OFF();
ADC_6();
ADEN_ON()
chanel=6;
break;
}
case 6:{
chanel6=ADCW;
ADEN_OFF();
ADC_1();
ADEN_ON();
chanel=0;
break;
}
}
}
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс мар 03, 2013 15:33:12
vitalik_1984
servo писал(а):
bit flag;
в прерывании поставить флаг
flag =1; //сработал флаг
в цикле:
flag=0;//сбрасываем флаг
while(1){
if (flag==1) break;
}
Зачем лишнее сравнение?
Код: Выделить всё
bit flag;
в прерывании поставить флаг
flag =0; //сработал флаг
в цикле:
flag=1;//сбрасываем флаг
while(flag){
//тут то, что нужно выполнять
}
ChipKiller писал(а):по тому мизеру информации. что приведена - предположу, что перед сменой канала вы не выключаете АЦП (бит ADEN).
... я не телепат, так что пардон .......
что за бред, сгенерите код визардом, ничего подобного там не делается и все работает.
Регистр ADC блокируется аппаратно когда читается младший регистр результата Ацп, когда читается старший, блокировка автоматически снимается.
После смены канала в автокоде делается задержка 10us.и только после этого запуск преобразования.
Вообще судя по журналу как то часто прерывания таймера случаются, возможно с этим что то связано.Если в каждом прерывании идет запуск преобразования, а прерывание чтения возникает в два-три раза реже немудрено, что в какой то момент произойдет глюк.
Какая вообще частота работы Ацп?
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс мар 03, 2013 17:42:42
pokk
Частота синхронизации АЦП 62 кГц
А запуск преобразования от таймера 4 кГц (250us).