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

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

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

Сообщение amd9800 »

Есть такой макрос
#define LED_ON(A,B,C) PORTB=PORTB|((1<<A)|(1<<B)|(1<<C))

#define LED_ON(A,B) PORTB=PORTB|((1<<A)|(1<<B))

#define LED_ON(A) PORTB=PORTB|(1<<A)

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

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

Сообщение WiseLord »

Думаю, что-то удобоваримое можно сделать только как-то так:

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

#define LED_RED (1<<1)
#define LED_BLUE (1<<3)
#define LED_GREEN (1<<4)

#define LED_ON(x) PORTB |= (x)

LED_ON(LED_RED | LED_GREEN | LED_BLUE)
amd9800
Опытный кот
Сообщения: 822
Зарегистрирован: Вс июн 02, 2013 12:23:03

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

Сообщение amd9800 »

Спасибо.
Я кстати тоже сам к такой идеи пришел.
Аватара пользователя
Vanes
Первый раз сказал Мяу!
Сообщения: 27
Зарегистрирован: Вт июл 08, 2014 14:27:38
Откуда: Славянск-на-Кубани

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

Сообщение Vanes »

Дима_Медвед писал(а):Всем привет! Есть вопрос: как запустить симулятор в CVAVR??
При попытку запуска с AVR studio 4.19 пишет, что не может открыть студию, а с версией 6.1+ ничего не происходит.
Что делать?

Попробуй проверить настройки симулятора в CVAVR, прописан ли там путь к AVRStudio(номер версии).exe. Попробуй просто запустить саму AVR Студию напрямую через её экзешник.
Изображение Истина где то рядом :-)
AVK
Потрогал лапой паяльник
Сообщения: 349
Зарегистрирован: Сб окт 20, 2007 14:12:03

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

Сообщение AVK »

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

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

Сообщение WiseLord »

Работают на любых целочисленных типах, не только на char.
AVK
Потрогал лапой паяльник
Сообщения: 349
Зарегистрирован: Сб окт 20, 2007 14:12:03

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

Сообщение AVK »

WiseLord писал(а):Работают на любых целочисленных типах, не только на char.

Ага, я понял где затупил, спс.
kk042fjv
Грызет канифоль
Сообщения: 261
Зарегистрирован: Ср авг 01, 2012 10:45:42

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

Сообщение kk042fjv »

Добрый день!
Пишу программу для барометра на atmega8 с датчиком bmp180. Скачал библиотеку для барометра, но выдает ошибку.
included from: atmega_bmp180_lib.c, L11:can't open #include file: util/twi.h

Пишу в CodeVisionAVR, что эта за ошибка и как её исправить?
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

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

Сообщение WiseLord »

util/twi.h - это часть библиотеки I²C для avr-gcc/avr-libc. Так что либо пишите свой код в WinAVR, либо переделывайте I²C функции под CodeVision.
tolyan_2006
Родился
Сообщения: 1
Зарегистрирован: Пн окт 19, 2015 17:48:09

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

Сообщение tolyan_2006 »

Доброго времени суток!
Изучаю апноут AVR443 для управления бесколлекторным дпт. Codevision упорно ругается на элементы массива конфигураций порта управления ключами. Пишет "must be constant expression"

unsigned char drvPatternsCCW[] = {
0, //Stop
// MC_PORT drive config
PDP2_CCW, //Phase2
PDP4_CCW, //Phase4
PDP3_CCW, //Phase3
PDP6_CCW, //Phase6
PDP1_CCW, //Phase1
PDP5_CCW, //Phase5
// Configuration of Output Compare operation for timer 0
COM0P2_CCW, //Phase2
COM0P4_CCW, //Phase4
COM0P3_CCW, //Phase3
COM0P6_CCW, //Phase6
COM0P1_CCW, //Phase1
COM0P5_CCW, //Phase5
// Configuration of Output Compare operation for timer 2
COM2P2_CCW, //Phase2
COM2P4_CCW, //Phase4
COM2P3_CCW, //Phase3
COM2P6_CCW, //Phase6
COM2P1_CCW, //Phase1
COM2P5_CCW //Phase5
};


Сами переменные массива описываются в h-файле таким образом

#define UL PINB.1
#define VL PINB.4
#define WL PINB.6
#define UH PINB.0
#define VH PINB.3
#define WH PINB.5

