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

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

Сообщение Аlex »

servo писал(а):Как правильно это сделать не могли бы Вы примерчик накидать :)

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

char* func(){
static char arr[16];   // Создаём массив
............           // Работаем с массивом
............           //
............           //
return arr;            // Возвращаем указатель на массив
}
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

Сообщение А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;  // Или так, если хотим выйти совсем из функции
  ..........
  ..........
}
}
/***************************************************************/
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

Сообщение Аlex »

Одного не пойму, почему вы постите в этой ветке ? Есть же тема, специально для этого, - Вопросы по С/С++ (СИ)
MS24
Нашел транзистор. Понюхал.
Сообщения: 172
Зарегистрирован: Пн мар 19, 2012 13:04:11

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

Сообщение MS24 »

Создал в кодгенераторе код, для работы с DS1370, пытаюсь компильнуть, говорит что не найден ds1370.h, это как? Может подскажите в чем проблема? Версия не бесплатная.
UP версия оказалось безплатная( Проблемма решена.
pokk
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

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

Сообщение pokk »

Читаю книгу "Лебедев М.Б. - CodeVisionAVR. Пособие для начинающих. - 2008"
так на стр 269 приведён перечень математических функций. А в библиотеке math.h некоторых нету
где можно скачать более полную библиотеку?
Аватара пользователя
servo
Встал на лапы
Сообщения: 88
Зарегистрирован: Вс окт 30, 2011 22:52:51

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

Сообщение servo »

Valek3306 писал(а):
Аlex писал(а):Устанавливать в прерывании флаг и по нему выходить из цикла через break.

можно примерчик?


bit flag;

в прерывании поставить флаг

flag =1; //сработал флаг


в цикле:

flag=0;//сбрасываем флаг
while(1){
if (flag==1) break;
}
Аватара пользователя
servo
Встал на лапы
Сообщения: 88
Зарегистрирован: Вс окт 30, 2011 22:52:51

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

Сообщение servo »

Аlex писал(а):
servo писал(а):Как правильно это сделать не могли бы Вы примерчик накидать :)

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

char* func(){
static char arr[16];   // Создаём массив
............           // Работаем с массивом
............           //
............           //
return arr;            // Возвращаем указатель на массив
}



спасибо !
pokk
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

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

Сообщение 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 заблокирован. И мне может записать туда чего-то.
это видимо из за того нету задержки, но я так не могу понять, где она нужна.
Изображение
Последний раз редактировалось pokk Вс мар 03, 2013 15:05:53, всего редактировалось 1 раз.
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

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

Сообщение ChipKiller »

Не как понять не могу что за регистр заблокирован и почему.
... потому что нет проверки завершения преобразования ADC (бит ADIF)
pokk
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

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

Сообщение pokk »

А когда его проверять надо ? перед считывании ? в прерывании что ли ?
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

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

Сообщение ChipKiller »

после запуска преобразования
pokk
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

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

Сообщение pokk »

Что-то до меня не как не доходит. Можете сказать, где в моём коде надо это сделать ?
Единственное место, где я обращаюсь к регистру это в прерывании chanel1=ADCW;
Как он может быть там заблокированным ? Ведь по биту ADIF и возникает прерывание.
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

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

Сообщение ChipKiller »

Ведь по биту ADIF и возникает прерывание.
... возникает, если установлен бит ADFR.

PS. перед тем как начать кодировать, посмотрите в datasheet
pokk
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

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

Сообщение pokk »

Смотрел datasheet. :dont_know:
Изображение
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

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

Сообщение ChipKiller »

может чего-то не вижу, но вся работа с АЦП в приведенном примере у вас ограничивается регистром ADMUX - этого не достаточно
pokk
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

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

Сообщение 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КГц
}
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

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

Сообщение ChipKiller »

Вот только считывается всё нормально 1 раз.
... по тому мизеру информации. что приведена - предположу, что перед сменой канала вы не выключаете АЦП (бит ADEN).

... я не телепат, так что пардон .......
pokk
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

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

Сообщение 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;
            }
           
}
}
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

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

Сообщение 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.и только после этого запуск преобразования.

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

Какая вообще частота работы Ацп?
pokk
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

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

Сообщение pokk »

Частота синхронизации АЦП 62 кГц
А запуск преобразования от таймера 4 кГц (250us).
Ответить

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