|
|
  |
подключение lcd FDCC2004A к atmega8, простой код, а не пашет ничего |
|
|
|
Nov 1 2011, 17:19
|
Участник

Группа: Участник
Сообщений: 44
Регистрация: 4-11-10
Пользователь №: 60 647

|
В процедуре проверки флага думаю нужно инвертировать все E как и в основном коде по совету ILYAUL
|
|
|
|
|
Nov 1 2011, 17:20
|
Участник

Группа: Участник
Сообщений: 30
Регистрация: 1-11-11
Пользователь №: 68 094

|
Вот кодКод #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); //пишу символ }
Сообщение отредактировал failguru - Nov 1 2011, 17:22
|
|
|
|
|
Nov 1 2011, 17:27
|
Участник

Группа: Участник
Сообщений: 44
Регистрация: 4-11-10
Пользователь №: 60 647

|
у вас в процедуре вывода символа Код 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; Видите разницу?
|
|
|
|
|
Nov 1 2011, 17:39
|
Участник

Группа: Участник
Сообщений: 30
Регистрация: 1-11-11
Пользователь №: 68 094

|
загвоздка была в этом Код 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); //пишу символ } Спасибо, очень всем благодарен! Форум супер, первый раз тут
|
|
|
|
|
Nov 1 2011, 19:25
|

Профессионал
    
Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339

|
Код DDRD=0xff; это перенести в конец функции Busy в void wrcmd и void wrsym убрать
--------------------
Закон Мерфи:
Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
|
|
|
|
|
Nov 1 2011, 20:02
|
Участник

Группа: Участник
Сообщений: 30
Регистрация: 1-11-11
Пользователь №: 68 094

|
нет, так не катит. если перенести в конец функции бизи - то это не учитывается т.к. после ретурна осуществляется возврат, а перед ретурном не имеет смысла, т.к. мне нужно прочитать 7ой бит. вот так)
|
|
|
|
|
Nov 2 2011, 11:15
|
Гуру
     
Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847

|
У вас в чтении bsy флага ошибка. Вот тут - Код E=1; delay_us(2); E=0; return(PIND.7); Вы должны прочесть PIND.7 до того, как сбросите E перед выходом из функции. У вас сейчас ваша функция читает бит 7 с уже отключенной шины LCD (и читает она оттуда всегда 1, т.к. в LCD шина притянута резисторами в 1)
|
|
|
|
|
Nov 2 2011, 12:12
|
Участник

Группа: Участник
Сообщений: 44
Регистрация: 4-11-10
Пользователь №: 60 647

|
tDH=300 ns. Может успеть прочитать))))))))))))))))))))
|
|
|
|
|
Nov 2 2011, 20:09
|
Участник

Группа: Участник
Сообщений: 30
Регистрация: 1-11-11
Пользователь №: 68 094

|
походу успевает, раз ноль читает с портд.7)))) частота кварца 8МГц, следовательно 125нс один такт, нормал. Либо нужно сделать паузу в 120нс после поднятия Е, если я правильно понимаю))))))))))))) а то не то может считать)))
|
|
|
|
|
Nov 2 2011, 20:18
|
Участник

Группа: Участник
Сообщений: 44
Регистрация: 4-11-10
Пользователь №: 60 647

|
E выставляешь в 1. делаешь задержку на время нужное для выставления контроллером жки данных(смотри по даташиту), читай данные, E сбрасывай в 1.
|
|
|
|
|
Nov 2 2011, 20:33
|
Участник

Группа: Участник
Сообщений: 30
Регистрация: 1-11-11
Пользователь №: 68 094

|
дк я и говорю в даташите максимум 120нс. с частотой кварца 8Мгц и > можно сделать как я, а так надо с задержкой в 120 нс припариться
Сообщение отредактировал failguru - Nov 3 2011, 09:28
|
|
|
|
|
Nov 3 2011, 12:52
|
Гуру
     
Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847

|
Цитата(failguru @ Nov 3 2011, 00:33)  дк я и говорю в даташите максимум 120нс. Максимум - это не минимум. Т.е. 120нс вам никто не гарантирует. Вам гарантируют, что будет не более 120нс, т.е. вполне может быть и 0 Цитата с частотой кварца 8Мгц и > можно сделать как я, а так надо с задержкой в 120 нс припариться Если устойчивая работа не интересует, то конечно можно не парится
|
|
|
|
|
Nov 3 2011, 13:23
|
Участник

Группа: Участник
Сообщений: 44
Регистрация: 4-11-10
Пользователь №: 60 647

|
На практике будет работать как вы сделали, но вообще это неправильно.... Выставить E в 1, ждать 120 нс, читать выставленные контроллером ЖКИ данные. В вашем случае если расширите программу и будете использовать прерывания, то есть вероятность сработки прерывания как раз после того как выставите E в 0, но до того как вы прочитаете шину данных. В этом случае вы точно не успеете считать данные.
Однострочный или двустрочный режим задается при инициализации...
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|