реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Ридер Магнитных Карт, не правильно работает прерывание
Loreleja
сообщение Jun 8 2010, 14:45
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 15
Регистрация: 7-06-10
Из: Киев
Пользователь №: 57 785



Уважаемые, помогите решить проблему!
Внешнее прерывание INT0 от одной дорожки магнитной карты. Прерывание настроено по любому изменению.
В обработчике тупо счетчик считает количество возникших прерываний и выдает по юарту.
Кто сталкивался с магнитными картами, в курсе, что на 1 дорожке как минимум 240 перепадов уровня - это я округлила. Но почему то с каждой карты счетчик упорно выдает от 35-45 - не больше.
В чем может быть проблема? С электроникой всё в порядке, на осцилографе видна четкая картина данных в виде миандра.
МК - atmega16U4, таймер пока в сторонке не юзается.

Код программы в прикреплённом файле...
Прикрепленные файлы
Прикрепленный файл  code.txt ( 1.02 килобайт ) Кол-во скачиваний: 118
 
Go to the top of the page
 
+Quote Post
andrewkrot
сообщение Jun 8 2010, 15:45
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 306
Регистрация: 11-11-04
Из: Москва
Пользователь №: 1 106



Похоже, что интервал между прерываниями гораздо меньше времени на передачу одного байта в УАРТ. Нужно сделать примерно так -
1. Организовать буфер передачи в ОЗУ;
2. Организовать прерывания по окончанию передачи байта в УАРТ;
3. По прерыванию INT данные для передачи просто писать в буфер;
4. По прерываниям УАРТА проверять пустой ли буфер, и если не пустой то брать очередной байт и толкать на передачу.
Go to the top of the page
 
+Quote Post
Loreleja
сообщение Jun 9 2010, 09:36
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 15
Регистрация: 7-06-10
Из: Киев
Пользователь №: 57 785



Да, спасибо огромное!

Проблему решила следующим образом:
данные записываю в массив, по переполнению таймера проверяю наличие данных и если есть - передаю по уарту. biggrin.gif

к сожалению, основной проблемы это не решило sad.gif ...
Возможно вы сможете помочь?

Программа для кард-ридера написана под atmega8 c кварцем 7,3 , я её переделываю под atmega16u4 c кварцем 8.
Сама программа по сути универсальная, то есть её алгоритмы, но она упорно не хочет правильно работать. Каждый раз выдает ошибку проверки LRC.

Весь проект крепить не буду, смысла нет. Только основное - файл magestripe, настройка таймеров, юарта, файл с переменными (board.txt) ну и мейн (avr_cunit)...

Буду очень благодарна за любые предположения!!!
Прикрепленные файлы
Прикрепленный файл  magstripe.txt ( 6.88 килобайт ) Кол-во скачиваний: 58
Прикрепленный файл  timer.txt ( 448 байт ) Кол-во скачиваний: 32
Прикрепленный файл  uart.txt ( 553 байт ) Кол-во скачиваний: 33
Прикрепленный файл  board.txt ( 2.35 килобайт ) Кол-во скачиваний: 35
Прикрепленный файл  avr_cunit.txt ( 319 байт ) Кол-во скачиваний: 26
 
Go to the top of the page
 
+Quote Post
vesago
сообщение Jun 9 2010, 14:08
Сообщение #4


Тутэйшы
****

Группа: Свой
Сообщений: 708
Регистрация: 30-11-04
Пользователь №: 1 263



Где-то в софте косяк. Сперва нужно убедиться, что ваш ридер выдает в том формате, который вы ожидаете. В чистом виде это ф2ф, но может быть встроенный преобраз клокдата. Допустим ф2ф. Сначала нужно научиться принимать данные. Настройте программу, чтобы выдавала данные, которые считала без проверки битов паритета и лрц. Считайте допустим банковскую карту. Обычно сначала валят нули, потом тетрада B, в конце F. Добейтесь чтобы четко выдавало B. Если с приемом все в норме, значит некорректно считает лрц. лрц = B xor x1 xor...xor F.
Go to the top of the page
 
+Quote Post
andrewkrot
сообщение Jun 9 2010, 18:30
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 306
Регистрация: 11-11-04
Из: Москва
Пользователь №: 1 106



