 |
|
|
|
| Автор |
Сообщение |
pavel Частый гость (>5)

Зарегистрирован: 29.05.2007 Сообщения: 8
|
Добавлено: 29 Май 2007, 17:59 Заголовок сообщения: 90S2313+Считыватель |
|
|
Нужно считать с считывателя 26 бит и запихнуть их в контролер
вот сам считыватель http://www.perco.ru/rus/documents/RP_11.zip.
Не могу разобраться как последовательно их принять, я так думаю что надо считывать по 8 бит, или я ошибаюсь.
Пхните в нужном напрвлении.  |
|
| Вернуться к началу |
|
 |
AndryG Модератор
Зарегистрирован: 24.07.2006 Сообщения: 411 Откуда: Helios-3
|
Добавлено: 30 Май 2007, 8:13 Заголовок сообщения: |
|
|
Для начала неплохо бы определится с железной частью ... как по мне, то удобно организовать прерывание по приему битов данных.
Как вариант ...
| Код: |
--0----*-------> PORT
|
--
/\
--
|
--1----*-------> INT0
|
посередине - диод
Что имеем ... при передаче единицы линия "1" уходит в ноль ... на линии INT0 получаем отрицательный фронт - на линии PORT имеем единицу.
При передаче нуля линия "0" вместе с PORT уходит в ноль и за собой тянут INT0 ... получаем отрицательный фронт на INT0 и ноль на PORT
Таким макаром ... настраиваем прерывание на отриц. фронт. При возникновении прерывания смотрим на линию PORT ... на ней значение принимаемого бита.
Только подумайте ... верно ли полярность диода стоит?
Дальше разберетесь? Если нет, то опишите свой уровкень познаний в программировании/контроллерах/электронике. _________________ AndryG |
|
| Вернуться к началу |
|
 |
pavel Частый гость (>5)

Зарегистрирован: 29.05.2007 Сообщения: 8
|
Добавлено: 30 Май 2007, 10:07 Заголовок сообщения: |
|
|
Диод в схеме стоит правильно.
Познание в электронике есть, 10 лет работы в этом напрвлении, а вот програмирование конетролеров только недавно начал, так что неочень.
Мое мнение такое что нужно считывать побитно и писать в масив в ОЗУ, может я и ошибаюсь, но програмно не могу сообразить как это сделать |
|
| Вернуться к началу |
|
 |
AndryG Модератор
Зарегистрирован: 24.07.2006 Сообщения: 411 Откуда: Helios-3
|
Добавлено: 30 Май 2007, 12:29 Заголовок сообщения: |
|
|
Значит не ошибся я с диодом (у меня наоброт программирование >> электроники)
Дальше можно сотворить так: Кстати! А на чем и в чем пишете? АСМ или C ? (если АСМ, то помочь кодом не смогу - только идеями - времени нет на АСМе писать)
отводим три байта в памяти для данных.
При возникновении прерывания состояние PORT записываем в младший бит первого байта
И сдвигаем данные влево ... так постепенно наши данные заползут на свои места.
Кстати ... нужно не забывать также передвигать страший бит одного байта в младший бит следующего байта
Но это в общем виде ... нужно еще подумать над обработкой первого и последнего бита четности
(такой изврат сотворили ... сразу и не напишу как быстро и красиво сделать) _________________ AndryG |
|
| Вернуться к началу |
|
 |
pavel Частый гость (>5)

Зарегистрирован: 29.05.2007 Сообщения: 8
|
Добавлено: 30 Май 2007, 12:37 Заголовок сообщения: |
|
|
| Пробую на АСМЕ, на чем проще вкосить на АСМЕ или на Си, я понимаю - сколько человек, столько и мнений, раньше пробывал писать проги на дельфи, коечто даже получалось. |
|
| Вернуться к началу |
|
 |
