линия может быть наклонной под разными углами?Yellow Tiger писал(а):Что-то я не пойму... Эти символы - константы, то есть, во время работы не меняются, так нафига же их генерировать каким-то алгоритмом?
CodeVision AVR в вопросах и ответах
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
УРАААААААА!!!!!!!!!!!!!
Получилось!!!!!!!!!!!!!!!
Вот исходник:
Осталось теперь его оптимизировать, кто в этом может помочь?

Получилось!!!!!!!!!!!!!!!
Вот исходник:
Код: Выделить всё
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);
}
}
}
Осталось теперь его оптимизировать, кто в этом может помочь?
Ну что у кого какие соображения по оптимизации?
Мне кажется надо вначале оптимизировать вот этот кусок:
Какие могут быть идеи?
Мне кажется надо вначале оптимизировать вот этот кусок:
Код: Выделить всё
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
- Откуда: Новочеркасск
- Контактная информация:
да тут оптимизировать легко, надо только массив в ОЗУ перенести
смысл вот в чем: зачем такой большой массив, если у вас от раза к разу меняется только один байт?! вот и меняйте только его!
да поправьте же наконец скрипт вставки кода!!!
Код: Выделить всё
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;
}
да поправьте же наконец скрипт вставки кода!!!
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
To ARV
Спасибо что не отказали в помощи!
Если честно, то я не совсем понял как это сделать(((
Спасибо что не отказали в помощи!
Если честно, то я не совсем понял как это сделать(((
Последний раз редактировалось Sounds Вт апр 14, 2009 14:58:04, всего редактировалось 1 раз.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
возможно, мы не поняли друг друга оба.Sounds писал(а):To AVR
Спасибо что не отказали в помощи!
Если честно, то я не совсем понял как это сделать(((
я понял так: вы берете первый символ (который состоит из 8 байт) из вашего массива, выводите его в индикатор, потом выводите второй, третий и т.д. верно? если посмотреть, то все ваши 5 символов отличаются друг от друга всего-навсего одним байтом, причем байт этот содержит в первом символе один бит, во втором два рядом, в третьем три рядом и т.д.
я думаю, что иметь массив из 5 символов, которые практически одинаковы, нет смысла - можно просто менять один байт в символе и получать новый символ. но менять символы во FLASH не выйдет (прямо так уж просто), следовательно, переносим массив символа в ОЗУ и затем модифицируем его.
любая последовательность однотипных действий легко реализуется циклом. в цикле мы выводим наш теперь уже единственный символ, потом изменяем в нем нужный байт (добавляя по одному биту в ряд).
в коде я заменил операторы языка Си на слова человеческого языка, помещенные между звездочек - эту отсебятину вы должны заменить на правильный оператор Си - для сдвига и т.п.
что не понятно теперь? мне вот непонятно, когда будет скрипт форума откорректирован, чтобы можно было наконец код вставлять без извратов?!
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Yellow Tiger
- Сверлит текстолит когтями
- Сообщения: 1148
- Зарегистрирован: Вт июл 08, 2008 12:24:17
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
- Откуда: Новочеркасск
- Контактная информация:
во-первых, в цикле должен быть вывод символа, а не просто перелопачивание его без смысла.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;
}
Но однако так не получается!(((
Администраторы! Исправьте скрипт! С добавкой кода действительно проблема!
во-вторых, посмотри внимательно, как именно я предлагал сделать изменение символа: индексировать элементы массива (ни с того ни с сего ставшего вдруг двумерным!) не нужно, и надо делать ИЛИ с присваиванием, а не просто присваивание...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
anco писал(а):Что то или я дико торможу или контроллер.
Написал 3 строчки кода, зашил его, начал эксперементировать и стал чувствовать себя еще хуже...
В прикрепленном файле, если его залить в контроллер, вачдог настроен на ресет через 1 сек. По идее портВ всегда должн быть равен 0xFF. Программа даже не должна доходить до главного цикла, но диод на портуВ моргает с постоянной периодичностью в 1 сек!Ресета не происходит...
![]()
Помогите плз, а то уже крыша едет.
WDTON=1
PS Может проектом подобным в меня кините (заведомо рабочим), что бы или себя потестировать или контроллер.
Вот что написано хелпе на функцию delay_ms:
"This function automatically resets the watchdog timer every 1ms by generating the wdr instruction."
"Эта функция автоматически производит сброс wdt каждую 1 мс инструкцией "wdr" "
Программа у вас никогда не сбросится по wdt. Может это поможет.
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);
}
}
}
Однако долго до меня это доходило=)))
Кстати в этом варианте кода, я обратил внимание на то что при переходе к другой ячейки наблюдается какаято задержка(пауза)!
Я пока не разобрался из за чего она возникла, может есть какие мысли?
То ARV
Всё вроде решил проблемму с задержкой:
Спасибо за помощь!
Всё вроде решил проблемму с задержкой:
Код: Выделить всё
for(z=0; z<5; z++){
if(z!=0){
char0[3] |= char0[3]*сдвиг*1;
}
define_char(char0,z);
}
Спасибо за помощь!
-
Lockdog
- Встал на лапы
- Сообщения: 101
- Зарегистрирован: Вт июл 15, 2008 19:29:21
- Контактная информация:
Мне надо проверять состояния на ножках 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
- Откуда: Новочеркасск
- Контактная информация:
курите разницу между & и &&, а так же работу оператора if
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Yellow Tiger
- Сверлит текстолит когтями
- Сообщения: 1148
- Зарегистрирован: Вт июл 08, 2008 12:24:17
Да все они работают, просто условия в if'ах со второго по третий тождественно равны false (на это ARV и намекал), вот ничего и не происходит.Lockdog писал(а):работает только первый условный оператор, остальные нет. Что не так?
Конструкции типа if (var != false){...} или if (var == true){...} я бы рекомендовал заменять на if ( var ){...}, это логичнее. Конструкции типа if ((PIND.2 & !0x00) бессмысленны, так как выражение !0x00 не имеет никакого конкретного численного значения - известно только, что это не ноль, а что именно - неизвестно. Там и 1 может оказаться, и 32767, и три с половиной (шучу) - и что потом делать с побитовым или с неизвестной величиной?
И последнее - всю эту длинноту нужно бы свести к двум переменным, отражающим состояние входов, и двум операторам вывода. Смешивать две разные переменные в кучу, с получением четырех сочетаний, и потом городить четыре ИФа и восемь операторов вывода - как-то некузяво; если спустя месяц-два придется вносить дополнения, эту логику с карандашиком проверять придется.
А, кстати, это не глюк ли местного тега [соde]?ARV писал(а):курите разницу между & и &&,...
- Yellow Tiger
- Сверлит текстолит когтями
- Сообщения: 1148
- Зарегистрирован: Вт июл 08, 2008 12:24:17
Проверим:
Нет, такого глюка он не содержит...
Код: Выделить всё
Кот && Кошка == Кот и Кошка
Кот & Кошка == Кот, Кошка и Котенок