Еще раз повторю - у Вас драгоценное процессорное время тратится на программный опрос готовности УАРТА! Сделайте передачу/прием по прерываниям так как я выше говорил, и половина проблем скорее всего пропадет=)
Go to the top of the page
 
+Quote Post
rx3apf
сообщение Jun 9 2010, 19:23
Сообщение #6


Гуру
******

Группа: Участник
Сообщений: 3 834
Регистрация: 14-06-06
Из: Moscow, Russia
Пользователь №: 18 047



Цитата(Loreleja @ Jun 9 2010, 16:38) *
видимо не очень уважаемые... а зачем? ведь можно нагрузить программиста голову поломать...
smile3046.gif

_Голову_ ! Так вот, не надо страдать ерундой - если так хочется передавать на обработку сырые времянки - то Бога ради. Семплируем, считаем, сохраняем (у камешка килобайт на это дело, по байту на смену уровня это более чем достаточно). Закончили (по таймауту или заполнению) - отдали пакет времянок хосту. Причем пакет, оформленный по-человечески - какая-то преамбула, времянки, контрольная сумма. Тогда надо следить лишь за flow-control при обмене, если хост может тормозить.
Но так делать - вообще-то извращение. По-хорошему, надо писать полноценный декодер, и отдавать хосту уже готовые данные.


Цитата(vesago @ Jun 9 2010, 23:18) *
Задача эта элементарно решается без всяких дополнительных ис.

+1024. Решение на микроконтроллере и проще, и гибче, и дешевле. Работа совершенно ерундовая.
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Jun 9 2010, 20:01
Сообщение #7


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Разговоры не по теме скрыл.
Модератор.
Go to the top of the page
 
+Quote Post
Loreleja
сообщение Jun 11 2010, 08:36
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 15
Регистрация: 7-06-10
Из: Киев
Пользователь №: 57 785



Уважаемый rx3apf, я очень благодарна за внимание к моей проблеме, но не могли бы вы изъясняться более простыми словами. Я в программировании еще новичок и ваш сленг понимаю отчасти, из-за чего общий смысл поста вообще утерян ))
По поводу программы, так сказать, свежие новости. Поочередно отключив считывание то одной, то второй дорожки, было обнаружено, что они таки корректно считываются, декодируются и даже проходят все проверки! Не каждый раз конечно, это тоже проблема... Хотя временные интервалы правильны каждый раз.
Но только по отдельности, при отключенном втором внешнем прерывании... Как бы это решить?
Юарт запихнула по переполнению таймера, так что он не влияет на прием данных.
Go to the top of the page
 
+Quote Post
Loreleja
сообщение Jun 16 2010, 14:30
Сообщение #9


Участник
*

Группа: Участник
Сообщений: 15
Регистрация: 7-06-10
Из: Киев
Пользователь №: 57 785



Снова прошу вашего совета!

функция f2f явно не успевает обработатывать прерывания, из-за чего и ошибку выдает. Создала массив из 300 unsigned short int (2 байта) для хранения временных интервалов с трека 2. Но на 900 интервалов с трека 1 памяти уже естественно не хватает...

как же поступить теперь? может можно как-нибудь сократить f2f, что бы меньше времени на обработку уходило? я пока не нашла выхода...
Go to the top of the page
 
+Quote Post
rx3apf
сообщение Jun 16 2010, 15:14
Сообщение #10


Гуру
******

Группа: Участник
Сообщений: 3 834
Регистрация: 14-06-06
Из: Moscow, Russia
Пользователь №: 18 047



Цитата(Loreleja @ Jun 16 2010, 18:30) *
как же поступить теперь? может можно как-нибудь сократить f2f, что бы меньше времени на обработку уходило? я пока не нашла выхода...

А зачем двухбайтовые счетчики ? Отмасштабировать до одного байта, с учетом возможных длительностей и вариации скоростей протяжки...
Go to the top of the page
 
+Quote Post
Loreleja
сообщение Jun 16 2010, 21:34
Сообщение #11


Участник
*

Группа: Участник
Сообщений: 15
Регистрация: 7-06-10
Из: Киев
Пользователь №: 57 785



