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

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

Сообщение ARV »

Yellow Tiger писал(а):Что-то я не пойму... Эти символы - константы, то есть, во время работы не меняются, так нафига же их генерировать каким-то алгоритмом? :?
линия может быть наклонной под разными углами?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
Sounds
Прорезались зубы
Сообщения: 238
Зарегистрирован: Вт май 27, 2008 23:23:24

Сообщение Sounds »

УРАААААААА!!!!!!!!!!!!! :))
Получилось!!!!!!!!!!!!!!! :)
Вот исходник:

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

typedef unsigned char byte;
 int g,z,x,v;
flash byte char0[5][8]={
{
0b000000000,
0b000000000,
0b000000000,
0b000010000,
0b000000000,
0b000000000,
0b000000000,
0b000000000
},
{
0b000000000,
0b000000000,
0b000000000,
0b000011000,
0b000000000,
0b000000000,
0b000000000,
0b000000000
},
{
0b000000000,
0b000000000,
0b000000000,
0b000011100,
0b000000000,
0b000000000,
0b000000000,
0b000000000
},
{
0b000000000,
0b000000000,
0b000000000,
0b000011110,
0b000000000,
0b000000000,
0b000000000,
0b000000000
},
{
0b000000000,
0b000000000,
0b000000000,
0b000011111,
0b000000000,
0b000000000,
0b000000000,
0b000000000
}
};
void define_char(byte flash *pc,byte char_code)
{
byte i,a;
a=(char_code<<3) | 0x40;
for (i=0; i<8; i++) lcd_write_byte(a++,*pc++);
}
void main(void)
{
lcd_init(16);

for(z=0; z<5; z++){
define_char(char0[z],z);
}
 for (g=0; g<10; g++){
 v=g+3;
 for(x=0; x<5; x++){
  delay_ms(500);
  lcd_gotoxy(v,1);
lcd_putchar(x);
}
}
}

Осталось теперь его оптимизировать, кто в этом может помочь?
:))
Аватара пользователя
Sounds
Прорезались зубы
Сообщения: 238
Зарегистрирован: Вт май 27, 2008 23:23:24

Сообщение Sounds »

Ну что у кого какие соображения по оптимизации?
Мне кажется надо вначале оптимизировать вот этот кусок:

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

flash byte char0[5][8]={
{
0b000000000,
0b000000000,
0b000000000,
0b000010000,
0b000000000,
0b000000000,
0b000000000,
0b000000000
},
{
0b000000000,
0b000000000,
0b000000000,
0b000011000,
0b000000000,
0b000000000,
0b000000000,
0b000000000
},
{
0b000000000,
0b000000000,
0b000000000,
0b000011100,
0b000000000,
0b000000000,
0b000000000,
0b000000000
},
{
0b000000000,
0b000000000,
0b000000000,
0b000011110,
0b000000000,
0b000000000,
0b000000000,
0b000000000
},
{
0b000000000,
0b000000000,
0b000000000,
0b000011111,
0b000000000,
0b000000000,
0b000000000,
0b000000000
}
};

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

Сообщение ARV »

да тут оптимизировать легко, надо только массив в ОЗУ перенести :)

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

byte char0[8]={ 
   0b000000000,
   0b000000000,
   0b000000000,
   0b000010000,
   0b000000000,
   0b000000000,
   0b000000000,
   0b000000000
}

unsigned char i;
for(i=0;i *меньше* 5; i++){
   // тут выводим единственный символ
   // а затем его модифицируем
   char0[3] |= char0[3] *сдвиг вправо* 1;
}
смысл вот в чем: зачем такой большой массив, если у вас от раза к разу меняется только один байт?! вот и меняйте только его!

да поправьте же наконец скрипт вставки кода!!!
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
Sounds
Прорезались зубы
Сообщения: 238
Зарегистрирован: Вт май 27, 2008 23:23:24

Сообщение Sounds »

