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

Обсуждаем контроллеры компании Atmel.
master_74
Родился
Сообщения: 19
Зарегистрирован: Вт апр 06, 2010 09:50:34

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

Сообщение master_74 »

Прошу прощения, а откуда можно поиметь сей чудный int64_t из библиотеки inttypes?
Аватара пользователя
Volly
Опытный кот
Сообщения: 702
Зарегистрирован: Пт мар 06, 2009 18:22:23

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

Сообщение Volly »

master_74 из AVR-GCC (Winavr), и вместе с ним. Без переделки в CVAVR работать не будет, и с переделкой всё упрётся в тот-же long long int. К сожалению, нет ни одной новой, нормальноломанной версии CVAVR (мне по крайней мере не попадалось).
demiurg301
Опытный кот
Сообщения: 812
Зарегистрирован: Ср мар 18, 2009 21:14:33

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

Сообщение demiurg301 »

Так стоит вообще переходить с 1.25.5 , 1.25.9 на 2.05 ? В чём могут быть трудности?
Аватара пользователя
Volly
Опытный кот
Сообщения: 702
Зарегистрирован: Пт мар 06, 2009 18:22:23

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

Сообщение Volly »

demiurg301
Если старая версия работает стабильно, и если не собираетесь применять более новые МК- ИМХО смысла нет.
Ничто не мешает конечно и обе установить. У меня так и сделано.
demiurg301
Опытный кот
Сообщения: 812
Зарегистрирован: Ср мар 18, 2009 21:14:33

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

Сообщение demiurg301 »

Volly писал(а):demiurg301
Если старая версия работает стабильно, и если не собираетесь применять более новые МК- ИМХО смысла нет.
Ничто не мешает конечно и обе установить. У меня так и сделано.


Новые МК не применяю. Но 1.25.5 малёха задолбала своей глюкавостью. Особенно когда много вложеных циклов и условий.
Сейчас например парюсь с непонятным обнулением счётчика. ЗАметил ЛАГ , который вылазит очень часто.
Вот такая конструкция:

unsigned char *PtS1,*PtS;
unsigned char conflict=0;
unsigned char atc_retry_number=3;
unsigned char srn;
unsigned char step;
unsigned char temp;
unsigned char temp_str[3];

Приводит к тому, что изменение переменной step влияет на переменную srn. При этом если менять местами переменные может быть задета другая. Оптимизатор прикалывается?
Аватара пользователя
Cricket2107
Встал на лапы
Сообщения: 86
Зарегистрирован: Вт авг 19, 2008 14:48:19
Откуда: Харьков

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

Сообщение Cricket2107 »

Доброго времени суток! Подскажите такой вопрос что дает слово flash ? Если я например пишу flash int имя переменной , а потом пытаюсь ее изменить компилятор сильно ругает мол нельзя так делать. Выходит это переменная только для чтения? Тогда в чем отличие от const int? Простите за тупой вопрос (просто читать 141 страницу по теме codevision влом да и в программировании я еще не очень а точнее чайник )
Муррр.
vlad145
Встал на лапы
Сообщения: 130
Зарегистрирован: Пт мар 06, 2009 22:54:37
Откуда: Курган
Контактная информация:

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

Сообщение vlad145 »

Приветствую многоуважаемые коты. У меня нарисовалась такая проблема. Есть заготовка проекта на ATMega32 и LCD S65(LPH8836). Дак вот, я застопорился с выводом 16 битного цвета. Конкретно, я не могу нормально закрасить область, тоесть заполняется не полностью (часть кода прилагаю). Обшарил кучу форумов, пересмотрел кучу проектов, но в которых был использован данный алгоритм, написаны в основном на IAR. А вот как его адаптировать его под CVAVR. Написать свой - ума не хватит. Может есть у кого наработки по данной проблеме, помогите.
Вложения
cod.txt
(8.36 КБ) 208 скачиваний
Владимир
Аватара пользователя
Volly
Опытный кот
Сообщения: 702
Зарегистрирован: Пт мар 06, 2009 18:22:23

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

Сообщение Volly »

Cricket2107
Конечно не получится изменить. Вобщем flash- и есть константа, размещённая во FLASH- памяти, и может быть только глобальной.
const- может быть и локальной- размещённой в RAM- памяти, и глобальной- размещённой как в RAM, так и во FLASH (зависит от галочки "Store Global Constants in FLASH Memory" в свойствах компилятора). Некоторые функции в CVAVR заточены работать с константами объявленными только через flash (sprintf например).
Аватара пользователя
Cricket2107
Встал на лапы
Сообщения: 86
Зарегистрирован: Вт авг 19, 2008 14:48:19
Откуда: Харьков

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

Сообщение Cricket2107 »

