← на главную
Нашли ошибку? Сообщите, пожалуйста, о ней. Выделите ошибку и нажмите ctrl+enter.

Дневник — зеркало души

   читать: всё сразу по категориям поиск

   подписаться на рассылку: рассылка по email Twitter

28 апреля 2011 в 15:22
"Hello, Word" из Hardware

Автор статьи Чута Олег.

Разработка устройств подключаемых к компьютеру и способных обмениваться данными на уровне железа, всегда будоражило моё сознание.

Так например можно управлять любым механическим устройством от простого электромагнита до сложных шаговых двигателей. И в тоже время вводить в ПК угол наклона относительно земли, скорость вращения, уровень освещенности.

Это единицы примеров, по большому счету любой аналоговый химико-физический можно преобразовать в двоичный и код и в обратном направлении управлять процессом с помощью кода.

Первый мой проект (бакалаврская работа) — это работа с LPT-портом. А точнее это подключение 8-битного параллельного АЦП к двунаправленному параллельному порту ПК.

Почему параллельный порт?

Параллельные порты исторически появились раньше. Причина — простота. Конечно последовательные порты идут вслед, наступают и "выигрывают" (!) в некоторых областях.

Так вот, с точки зрения электроники этот порт выглядит как 8 контактов, на которых в зависимости от установленного бита 1 или 0 — установлено напряжение 5 В = лог 1, 0 В = лог 0 это пример только для ТТЛ.

Простота:

WriteFile( b010110000 , LPT1);

и на выходе порта у нас на первом выводе 0 В на втором 5 В, на третем 0 В и т.д.

Но это раритет — сделаешь девайс на нем — засмеют. Проскакиваем Com-port.

И сразу USB — Universal Serial Bus — последовательный порт, понятно из названия.

И благодаря не самым новейшим хардварным разработкам мы и тут проскакиваем мимо изучения стэка протокола, всех команд и всех спецификаций.


   

Микросхема FT245 — преобразователь USB -> RS232 (COM-port) -> 8 bit FIFO.

Эта микросхема ничем бы не отличалась от обычного кабеля к телефону средней давности, если бы не RS232 (COM-port) -> 8 bit FIFO.

А вот здесь мы как раз получаем 8 бит двоичный код в параллельном виде. Как в LPT.

"Hello, word" — это программа с которой начинают все книги по изучению программных языков. Подключение светодиодов на выход для индикации кода, который послан в порт — это и есть самая простая схема которая может показать работоспособность нашего программно-аппаратного комплекса.

Паяем все с первого раза правильно. Подключаем к USB - и увидели устройство. Подкинули на него драйвера с оригинального сайта www.ftdichip.com.

И теперь это USB-to-serial converter или Virtual COM7 — номер будет отличатся при разных операционках.

Так как плата испытательная, то схему не разводил, собрал все на монтажной плате:

Для того чтобы быстро проверить работоспособность, запускаем HyperTerminal и конектимся к определившемуся COM порту. Настройки соединения по умолчанию.

Печатаем символы -- получаем на выходе схемы двоичный код из ASCII-таблицы соответствующий посланному символу.

Дальше пишем свою программу (код на C++)
   

#include "stdafx.h"
#include 
#include 
#include 

using namespace std;


int _tmain(int argc_TCHARargv[])
{
    
DCB dcb;
    
BYTE a=128;
    
BYTE b=1;
    
BYTE c=0;
    
HANDLE hCom_1=NULL;
    
OVERLAPPED osWrite = {0};
    
DWORD dwWritten;
    
DWORD dwRes;
    
BOOL fRes;
    
charstr  = (char*) malloc(sizeof(char) * 1000);

    
ZeroMemory(&dcb,sizeof(DCB));
    
hCom_1=CreateFile("COM3"GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL);
    if (
hCom_1==INVALID_HANDLE_VALUE)
    {
        return 
false;
    }
    if (!
GetCommState(hCom_1, &dcb))
    {
        
CloseHandle(hCom_1);
        return 
false;
    }
    
dcb.BaudRate=CBR_9600;
    
dcb.ByteSize=8;
    
dcb.StopBits=ONESTOPBIT;
    
dcb.Parity=NOPARITY;
        
    if (!
SetCommState(hCom_1,&dcb))
    {
        
CloseHandle(hCom_1);
        return 
false;
    }

   
// Create this write operation's OVERLAPPED structure's hEvent.
    
osWrite.hEvent CreateEvent(NULLTRUEFALSENULL);
    if (
osWrite.hEvent == NULL
       return 
FALSE;
    while ( 
TRUE )
    {


        if (!
WriteFile (hCom_1,&c,sizeof (BYTE),&dwWritten, &osWrite)) 
        
dwRes WaitForSingleObject(osWrite.hEventINFINITE);
        
Sleep(100);
        if (
== 1)
        {
            
a=b-a;
            
b=b-a;
            
a=a+b;
        }
        if (
== 8)
        {
            
a=a/2;
            
b=b*2;
        }
        
a+b;
        
b=b*2;
        
a=a/2;
    }
    
CloseHandle(hCom_1);
    return 
0;
?>


   

жизнь, знания, увлечения   |   нет комментариев    |   следить за комментариями
|
|
Запросы, по которым находят эту запись (1)
c5xn

← Халяву надо заработатьАскания-Нова. Жизнь в дороге. →
 
Комментарии:
Комментариев пока нет.
 
Добавить комментарий:

Вы можете войти под своим именем или просто написать комментарий от имени Гость.

Сколько будет два умножить на одиннадцать?

следить за комментариями к этой записи