СЦБИСТ - железнодорожный форум, блоги, фотогалерея, социальная сеть

СЦБИСТ - железнодорожный форум, блоги, фотогалерея, социальная сеть (https://scbist.com/)
-   Классические релейные системы ЭЦ, АБ и ПАБ (https://scbist.com/klassicheskie-releinye-sistemy-ec-ab-i-pab/)
-   -   Дешифратор АБ (https://scbist.com/klassicheskie-releinye-sistemy-ec-ab-i-pab/30016-deshifrator-ab.html)

Просто инженер АиТ 03.12.2013 12:56

Цитата:

РШ решил собрать на микроконтроллере AVR.
Что такое "РШ" - релейный шкаф? Или я что-то не понимаю?!

Просто инженер АиТ 03.12.2013 14:30

Цитата:

Две сигнальные точки будут на реле-как показательные и на них можно будет выполнять лабораторные работы.Суть проблемы:РШ решил собрать на микроконтроллере AVR.
Ну я вообще, тотально запутался! С одной стороны пишут-"Две сигнальные точки будут на реле", с другой стороны-"РШ решил собрать на микроконтроллере AVR"! Примерно как в анекдоте.
"-Радиостанция на броневике.
- Извините, радиостанция на полупроводниках или лампах?!
- Я же сказал-"На броневике!"".

Rafa 03.12.2013 14:59

Информацию в МК лучше загонять с контактов импульсного реле.

Защиту от дребезга контакта делай на RS триггере.

Просто инженер АиТ 03.12.2013 15:09

А я знаю как написать драйвер "состояния контакта" и триггера не надо.

Rafa 03.12.2013 15:22

Цитата:

А я знаю как написать драйвер "состояния контакта" и триггера не надо.
Как-как.
С помощью задержки. Сам так делал.
Просто если он собирается использовать прерывание по изменению сигнала на выводе МК, то тут задержка не прокатит.
Прерывание вызывается при изменении входного сигнала, например с 0-1.
А уже в обработчике прерывания считаем количество импульсов.
В длинном интервале кодового цикла принимаем решение о поступившем коде.
...............................
Сам так делал.

Просто инженер АиТ 04.12.2013 08:58

Конечно, драйвер - это громко сказано :laduh:.
Обычно на прерывании от таймера считывали состояние всех контактов (обработчик прерывания должен быть как можно меньше и по возможности линейным). На фоне проверяли их состояние, если 1, то +1 в счётчик, увеличиваем то определённого уровня, если 0, то -1 в счётчике, вычитаем до 0. Принцип интегрирования.

unsigned char InSig[N]; // Состояние считанного сигнала.
unsigned char StatusSig[N]; // Состояние сигнала.
unsigned char Counter[N]; // Счётчик состояния.

// Получить состояние сигнала.
unsigned char GetState ( unsigned char N ) // N - номер сигнала.
{
// Проверка наличия изменения.
if ( InSig[N] != StatusSig[N] )
{ // Изменение есть!
// Проверим как изменился сигнал.
if ( InSig[N] == 0 )
{
if ( Counter[N] != 0 )
Counter[N]--;
}
else
{
if ( Counter[N] != Level )
Counter[N]++;
}
// Определим Новое состояние сигнала.
if ( Counter[N] == 0 ) StatusSig[N] = 0;
else if ( Counter[N] == Level ) StatusSig[N] = 1;
}
return StatusSig[N];
}
Это просто демонстрация, на самом деле состояние сигнала хранятся в бинарном виде в бинарном массиве.
Согласитесь на "С" это более читаемо, чем на ассемблере.

Иногда печатная плат нового устройства не была готова, но чтобы не тормозить разработку, программу писал на "С" для компьютера и отлаживал, а когда была готова железка достаточно было этот исходник перекомпилировать (используйте условную компиляцию, пишите в Posix стандарте, тогда будет максимальная переносимость) под соответствующий процессор железки. Время разработки ПО резко сокращалось.
Всем всего доброго!

Никита Каширихин 6112 21.02.2014 20:50

Rafa,Твой алгоритм в неправильном направлении умеет таботать?


Часовой пояс GMT +3, время: 22:48.

Powered by vBulletin® Version 3.8.1
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot


Яндекс.Метрика