Понял Спасибо.
Муррр.
vlad145
Встал на лапы
Сообщения: 130
Зарегистрирован: Пт мар 06, 2009 22:54:37
Откуда: Курган
Контактная информация:

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

Сообщение vlad145 »

Экспериментальным путём мне удалось определить максимальный размер закрашиваемой области, это 14х14. Если размеры области увеличивать, то закрашивание наоборот уменьшается. На фото есть две колонки. В левой закрашиваю 14х14, в правой 14х16. Получается как бы обратный эффект. Прикрепляю мой проект(если его можно так назвать), может кто посмотрит и подскажет, в каком направлении копать.
Вложения
01.RAR
(179.21 КБ) 151 скачивание
Изображение 003-2.jpg
(35.92 КБ) 279 скачиваний
Владимир
vlad145
Встал на лапы
Сообщения: 130
Зарегистрирован: Пт мар 06, 2009 22:54:37
Откуда: Курган
Контактная информация:

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

Сообщение vlad145 »

Ура! Победил я данную проблему. Конечно большое спасибо Dadigor-у с форума KAZUS, он меня навел на мысль, что ...int обычно и так 16-битное число. Был бы опыт в программировании, может и сам бы это знал, но увы. Короче, пересмотрев ещё раз свой проект, решил поправить данный код:

void fill_area( int x1, int x2, int y1, int y2,int color)
{
int i;
char w,h;


на

void fill_area( int x1, int x2, int y1, int y2,int color)
{
int i;

int w,h;

что само по себе логично. В результате всё получилось.
Владимир
vlad145
Встал на лапы
Сообщения: 130
Зарегистрирован: Пт мар 06, 2009 22:54:37
Откуда: Курган
Контактная информация:

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

Сообщение vlad145 »

Есть ещё один вопрос. Допустим есть массив, состоящий из 9 кодов цвета для LCD. Как сделать перебор данных кодов от 0 до 8 например циклом For?

И ещё, как сделать градиентную заливку в определенно области?
Владимир
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

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

Сообщение Мастер Ломастер »

vlad145 писал(а):Есть ещё один вопрос. Допустим есть массив, состоящий из 9 кодов цвета для LCD. Как сделать перебор данных кодов от 0 до 8 например циклом For?
может, стоило бы почитать букварь Си, а не стонать по форумам "помогите"? азы надо знать.
битва с дураками проиграна, победители торжествуют. слава победителям!
vlad145
Встал на лапы
Сообщения: 130
Зарегистрирован: Пт мар 06, 2009 22:54:37
Откуда: Курган
Контактная информация:

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

Сообщение vlad145 »

Мастер Ломастер писал(а):
vlad145 писал(а):Есть ещё один вопрос. Допустим есть массив, состоящий из 9 кодов цвета для LCD. Как сделать перебор данных кодов от 0 до 8 например циклом For?
может, стоило бы почитать букварь Си, а не стонать по форумам "помогите"? азы надо знать.


Во первых, если бы в учебниках описывалась точно такая ситуация, я бы не спрашивал. Во вторых я не кричу помогите, а спрашиваю Вашего совета. Если не для этого, то для чего тогда форумы нужны - для обмена опытом. А так получается чтобы гнобить новичков.

Короче, всего наилучшего, до свидания!
Владимир
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

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

Сообщение Мастер Ломастер »

vlad145 писал(а):если бы в учебниках описывалась точно такая ситуация, я бы не спрашивал.
в учебниках не описан цикл for? или в учебниках цикл рассматривается на примере перебора массива фамилий, а у вас массив цветов - значит, это не то? если бы в учебниках рассматривали ВСЕ варианты использования цикла for, то этот учебник выходил бы в виде многотомника и по сей день.
vlad145 писал(а):Во вторых я не кричу помогите, а спрашиваю Вашего совета.
и в каком же месте вы спрашивали совета? цитирую:
vlad145 писал(а):Есть ещё один вопрос. Допустим есть массив, состоящий из 9 кодов цвета для LCD. Как сделать перебор данных кодов от 0 до 8 например циклом For?
vlad145 писал(а):как сделать градиентную заливку в определенно области?
vlad145 писал(а):Обшарил кучу форумов, пересмотрел кучу проектов, но в которых был использован данный алгоритм, написаны в основном на IAR. А вот как его адаптировать его под CVAVR. Написать свой - ума не хватит. Может есть у кого наработки по данной проблеме, помогите.
в какой из цитат есть вопрос о СОВЕТЕ? всюду - помогите, дайте, покажите, посмотрите... а СОВЕТ я вам дал - читать учебник и думать.
vlad145 писал(а):Если не для этого, то для чего тогда форумы нужны - для обмена опытом.
и каким опытом поделились вы? опытом лени и незнания?
vlad145 писал(а):А так получается чтобы гнобить новичков.
нет. но если вы хотите сесть на шею опытных товарищей и ехать - вас скинут. разобраться с циклом for - это вы должны сделать самостоятельно. как, собственно, и с int (ранее).
битва с дураками проиграна, победители торжествуют. слава победителям!
Аватара пользователя
Paladiy
Открыл глаза
Сообщения: 43
Зарегистрирован: Чт июл 22, 2010 20:01:14
Откуда: Нижний Новгород

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

Сообщение Paladiy »

Добрый день многоуважаемые коты. Не хотел бы что бы мой вопрос посчитали оффтопом, но конкретной проблемы я что то не нашел на форуме, хотя некоторые идеи были...
Вот в чем проблема: Решил сделать часики себе, нет ничего особенного, схема типовая по даташиту, но никак не могу вывести считанную с часиков информацию на LCD (16х2). На индикаторе появляется все что угодно, но только не то что я ожидаю. Исходник привожу ниже что бы не быть голословным. Я подразумеваю что как то не так использую функцию sprintf. Если не трудно, подскажите пожалуйста, где и что или как нужно поменять, что бы показания стали нормальными. Заранее прошу меня простить, я тока учусь работе с AVR-ами.

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

#include <mega8515.h>

// I2C Bus functions
#asm
   .equ __i2c_port=0x12 ;PORTD
   .equ __sda_bit=6
   .equ __scl_bit=5
#endasm
#include <i2c.h>
#include <ds1307.h>
#asm
   .equ __lcd_port=0x1B ;PORTA
#endasm
#include <lcd.h>
#include <delay.h>
#include <stdio.h>
#include <bcd.h>
char buff[33];
void main(void){
unsigned char h,m,s,s1;

// I2C Bus initialization
i2c_init();
rtc_init(3,0,1);
lcd_init(16);
lcd_putsf("start");
rtc_get_time(&h,&m,&s);
delay_ms(3000);
rtc_get_time(&h,&m,&s1);
if (s==s1){lcd_clear();
lcd_putsf("rtc_time error");}
else {lcd_clear();
lcd_putsf("rtc_time NORM");}
delay_ms(2000);
// Global enable interrupts
#asm("sei")

while (1)
      {
      rtc_get_time(&h,&m,&s);
      sprintf(buff,"%u : %u : %u",h,m,s);
      lcd_clear();
      lcd_puts(buff);
      delay_ms(1000);
      }
      };
Если твое устройство не заработало, то не надо паниковать и нервничать. Отдохни, подумай, успокойся. А вдруг заметишь или догадаешься в чем была загвоздка. Глядишь и вскоре воскликнешь "УРА!!! ЗАРАБОТАЛО!!!" :))
Аватара пользователя
DataLife
Вымогатель припоя
Сообщения: 601
Зарегистрирован: Пт фев 13, 2009 20:58:13
Откуда: Донецк

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

