Вт янв 17, 2017 22:58:49
Зачем дергаете ногой "Е" в функции busy_flag()? И полная рекурсия там не нужна, достаточно проверять PIN7, до выхода из условия. Как, например, у Мурато Мяуконни сделано.ROMan2947 писал(а):2.Первую часть вопроса не понял
Ср янв 18, 2017 01:11:04
MOHCTEP писал(а):1 Это надо делать однократно, в вашем случае, по крайней мере.Зачем дергаете ногой "Е" в функции busy_flag()? И полная рекурсия там не нужна, достаточно проверять PIN7, до выхода из условия. Как, например, у Мурато Мяуконни сделано.ROMan2947 писал(а):2.Первую часть вопроса не понял
Мурато Мяуконни писал(а):
- Код:
if (PORT & P7)
это тоже абстрактность или вполне серьезный маневр? если маневр то прошу распинать его
- Код:
if (PORT & P7)
return 1;
else return 0;
Ср янв 18, 2017 06:54:06
надеюсь, вы понимаете, что рекурсия - это расход стека, который в AVR принципиально невозможно контролировать?ROMan2947 писал(а):С целью прослушки PIN7 до тех пор пока условие станет ложью.
Ср янв 18, 2017 07:01:40
что нужно проверять BF каждого полубайта
как я буду cчитывать PIND при чтении,если я однократно выставлю его на выход?
(PORT & P7) это тоже абстрактность или вполне серьезный маневр? если маневр то прошу распинать его
мне кажется здесь ретурны надо поменять нет?
while (CheckBSY)
{
if (++i > 500) return 1;
}
.а if я использовал вместо while из-за того, что
, но я не хочу заниматься копированием, а хочу найти и исправить ошибки в том,
LCD_PORT &= 0x00; // очищаем шину данных
LCD_PORT |= DATA; // бaйт данных
RUN_PORT |= E; // взводим строб
_delay_us(40);
RUN_PORT &= ~E; // команда на запись
_delay_us(40);
ARV писал(а):"пока условие станет ложью" - это в переводе на Си оператор while(!(условие));,.
Ср янв 18, 2017 11:08:32
Ср янв 18, 2017 12:20:19
Ср янв 18, 2017 13:35:41
Да нет его - профита особого. В недавнем холиваре ругали задержки, дескать это - не дзен. Однако, в начале инициализации, когда BF игнорится, хошь - не хошь, а задержки используются. Был разумный аргумент, что на серийном производстве можно нарваться на разброс параметров дисплея (аж в 3 раза! ), ну так и BF может подвеситься. Причем, если проблема с задержками выявится практически сразу, при первом включении, то BF может подложить свинью вполне себе и рандомно.scorpi_0n писал(а):Какой тогда с этого BF вообще профит?
Ср янв 18, 2017 14:23:27
ARV писал(а):надеюсь, вы понимаете, что рекурсия - это расход стека, который в AVR принципиально невозможно контролировать?
ARV писал(а):"пока условие станет ложью" - это в переводе на Си оператор while(!(условие));, рекурсия тут не нужна.
void busy_flag()
{
DDRD = 0x00; // порт D на вход
LCD_PORT = 0xFF; // включаем поддтяжку
RUN_PORT |= RW_read;
do
{
RUN_PORT |= E; // взводим строб
RUN_PORT &= ~E; // команда на чтение
} while (!(PIND&(1<<7)));
}
Мурато Мяуконни писал(а):Я уже не помню, давно 1602 не использовал. Но кажется там была какая-то фишка с интервалом в полубайтах. Или я уже че путаю. Кароч, если найду у себя в загашнике дисплейчик, или если найду свои старые проекты - проверю.
Мурато Мяуконни писал(а):Иногда проще переписать заново с чистого листа, и сразу по-новому, чем разбираться даже в собственной писанине, пытаясь переделать ее в правильность.
Мурато Мяуконни писал(а): а разве нельзя записать одним шагом напрямую:
Ср янв 18, 2017 14:45:53
конструкция имеет. только надо хорошенько разобраться с условием во while - вам надо, чтобы старший бит стал равным 0 или 1 для выхода из цикла? сейчас цикл закончится, если бит станет равным 1, а пока он равен 0 - цикл будет крутиться. если это не то, что вам надо - уберите восклицательный знак в скобках.ROMan2947 писал(а):данная конструкция имеет право на жизнь?
Ср янв 18, 2017 16:53:04
ARV писал(а):конструкция имеет. только надо хорошенько разобраться с условием во while - вам надо, чтобы старший бит стал равным 0 или 1 для выхода из цикла? сейчас цикл закончится, если бит станет равным 1, а пока он равен 0 - цикл будет крутиться. если это не то, что вам надо - уберите восклицательный знак в скобках
ARV писал(а):есть еще одно замечание. я не знаю, как на самом деле, но что-то мне подсказывает, что данные надо считывать во время активного строба Е, а не после того, как он будет убран. если мои подозрения верны, то цикл у вас не будет работать корректно.
Ср янв 18, 2017 17:30:36
Interfacing to the MPU
The HD44780U can send data in either two 4-bit operations or one 8-bit operation, thus allowing
interfacing with 4- or 8-bit MPUs.
· For 4-bit interface data, only four bus lines (DB4 to DB7) are used for transfer. Bus lines DB0 to DB3
are disabled. The data transfer between the HD44780U and the MPU is completed after the 4-bit data
has been transferred twice. As for the order of data transfer, the four high order bits (for 8-bit operation,
DB4 to DB7) are transferred before the four low order bits (for 8-bit operation, DB0 to DB3).
The busy flag must be checked (one instruction) after the 4-bit data has been transferred twice. Two
more 4-bit operations then transfer the busy flag and address counter data.
· For 8-bit interface data, all eight bus lines (DB0 to DB7) are used.
Figure 9 4-Bit Transfer Example
Ср янв 18, 2017 18:54:20
trengtor писал(а):Первым читаем старший нибл по стробу E, затем младший нибл по стробу E. После этого проверяем 4-й бит старшего нибла. И так далее, пока в нем не окажется нолик.
void busy_flag()
{
char BF=1;
DDRD = 0x00;
LCD_PORT = 0xFF;
RUN_PORT |= RW_read;
do
{
RUN_PORT |= E;
RUN_PORT &= ~E;
BF=PIND;
RUN_PORT |= E;
RUN_PORT &= ~E;
} while (BF&(1<<7));
}
Ср янв 18, 2017 19:10:18
ROMan2947 писал(а):
- Код:
LCD_PORT &= 0x00; // очищаем шину данных
LCD_PORT |= DATA; // бaйт данныхМурато Мяуконни писал(а): а разве нельзя записать одним шагом напрямую:
даже нужно,ну я как вы может не заметили пишу и так и не так помню как то раз выложил код написанный именно просто присваиванием в тему, и мне один "КОТ" сделал замечание
Ср янв 18, 2017 19:14:48
ROMan2947 писал(а):что-то этот дисплейчик меня не на шутку изводит
ведь могли б уже радоваться жизниARV писал(а):я вообще не понимаю, почему не применять готовые проверенные наработки?
Ср янв 18, 2017 20:05:59
ARV писал(а):ведь могли б уже радоваться жизни
Ср янв 18, 2017 20:16:17
Ср янв 18, 2017 20:41:31
void busy_flag()
{
char BF=1;
...
do
{
...
[b] BF=PIND;[/b] <---- чему равен PIND? чтобы цикл повторялся, у PIND в старшем разряде должна быть 1
...
} while ([b]BF&(1<<7[/b])); <--- цикл прекращается, если условие =0, и продолжается, если условие не равно 0.
}
Ср янв 18, 2017 23:52:30
Мурато Мяуконни писал(а):Вот тут:
- Код:
void busy_flag()
{
char BF=1;
...
do
{
...
[b] BF=PIND;[/b] <---- чему равен PIND? чтобы цикл повторялся, у PIND в старшем разряде должна быть 1
...
} while ([b]BF&(1<<7[/b])); <--- цикл прекращается, если условие =0, и продолжается, если условие не равно 0.
}
Как написал trengtor, нужно сначала принять оба полубайта, записывая их в промежуточную переменную, а затем в ней и проверить старший бит.
В промежуточную переменную надо не только принять, но и принять правильно, сдвинув старший полубайт на свое старшее место, а младший поместить тоже на своем месте. Либо просто принять старший полубайт и сохранить его в промежуточную переменную как есть, а следующий полубайт принять и отбросить. Затем в переменной, зная положение бита BF, проверить его.
Чт янв 19, 2017 13:35:40
Чт янв 19, 2017 15:13:55
void busy_flag()
{
//_delay_ms(1);
char BF=1;
DDRD = 0x00; // порт D на вход
LCD_PORT = 0xFF; // включаем поддтяжку
RUN_PORT |= RW;
RUN_PORT &= ~RS;
do
{
RUN_PORT |= E;
RUN_PORT &= ~E;
BF=PIND;
RUN_PORT |= E;
RUN_PORT &= ~E;
} while (BF&(1<<7));
}