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

Обсуждаем контроллеры компании Atmel.
flimp
Прорезались зубы
Сообщения: 242
Зарегистрирован: Вс май 24, 2015 19:10:41

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

Сообщение flimp »

господа, у кого нибудь есть библиотека ssd1305 под CVAVR?
нужено ну просто не передать как, а гугл не ищет.
mar1lynmanson
Первый раз сказал Мяу!
Сообщения: 28
Зарегистрирован: Чт ноя 22, 2012 00:35:51
Откуда: г. Мариуполь, Украина

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

Сообщение mar1lynmanson »

Добрый день, как в CVAVR считать константу из флеш памяти?
Суть проблемы такова: имеется Atmega16 и графический дисплей, соответственно есть заготовки в виде констант в которых содержится графика и периодически их нужно выводить на дисплей, так вот они копируются в RAM и соответственно ее не хватает.
Поэтому и непонятно как считать напрямую из флеш, чтобы не занимать RAM впустую этими данными.


P.S.: Вроде разобрался, константы объявляем как "flash", создаем дополнительную переменную, в которую копируем данные из флеш, а потм уже спокойно с ней работаем. По крайней мере такой способ позволил освободить RAM, ну а потеря на времени на копирование из флеш во вспомогательную переменную а потом уже работа с ней - для меня пока не критична.
Последний раз редактировалось mar1lynmanson Сб дек 24, 2016 10:06:58, всего редактировалось 2 раза.
С уважением Владимир.
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

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

Сообщение Z_h_e »

Тут почитайте и еще много где наверное написано.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
mar1lynmanson
Первый раз сказал Мяу!
Сообщения: 28
Зарегистрирован: Чт ноя 22, 2012 00:35:51
Откуда: г. Мариуполь, Украина

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

Сообщение mar1lynmanson »

Z_h_e писал(а):Тут почитайте и еще много где наверное написано.

Прочитал, при чем еще вчера, вот только ни фига не понял.
Самое интересное - нащупанный мною доступ к флешь памяти прекрасно работает в main функции а в других меня компилятор посылает на ЙУХ.
Писец какой то в общем, нигде не могу найти нормальный ответ как сохранить константу во флеш (с этим вроде разобрался) и как потом её потом оттуда просто прочитать, при чем желательно на примере какого то проекта CVAVR.

P.S.: Сделал как по ссылке при помощи #include <pgmspace.h>, объявления массива с данными с пометкой PROGMEM и доступом к данным через pgm_read_byte(&()) - все хорошо работает в основной main функции, копирую рабочий код в любую вспомогательную функцию вызываемую отдельно - получаю вежливый посыл на ЙУХ и кучу ошибок - что за бред, почему в main функции все хорошо, в любой другой нет?
С уважением Владимир.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

mar1lynmanson писал(а):Сделал как по ссылке при помощи #include <pgmspace.h>, объявления массива с данными с пометкой PROGMEM и доступом к данным через pgm_read_byte(&())
у вас на самом деле ЭТО компилируется в CVAVR? :shock:

хотелось бы увидеть... ну и сообщения об ошибках тоже на многое могут открыть глаза.
mar1lynmanson писал(а):вежливый посыл на ЙУХ и кучу ошибок
это вообще ни о чем, так о проблемах не рассказывают, если хотят их решить
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
uk8amk
Поставщик валерьянки для Кота
Сообщения: 2222
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Откуда: Tashkent

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

Сообщение uk8amk »

CVAVR позволяет использовать указатели на область флеш. С ними код выходит более читабельный чем через pgmspace.
Искать во встроенной справке на тему Flash Pointers.
mar1lynmanson
Первый раз сказал Мяу!
Сообщения: 28
Зарегистрирован: Чт ноя 22, 2012 00:35:51
Откуда: г. Мариуполь, Украина

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

Сообщение mar1lynmanson »

ARV писал(а):
mar1lynmanson писал(а):Сделал как по ссылке при помощи #include <pgmspace.h>, объявления массива с данными с пометкой PROGMEM и доступом к данным через pgm_read_byte(&())
у вас на самом деле ЭТО компилируется в CVAVR? :shock:


Уже нет. Смешно, но факт. На #include <pgmspace.h> - компилятор реагирует нормально, на pgm_read_byte(&()), а вот при попытке использовать PROGMEM указывает что не хватает знака ";"

