CodeVision AVR в вопросах и ответах
Re: CodeVision AVR в вопросах и ответах
господа, у кого нибудь есть библиотека ssd1305 под CVAVR?
нужено ну просто не передать как, а гугл не ищет.
нужено ну просто не передать как, а гугл не ищет.
-
mar1lynmanson
- Первый раз сказал Мяу!
- Сообщения: 28
- Зарегистрирован: Чт ноя 22, 2012 00:35:51
- Откуда: г. Мариуполь, Украина
Re: CodeVision AVR в вопросах и ответах
Добрый день, как в CVAVR считать константу из флеш памяти?
Суть проблемы такова: имеется Atmega16 и графический дисплей, соответственно есть заготовки в виде констант в которых содержится графика и периодически их нужно выводить на дисплей, так вот они копируются в RAM и соответственно ее не хватает.
Поэтому и непонятно как считать напрямую из флеш, чтобы не занимать RAM впустую этими данными.
P.S.: Вроде разобрался, константы объявляем как "flash", создаем дополнительную переменную, в которую копируем данные из флеш, а потм уже спокойно с ней работаем. По крайней мере такой способ позволил освободить RAM, ну а потеря на времени на копирование из флеш во вспомогательную переменную а потом уже работа с ней - для меня пока не критична.
Суть проблемы такова: имеется 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 в вопросах и ответах
Тут почитайте и еще много где наверное написано.
-
mar1lynmanson
- Первый раз сказал Мяу!
- Сообщения: 28
- Зарегистрирован: Чт ноя 22, 2012 00:35:51
- Откуда: г. Мариуполь, Украина
Re: CodeVision AVR в вопросах и ответах
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 в вопросах и ответах
у вас на самом деле ЭТО компилируется в CVAVR?mar1lynmanson писал(а):Сделал как по ссылке при помощи #include <pgmspace.h>, объявления массива с данными с пометкой PROGMEM и доступом к данным через pgm_read_byte(&())
хотелось бы увидеть... ну и сообщения об ошибках тоже на многое могут открыть глаза.
это вообще ни о чем, так о проблемах не рассказывают, если хотят их решитьmar1lynmanson писал(а):вежливый посыл на ЙУХ и кучу ошибок
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
-
uk8amk
- Поставщик валерьянки для Кота
- Сообщения: 2222
- Зарегистрирован: Вт ноя 27, 2007 11:32:06
- Откуда: Tashkent
Re: CodeVision AVR в вопросах и ответах
CVAVR позволяет использовать указатели на область флеш. С ними код выходит более читабельный чем через pgmspace.
Искать во встроенной справке на тему Flash Pointers.
Искать во встроенной справке на тему Flash Pointers.
-
mar1lynmanson
- Первый раз сказал Мяу!
- Сообщения: 28
- Зарегистрирован: Чт ноя 22, 2012 00:35:51
- Откуда: г. Мариуполь, Украина
Re: CodeVision AVR в вопросах и ответах
ARV писал(а):у вас на самом деле ЭТО компилируется в CVAVR?mar1lynmanson писал(а):Сделал как по ссылке при помощи #include <pgmspace.h>, объявления массива с данными с пометкой PROGMEM и доступом к данным через pgm_read_byte(&())![]()
Уже нет. Смешно, но факт. На #include <pgmspace.h> - компилятор реагирует нормально, на pgm_read_byte(&()), а вот при попытке использовать PROGMEM указывает что не хватает знака ";"
Сегодня точно уже ничего не получится посмотреть, у меня уже шарики за ролики начинают заходить.
Самое обидно то, что на поставленный вопрос я так и не получил вменяемого ответа.
uk8amk писал(а):CVAVR позволяет использовать указатели на область флеш. С ними код выходит более читабельный чем через pgmspace.
Искать во встроенной справке на тему Flash Pointers.
Спасибо, но это я уже посмотрю завтра. Да и походу нужно сваливать с CVAVR потому как примеров на нем крайне мало в сети. А также он у меня пиратский потому может и глюкотню всякую выдает, потому как у меня не укладывается в уме как кусок кода может нормально работать в main функции и сыпать ошибками при попытке скопировать его в вспомогательную функцию.
С уважением Владимир.
- COKPOWEHEU
- Говорящий с текстолитом
- Сообщения: 1525
- Зарегистрирован: Чт июн 10, 2010 20:11:19
Re: CodeVision AVR в вопросах и ответах
Очень странно. Мне казалось, что cvavr вообще не должен переваривать pgmspace.h, в том числе PROGMEM. Или вы умудрились в среду вместо родного компилятора gcc прикрутить?!Уже нет. Смешно, но факт. На #include <pgmspace.h> - компилятор реагирует нормально, на pgm_read_byte(&()), а вот при попытке использовать PROGMEM указывает что не хватает знака ";"
Собственно, согласен с ARV: покажите код и ругань компилятора.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
одно из объяснений подобного поведения, может быть очень простым: автосохранение исходника при компиляции не включеноCOKPOWEHEU писал(а):Очень странно
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
-
mar1lynmanson
- Первый раз сказал Мяу!
- Сообщения: 28
- Зарегистрирован: Чт ноя 22, 2012 00:35:51
- Откуда: г. Мариуполь, Украина
Re: CodeVision AVR в вопросах и ответах
В общем этой ночью перетянул код с CVAVR в Atmel Studio 7.0 - все работает нормально, да и работать в ней пожалуй чутка удобней. Пожалуй на Atmel Studio и останусь, все равно я ей постоянно пользуюсь для заливки прошивки, потому как CVAVR у меня отказывается программировать через AVRISP MKII(настоящий не клон).
Ничего плохого про CVAVR сказать не хочу, просто ломаная версия наверно может подглючивать, а может я тупил.
Всем спасибо.
Ничего плохого про CVAVR сказать не хочу, просто ломаная версия наверно может подглючивать, а может я тупил.
Всем спасибо.
С уважением Владимир.
- levaclaus
- Потрогал лапой паяльник
- Сообщения: 302
- Зарегистрирован: Пн янв 07, 2008 16:56:28
- Откуда: Минск
Re: CodeVision AVR в вопросах и ответах
Комрады, помогите впихнуть невнихуемое. Есть 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 в вопросах и ответах
А самому слабо опросить датчик? Там в даташите все нормально описано, если не требуется большая точность показаний, то это не займет много места, потом вместо функций задержек можно использовать асм вставки и крутить пустой цикл, места 3 копейки скорость огого. Да и 4 переменные типа int вообще непонятно зачем???
-
a.garkin
- Нашел транзистор. Понюхал.
- Сообщения: 175
- Зарегистрирован: Вт сен 29, 2009 09:28:51
- Откуда: Ульяновск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Господа подскажите плиз по коду. Кнопка по +
Все бы ничего. При нажатии ШИМ растет, при отпускании не возвращается (как сделать чтобы вернулся в 50%).
Update: Забыл резистор к земле подтянуть ))) Все работает.
Код: Выделить всё
//При первом запуске идет плавное увеличение сигнала пота 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 в вопросах и ответах
А в чём проблема то, если код до килобайта ужимается ?levaclaus писал(а):Есть Attiny13 c 1024 байт памяти, и есть код, который ужимается до 1040 байт
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
1040 > 1024Аlex писал(а):А в чём проблема то
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
С просони цифры попутал
Прошу пардону...
Тогда да, самописный код работы с датчиком, скорее всего, спасёт. Благо примеров в тырнете - как грязи...
Тогда да, самописный код работы с датчиком, скорее всего, спасёт. Благо примеров в тырнете - как грязи...
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
по идее 16 байт можно выгадать на исключении задержек в spi - зачем они там? ну и если поэкспериментировать с самим алгоритмом - зачем, например, по 2 параметра в spi передавать, может по 1 будет оптимальнее... это игры в мозаику.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: CodeVision AVR в вопросах и ответах
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, тоже была нехватка памяти. Ниже моя версия.
Она была оптимизирована для работы с прерываниями, теперь преобразование отдельно запускается отдельной функцией, потом можно проверить его готовность, а затем прочитать данные ещё одной функцией. Классическое чтение температуры тоже осталось. Если у Вас только один датчик, то сильно уменьшается объём кода, если в Project -> Configure -> C Compiler -> Globally #define написать строчку ONE_DS18b20. При этом все функции перестают иметь аргумент адреса.
Этот пост оказался полезен? Не поленись, нажми
слева!

Куплю индикаторы ИТС-1А, ИТС-1Б, ИГВ1-8х5Л, ИГПС1-222/7, ИГПС1-111/7 и подобные.
слева!Куплю индикаторы ИТС-1А, ИТС-1Б, ИГВ1-8х5Л, ИГПС1-222/7, ИГПС1-111/7 и подобные.
- levaclaus
- Потрогал лапой паяльник
- Сообщения: 302
- Зарегистрирован: Пн янв 07, 2008 16:56:28
- Откуда: Минск
Re: CodeVision AVR в вопросах и ответах
Убрал задержки в spi();
Сделал unsigned char d1, d2, d3, d4;
Заменил в spi(); "if (data_h&(1<<7))"
Получилось 1004 байта, 98% flash.
Сделал 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 в вопросах и ответах
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 бита
