CodeVision AVR в вопросах и ответах
- Сообщения: 19
- Зарегистрирован: Вт апр 06, 2010 09:50:34
Прошу прощения, а откуда можно поиметь сей чудный int64_t из библиотеки inttypes?
- Реклама
- Сообщения: 702
- Зарегистрирован: Пт мар 06, 2009 18:22:23
master_74 из AVR-GCC (Winavr), и вместе с ним. Без переделки в CVAVR работать не будет, и с переделкой всё упрётся в тот-же long long int. К сожалению, нет ни одной новой, нормальноломанной версии CVAVR (мне по крайней мере не попадалось).
- Сообщения: 812
- Зарегистрирован: Ср мар 18, 2009 21:14:33
Так стоит вообще переходить с 1.25.5 , 1.25.9 на 2.05 ? В чём могут быть трудности?
- Сообщения: 702
- Зарегистрирован: Пт мар 06, 2009 18:22:23
demiurg301
Если старая версия работает стабильно, и если не собираетесь применять более новые МК- ИМХО смысла нет.
Ничто не мешает конечно и обе установить. У меня так и сделано.
Если старая версия работает стабильно, и если не собираетесь применять более новые МК- ИМХО смысла нет.
Ничто не мешает конечно и обе установить. У меня так и сделано.
- Сообщения: 812
- Зарегистрирован: Ср мар 18, 2009 21:14:33
Новые МК не применяю. Но 1.25.5 малёха задолбала своей глюкавостью. Особенно когда много вложеных циклов и условий.Volly писал(а):demiurg301
Если старая версия работает стабильно, и если не собираетесь применять более новые МК- ИМХО смысла нет.
Ничто не мешает конечно и обе установить. У меня так и сделано.
Сейчас например парюсь с непонятным обнулением счётчика. ЗАметил ЛАГ , который вылазит очень часто.
Вот такая конструкция:
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. При этом если менять местами переменные может быть задета другая. Оптимизатор прикалывается?
- Реклама
Доброго времени суток! Подскажите такой вопрос что дает слово flash ? Если я например пишу flash int имя переменной , а потом пытаюсь ее изменить компилятор сильно ругает мол нельзя так делать. Выходит это переменная только для чтения? Тогда в чем отличие от const int? Простите за тупой вопрос (просто читать 141 страницу по теме codevision влом да и в программировании я еще не очень а точнее чайник )
Муррр.
Приветствую многоуважаемые коты. У меня нарисовалась такая проблема. Есть заготовка проекта на ATMega32 и LCD S65(LPH8836). Дак вот, я застопорился с выводом 16 битного цвета. Конкретно, я не могу нормально закрасить область, тоесть заполняется не полностью (часть кода прилагаю). Обшарил кучу форумов, пересмотрел кучу проектов, но в которых был использован данный алгоритм, написаны в основном на IAR. А вот как его адаптировать его под CVAVR. Написать свой - ума не хватит. Может есть у кого наработки по данной проблеме, помогите.
- Вложения
-
- cod.txt
- (8.36 КБ) 209 скачиваний
Владимир
- Сообщения: 702
- Зарегистрирован: Пт мар 06, 2009 18:22:23
Cricket2107
Конечно не получится изменить. Вобщем flash- и есть константа, размещённая во FLASH- памяти, и может быть только глобальной.
const- может быть и локальной- размещённой в RAM- памяти, и глобальной- размещённой как в RAM, так и во FLASH (зависит от галочки "Store Global Constants in FLASH Memory" в свойствах компилятора). Некоторые функции в CVAVR заточены работать с константами объявленными только через flash (sprintf например).
Конечно не получится изменить. Вобщем flash- и есть константа, размещённая во FLASH- памяти, и может быть только глобальной.
const- может быть и локальной- размещённой в RAM- памяти, и глобальной- размещённой как в RAM, так и во FLASH (зависит от галочки "Store Global Constants in FLASH Memory" в свойствах компилятора). Некоторые функции в CVAVR заточены работать с константами объявленными только через flash (sprintf например).
Экспериментальным путём мне удалось определить максимальный размер закрашиваемой области, это 14х14. Если размеры области увеличивать, то закрашивание наоборот уменьшается. На фото есть две колонки. В левой закрашиваю 14х14, в правой 14х16. Получается как бы обратный эффект. Прикрепляю мой проект(если его можно так назвать), может кто посмотрит и подскажет, в каком направлении копать.
- Вложения
-
- 01.RAR
- (179.21 КБ) 152 скачивания
-
- Изображение 003-2.jpg
- (35.92 КБ) 280 скачиваний
Владимир
Ура! Победил я данную проблему. Конечно большое спасибо 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;
что само по себе логично. В результате всё получилось.
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;
что само по себе логично. В результате всё получилось.
Владимир
Есть ещё один вопрос. Допустим есть массив, состоящий из 9 кодов цвета для LCD. Как сделать перебор данных кодов от 0 до 8 например циклом For?
И ещё, как сделать градиентную заливку в определенно области?
И ещё, как сделать градиентную заливку в определенно области?
Владимир
может, стоило бы почитать букварь Си, а не стонать по форумам "помогите"? азы надо знать.vlad145 писал(а):Есть ещё один вопрос. Допустим есть массив, состоящий из 9 кодов цвета для LCD. Как сделать перебор данных кодов от 0 до 8 например циклом For?
битва с дураками проиграна, победители торжествуют. слава победителям!
Во первых, если бы в учебниках описывалась точно такая ситуация, я бы не спрашивал. Во вторых я не кричу помогите, а спрашиваю Вашего совета. Если не для этого, то для чего тогда форумы нужны - для обмена опытом. А так получается чтобы гнобить новичков.Мастер Ломастер писал(а):может, стоило бы почитать букварь Си, а не стонать по форумам "помогите"? азы надо знать.vlad145 писал(а):Есть ещё один вопрос. Допустим есть массив, состоящий из 9 кодов цвета для LCD. Как сделать перебор данных кодов от 0 до 8 например циклом For?
Короче, всего наилучшего, до свидания!
Владимир
в учебниках не описан цикл for? или в учебниках цикл рассматривается на примере перебора массива фамилий, а у вас массив цветов - значит, это не то? если бы в учебниках рассматривали ВСЕ варианты использования цикла for, то этот учебник выходил бы в виде многотомника и по сей день.vlad145 писал(а):если бы в учебниках описывалась точно такая ситуация, я бы не спрашивал.
и в каком же месте вы спрашивали совета? цитирую:vlad145 писал(а):Во вторых я не кричу помогите, а спрашиваю Вашего совета.
vlad145 писал(а):Есть ещё один вопрос. Допустим есть массив, состоящий из 9 кодов цвета для LCD. Как сделать перебор данных кодов от 0 до 8 например циклом For?
vlad145 писал(а):как сделать градиентную заливку в определенно области?
в какой из цитат есть вопрос о СОВЕТЕ? всюду - помогите, дайте, покажите, посмотрите... а СОВЕТ я вам дал - читать учебник и думать.vlad145 писал(а):Обшарил кучу форумов, пересмотрел кучу проектов, но в которых был использован данный алгоритм, написаны в основном на IAR. А вот как его адаптировать его под CVAVR. Написать свой - ума не хватит. Может есть у кого наработки по данной проблеме, помогите.
и каким опытом поделились вы? опытом лени и незнания?vlad145 писал(а):Если не для этого, то для чего тогда форумы нужны - для обмена опытом.
нет. но если вы хотите сесть на шею опытных товарищей и ехать - вас скинут. разобраться с циклом for - это вы должны сделать самостоятельно. как, собственно, и с int (ранее).vlad145 писал(а):А так получается чтобы гнобить новичков.
битва с дураками проиграна, победители торжествуют. слава победителям!
Добрый день многоуважаемые коты. Не хотел бы что бы мой вопрос посчитали оффтопом, но конкретной проблемы я что то не нашел на форуме, хотя некоторые идеи были...
Вот в чем проблема: Решил сделать часики себе, нет ничего особенного, схема типовая по даташиту, но никак не могу вывести считанную с часиков информацию на LCD (16х2). На индикаторе появляется все что угодно, но только не то что я ожидаю. Исходник привожу ниже что бы не быть голословным. Я подразумеваю что как то не так использую функцию sprintf. Если не трудно, подскажите пожалуйста, где и что или как нужно поменять, что бы показания стали нормальными. Заранее прошу меня простить, я тока учусь работе с AVR-ами.
Вот в чем проблема: Решил сделать часики себе, нет ничего особенного, схема типовая по даташиту, но никак не могу вывести считанную с часиков информацию на 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);
}
};
Если твое устройство не заработало, то не надо паниковать и нервничать. Отдохни, подумай, успокойся. А вдруг заметишь или догадаешься в чем была загвоздка. Глядишь и вскоре воскликнешь "УРА!!! ЗАРАБОТАЛО!!!" 
Здравствуйте.
Есть очень простая, по своей задумке, программка...
До конца не дописал, но уже есть ошибки при компиляции.
Ошибки вот такие:
Тоесть ругается на точки-запятые, начиная с "led_1=1;"...
Пару часов уже бьюсь над ними - безрезультатно.
На форумах похожее есть, говорят, что нужно настроить компилятор для понимания языка.
Подскажите, куда рыть? Глаза на лог лезут.
Если убрать у led_1=1; точку-запятую, но ругается тем же матом только на неё, остальные не видит...
PS. Есть мысль, что ВинАВР не корректно работает. Его можно как-то настроить?
Есть очень простая, по своей задумке, программка...
До конца не дописал, но уже есть ошибки при компиляции.
Код: Выделить всё
#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; точку-запятую, но ругается тем же матом только на неё, остальные не видит...
PS. Есть мысль, что ВинАВР не корректно работает. Его можно как-то настроить?
Только те, кто предпринимают абсурдные попытки, смогут достичь невозможного.
Вы уверены, что в студии поддерживается фича от 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); // гасим первый светодиод
}
}
}В поисках истины человек развивается.
vitalik_1984, огромное спасибо! Ваш код компилируется!
Правда я уже переделал программу под CVAVR (роднее она мне). Там попроще всё стало...
Но вашу версию обязательно рассмотрю, нужно же всесторонне развиваться)
Правда я уже переделал программу под CVAVR (роднее она мне). Там попроще всё стало...
Но вашу версию обязательно рассмотрю, нужно же всесторонне развиваться)
Только те, кто предпринимают абсурдные попытки, смогут достичь невозможного.
Снова вопрос у меня.
Программку написал до конца. В плане основновного своего назначения - сигнал определённой частоты и продолжительности на выходе, - работает нормально. Однако светодиоды, которые отвечают за сигнализацию выбраного режима - вообще невпопад работают!
Помогите!
Как должно быть: включаем устройство - горит первый светодиод (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 - никого...
Как-то очень странно работает... Сегодня соберу всё на соплях, авось нормально будет, но всё же вопрос актуален.
Программку написал до конца. В плане основновного своего назначения - сигнал определённой частоты и продолжительности на выходе, - работает нормально. Однако светодиоды, которые отвечают за сигнализацию выбраного режима - вообще невпопад работают!
Помогите!
Как должно быть: включаем устройство - горит первый светодиод (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 КБ) 368 скачиваний
Только те, кто предпринимают абсурдные попытки, смогут достичь невозможного.