Сегодня точно уже ничего не получится посмотреть, у меня уже шарики за ролики начинают заходить.
Самое обидно то, что на поставленный вопрос я так и не получил вменяемого ответа.

uk8amk писал(а):CVAVR позволяет использовать указатели на область флеш. С ними код выходит более читабельный чем через pgmspace.
Искать во встроенной справке на тему Flash Pointers.

Спасибо, но это я уже посмотрю завтра. Да и походу нужно сваливать с CVAVR потому как примеров на нем крайне мало в сети. А также он у меня пиратский потому может и глюкотню всякую выдает, потому как у меня не укладывается в уме как кусок кода может нормально работать в main функции и сыпать ошибками при попытке скопировать его в вспомогательную функцию.
С уважением Владимир.
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

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

Сообщение COKPOWEHEU »

Уже нет. Смешно, но факт. На #include <pgmspace.h> - компилятор реагирует нормально, на pgm_read_byte(&()), а вот при попытке использовать PROGMEM указывает что не хватает знака ";"
Очень странно. Мне казалось, что cvavr вообще не должен переваривать pgmspace.h, в том числе PROGMEM. Или вы умудрились в среду вместо родного компилятора gcc прикрутить?!
Собственно, согласен с ARV: покажите код и ругань компилятора.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

COKPOWEHEU писал(а):Очень странно
одно из объяснений подобного поведения, может быть очень простым: автосохранение исходника при компиляции не включено :))) сам не раз попадал на такое: правишь, правишь текст, жмешь "build" - а ошибки как были, так и остались! :)))
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
mar1lynmanson
Первый раз сказал Мяу!
Сообщения: 28
Зарегистрирован: Чт ноя 22, 2012 00:35:51
Откуда: г. Мариуполь, Украина

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

Сообщение mar1lynmanson »

В общем этой ночью перетянул код с CVAVR в Atmel Studio 7.0 - все работает нормально, да и работать в ней пожалуй чутка удобней. Пожалуй на Atmel Studio и останусь, все равно я ей постоянно пользуюсь для заливки прошивки, потому как CVAVR у меня отказывается программировать через AVRISP MKII(настоящий не клон).

Ничего плохого про CVAVR сказать не хочу, просто ломаная версия наверно может подглючивать, а может я тупил.
Всем спасибо.
С уважением Владимир.
Аватара пользователя
levaclaus
Потрогал лапой паяльник
Сообщения: 302
Зарегистрирован: Пн янв 07, 2008 16:56:28
Откуда: Минск

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

Сообщение levaclaus »

Комрады, помогите впихнуть невнихуемое. Есть Attiny13 c 1024 байт памяти, и есть код, который в cvavr 3,12 ужимается до 1040 байт. Или может есть легкая библиотека для ds18b20

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

/*******************************************************
This program was created by the
CodeWizardAVR V3.12 Advanced
Project : at13 termo

Chip type               : ATtiny13A
AVR Core Clock frequency: 9,600000 MHz
Memory model            : Tiny
External RAM size       : 0
Data Stack size         : 16
*******************************************************/

#include <tiny13a.h>
#include <delay.h>
#include <1wire.h>
#include <ds1820.h>


