Перейти к содержанию

sam3x8e проблема с прерыванием


Рекомендуемые сообщения

добрый день

исходные:

Цитата

- arm-toolchain (10.3.1, 11.x, 12.2)
- arm_gdb-12.1_py3.7
- openocd-0.12.0
- atmel ice (отладчик)
- sam3x8e (прототиа arduino-due)
- slackware-14.2 x64


отлаживаю "библиотеку" на си - передача данных по 2м проводам (wiegand):
- импульс D0 -> получили "0"
- импульс D1 -> получили "1"

будет использоваться неск. экземпляров RFID-датчиков, поэтому планирую сделать вообще без "механизмов блокировки".

в прерывании только устанавливаются флаги, все остальное делается в основном цикле.

в силу "обстоятельств" (унаследовано с прототипа) подключение пинов данных D0/D1 - на разных портах (по идее это не проблема, на ардуиновском "тестовом скетче" с таким-же расположением пинов - rfid-карта читается без проблем, но, походу, конечно протестирую еще и "все на одном порту") 

текущий код на си. читает карту, но с особенностями. 
к основному номеру карты (в старший разряд) добавляется еденица и последний (младший) разряд, соотв. обрезается.

для отладки по шагам вместо "виганда" подключил две кнопки (c rc-цепочкой, сигналы нормальные, дребезг отсутствует, кнопок много, менялись/проверялись)

выяснилось (в отладчике):
- импульс на D0 - прерывание срабатывает 1 раз и далее все "печенькой" :о)
- импульс на D1 - прерывание срабатывает 3 раза 

1й раз - все по делу, "на падение сигнала", как и должно быть
2й раз - не  по делу, "на подьем" (возвращение кнопки обратно), причем 2раза подряд

и еще для "запуток" - при чтении (без отладчика, напрямую) только одна, самая первая, неправильная 1-ца добавляется в начало (в старший разряд) а далее серийник читается правильно.

порты D0/D1 инициируются на вход, включается подтяжка, ни чего особенного.код, выкусы (упрощенка) кода:

//
// структура (выкус)
//
struct struct_Wiegand
{
TPinOut           d0;                   // D0   пин
TPinOut           d1;                   // D1   пин

uint8_t  volatile data_flag[2]; // два флага на сработку D0/D1
...
};

typedef struct struct_Wiegand TWiegand;

extern TWiegand* lst_rfid[RFID_NUM_DEV]; // список указателей на структуры

//
// в теле реализации
//
TWiegand w1={ {PIOA,19}, {PIOC,18}, {PIOA,20}, 0, {0,0}, 0, 0 }; 
TWiegand* lst_rfid[RFID_NUM_DEV] = { &w1 }; 

//
// регистрация/добавление обработчиков прерываний
// механизм/список такой-же как в ардуино
//
isr_enb_port (lst_rfid[0]->d0.pio, lst_rfid[0]->d0.pin, isr_rfid0_D0, FALLING); // D0
isr_enb_port (lst_rfid[0]->d1.pio, lst_rfid[0]->d1.pin, isr_rfid0_D1, FALLING); // D1

//
// обработчики
//
void isr_rfid0_D0() { lst_rfid[0]->data_flag[0] ++; }
void isr_rfid0_D1() { lst_rfid[0]->data_flag[1] ++; }


других инициализаций прерываний нет (отрубал все что можно).
если закомментировать строку вызова "добавления прерывания" для D1, то прерывание на D1 не срабатывает

подобрал ссылки "околотемы"
URL1
URL2
URL3
URL4
URL5
URL6

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

Изменено пользователем sunjob
!!!
Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы публикуете как гость. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...