Сообщение DataLife »

Здравствуйте.
Есть очень простая, по своей задумке, программка...
До конца не дописал, но уже есть ошибки при компиляции.

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

#define F_CPU 8000000UL

#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>

#define led_1 PORTC.5

     
    int s = 1;//переменная для задержки
     
    unsigned int x,i;//перечисление переменных
     
    void delay (unsigned int a)
    {
    unsigned int i;
    for (i=a;i>0;i--);
    }
     
    SIGNAL(SIG_INTERRUPT0)//обработка прерываний INT0
    {
    cli();//запрещение прерываний на время обработки прерывания
    s = s+1;//увеличиваем переменную s на 1
    sei();//разрешение прерываний
    }
    int main(void)
    {
    DDRD = 0x00; //все вход
    DDRC = 0xFF; //все выход
     
    GICR=0b01000000; //разрешаем прерывание int0 - кнопка
    MCUCR=0x03; // int by rising front - для кнопки
     
    sei();//разрешение прерываний

   PORTC=0;
     
    while (1)//вечный цикл
    {
    if (s==1)
   {
   led_1=1; // зажгли первый светодиод

      while (s==1)
      {   
         PORTC.1=1; // подаём сигнал
         _delay_ms(5); // и ждём 5 милисек
         PORTC.1=0; // прекращаем сигнал
         delay(100);
      }
      led_1=0; // гасим первый светодиод
   }



    }
    }
   



Ошибки вот такие:

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

avr-gcc.exe  -mmcu=atmega8 -Wall -gdwarf-2  -Os -fsigned-char -MD -MP -MT E85.o -MF dep/E85.o.d  -c  ../E85.c
../E85.c: In function 'main':
../E85.c:44: error: expected ';' before numeric constant
../E85.c:48: error: expected ';' before numeric constant
../E85.c:50: error: expected ';' before numeric constant
../E85.c:53: error: expected ';' before numeric constant
make: *** [E85.o] Error 1
Build failed with 4 errors and 0 warnings...


