Четверг, 06.05.2021, 06:17 
Приветствую Вас Гость | RSS



Меню сайта
 

Личные странички
UA3EKK
RV3EFH
UA3EID
RA3EA
UA3EKJ
RA3ED
UA3ECX
RV3EF

Мини-чат

Погода


Наш опрос
Оцените наш сайт
Всего ответов: 235

Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0


Форма входа
Логин:
Пароль:

Куплю/продам

[13.02.2012]
продам (1)
[19.12.2011]
icom R6 (0)
[16.10.2011]
Усилитель мощности на ГС31/ ГС35 (3)
[11.10.2011]
Нужны микросхемы (1)
[22.05.2011]
Рубрика технической взаимопомощи (2)

Фото

Праздники

Ваш IP
Узнай свой IP адрес

Главная » 2012 » Декабрь » 3 » Управление сдвиговым регистром через COM порт средствами WinAPI
22:53
Управление сдвиговым регистром через COM порт средствами WinAPI

Доброго времени суток всем! Последний год я редко обращался к своему родному языку C++, а средствами WinAPI никогда не программировал. Несколько недель назад я взялся за интересующее меня дело. Я уже как три года собирался заняться программированием микроконтроллеров или портов ПК. Ещё тогда я по одной статье из журнала "Радио" за те времена собрал схему из  8 лампочек и популярного 8-разрядного регистра 74HC595. Прилагалась программа управления на частично знакомом мне "Паскале". По исходному коду я уточнил, как управляется данный регистр и запомнил это на всю жизнь (поднял свои знания из "школьного" курса цифровой микроэлектроники). В интернете не мало статей на русском языке, разъясняющие принципы управления этого регистра. Схему я доработал: поставил ещё один регистр, соединя их "последовательно" и ещё 8 "лампочек", ибо у меня уже висела гирлянда из 16 лампочек на 220В и был к ним 16-канальный тиристорный самодельный блок.

 

И вот, на днях я написал программу для управления сего дела через COM порт. Несложную программу писал весь день, попутно изучая по форумам средства WinAPI и все новые для меня функции, а также отлаживая и доводя её до ума. И вот, свершилось чудо! Лампочки замигали!

 

Ниже представлен главный фрагмент кода консольной программы на C++ с подробными комментариями. В файловом архиве - полный код с цветовой разметкой в word файле doc, откомпилированный exe'шник, образцовый файл конфигурации. Разрабатывал в среде Microsoft Visual Studio 2008. Но можно не забивать голову и компьютер тоже, поставив простенькую и бесплатную DevC++. Вместо десятков файлов проекта в рабочем каталоге будет вам всего три файла: файл исходного кода 1.cpp, файл откомпилированной программы 1.exe и файл конфигурации мигания лампочек 1.txt. При этом, для 

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

 

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


for(j=0;j<N;j++){   //пробег по группам состояний лампочек;

             TX0(hFile);   //к выводу TX я подключил «ключ» нашего регистра; этой функцией принудительно блокируем регистр, то есть «закрываем» его;

             for(i=0;i<16;i++){   //пробег по лампочкам и заполнение регистра;

                 bit=f.get();   //считываем символ из файла в переменную bit;

                 if(bit=='1'){   //если это символ «1»,

                     RTS0(hFile);   //посылаем в регистр логический «0»; очевидно, что к выводу RTS я подключил «информационный вход» нашего регистра; посылаем не «1», а «0», так как у него этот вход инверсный;

                     printf("%c",S[i]);   //выводим на экран название моей лампочки из того самого массива;

                 }else{   //иначе, если в файле оказался символ не «1» (в данном случае «0», но можно использовать любой символ при задании конфигурации),

                     RTS1(hFile);   //посылаем в регистр «1»,

                     printf(" ");   //выводим на экран пробел (пустоту), так как лампочка не горит;

                 }

//нижними двумя строчками «тактируем» регистр, то есть посылаем импульс на соответствующий вход нашего регистра; этим импульсом мы записываем («проталкиваем») в регистр тот бит, который был предварительно «подготовлен» на информационном входе функцией RTS1 или RTS0; очевидно, к контакту DTR я подключил тактирующий вход (CLK) нашего регистра;

 

                 DTR1(hFile);

                 DTR0(hFile);

             }

//на этой позиции кончился внутренний цикл for, который прокрутился 16 раз и наш 16-разрядный регистр (если быть точнее, два 8-разрядных последовательно соединённых регистра) заполнился согласно текущей j-ой строчке нашего конфигурационного файла "1.txt";

 

             printf("\n");   //переходим на строчку ниже;

             bit=f.get();   //сканируем следующий символ из файла в bit и никуда его не используем; если файл сконструирован «по-честному» и без обмана программы, этим мы сканируем символ перехода на новую строку, чтобы начать забивать в регистр следующую (j+1) строчку от её начала;

 

             TX1(hFile);   //«отмыкаем» заполненный информацией регистр, посылая на «ключ» логическую единицу; в этот момент лампочки загораются по соответствующим состояниям регистра, которые мы загружали выше;

 

             Sleep(ms);   //программа «замирает» на время ms, введённое в милисекундах при старте программы, и лампочки продолжают гореть это время; потом программа перейдёт к считыванию следующей строки и аналогичным операциям;

         }

//на этой позиции завершился внешний цикл for; нижней строкой выводим на экран нижнее отчёркивание, информирующее о конце всего файла;

 

         printf("\n-----------------\n\n");

    }


Просмотров: 2256 | Добавил: RV3EEQ | Теги: 74HC595, c++
Всего комментариев: 9
7 ra3ed   [Материал]
А так вообще ATmega 32 может и датчики температуры опрашивать далласовские и с компом по rs-232 стыковаться и DDS синтезатором управлять

8 RV3EEQ   [Материал]
Всё можно. А для управления регистрами с микропроцессора нужно всего три порта.

9 ra3ed   [Материал]
Нужно будет попробовать поэкспериментировать

5 RV3EEQ   [Материал]

6 ra3ed   [Материал]
Симпатично перемигиваются,
думаю можно попробовать с atmega32 поэкспериментировать на эту тему.

3 ra3ed   [Материал]
Привет.
Интересная программа. Для управления используешь DTR, RST, TX выходы COM-порта.
Выложи видео как это работает, интересно.

4 RV3EEQ   [Материал]
Я подключаю лампочки по всей комнате. Но на примере этих светодиодов, что на фотографии, я запишу видео и выложу его в комментариях. Кстати, завтра буду подключать к одному 8-портовому регистру 4 семисегментных индикатора. Первые 4 порта регистра будут загружать бинарный код в семисегментный дешифратор, а остальные 4 порта регистра будут открывать нужный индикатор. При сверхбыстром последовательном "переборе" индикаторов будут высвечиваться разные цифры, на глаз горящие одновременно.

2 RV3EEQ   [Материал]
Вот фото конструкции. Для первоначального тестирования вместо тиристоров и лампочек применил светодиоды. А так, шлейфом (от FDD) идёт всё на тиристорный блок. На плате КРЕН-5 и три стабилитрона на 5В - псевдопреобразователь уровней UART-TTL.




1 RV3EEQ   [Материал]
АРХИВ С ПОЛНЫМ МАТЕРИАЛОМ И ПРОГРАММОЙ: Скачать

Вот, например, конфигурация "бегающий огонь туда-обратно + нарастание", согласно которому программа работает, как на иллюстрации выше:

1000000000000000
0100000000000000
0010000000000000
0001000000000000
0000100000000000
0000010000000000
0000001000000000
0000000100000000
0000000010000000
0000000001000000
0000000000100000
0000000000010000
0000000000001000
0000000000000100
0000000000000010
0000000000000001
0000000000000010
0000000000000100
0000000000001000
0000000000010000
0000000000100000
0000000001000000
0000000010000000
0000000100000000
0000001000000000
0000010000000000
0000100000000000
0001000000000000
0010000000000000
0100000000000000
1000000000000000
1100000000000000
1110000000000000
1111000000000000
1111100000000000
1111110000000000
1111111000000000
1111111100000000
1111111110000000
1111111111000000
1111111111100000
1111111111110000
1111111111111000
1111111111111100
1111111111111110
1111111111111111

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Круглый стол
СКАЧАТЬ аудиозапись круглого стола Орловской области за последнюю субботу
СКАЧАТЬ аудиозапись предыдущего КС

Наши соревнования

Соревнования Золотой Орел


Поиск

Время
MCK

Календарь
«  Декабрь 2012  »
ПнВтСрЧтПтСбВс
     12
3456789
10111213141516
17181920212223
24252627282930
31

Архив записей

Дни рождения
Дни рождения в Мае :
 
Вячеслав   UA3EAD (02.05)
Сергей   R2EF (24.05)
Дмитрий   RV3EFF (26.05)
 
Поздравляем !!!

E-mail отправителя *:
ФИО, позывной, день рождения:

Друзья сайта
  • RK3EWW
  • Сайт Ливенских радиолюбителей
  • Полезные ссылки:
  • QRZ.RU
  • Сервер Кубанских Радиолюбителей
  • Союз радиолюбителей России
  • Российский УКВ портал

  • Форум
  • XieGu (0)

  • Коментарии

    Поиск на QRZ.RU
    Поиск в российском Callbook'e:
    ON-LINE поиск предоставлен сервером QRZ.RU

    Известные сайты
    Сервер радиолюбителей России - схемы, документация,
 соревнования, дипломы, программы, форумы и многое другое!

    Сервер 

Кубанских радиолюбителей

    Российский УКВ портал

    R-Quad - 

радиолюбительские антенны


    РАДИОФАНАТ - 

сайт Николая Большакова

    Орловский регион
    Радиоклуб Орловский Эфир. Региональное общественное объединение

    Детская коллективная радиостанция. Орел



    Сайт Ливенских радиолюбителей

    Разместите наш баннер

    Регионы России

    Smolradio.ru -
Сайт Радиолюбителей Смоленщины

    Сайт радиолюбителей Тульской области

    Сервер Тамбовских Радиолюбителей



    Тульский областной радиоклуб




    Принципиальные схемы

    Радиоклуб Орловский Эфир © 2021Сайт управляется системой uCoz