Страница 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. :dont_know:
Изображение

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).