int temp=0;
int d1, d2, d3, d4;
     
     
  void spi(unsigned char data_h,unsigned char data_l) {
   unsigned char f;
    PORTB.0=0; // SCK = 0
      delay_us(150);
    PORTB.3=0; // CS = 0 

    for(f = 0; f<8; f++) {
     
     if ((data_h&(0b10000000)) == 0b10000000)  {
     PORTB.4=1;  // MOSI = 1                   
      }
       else  { PORTB.4=0;  // MOSI = 0   
     };                 
       
      delay_us(150);
      PORTB.0=1; // SCK = 1
      data_h = (data_h << 1);
      delay_us(150);
      PORTB.0=0; // SCK = 0
    }
      delay_us(150); 

    for(f = 0; f<8; f++) {
     
     if ((data_l&(0b10000000)) == 0b10000000)  {
     PORTB.4=1;  // MOSI = 1                   
      }
       else  { PORTB.4=0;  // MOSI = 0   
     };                 
       
      delay_us(150);
      PORTB.0=1; // SCK = 1
      data_l = (data_l << 1);
      delay_us(150);
      PORTB.0=0; // SCK = 0
    }
      delay_us(150);
      PORTB.3=1;   // CS = 1
  }

    void tem(void)
    {
    temp=ds1820_temperature_10(0);    // Чтение температуры 
     if (temp>=0) {
           
      if (temp>1000) {
      temp=4096-temp;
      d1=10;      //минус   
      }
         
      else  {
      d1=12;  //пусто         
      };   
     };

     if (temp<0) {
     temp=-1*temp;
     d1=10;         //минус
     };
     
     d2=temp/10;
     d3=temp%10;     
       
    }
   
    void main(void)
    {
    //CS      3  // Выбор ведомого
    //MOSI    4  // Передатчик ведущего, приемник ведомого
    //SCK     0  // Тактовый сигнал
    //led     1
    //ds18b20 2
   
    // Input/Output Ports initialization
    // Port B initialization
    // Function: Bit5=In Bit4=Out Bit3=Out Bit2=In Bit1=In Bit0=Out
    DDRB=(0<<DDB5) | (1<<DDB4) | (1<<DDB3) | (0<<DDB2) | (0<<DDB1) | (1<<DDB0);

    w1_init(); 

    spi(9,0b00001111);   //дешифраторы включены первые 6 мест
    spi(10,15);   //яркость //максимальная
    spi(11,6);   //разряды 6 символов 
    spi(15,0);   //Тест дисплея выключен
    spi(12,1);   //Выйти из сна 

    while (1)
      {   
             
           tem();
       
      spi(1,d1);   // зажечь цифру
      spi(2,d2);   // зажечь цифру
      spi(3,(128+d3));   // зажечь цифру
      spi(4,0);   // зажечь цифру
      spi(5,99);   // зажечь цифру
      spi(6,13);   // зажечь цифру       
       

      }
  }

Аватара пользователя
rxstart1
Вымогатель припоя
Сообщения: 508
Зарегистрирован: Пт фев 22, 2013 18:00:43
Откуда: Беларусь, г. Гомель

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

Сообщение rxstart1 »

А самому слабо опросить датчик? Там в даташите все нормально описано, если не требуется большая точность показаний, то это не займет много места, потом вместо функций задержек можно использовать асм вставки и крутить пустой цикл, места 3 копейки скорость огого. Да и 4 переменные типа int вообще непонятно зачем???
a.garkin
Нашел транзистор. Понюхал.
Сообщения: 175
Зарегистрирован: Вт сен 29, 2009 09:28:51
Откуда: Ульяновск
Контактная информация:

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

Сообщение a.garkin »

Господа подскажите плиз по коду. Кнопка по +

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


//При первом запуске идет плавное увеличение сигнала пота PB0 от 0 до 50% заполнения.   
while(OCR0A<0x7f)
    {
    OCR0A=OCR0A+0x01;
    delay_ms(10); //время увеличения шим
    }     

//Выполняем условие опроса входа, если на порту 3 лог 1 то заполнение 50%, в противном случае происходит заполнение
     
     if (PINB.3==1)
         
     {
     delay_ms(5); //Задержка при увеличении
     if (OCR0A<0xff)
     OCR0A=OCR0A+0x01; //Прибавляем на единицу
     }
         
     else
     
     {
     OCR0A=0x7f; //Сброс до 50%
     }



Все бы ничего. При нажатии ШИМ растет, при отпускании не возвращается (как сделать чтобы вернулся в 50%).

Update: Забыл резистор к земле подтянуть ))) Все работает.
Последний раз редактировалось a.garkin Вт дек 27, 2016 14:02:43, всего редактировалось 1 раз.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

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

levaclaus писал(а):Есть Attiny13 c 1024 байт памяти, и есть код, который ужимается до 1040 байт
А в чём проблема то, если код до килобайта ужимается ?
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

Аlex писал(а):А в чём проблема то
1040 > 1024 :)))
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

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

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

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

С просони цифры попутал :))) Прошу пардону... :oops:
Тогда да, самописный код работы с датчиком, скорее всего, спасёт. Благо примеров в тырнете - как грязи...
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

по идее 16 байт можно выгадать на исключении задержек в spi - зачем они там? ну и если поэкспериментировать с самим алгоритмом - зачем, например, по 2 параметра в spi передавать, может по 1 будет оптимальнее... это игры в мозаику.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
*Trigger*
Друг Кота
Сообщения: 3059
Зарегистрирован: Пн май 11, 2009 14:15:00
Откуда: СПб

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

