|
|
|
|  |
fAL 31 октября 2006 19:25
Id сообщения: 2448 |
Помогите найти ошибку при работе с MT-10S1 Распаял по схеме приведенной в примере. Выдает тестовую строку при помощи вашей программы. А вот моя программа ни хочет работать (при запуске тестовая строка с экрана пропадает, т.е. на порт что то выходит). Пожалуйста посмотрите код:
#include <stdio.h>
#include
#include
#include
#include "h.h"
int x;
int main(){
//инициализация, устанавливаем разрядность интерфейса (3 раза)
Out32(888,48); //D(7...0) 00110000
Out32(889,0); //E=1 (с учетом инверсии порта), A0=0
Sleep(10);//задержка в миллисекундах
Out32(889,1); //E=0 (с учетом инверсии порта), A0=0
Sleep(10);
Out32(889,0);//E=1 (с учетом инверсии порта), A0=0
Sleep(10);
Out32(889,1);//E=0 (с учетом инверсии порта), A0=0
Sleep(10);
Out32(889,0);//E=1 (с учетом инверсии порта), A0=0
Sleep(10);
Out32(889,1);//E=0 (с учетом инверсии порта), A0=0
Out32(888,0);//D(7...0) 00000000
Sleep(10);//установка параметров
Out32(888,56);//установка разрядности интерфейса D(0...7) 00111000
Out32(889,0);//E=1 (с учетом инверсии порта), A0=0
Sleep(10);
Out32(889,1);//E=0 (с учетом инверсии порта), A0=0
Out32(888,0);//D(7...0) 00000000
Sleep(10);
Out32(888,8);//выключение дисплея D(7...0) 00001000
Out32(889,0);//E=1 (с учетом инверсии порта), A0=0
Sleep(10);
Out32(889,1);//E=0 (с учетом инверсии порта), A0=0
Out32(888,0);//D(7...0) 00000000
Sleep(10);
Out32(888,1);//очистка дисплея D(7...0) 00000001
Out32(889,0);//E=1 (с учетом инверсии порта), A0=0
Sleep(10);
Out32(889,1);//E=0 (с учетом инверсии порта), A0=0
Out32(888,0);//D(7...0) 00000000
Sleep(10);
Out32(888,6);//установка направления сдвига D(7...0) 00000110
Out32(889,0);//E=1 (с учетом инверсии порта), A0=0
Sleep(10);
Out32(889,1);//E=0 (с учетом инверсии порта), A0=0
Out32(888,0);//D(7...0) 00000000
Sleep(10);
//инициализация завершена
Out32(888,128);//установка адреса памяти для записи в DDRAM D(7...0) 10000000
Out32(889,0);//E=1 (с учетом инверсии порта), A0=0
Sleep(10);
Out32(889,1);//E=0 (с учетом инверсии порта), A0=0
Out32(888,0);//D(7...0) 00000000
Sleep(10);
//начинаем запись
for (x=0; x<10;x++){
Out32(888,48);//выводим на порт символ 0 (код 30h) D(7...0) 00110000
Out32(889,5);//E=1 (с учетом инверсии порта), A0=1
Sleep(10);
Out32(889,1);//E=0 (с учетом инверсии порта), A0=0
Out32(888,0);//D(7...0) 00000000
Sleep(10);
}
return 0;
}
|
|
|
Петухов 01 ноября 2006 04:53
Id сообщения: 2462 |
Извините, я не стал детально разбираться в этом огромном листинге (времени жалко), вижу минимум одну ошибку (как мне кажется): адреса портов должны быть 888 и 890 (0x378 и 0x37A), а не 888 и 889 (0x378 и 0x379)!
Ещё, в нашей программе (которая как Вы говорите работает нормально) управляющие сигналы выводятся значениями 2 и 3 (для команд) и 6 и 7 (для данных). А у Вас - 0, 1, 5. Ошибка это или нет не знаю, проверьте сами.
Остальное вроде на первый взгляд правильно.
|
|
|
fAL 01 ноября 2006 09:40
Id сообщения: 2466 |
Спасибо, действительно с портом ошибся.
"Ещё, в нашей программе (которая как Вы говорите работает нормально) управляющие сигналы выводятся значениями 2 и 3 (для команд) и 6 и 7 (для данных). А у Вас - 0, 1, 5. "
А этот аспект можно поподробнее?
|
|
|
Петухов 01 ноября 2006 15:41
Id сообщения: 2469 |
Что тут подробнее? Я посмотрел нашу программу для тестирования индикаторов через LPT порт, там выводятся значения 2,3,6,7 в порт 0x37A, а у Вас - 0,1,5. Важно ли это отличие я не знаю, потому и сказал Вам. Будет интересно - разберётесь, не будет - оставьте как работает. Я просто уже не помню почему у нас сделано именно так, давно это было.
|
|
|
fAL 01 ноября 2006 23:02
Id сообщения: 2472 |
ЗАРАБОТАЛО! не знаю где я вычитал такую дурь как инверсия в C0, но вообщем поменял и ЗАРАБОТАЛО :))) если надо, могу дать листинг что бы будующие поколения не так мучались ))
|
|
|
Головин_Сергей 02 ноября 2006 11:25
Id сообщения: 2475 |
Вот и мы тоже думаем, почему каждый, даже зная, что все уже было написано раньше и при том не раз, тем не менее продолжает мучаться самостоятельно СНОВА и СНОВА :=)
|
|
|
Петухов 02 ноября 2006 11:56
Id сообщения: 2476 |
Листинг спасибо, но не надо. Тем более если он такой же как выше. Обычно выдачу команд и данных в индикатор оформляют отдельной процедуркой: и ошибок меньше, и модифицировать легче, и разбираться, и программа яснее. Не зря же придумали такую штуку как процедура.
А вот про инверсию... В нашей программе сигнал E выдаётся командами: Out(0x37A,2); Sleep(); Out(0x37A,3); (для команд). Т.е. тоже инверсно. Откуда Вы взяли "дурь" про инверсию - не знаю. А взять осциллограф (или хоть вольтметр) и посмотреть на реальный сигнал не судьба?
|
|
|
Arturian 15 июля 2007 16:23
Id сообщения: 3912 |
FAL - Дайте пожалуйста листинг на мыло arturian@inbox.ru
|
|
|
|
|
|