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

Обсуждаем контроллеры компании Atmel.
master_74
Родился
Posts: 19
Joined: Tue Apr 06, 2010 09:50:34

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

Post by master_74 »

Прошу прощения, а откуда можно поиметь сей чудный int64_t из библиотеки inttypes?
Реклама
User avatar
Volly
Опытный кот
Posts: 702
Joined: Fri Mar 06, 2009 18:22:23

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

Post by Volly »

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

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

Post by demiurg301 »

Так стоит вообще переходить с 1.25.5 , 1.25.9 на 2.05 ? В чём могут быть трудности?
User avatar
Volly
Опытный кот
Posts: 702
Joined: Fri Mar 06, 2009 18:22:23

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

Post by Volly »

demiurg301
Если старая версия работает стабильно, и если не собираетесь применять более новые МК- ИМХО смысла нет.
Ничто не мешает конечно и обе установить. У меня так и сделано.
Реклама
Эиком - электронные компоненты и радиодетали
demiurg301
Опытный кот
Posts: 812
Joined: Wed Mar 18, 2009 21:14:33

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

Post by demiurg301 »

Volly wrote: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. При этом если менять местами переменные может быть задета другая. Оптимизатор прикалывается?
Реклама
User avatar
Cricket2107
Встал на лапы
Posts: 86
Joined: Tue Aug 19, 2008 14:48:19
Location: Харьков

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

Post by Cricket2107 »

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

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

Post by vlad145 »

Приветствую многоуважаемые коты. У меня нарисовалась такая проблема. Есть заготовка проекта на ATMega32 и LCD S65(LPH8836). Дак вот, я застопорился с выводом 16 битного цвета. Конкретно, я не могу нормально закрасить область, тоесть заполняется не полностью (часть кода прилагаю). Обшарил кучу форумов, пересмотрел кучу проектов, но в которых был использован данный алгоритм, написаны в основном на IAR. А вот как его адаптировать его под CVAVR. Написать свой - ума не хватит. Может есть у кого наработки по данной проблеме, помогите.
Attachments
cod.txt
(8.36 KiB) Downloaded 209 times
Владимир
User avatar
Volly
Опытный кот
Posts: 702
Joined: Fri Mar 06, 2009 18:22:23

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

Post by Volly »

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

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

Post by Cricket2107 »

Понял Спасибо.
Муррр.
vlad145
Встал на лапы
Posts: 130
Joined: Fri Mar 06, 2009 22:54:37
Location: Курган
Contact:

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

Post by vlad145 »

Экспериментальным путём мне удалось определить максимальный размер закрашиваемой области, это 14х14. Если размеры области увеличивать, то закрашивание наоборот уменьшается. На фото есть две колонки. В левой закрашиваю 14х14, в правой 14х16. Получается как бы обратный эффект. Прикрепляю мой проект(если его можно так назвать), может кто посмотрит и подскажет, в каком направлении копать.
Attachments
01.RAR
(179.21 KiB) Downloaded 151 times
Изображение 003-2.jpg
(35.92 KiB) Downloaded 279 times
Владимир
vlad145
Встал на лапы
Posts: 130
Joined: Fri Mar 06, 2009 22:54:37
Location: Курган
Contact:

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

Post by 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
Встал на лапы
Posts: 130
Joined: Fri Mar 06, 2009 22:54:37
Location: Курган
Contact:

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

Post by vlad145 »

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

И ещё, как сделать градиентную заливку в определенно области?
Владимир
Мастер Ломастер
Поставщик валерьянки для Кота
Posts: 1995
Joined: Wed May 11, 2011 21:37:45
Location: Цветочный город
Contact:

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

Post by Мастер Ломастер »

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

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

Post by vlad145 »

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

Короче, всего наилучшего, до свидания!
Владимир
Мастер Ломастер
Поставщик валерьянки для Кота
Posts: 1995
Joined: Wed May 11, 2011 21:37:45
Location: Цветочный город
Contact:

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

Post by Мастер Ломастер »

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

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

Post by Paladiy »

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

Code: Select all

#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);
      }
      };
Если твое устройство не заработало, то не надо паниковать и нервничать. Отдохни, подумай, успокойся. А вдруг заметишь или догадаешься в чем была загвоздка. Глядишь и вскоре воскликнешь "УРА!!! ЗАРАБОТАЛО!!!" :))
User avatar
DataLife
Вымогатель припоя
Posts: 601
Joined: Fri Feb 13, 2009 20:58:13
Location: Донецк

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

Post by DataLife »

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

Code: Select all

#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; // гасим первый светодиод
	}



    }
    }
    

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

Code: Select all

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. Есть мысль, что ВинАВР не корректно работает. Его можно как-то настроить?
Только те, кто предпринимают абсурдные попытки, смогут достичь невозможного.
User avatar
vitalik_1984
Поставщик валерьянки для Кота
Posts: 2482
Joined: Fri Aug 27, 2010 05:57:06
Location: Тюмень
Contact:

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

Post by vitalik_1984 »

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

Code: Select all

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

Code: Select all

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

Code: Select all

PORTX|=(1<<y)
Я делал так

Code: Select all

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

Set(Led1);//Зажигаем светодиод 1
Пробуйте

Code: Select all

#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); // гасим первый светодиод
   }



    }
    }
В поисках истины человек развивается.
User avatar
DataLife
Вымогатель припоя
Posts: 601
Joined: Fri Feb 13, 2009 20:58:13
Location: Донецк

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

Post by DataLife »

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

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

Но вашу версию обязательно рассмотрю, нужно же всесторонне развиваться)
Только те, кто предпринимают абсурдные попытки, смогут достичь невозможного.
User avatar
DataLife
Вымогатель припоя
Posts: 601
Joined: Fri Feb 13, 2009 20:58:13
Location: Донецк

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

Post by 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 - никого...

Как-то очень странно работает... Сегодня соберу всё на соплях, авось нормально будет, но всё же вопрос актуален.
Attachments
1.c
Программа на Си
(2.43 KiB) Downloaded 367 times
Только те, кто предпринимают абсурдные попытки, смогут достичь невозможного.
Post Reply

Return to “AVR”