#define PDP1_CCW ((1<<UL)|(0<<VL)|(0<<WL)|(0<<UH)|(1<<VH)|(0<<WH))
#define PDP2_CCW ((1<<UL)|(0<<VL)|(0<<WL)|(0<<UH)|(0<<VH)|(1<<WH))
#define PDP3_CCW ((0<<UL)|(1<<VL)|(0<<WL)|(0<<UH)|(0<<VH)|(1<<WH))
#define PDP4_CCW ((0<<UL)|(1<<VL)|(0<<WL)|(1<<UH)|(0<<VH)|(0<<WH))
#define PDP5_CCW ((0<<UL)|(0<<VL)|(1<<WL)|(1<<UH)|(0<<VH)|(0<<WH))
#define PDP6_CCW ((0<<UL)|(0<<VL)|(1<<WL)|(0<<UH)|(1<<VH)|(0<<WH))


Подскажите пожалуйста как мне можно обмануть сего товарища?
V32301
Родился
Сообщения: 1
Зарегистрирован: Пн окт 12, 2015 02:09:57

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

Сообщение V32301 »

Dr.Seldom писал(а):Всем мяв!

вопрос созрел.... перезрел.... и начал пахнуть....

протеус+модель LCD ILI9325+Mega64+CV

в СВ с помощью визарда определил куда и чего подключать, повторил все подключения в протеусе, но что-то на экранчике ничего не отображается (модель LCD рабочая, есть пример с андурило )..
пытаюсь вывести хоть строчку из примера с Хмега128

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

   // glcd_clear(); //при закомментированной строчке на ногах МК серые квадратики, хотя они сконфигурированы как выходы
                          //если убрать комментарий то синие и  красные и мигают ;)
glcd_setfont(font5x7);
glcd_setcolor(GLCD_CL_YELLOW);
glcd_outtextf("Ilitek ILI9325 Graphics Demo");


чего-то не хватает, а вот чего именно не понятно
сразу железе не могу пока попробовать, пока нету в наличии ;)


Я столкнулся с такой же проблемой, я новичок, подскажите пожалуста как вы решили эту проблему.
Аватара пользователя
Mon
Встал на лапы
Сообщения: 92
Зарегистрирован: Вс авг 21, 2011 23:12:37
Откуда: Харьков

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

Сообщение Mon »

Доброй ночи всем котам!
Прошу подсказки - куда рыть:
"изобретаю велосипед", есть микросхема часов реального времени DS1307, с которой считывается, собственно, время ( используя стандартную библиотеку в CVAVR) при помощи функции:

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

void rtc_get_time(unsigned char *hour,unsigned char *min,unsigned char *sec);


Есть необходимость выделить именно цифры из чисел "часы", "минуты", "секунды" и привести их к типу int ( чтобы иметь возможность проводить операцию сравнения).
В основном коде это выглядит так:

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

rtc_get_time(&hour,&min,&sec); //считать время 
 sprintf(hour1,"%d",hour/10);        //выделяем цифры времени чч\\мм\\сс     
 sprintf(hour2,"%d",hour&10);
 sprintf(minute1,"%d",min/10);
 sprintf(minute2,"%d",min&10);
 sprintf(second1,"%d",sec/10);
 sprintf(second2,"%d",sec&10);


но сие чудо работать не хочет, мои "сравнения" не проходят.
Плюс пробовал вывести значение секунд на дисплей при помощи:

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

 lcd_puts(second2);

при задержке 200 мс после каждого вывода значения на дисплей - получаем то,что на картинке: Изображение

Вопрос в следующим - как правильно оперировать данными, считанными с микросхемы DS1307? Эта задача возникла из необходимости выводить время при помощи символов(т.е. большие часы).
Вложения
1234.JPG
(32.52 КБ) 291 скачивание
выше головы не прыгнешь - ниже зад**цы не сядешь.
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

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

Сообщение WiseLord »

Mon писал(а): sprintf(hour2,"%d",hour&10);
а это что за фигня?

А вообще, sprintf для такой мелочи использовать - плохая затея.Да и вообще, sprintf и прочее подобное на МК лучше не применять, слишком уж тяжёлые функции.

P.S. Почему бы не написать код гораздо проще:

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

void lcd_time(unsigned char value) {
  lcd_putc(value / 10 + 0x30);
  lcd_putc(value % 10 + 0x30);
}
...
rtc_get_time(&hour,&min,&sec);
lcd_time(hour);
lcd_putc(':');
lcd_time(min);
lcd_putc(':');
lcd_time(sec);
...
uk8amk
Поставщик валерьянки для Кота
Сообщения: 2222
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Откуда: Tashkent

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

Сообщение uk8amk »

tolyan_2006 писал(а):Codevision упорно ругается на элементы массива конфигураций порта управления ключами.

Вот это

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

