добрый день
исходные:
Код:
|
- 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 https://forum.cxem.net/index.php?/to...-вместо-одного
URL2
URL3
URL4
URL5
URL6
пока буду изучать ссылки, доки, даташит
пинайте, кидайте помидоры, идеи, ссылки, все что угодно! можно просто побалагурить по теме! :о)
спасибо.