Тоесть ругается на точки-запятые, начиная с "led_1=1;"...

Пару часов уже бьюсь над ними - безрезультатно.
На форумах похожее есть, говорят, что нужно настроить компилятор для понимания языка.
Подскажите, куда рыть? Глаза на лог лезут.
Если убрать у led_1=1; точку-запятую, но ругается тем же матом только на неё, остальные не видит...

PS. Есть мысль, что ВинАВР не корректно работает. Его можно как-то настроить?
Только те, кто предпринимают абсурдные попытки, смогут достичь невозможного.
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

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

Сообщение vitalik_1984 »

Вы уверены, что в студии поддерживается фича от CVavr?

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

#define led_1 PORTC.5 


Тут такое не выйдет.
Нужно ВСЁ менять на

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

#define _BV(x) (1<<x)
 PORTX|=_BV(PORTXY)//- установить бит Y в порту X
PORTX|=~_BV(PORTXY)//-очистить бит Y в порту X


Или просто на

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

PORTX|=(1<<y)


Я делал так

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

#define Set(x) PORTC|=(1<<x)
#define Clear(x) PORTC|=~(1<<x)
#define Led1 5

Set(Led1);//Зажигаем светодиод 1


Пробуйте

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

#define F_CPU 8000000UL

#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>


#define Set(x) PORTC|=(1<<x)
#define Clear(x) PORTC|=~(1<<x)
#define Led1 5

     
    int s = 1;//переменная для задержки
     
    unsigned int x,i;//перечисление переменных
     
    void delay (unsigned int a)
    {
    unsigned int i;
    for (i=a;i>0;i--);
    }
     
    SIGNAL(SIG_INTERRUPT0)//обработка прерываний INT0
    {
    cli();//запрещение прерываний на время обработки прерывания
    s = s+1;//увеличиваем переменную s на 1
    sei();//разрешение прерываний
    }
    int main(void)
    {
    DDRD = 0x00; //все вход
    DDRC = 0xFF; //все выход
     
    GICR=0b01000000; //разрешаем прерывание int0 - кнопка
    MCUCR=0x03; // int by rising front - для кнопки
     
    sei();//разрешение прерываний

   PORTC=0;
     
    while (1)//вечный цикл
    {
    if (s==1)
   {
   Set(Led1);; // зажгли первый светодиод

      while (s==1)
      {   
         Set(1); // подаём сигнал
         _delay_ms(5); // и ждём 5 милисек
         Clear(1); // прекращаем сигнал
         delay(100);
      }
      Clear(Led1); // гасим первый светодиод
   }



    }
    }
В поисках истины человек развивается.
Аватара пользователя
DataLife
Вымогатель припоя
Сообщения: 601
Зарегистрирован: Пт фев 13, 2009 20:58:13
Откуда: Донецк

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

Сообщение DataLife »

vitalik_1984, огромное спасибо! Ваш код компилируется!

Правда я уже переделал программу под CVAVR (роднее она мне). Там попроще всё стало...

Но вашу версию обязательно рассмотрю, нужно же всесторонне развиваться)
Только те, кто предпринимают абсурдные попытки, смогут достичь невозможного.
Аватара пользователя
DataLife
Вымогатель припоя
Сообщения: 601
Зарегистрирован: Пт фев 13, 2009 20:58:13
Откуда: Донецк

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

Сообщение DataLife »

Снова вопрос у меня.
Программку написал до конца. В плане основновного своего назначения - сигнал определённой частоты и продолжительности на выходе, - работает нормально. Однако светодиоды, которые отвечают за сигнализацию выбраного режима - вообще невпопад работают!
Помогите!
Как должно быть: включаем устройство - горит первый светодиод (led_1). Работает программа на 10 Гц. Нажимаем кнопку - загорается и второй светодиод (led_2). Работает программа на 20 Гц. Второй раз нажали кнопку - горят все три светодиода (загорается led_3). Работает программа на 40 Гц. Если ещё1 раз нажать кнопку программа возвращается в режим 10 Гц.

Пояснения по тексту в файле есть.

А получается (в протеусе, правда) так: (для упрощения я буду писать led1 led2 led3, частоты, и "тыц" когда нажали кнопку)
включили: 20 Hz - led1 led2
тыц - 40 Hz - led3
тыц - 10 Hz - led1
тыц - 20 Hz - led2 led3
тыц - 40 Hz - led1
тыц - 10 Hz - никого...

Как-то очень странно работает... Сегодня соберу всё на соплях, авось нормально будет, но всё же вопрос актуален.
Вложения
1.c
Программа на Си
(2.43 КБ) 366 скачиваний
Только те, кто предпринимают абсурдные попытки, смогут достичь невозможного.
Ответить

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