#define UL PINB.1
#define PDP1_CCW ((1<<UL)|(0<<VL)|(0<<WL)|(0<<UH)|(1<<VH)|(0<<WH))

разворачивается следующим образом:

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

1<<PINB.1|0<<PINB.4|0<<WL 
и т.д.
Это набор инструкций чтения, а не какие не переменные. Массив - это таблица данных, туда нельзя явно помещать машинные инструкции и исполняемый код.
Аватара пользователя
Mon
Встал на лапы
Сообщения: 92
Зарегистрирован: Вс авг 21, 2011 23:12:37
Откуда: Харьков

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

Сообщение Mon »

WiseLord писал(а):
Mon писал(а): sprintf(hour2,"%d",hour&10);
а это что за фигня?

А вообще, sprintf для такой мелочи использовать - плохая затея.Да и вообще, sprintf и прочее подобное на МК лучше не применять, слишком уж тяжёлые функции.

P.S. Почему бы не написать код гораздо проще:


Я понимаю, что sprintf тяжелая, пока не вижу другого решения,а то - что предлагаете Вы, мне не совсем подходит. Мне необходимо провести операции сравнения - непосредственно с самими данными, которые считаны с ДС1307, а не выводить их сразу.
А этого я не могу сделать, т.к. CVAVR ругается на то , что у меня переменная modified .
выше головы не прыгнешь - ниже зад**цы не сядешь.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

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

Mon писал(а):Мне необходимо провести операции сравнения - непосредственно с самими данными, которые считаны с ДС1307, а не выводить их сразу.
А для чего Вам тогда sprintf, если нужны числа ? sprintf на выходе имеет форматированную строку, а не чиселки...
Просто раскладывайте принятые значения на десятки и единицы.
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

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

Сообщение WiseLord »

Говоря "фигня", я имел в виду не сам sprintf, а то, что мне непонятно, зачем умножать побитно hour2 и прочее на 10 (hour2 & 10). Тут нужно деление с остатком, а не умножение.

И потом, что мешает сравнивать числа без всякого sprintf?

А если rtc_get_time(&hour,&min,&sec) возвращает результат в "нетронутом виде", то и деление на 10 не нужно. Под этим я понимаю результат в том виде, как он хранится в микросхеме RTC, т.е. двоично-десятичном.

Например, сейчас 11:01:48. Если функция возвращает результат hour = 0x11, min = 0x01, sec = 0x48, то никаких делений не нужно, и сравнивать вообще просто. Деление (обычное и с остатком, а не побитовое умножение на 10) нужно будет только если результат hour = 11, min = 1, sec = 48. Но и тут sprintf вообще никак не нужен.
Аватара пользователя
Mon
Встал на лапы
Сообщения: 92
Зарегистрирован: Вс авг 21, 2011 23:12:37
Откуда: Харьков

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

Сообщение Mon »

[quote="WiseLord"]Говоря "фигня", я имел в виду не сам sprintf, а то, что мне непонятно, зачем умножать побитно hour2 и прочее на 10 (hour2 & 10). Тут нужно деление с остатком, а не умножение.

И потом, что мешает сравнивать числа без всякого sprintf?/quote]

За первый момент, спасибо, пропустил, исправил.
А вот за второй большое спасибо! Получается - сам для себя лишних действий добавил.
Теперь на выходе имею то, что нужно: Изображение
выше головы не прыгнешь - ниже зад**цы не сядешь.
kk042fjv
Грызет канифоль
Сообщения: 261
Зарегистрирован: Ср авг 01, 2012 10:45:42

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

Сообщение kk042fjv »

Добрый день!
Подскажите, как правильно сделать в этом коде:

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

          if (V<3.7)
                         {
                              if (V<2.95)       // температура менее 25 градусов
                              {
                              TCCR1B=0x0C;     
                              TCCR2=0x6B;       
                              }
                              if (V>2.95)        //температура более 25 градусов
                              {
                              TCCR1B=0x00;     
                              TCCR2=0x6E;       
                              }
                         }
                         if (V>3.7)
                         {
                              if (V<3.8)         //температура более 100 градусов         
                              {
                              TCCR2=0x6B;       
                              }
                              if (V>3.95)        //температура более 125 град.
                              {
                              TCCR2=0x6F;
                              }
                         }         

Нужно сделать, чтоб после того как температура станет более 125 град т.е. (V>3.95), ШИМ работал в режиме TCCR2=0x6F; пока температура не упадет менее 25 град
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

в этом коде даже температура более 100 градусов не будет отрабатывать - у вас в самом начале стоит "если V < 3.7", а вы про больше 3.9 говорите.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Ответить

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