Страница 39 из 421

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

Добавлено: Вт апр 14, 2009 12:52:49
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); 
}
}
}
Осталось теперь его оптимизировать, кто в этом может помочь?
:))

Добавлено: Вт апр 14, 2009 13:32:45
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
}
};
Какие могут быть идеи?

Добавлено: Вт апр 14, 2009 14:04:44
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;
}
смысл вот в чем: зачем такой большой массив, если у вас от раза к разу меняется только один байт?! вот и меняйте только его!

да поправьте же наконец скрипт вставки кода!!!

Добавлено: Вт апр 14, 2009 14:27:32
Sounds
To ARV
Спасибо что не отказали в помощи!
Если честно, то я не совсем понял как это сделать(((

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

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

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

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

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

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

Добавлено: Вт апр 14, 2009 15:44:45
Yellow Tiger
ARV писал(а):линия может быть наклонной под разными углами?
По условию задачи, не может:
Sounds писал(а):Есть ЖК модуль ... на котором надо плавно начертить горизонтальную полоску.

Добавлено: Вт апр 14, 2009 17:48:34
anco
ikarab писал(а):
anco писал(а): WDTON=1
Наверно вы выключили сторожевую собаку.
WDTON=1 - это включена не всегда.
Она отключена фьзом, но программно то я ее включаю.

Добавлено: Ср апр 15, 2009 11:57:18
Sounds
To ARV
Теперь я вроде понял мысль!!!, сегодня вечерком приеду с работы и попробую!)))[/i]

Добавлено: Чт апр 16, 2009 00:19:34
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; 
}
Но однако так не получается!(((

Администраторы! Исправьте скрипт! С добавкой кода действительно проблема!

Добавлено: Чт апр 16, 2009 07:02:29
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; 
}
Но однако так не получается!(((

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

Добавлено: Чт апр 16, 2009 15:28:58
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. Может это поможет.

Добавлено: Пт апр 17, 2009 00:12:29
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); 
} 
} 
}
Однако долго до меня это доходило=)))
Кстати в этом варианте кода, я обратил внимание на то что при переходе к другой ячейки наблюдается какаято задержка(пауза)!
Я пока не разобрался из за чего она возникла, может есть какие мысли?

Добавлено: Пт апр 17, 2009 01:25:57
Sounds
То ARV
Всё вроде решил проблемму с задержкой:

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

for(z=0; z<5; z++){
if(z!=0){
char0[3] |= char0[3]*сдвиг*1; 
}
define_char(char0,z); 
} 
Спасибо за помощь!

Добавлено: Сб апр 18, 2009 00:05:33
Sounds
Опять у меня появилась очередная задумка! Вот теперь думаю как зделать управление этой строкой от кнопок, то есть нажал одну кнопку прибавилась на 2, другую убавилось на два.
Как граматней это будет реализовать?

Добавлено: Пн апр 20, 2009 09:33:28
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");
}

Добавлено: Пн апр 20, 2009 10:23:34
ARV
курите разницу между & и &&, а так же работу оператора if

Добавлено: Пн апр 20, 2009 11:37:57
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:

Добавлено: Пн апр 20, 2009 12:55:15
Sounds
Yellow Tiger писал(а):А, кстати, это не глюк ли местного тега [соde]? :idea:
Возможно! Ты думаешь он вырезал один символ &?

Добавлено: Пн апр 20, 2009 13:33:04
Yellow Tiger
Проверим:

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

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