SortoVaritu 0 1 ноября, 2011 Опубликовано 1 ноября, 2011 · Жалоба В процедуре проверки флага думаю нужно инвертировать все E как и в основном коде по совету ILYAUL Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
failguru 0 1 ноября, 2011 Опубликовано 1 ноября, 2011 (изменено) · Жалоба Вот код #include <io.h> #include <delay.h> #define E PORTC.2 #define RS PORTC.0 #define RW PORTC.1 #define port PORTD int chkbf(){ // проверка флага занятости DDRD=0x00; port=0xff; RS=0; RW=1; E=0; delay_us(2); E=1; delay_us(2); E=0; return(PIND.7); } void wrcmd(int cmd){ // пишу команду DDRD=0xff; //while(chkbf()); RS=0; RW=0; E=0; delay_us(2); port=cmd; delay_us(2); E=1; delay_ms(2); E=0; } void wrsym(int sym){ // пишу символ DDRD=0xff; //while(chkbf()); RS=1; RW=0; E=1; port=sym; delay_us(2); E=0; delay_us(2); E=1; } void main(){ DDRC=0xff; PORTC=0x00; delay_ms(20); wrcmd(0b00110000); // инициализация delay_ms(5); wrcmd(0b00001110); delay_us(40); wrcmd(0b00000001); delay_ms(2); wrcmd(0b00000110); delay_us(40); wrsym(0x30); //пишу символ } Изменено 1 ноября, 2011 пользователем failguru Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SortoVaritu 0 1 ноября, 2011 Опубликовано 1 ноября, 2011 · Жалоба у вас в процедуре вывода символа E=1; port=sym; delay_us(2); E=0; delay_us(2); E=1; в процедуре проверки флага занятости E=0; delay_us(2); E=1; delay_us(2); E=0; Видите разницу? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
failguru 0 1 ноября, 2011 Опубликовано 1 ноября, 2011 · Жалоба загвоздка была в этом void wrcmd(int cmd){ // пишу команду [b]DDRD=0xff; while(chkbf());[/b] RS=0; RW=0; в проверке бизи флага я переключал порт на вход, а при записи команды переключение на выход было раньше проверки бизи флага))))) вот причесал код, все работает!!! #include <io.h> #include <delay.h> #define E PORTC.2 #define RS PORTC.0 #define RW PORTC.1 #define port PORTD int chkbf(){ // проверка флага занятости DDRD=0x00; port=0xff; RS=0; RW=1; E=1; delay_us(2); E=0; return(PIND.7); } void wrcmd(int cmd){ // пишу команду while(chkbf()); DDRD=0xff; RS=0; RW=0; E=1; port=cmd; delay_us(2); E=0; } void wrsym(int sym){ // пишу символ while(chkbf()); DDRD=0xff; RS=1; RW=0; E=1; port=sym; delay_us(2); E=0; } void main(){ DDRC=0xff; PORTC=0x00; delay_ms(20); wrcmd(0b00110000); // инициализация delay_ms(5); wrcmd(0b00001110); delay_us(40); wrcmd(0b00000001); delay_ms(2); wrcmd(0b00000110); delay_us(40); wrsym(0x30); //пишу символ } Спасибо, очень всем благодарен! Форум супер, первый раз тут :a14: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ILYAUL 0 1 ноября, 2011 Опубликовано 1 ноября, 2011 · Жалоба DDRD=0xff; это перенести в конец функции Busy в void wrcmd и void wrsym убрать Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
failguru 0 1 ноября, 2011 Опубликовано 1 ноября, 2011 · Жалоба нет, так не катит. если перенести в конец функции бизи - то это не учитывается т.к. после ретурна осуществляется возврат, а перед ретурном не имеет смысла, т.к. мне нужно прочитать 7ой бит. вот так) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ILYAUL 0 1 ноября, 2011 Опубликовано 1 ноября, 2011 · Жалоба нет, так не катит. если перенести в конец функции бизи - то это не учитывается т.к. после ретурна осуществляется возврат, а перед ретурном не имеет смысла, т.к. мне нужно прочитать 7ой бит. вот так) Ах , ну да.. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 2 ноября, 2011 Опубликовано 2 ноября, 2011 · Жалоба У вас в чтении bsy флага ошибка. Вот тут - E=1; delay_us(2); E=0; return(PIND.7); Вы должны прочесть PIND.7 до того, как сбросите E перед выходом из функции. У вас сейчас ваша функция читает бит 7 с уже отключенной шины LCD (и читает она оттуда всегда 1, т.к. в LCD шина притянута резисторами в 1) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SortoVaritu 0 2 ноября, 2011 Опубликовано 2 ноября, 2011 · Жалоба tDH=300 ns. Может успеть прочитать)))))))))))))))))))) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
failguru 0 2 ноября, 2011 Опубликовано 2 ноября, 2011 · Жалоба походу успевает, раз ноль читает с портд.7)))) частота кварца 8МГц, следовательно 125нс один такт, нормал. Либо нужно сделать паузу в 120нс после поднятия Е, если я правильно понимаю))))))))))))) а то не то может считать))) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SortoVaritu 0 2 ноября, 2011 Опубликовано 2 ноября, 2011 · Жалоба E выставляешь в 1. делаешь задержку на время нужное для выставления контроллером жки данных(смотри по даташиту), читай данные, E сбрасывай в 1. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
failguru 0 2 ноября, 2011 Опубликовано 2 ноября, 2011 (изменено) · Жалоба дк я и говорю в даташите максимум 120нс. с частотой кварца 8Мгц и > можно сделать как я, а так надо с задержкой в 120 нс припариться Изменено 3 ноября, 2011 пользователем failguru Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 3 ноября, 2011 Опубликовано 3 ноября, 2011 · Жалоба дк я и говорю в даташите максимум 120нс.Максимум - это не минимум. Т.е. 120нс вам никто не гарантирует. Вам гарантируют, что будет не более 120нс, т.е. вполне может быть и 0 с частотой кварца 8Мгц и > можно сделать как я, а так надо с задержкой в 120 нс припаритьсяЕсли устойчивая работа не интересует, то конечно можно не парится :smile3046: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
failguru 0 3 ноября, 2011 Опубликовано 3 ноября, 2011 · Жалоба Кто-нибудь знает, когда ставлю двухстрочный режим он ничего не показывает. При однострочном все нормал, только 1 и 3тью строку соответственно пишет, так по адресам и должно быть. Дальше если указать адрес второй строки или четвертой, то он там ничего не пишет, что скорее всего из-за однострочного режима. А как двустрочный сделать? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SortoVaritu 0 3 ноября, 2011 Опубликовано 3 ноября, 2011 · Жалоба На практике будет работать как вы сделали, но вообще это неправильно.... Выставить E в 1, ждать 120 нс, читать выставленные контроллером ЖКИ данные. В вашем случае если расширите программу и будете использовать прерывания, то есть вероятность сработки прерывания как раз после того как выставите E в 0, но до того как вы прочитаете шину данных. В этом случае вы точно не успеете считать данные. Однострочный или двустрочный режим задается при инициализации... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться