|
Ридер Магнитных Карт, не правильно работает прерывание |
|
|
|
Jun 8 2010, 14:45
|
Участник

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

|
Уважаемые, помогите решить проблему! Внешнее прерывание INT0 от одной дорожки магнитной карты. Прерывание настроено по любому изменению. В обработчике тупо счетчик считает количество возникших прерываний и выдает по юарту. Кто сталкивался с магнитными картами, в курсе, что на 1 дорожке как минимум 240 перепадов уровня - это я округлила. Но почему то с каждой карты счетчик упорно выдает от 35-45 - не больше. В чем может быть проблема? С электроникой всё в порядке, на осцилографе видна четкая картина данных в виде миандра. МК - atmega16U4, таймер пока в сторонке не юзается. Код программы в прикреплённом файле...
Прикрепленные файлы
code.txt ( 1.02 килобайт )
Кол-во скачиваний: 118
|
|
|
|
|
Jun 9 2010, 09:36
|
Участник

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

|
Да, спасибо огромное! Проблему решила следующим образом: данные записываю в массив, по переполнению таймера проверяю наличие данных и если есть - передаю по уарту.  к сожалению, основной проблемы это не решило  ... Возможно вы сможете помочь? Программа для кард-ридера написана под atmega8 c кварцем 7,3 , я её переделываю под atmega16u4 c кварцем 8. Сама программа по сути универсальная, то есть её алгоритмы, но она упорно не хочет правильно работать. Каждый раз выдает ошибку проверки LRC. Весь проект крепить не буду, смысла нет. Только основное - файл magestripe, настройка таймеров, юарта, файл с переменными (board.txt) ну и мейн (avr_cunit)... Буду очень благодарна за любые предположения!!!
|
|
|
|
|
Jun 9 2010, 19:23
|
Гуру
     
Группа: Участник
Сообщений: 3 834
Регистрация: 14-06-06
Из: Moscow, Russia
Пользователь №: 18 047

|
Цитата(Loreleja @ Jun 9 2010, 16:38)  видимо не очень уважаемые... а зачем? ведь можно нагрузить программиста голову поломать...  _Голову_ ! Так вот, не надо страдать ерундой - если так хочется передавать на обработку сырые времянки - то Бога ради. Семплируем, считаем, сохраняем (у камешка килобайт на это дело, по байту на смену уровня это более чем достаточно). Закончили (по таймауту или заполнению) - отдали пакет времянок хосту. Причем пакет, оформленный по-человечески - какая-то преамбула, времянки, контрольная сумма. Тогда надо следить лишь за flow-control при обмене, если хост может тормозить. Но так делать - вообще-то извращение. По-хорошему, надо писать полноценный декодер, и отдавать хосту уже готовые данные. Цитата(vesago @ Jun 9 2010, 23:18)  Задача эта элементарно решается без всяких дополнительных ис. +1024. Решение на микроконтроллере и проще, и гибче, и дешевле. Работа совершенно ерундовая.
|
|
|
|
|
Jun 11 2010, 08:36
|
Участник

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

|
Уважаемый rx3apf, я очень благодарна за внимание к моей проблеме, но не могли бы вы изъясняться более простыми словами. Я в программировании еще новичок и ваш сленг понимаю отчасти, из-за чего общий смысл поста вообще утерян )) По поводу программы, так сказать, свежие новости. Поочередно отключив считывание то одной, то второй дорожки, было обнаружено, что они таки корректно считываются, декодируются и даже проходят все проверки! Не каждый раз конечно, это тоже проблема... Хотя временные интервалы правильны каждый раз. Но только по отдельности, при отключенном втором внешнем прерывании... Как бы это решить? Юарт запихнула по переполнению таймера, так что он не влияет на прием данных.
|
|
|
|
|
Jun 16 2010, 14:30
|
Участник

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

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

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

|
Цитата(rx3apf @ Jun 16 2010, 18:14)  А зачем двухбайтовые счетчики ? Отмасштабировать до одного байта, с учетом возможных длительностей и вариации скоростей протяжки... да, была такая идея, но ни к чему на практике не привела. Даже если значение таймера будет в 1 байт, то 300+900=1200, всё равно никак не помещается... как вариант, может переписать функцию на асме, ну я пока не надумала как это сделать...
|
|
|
|
|
Jun 17 2010, 07:06
|
Участник

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

|
Цитата(vesago @ Jun 17 2010, 09:52)  Loreleja, может у Вас в принципе алгоритм декодирования не очень? Каков он? вряд ли проблема в декодаровании. Ведь по отдельности дорожки отлично считываются и выдают правильную инфу. Тем более что эта програ приспокойненько себе работала на atmega8 c кварцем 7,3 , то есть скорость обработки и того была меньше. А тут получается и кварт побольше, и мега покруче, а всё равно не пашет... я в замешательстве
|
|
|
|
|
Jun 17 2010, 08:01
|
Гуру
     
Группа: Участник
Сообщений: 3 834
Регистрация: 14-06-06
Из: Moscow, Russia
Пользователь №: 18 047

|
Цитата(vesago @ Jun 17 2010, 10:52)  Если сразу несколько дорожек, то сложнее. Скорость протяжки может быть разная и длительности могут быть довольно малыми. Тут надо мудрить со вложенными прерываниями. Наверное. Вейганд я сразу 4 канал декодировал, но там длительности млс. Может проц пошустрее задействовать или применить на каждую дорожку свою мегу? Я бы, пожалуй, не стал работать с прерываниями от входного сигнала, а вместо этого просто по таймеру, с достаточным оверсемплингом, опрашивать каналы. Дискриминацию длительностей можно вообще сделать по одной дорожке. Определились со скоростями и погнали битовые потоки в накопители...
|
|
|
|
|
Jun 17 2010, 08:09
|
Участник

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

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