Цитата(rx3apf @ Jun 16 2010, 18:14) *
А зачем двухбайтовые счетчики ? Отмасштабировать до одного байта, с учетом возможных длительностей и вариации скоростей протяжки...


да, была такая идея, но ни к чему на практике не привела. Даже если значение таймера будет в 1 байт, то 300+900=1200, всё равно никак не помещается...

как вариант, может переписать функцию на асме, ну я пока не надумала как это сделать...
Go to the top of the page
 
+Quote Post
vesago
сообщение Jun 17 2010, 06:52
Сообщение #12


Тутэйшы
****

Группа: Свой
Сообщений: 708
Регистрация: 30-11-04
Пользователь №: 1 263



Loreleja, может у Вас в принципе алгоритм декодирования не очень? Каков он? Если одну дорожку декодировать, то проблем нет. Для одной дорожки я бы наверное делал так. Вначале идут нули для синхронизации. Т.е. можно определить временные характеристики данного семпла измеряя время между дерганиями ноги. Как только появится перепад отличающийся соответсвенно по времени - пошла единица начала посылки - B. После этого начинаем по каждому прерыванию, зная длительности 0 и 1 складывать в буфер биты. Также контролируем таймаут. На банковской карте на дорожке порядка 40 байт.

Если сразу несколько дорожек, то сложнее. Скорость протяжки может быть разная и длительности могут быть довольно малыми. Тут надо мудрить со вложенными прерываниями. Наверное. Вейганд я сразу 4 канал декодировал, но там длительности млс. Может проц пошустрее задействовать или применить на каждую дорожку свою мегу?
Go to the top of the page
 
+Quote Post
Loreleja
сообщение Jun 17 2010, 07:06
Сообщение #13


Участник
*

Группа: Участник
Сообщений: 15
Регистрация: 7-06-10
Из: Киев
Пользователь №: 57 785



Цитата(vesago @ Jun 17 2010, 09:52) *
Loreleja, может у Вас в принципе алгоритм декодирования не очень? Каков он?


вряд ли проблема в декодаровании. Ведь по отдельности дорожки отлично считываются и выдают правильную инфу. Тем более что эта програ приспокойненько себе работала на atmega8 c кварцем 7,3 , то есть скорость обработки и того была меньше. А тут получается и кварт побольше, и мега покруче, а всё равно не пашет...
я в замешательстве sad.gif
Go to the top of the page
 
+Quote Post
rx3apf
сообщение Jun 17 2010, 08:01
Сообщение #14


Гуру
******

Группа: Участник
Сообщений: 3 834
Регистрация: 14-06-06
Из: Moscow, Russia
Пользователь №: 18 047



Цитата(vesago @ Jun 17 2010, 10:52) *
Если сразу несколько дорожек, то сложнее. Скорость протяжки может быть разная и длительности могут быть довольно малыми. Тут надо мудрить со вложенными прерываниями. Наверное. Вейганд я сразу 4 канал декодировал, но там длительности млс. Может проц пошустрее задействовать или применить на каждую дорожку свою мегу?

Я бы, пожалуй, не стал работать с прерываниями от входного сигнала, а вместо этого просто по таймеру, с достаточным оверсемплингом, опрашивать каналы. Дискриминацию длительностей можно вообще сделать по одной дорожке. Определились со скоростями и погнали битовые потоки в накопители...
Go to the top of the page
 
+Quote Post
Loreleja
сообщение Jun 17 2010, 08:09
Сообщение #15


Участник
*

Группа: Участник
Сообщений: 15
Регистрация: 7-06-10
Из: Киев
Пользователь №: 57 785



Цитата(rx3apf @ Jun 17 2010, 11:01) *
Я бы, пожалуй, не стал работать с прерываниями от входного сигнала, а вместо этого просто по таймеру, с достаточным оверсемплингом, опрашивать каналы. Дискриминацию длительностей можно вообще сделать по одной дорожке. Определились со скоростями и погнали битовые потоки в накопители...

по одной дорожке никак не получится, там ведь интервалы разные. трек 2 длительность длиннее, там бит меньше...

может стоит кварц побольше поставить?
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 07:23
Рейтинг@Mail.ru


Страница сгенерированна за 0.01476 секунд с 7
ELECTRONIX ©2004-2016