To ARV
Спасибо что не отказали в помощи!
Если честно, то я не совсем понял как это сделать(((
Последний раз редактировалось Sounds Вт апр 14, 2009 14:58:04, всего редактировалось 1 раз.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

Sounds писал(а):To AVR
Спасибо что не отказали в помощи!
Если честно, то я не совсем понял как это сделать(((
возможно, мы не поняли друг друга оба.

я понял так: вы берете первый символ (который состоит из 8 байт) из вашего массива, выводите его в индикатор, потом выводите второй, третий и т.д. верно? если посмотреть, то все ваши 5 символов отличаются друг от друга всего-навсего одним байтом, причем байт этот содержит в первом символе один бит, во втором два рядом, в третьем три рядом и т.д.

я думаю, что иметь массив из 5 символов, которые практически одинаковы, нет смысла - можно просто менять один байт в символе и получать новый символ. но менять символы во FLASH не выйдет (прямо так уж просто), следовательно, переносим массив символа в ОЗУ и затем модифицируем его.

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

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

что не понятно теперь? мне вот непонятно, когда будет скрипт форума откорректирован, чтобы можно было наконец код вставлять без извратов?!
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
Yellow Tiger
Сверлит текстолит когтями
Сообщения: 1148
Зарегистрирован: Вт июл 08, 2008 12:24:17

Сообщение Yellow Tiger »

ARV писал(а):линия может быть наклонной под разными углами?
По условию задачи, не может:
Sounds писал(а):Есть ЖК модуль ... на котором надо плавно начертить горизонтальную полоску.
anco
Открыл глаза
Сообщения: 57
Зарегистрирован: Вс фев 15, 2009 21:12:36

Сообщение anco »

ikarab писал(а):
anco писал(а): WDTON=1

Наверно вы выключили сторожевую собаку.


WDTON=1 - это включена не всегда.
Она отключена фьзом, но программно то я ее включаю.
Аватара пользователя
Sounds
Прорезались зубы
Сообщения: 238
Зарегистрирован: Вт май 27, 2008 23:23:24

Сообщение Sounds »

To ARV
Теперь я вроде понял мысль!!!, сегодня вечерком приеду с работы и попробую!)))[/i]
Аватара пользователя
Sounds
Прорезались зубы
Сообщения: 238
Зарегистрирован: Вт май 27, 2008 23:23:24

Сообщение Sounds »

To ARV
чего-то у меня нехрина не получается!(твой вариант тоже)
Я представляю это вот так:

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

byte char0[8]={ 
0b000000000,
0b000000000,
0b000000000,
0b000010000,
0b000000000,
0b000000000,
0b000000000,
0b000000000
};
for(p=0; p *меньше* 5; p++){
 char0[p][3]= char0[3] *сдвиг вправо* 1;
}

Но однако так не получается!(((

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

Сообщение ARV »

Sounds писал(а):To ARV
чего-то у меня нехрина не получается!(твой вариант тоже)
Я представляю это вот так:

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

byte char0[8]={ 
0b000000000,
0b000000000,
0b000000000,
0b000010000,
0b000000000,
0b000000000,
0b000000000,
0b000000000
};
for(p=0; p *меньше* 5; p++){
 char0[p][3]= char0[3] *сдвиг вправо* 1;
}

Но однако так не получается!(((

Администраторы! Исправьте скрипт! С добавкой кода действительно проблема!
во-первых, в цикле должен быть вывод символа, а не просто перелопачивание его без смысла.
во-вторых, посмотри внимательно, как именно я предлагал сделать изменение символа: индексировать элементы массива (ни с того ни с сего ставшего вдруг двумерным!) не нужно, и надо делать ИЛИ с присваиванием, а не просто присваивание...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
alx_2009
Родился
Сообщения: 7
Зарегистрирован: Пн мар 30, 2009 19:59:50

Сообщение alx_2009 »

anco писал(а):Что то или я дико торможу или контроллер.
Написал 3 строчки кода, зашил его, начал эксперементировать и стал чувствовать себя еще хуже...
В прикрепленном файле, если его залить в контроллер, вачдог настроен на ресет через 1 сек. По идее портВ всегда должн быть равен 0xFF. Программа даже не должна доходить до главного цикла, но диод на портуВ моргает с постоянной периодичностью в 1 сек! :shock: Ресета не происходит... :cry:
Помогите плз, а то уже крыша едет.
WDTON=1

PS Может проектом подобным в меня кините (заведомо рабочим), что бы или себя потестировать или контроллер.


Вот что написано хелпе на функцию delay_ms:
"This function automatically resets the watchdog timer every 1ms by generating the wdr instruction."
"Эта функция автоматически производит сброс wdt каждую 1 мс инструкцией "wdr" "

Программа у вас никогда не сбросится по wdt. Может это поможет.
Аватара пользователя
Sounds
Прорезались зубы
Сообщения: 238
Зарегистрирован: Вт май 27, 2008 23:23:24

Сообщение Sounds »

To ARV
Ура!!! Вроде получилось. Спасибо тебе!!! Посмотри пожалуйсто исходник:

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

typedef unsigned char byte; 
 int g,z,x,v;
byte char0[8]={
 
0b000000000,
0b000000000,
0b000000000,
0b000010000,
0b000000000,
0b000000000,
0b000000000,
0b000000000
};

void define_char(byte *pc,byte char_code)
{
byte i,a;
a=(char_code<<3) | 0x40;
for (i=0; i<8; i++) lcd_write_byte(a++,*pc++);
}
void main(void)
{
lcd_init(16);

for(z=0; z<5; z++){
char0[3] |= char0[3]*сдвиг*1;
define_char(char0,z);
}
 for (g=0; g<10; g++){
 v=g+3;
 for(x=0; x<5; x++){
  delay_ms(500);
  lcd_gotoxy(v,1);
lcd_putchar(x);
}
}
}

Однако долго до меня это доходило=)))
Кстати в этом варианте кода, я обратил внимание на то что при переходе к другой ячейки наблюдается какаято задержка(пауза)!
Я пока не разобрался из за чего она возникла, может есть какие мысли?
Аватара пользователя
Sounds
Прорезались зубы
Сообщения: 238
Зарегистрирован: Вт май 27, 2008 23:23:24

Сообщение Sounds »

То ARV
Всё вроде решил проблемму с задержкой:

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

for(z=0; z<5; z++){
if(z!=0){
char0[3] |= char0[3]*сдвиг*1;
}
define_char(char0,z);
}

Спасибо за помощь!
Аватара пользователя
Sounds
Прорезались зубы
Сообщения: 238
Зарегистрирован: Вт май 27, 2008 23:23:24

Сообщение Sounds »

Опять у меня появилась очередная задумка! Вот теперь думаю как зделать управление этой строкой от кнопок, то есть нажал одну кнопку прибавилась на 2, другую убавилось на два.
Как граматней это будет реализовать?
Lockdog
Встал на лапы
Сообщения: 101
Зарегистрирован: Вт июл 15, 2008 19:29:21
Контактная информация:

Сообщение Lockdog »

Мне надо проверять состояния на ножках PIND.2 и PIND.3 одновременно и выполнять действия, работает только первый условный оператор, остальные нет. Что не так?

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

if ((PIND.2!=0x00) & (PIND.3!=0x00)) {
lcd_gotoxy(0,1);
lcd_putsf("1");
lcd_gotoxy(15,1);
lcd_putsf("1");
}

if ((PIND.2 & 0x00) & (PIND.3 & 0x00)) {
lcd_gotoxy(0,1);
lcd_putsf("0");
lcd_gotoxy(15,1);
lcd_putsf("0");
}

if ((PIND.2 & !0x00) & (PIND.3 & 0x00)) {
lcd_gotoxy(0,1);
lcd_putsf("1");
lcd_gotoxy(15,1);
lcd_putsf("0");
}

if ((PIND.2 & 0x00) & (PIND.3 & !0x00)) {
lcd_gotoxy(0,1);
lcd_putsf("0");
lcd_gotoxy(15,1);
lcd_putsf("1");
}
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

курите разницу между & и &&, а так же работу оператора if
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
Yellow Tiger
Сверлит текстолит когтями
Сообщения: 1148
Зарегистрирован: Вт июл 08, 2008 12:24:17

Сообщение Yellow Tiger »

Lockdog писал(а):работает только первый условный оператор, остальные нет. Что не так?
Да все они работают, просто условия в if'ах со второго по третий тождественно равны false (на это ARV и намекал), вот ничего и не происходит.
Конструкции типа if (var != false){...} или if (var == true){...} я бы рекомендовал заменять на if ( var ){...}, это логичнее. Конструкции типа if ((PIND.2 & !0x00) бессмысленны, так как выражение !0x00 не имеет никакого конкретного численного значения - известно только, что это не ноль, а что именно - неизвестно. Там и 1 может оказаться, и 32767, и три с половиной (шучу) - и что потом делать с побитовым или с неизвестной величиной? 8)
И последнее - всю эту длинноту нужно бы свести к двум переменным, отражающим состояние входов, и двум операторам вывода. Смешивать две разные переменные в кучу, с получением четырех сочетаний, и потом городить четыре ИФа и восемь операторов вывода - как-то некузяво; если спустя месяц-два придется вносить дополнения, эту логику с карандашиком проверять придется.

ARV писал(а):курите разницу между & и &&,...
А, кстати, это не глюк ли местного тега [соde]? :idea:
Аватара пользователя
Sounds
Прорезались зубы
Сообщения: 238
Зарегистрирован: Вт май 27, 2008 23:23:24

Сообщение Sounds »

Yellow Tiger писал(а):А, кстати, это не глюк ли местного тега [соde]? :idea:

Возможно! Ты думаешь он вырезал один символ &?
Аватара пользователя
Yellow Tiger
Сверлит текстолит когтями
Сообщения: 1148
Зарегистрирован: Вт июл 08, 2008 12:24:17

Сообщение Yellow Tiger »

Проверим:

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

Кот && Кошка == Кот и Кошка
Кот & Кошка == Кот, Кошка и Котенок
Нет, такого глюка он не содержит...
Ответить

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