реклама на сайте
подробности

 
 
3 страниц V  < 1 2 3 >  
Reply to this topicStart new topic
> подключение lcd FDCC2004A к atmega8, простой код, а не пашет ничего
SortoVaritu
сообщение Nov 1 2011, 17:19
Сообщение #16


Участник
*

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



В процедуре проверки флага думаю нужно инвертировать все E как и в основном коде по совету ILYAUL
Go to the top of the page
 
+Quote Post
failguru
сообщение Nov 1 2011, 17:20
Сообщение #17


Участник
*

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
SortoVaritu
сообщение Nov 1 2011, 17:27
Сообщение #18


Участник
*

Группа: Участник
Сообщений: 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;


Видите разницу?
Go to the top of the page
 
+Quote Post
failguru
сообщение Nov 1 2011, 17:39
Сообщение #19


Участник
*

Группа: Участник
Сообщений: 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);  //пишу символ
}


Спасибо, очень всем благодарен! Форум супер, первый раз тут a14.gif
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Nov 1 2011, 19:25
Сообщение #20


Профессионал
*****

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



Код
DDRD=0xff;
это перенести в конец функции Busy в void wrcmd и void wrsym убрать


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
failguru
сообщение Nov 1 2011, 20:02
Сообщение #21


Участник
*

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



нет, так не катит. если перенести в конец функции бизи - то это не учитывается т.к. после ретурна осуществляется возврат, а перед ретурном не имеет смысла, т.к. мне нужно прочитать 7ой бит. вот так)
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Nov 1 2011, 20:09
Сообщение #22


Профессионал
*****

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



Цитата(failguru @ Nov 2 2011, 00:02) *
нет, так не катит. если перенести в конец функции бизи - то это не учитывается т.к. после ретурна осуществляется возврат, а перед ретурном не имеет смысла, т.к. мне нужно прочитать 7ой бит. вот так)

Ах , ну да..


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
XVR
сообщение Nov 2 2011, 11:15
Сообщение #23


Гуру
******

Группа: Свой
Сообщений: 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)
Go to the top of the page
 
+Quote Post
SortoVaritu
сообщение Nov 2 2011, 12:12
Сообщение #24


Участник
*

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



tDH=300 ns. Может успеть прочитать))))))))))))))))))))
Go to the top of the page
 
+Quote Post
failguru
сообщение Nov 2 2011, 20:09
Сообщение #25


Участник
*

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



походу успевает, раз ноль читает с портд.7)))) частота кварца 8МГц, следовательно 125нс один такт, нормал. Либо нужно сделать паузу в 120нс после поднятия Е, если я правильно понимаю))))))))))))) а то не то может считать)))
Go to the top of the page
 
+Quote Post
SortoVaritu
сообщение Nov 2 2011, 20:18
Сообщение #26


Участник
*

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



E выставляешь в 1. делаешь задержку на время нужное для выставления контроллером жки данных(смотри по даташиту), читай данные, E сбрасывай в 1.
Go to the top of the page
 
+Quote Post
failguru
сообщение Nov 2 2011, 20:33
Сообщение #27


Участник
*

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



дк я и говорю в даташите максимум 120нс. с частотой кварца 8Мгц и > можно сделать как я, а так надо с задержкой в 120 нс припариться

Сообщение отредактировал failguru - Nov 3 2011, 09:28
Go to the top of the page
 
+Quote Post
XVR
сообщение Nov 3 2011, 12:52
Сообщение #28


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата(failguru @ Nov 3 2011, 00:33) *
дк я и говорю в даташите максимум 120нс.
Максимум - это не минимум. Т.е. 120нс вам никто не гарантирует. Вам гарантируют, что будет не более 120нс, т.е. вполне может быть и 0
Цитата
с частотой кварца 8Мгц и > можно сделать как я, а так надо с задержкой в 120 нс припариться
Если устойчивая работа не интересует, то конечно можно не парится smile3046.gif
Go to the top of the page
 
+Quote Post
failguru
сообщение Nov 3 2011, 13:16
Сообщение #29


Участник
*

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



Кто-нибудь знает, когда ставлю двухстрочный режим он ничего не показывает. При однострочном все нормал, только 1 и 3тью строку соответственно пишет, так по адресам и должно быть. Дальше если указать адрес второй строки или четвертой, то он там ничего не пишет, что скорее всего из-за однострочного режима. А как двустрочный сделать? help.gif
Go to the top of the page
 
+Quote Post
SortoVaritu
сообщение Nov 3 2011, 13:23
Сообщение #30


Участник
*

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



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

Однострочный или двустрочный режим задается при инициализации...
Go to the top of the page
 
+Quote Post

3 страниц V  < 1 2 3 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 12th August 2025 - 06:52
Рейтинг@Mail.ru


Страница сгенерированна за 0.01462 секунд с 7
ELECTRONIX ©2004-2016