AndryG Модератор
Зарегистрирован: 24.07.2006 Сообщения: 411 Откуда: Helios-3
|
Добавлено: 30 Май 2007, 13:19 Заголовок сообщения: |
|
|
ВО! Придумал о битах четности!
Общая идея ... берем переменную ... Б_ЧЕТ ("буфер четности") Если приняли единичку - будем плюсовать в нее единичку.
Младший бит переменной указывает ее НЕ четность (младший бит равен единице - число не четное)
Теперь по принятии 13 бит (1 четности и 12 данных) можно смотреть Б_ЧЕТ -- он и укажет нам с ошибками ли мы приняли данные
первоначально Б_ЧЕТ = 0 (чет, кстати )
Первый бит (номер 1) - добавляет до четности, значит сумма бита четности и битов данных (2-13) должна дать ноль в мл. разряде (четное число)
Cледовательно если там (Б_ЧЕТ & 0x01 ) будет 1 - значит ошибка!
Последний бит (номер 26) - наоброт добавляет до нечетности ... тоесть всё наоборот 1 - нет ошибки ... для того, чтобы было как и в первом случае нужно после принятия 13 бита в Б_ЧЕТ записать 1 ... тогда ... мы принимаем 12 бит данных, контрольный 26-й бит добавляет до нечетности и плюс наша единичка получаем чет ... получаем условие такое же как и в первом случае (1 - есть ошибка)
Теперь нужно подумать как это в цикл запихнуть красиво ... примерно так:
Переменная К_ВО - к-во принятых бит (0-еще ничего не принято)
| Код: |
В ПРЕРЫВАНИИ
ЕСЛИ К_ВО == 13
ТО НАЧАЛО //приняли первую половину данных
если проверка чет/нечет не прошла,
то поднять флаг ошибки
Б_ЧЕТ = 1
КОНЕЦ
ЕСЛИ К_ВО == 0
ТО НАЧАЛО //начало приема посылки
Б_ЧЕТ = 0
К_ВО = 1
сбросить флаг ошибки
КОНЕЦ //к-во == 0
ИНАЧЕ ЕСЛИ К_ВО == 26 //принимаем последний бит - проверка чет/нечет и окончательная обработка данных!
НАЧАЛО
проверка чет/нечет ... если ое проверки прошли (флаг ошибки опущен), то данные готовы - можно выдавать в основную программу, иначе поднимаем флаг "приняты кривые данные"
К_ВО = 0 // типа "готовы к приему следующих данных"
КОНЕЦ
ИНАЧЕ НАЧАЛО //здесь мы окажемся, если принимаем биты 2-25
принять бит с линии, запихнуть его в младший бит младшего байта данных и сдвинуть все три байта влево
КОНЕЦ
К_ВО +1
|
Но данный алгоритм пока не решает проблему "десинхронизации пакетов" ... если мы случайно потеряем часть пакета, то потом будет разрыв пакетов: приняли одного пакета половину .. он закончился. а мы ждем даные .. идет второй пакет .. мы принимаем его часть и видам, что принят весь пакет, хотя на самом деле это только часть другого пакета ... типа такого... для избежания этого введем таймаут на длительность приепма пакета... счас посчитаем ...
У нас передача одного бита занимает 1.1 мс (0.1 импульс+1 промежуток между импульсами)
Длительность пакета - 1.1*26 = 28,6 мс
Задержка между пакетами не менее 200 мс
Другими словами ... если от начала пакета прошло более 50 (с запасом) мс и пакет полностью не принят - значит у нас проблемы.
Для обработки таких ошибок добавляем алгоритм:
При принятии первого бита (К_ВО == 0) , запускаем таймер на 50 мс.
При принятии последнего бита (К_ВО == 26) останавливаем таймер.
| Код: |
В прерывании таймера пишем
К_ВО == 0
ОШИБКА == 1
|
Что мы имеем:
допустим при приеме у нас пропадет 5 бит -- будто и не было его.
Начинаем принимать данные (запускаем таймер) ... принимаем первые 12 - у нас, возможно, ошибка чет-нечет вылезет
принимаем последний бит .. и ждем еще один ... но его то нет! проходит 50 мс и К_ВО в таймере сбрасывается в ноль .... тоесть мы "как бы ничего и не принимали " - кривой пакет отвалился.
Допустим, что из-за помех у нас проскочили "лишние" биты
Начинаем прием (запускаем таймер) ... принимаем как обычно данные ... ловим и "лишние импульсы" ... из-а них по "окончанию пакета" проверка четности даст ошибку (пакет отваливается) ... мы типа приняли пакет уже ... но биты настоящего пакета продолжаю идти ... мы начинаем принимать следующий пакет (остаток настоящего), но в нем будет маловато бит - получаем первый случай .. ."как бы ничего и не принимали"
Вот ... ох и написал ...  _________________ AndryG
Последний раз редактировалось: AndryG (30 Май 2007, 13:30), всего редактировалось 1 раз |
|
| Вернуться к началу |
|
 |
AndryG Модератор
Зарегистрирован: 24.07.2006 Сообщения: 411 Откуда: Helios-3
|
Добавлено: 30 Май 2007, 13:26 Заголовок сообщения: |
|
|
| pavel писал(а): | | пробывал писать проги на дельфи, коечто даже получалось. |
Я бы Вам советовал на С ... не даром систему команд разрабатывали "под Язык Высокого Уровня"
Возьмите компилятор CVAVR. В сети немеряно лежит и с кряками и т.д.
Если с электроникой 10 лет возитесь, то, думаю, что Вам не стоит доказывать, что сперва нужно алгоритм заиметь, а потом садится за написание кода ... одно дело кусочки программки насобирать (считывание, индикация. протокол обмена и т.д.) .. а вот всё вместе без четкого алгоритма не собрать толком.
Поищите в сети "Автоматное программирование" "Программирование с явным выделением состояний" "конечные автоматы" -- это одна из методик построения алгоритма ПО -- не говорю, что стоит всё копировать ... но саму идею метода полезно попользовать. _________________ AndryG |
|
| Вернуться к началу |
|
 |
pavel Частый гость (>5)

Зарегистрирован: 29.05.2007 Сообщения: 8
|
Добавлено: 30 Май 2007, 13:36 Заголовок сообщения: |
|
|
| Большое спасибо, за разьяснение, буду пробовать. |
|
| Вернуться к началу |
|
 |
|
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах Вы не можете добавлять вложения в этом форуме Вы можете просматривать вложения в этом форуме
|
|