Сообщение *Trigger* »

levaclaus писал(а):Комрады, помогите впихнуть невнихуемое. Есть Attiny13 c 1024 байт памяти, и есть код, который в cvavr 3,12 ужимается до 1040 байт. Или может есть легкая библиотека для ds18b20

Библиотека DS18B20 в CVAVR использует float, когда можно обойтись фиксированной точкой. Ниже функция получения температуры, выдающая результат в виде 10*t, где t - измеренная температура. Например, если t=27,3 C, то функция вернёт значение 273.

Использовать совместно со стандартной библиотекой, т.е. просто вставить в начало кода после #include, а #include не убирать.

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

#include <ds18b20.h>
// temp. conversion time [ms] depending on the resolution
static flash int conv_delay[4]={100,200,400,800};
// valid temp. bit mask depending on the resolution
static flash unsigned bit_mask[4]={0xFFF8,0xFFFC,0xFFFE,0xFFFF};
signed int my_ds18b20_temperature(unsigned char *addr)
{
unsigned char resolution;
if (ds18b20_read_spd(addr)==0) return -9999;
resolution=(__ds18b20_scratch_pad.conf_register>>5) & 3;
if (ds18b20_select(addr)==0) return -9999;
w1_write(0x44);
delay_ms(conv_delay[resolution]);
if (ds18b20_read_spd(addr)==0) return -9999;
w1_init();
return ((*((int *) &__ds18b20_scratch_pad.temp_lsb) & ((int) bit_mask[resolution]))*5/8);
}


Отрицательные числа обрабатываются корректно, никакие магические вычитания из 4096 не нужны. Кстати, для постановки знака "минус" есть оператор "унарный минус", т.е. вместо

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

temp=-1*temp;

можно писать

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

temp=-temp;


Ещё можно уменьшить размер, заменив тип int у d1 - d4 на char. В настройках проекта снять галочку "Promote char to int" (Project -> Configure -> C Compiler -> Code Generation).

Возможно, ещё сэкономить можно тут:

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

if ((data_l&(0b10000000)) == 0b10000000)

написав

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

if (data_l&(1<<7))

Эта конструкция компилятором преобразуется в более компактный ассемблерный код. Аналогично с data_h.

P.S. Я полностью переработал в своё время библиотеку DS18B20, тоже была нехватка памяти. Ниже моя версия.
my_ds18b20_lib.rar
(1.97 КБ) 174 скачивания

Она была оптимизирована для работы с прерываниями, теперь преобразование отдельно запускается отдельной функцией, потом можно проверить его готовность, а затем прочитать данные ещё одной функцией. Классическое чтение температуры тоже осталось. Если у Вас только один датчик, то сильно уменьшается объём кода, если в Project -> Configure -> C Compiler -> Globally #define написать строчку ONE_DS18b20. При этом все функции перестают иметь аргумент адреса.
Этот пост оказался полезен? Не поленись, нажми Изображение слева!
:) :)) :)))
Куплю индикаторы ИТС-1А, ИТС-1Б, ИГВ1-8х5Л, ИГПС1-222/7, ИГПС1-111/7 и подобные.
Аватара пользователя
levaclaus
Потрогал лапой паяльник
Сообщения: 302
Зарегистрирован: Пн янв 07, 2008 16:56:28
Откуда: Минск

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

Сообщение levaclaus »

Убрал задержки в spi();
Сделал unsigned char d1, d2, d3, d4;
Заменил в spi(); "if (data_h&(1<<7))"
Получилось 1004 байта, 98% flash.
Аватара пользователя
rxstart1
Вымогатель припоя
Сообщения: 508
Зарегистрирован: Пт фев 22, 2013 18:00:43
Откуда: Беларусь, г. Гомель

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

Сообщение rxstart1 »

levaclaus писал(а):Убрал задержки в spi();
Сделал unsigned char d1, d2, d3, d4;
Заменил в spi(); "if (data_h&(1<<7))"
Получилось 1004 байта, 98% flash.


Можешь попробовать так
typedef struct s
{
unsigned d1 : 1;
unsigned d2 : 1;
unsigned d3 : 1;
unsigned d4 : 1;
}t;

t d;
обращаться соответственно d.d1=1;
переменная d занимает 4 бита
Ответить

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