Прошу помощи, приём и передача данных по 8 пинам .
- Войдите на сайт для отправки комментариев
Суть проблемы: устройство имеет 8 контактов - три входящие данные, три выходящие, входящие тактируются устройством, выходящие планируются микроконтроллером.
Устройство выставляет единицы и нули на трех пинах одновременно по спаду такта (я так понимаю один байт), и так четыре раза (4 байта), после чего тактирование передающий стороной останавливается. Ждём ответа.
Передатчик принимает эти данные, формирует ответ, так же четыре байта,и по другим пинам, аналогично тактирует и передаёт данные. Ждём следующий вопрос.
Время одного такта примерно 225ms.
Вопрос - возможно ли на ардуино это сделать?
Буду рад любым подсказкам и направлениям.
Заранее благодарен за ответ.
P.S. Картинки с осциллограф будут позже.
На такой скорости как 225 мсек обычный дигиталРеад прокатит, детская задача. Вот если 22 микросек, тогда немного сложнее, но ардуино запросто справится и тут.
Как прочитать то мне понятно , я не знаю как ответ отправить , а именно как тактировать и выставлять уровни.
К сожалению флешка умерла, с картинками облом. Накидал на скорую руку, ширина клетки 112ms.
Ну начинать надо так
/*millis_sirshulz.ino #1 передатчик ->(2,3,4) CLKout ->5 1\0 фиксация данных 0/1 готовность к передаче 0 - нет передачи #2 приемник Din_pin -> (6,7,8) CLKin ->9 1\0 фиксация данных 0/1 готовность к передаче 0 - нет передачи пауза 225ms 225ms D --[==]---[==]-- CLK __________/^^\___/^^\__ */ //#1 передатчик const int Dout_pin[3] = {2, 3, 4}; const int CLKout_pin = 5; //#2 приемник const int Din_pin[3] = {6, 7, 8}; const int CLKin_pin = 9; void setup() { //#1 передатчик pinMode(Dout_pin[0], OUTPUT); pinMode(Dout_pin[1], OUTPUT); pinMode(Dout_pin[2], OUTPUT); pinMode(CLKout_pin, OUTPUT); //#2 приемник pinMode(Din_pin[0], INPUT); pinMode(Din_pin[1], INPUT); pinMode(Din_pin[2], INPUT); pinMode(CLKin_pin, INPUT); } void loop() { //#1 передатчик //#2 приемник }Там ещё дигиталВрайт есть, пишем три раза на три пина. Потом смотрим пример "блинк визаут делэй", и если милисеки набежали до нужного значение, то пошем плЮс один дигиталВрайт по клок пину.
Товарищи !
Мне только казалось , то смогу прочитать данные.
Подскажите как правильно прочитать эти четыре байта и обьединить в одно число не растягивая код программы на несколько страниц?
Код даже публиковать стыдно , читать вообще не реально
Признаю , знаний у меня нет!
Ну, может я вас сбиваю своим подходом к программированию. Но передача 12 бит в течении 1 сек (225ms * 4) при обычном (а не с помощью программирования параллельных потоков) тормознет работу всей вашей системы.
Ну, может я вас сбиваю своим подходом к программированию. Но передача 12 бит в течении 1 сек (225ms * 4) при обычном (а не с помощью программирования параллельных потоков) тормознет работу всей вашей системы.
Да, вы правы, но устройство куда я планирую подключить ардуино , передает и принимает именно с такой скоростью. Оно имеет встроенный цифровой осцилограф и показания этих входов и выходов сняты с него.
Ну отправка 3 бит вроде есть. Но не проверял.
/*millis_sirshulz.ino #1 передатчик ->(2,3,4) CLKout ->5 1\0 фиксация данных 0/1 готовность к передаче 0 - нет передачи #2 приемник Din_pin -> (6,7,8) CLKin ->9 1\0 фиксация данных 0/1 готовность к передаче 0 - нет передачи пауза 225ms 225ms D --<=====><=====>-- CLK __________/^^\___/^^\__ #3 кнопка -> A0 (btn1_pin) */ //#1 передатчик const int Dout_pin[3] = {2, 3, 4}; const int CLKout_pin = 5; bool CLKout; bool do_transmission;// сделать передачу 1 / 0 нет bool transmission;// 1 идет передача /0 нет byte bit3_Tx = 0x5; // число b 0000 0101; void Out_bit3(byte data) { // отправка данных bit3_Tx = data; // загрузить данные do_transmission = 1; // подать команду "сделать передачу" } //#2 приемник const int Din_pin[3] = {6, 7, 8}; const int CLKin_pin = 9; bool CLKin, CLKin_old; byte bit3_Rx; byte In_bit3() { return digitalRead(Din_pin[2]) * 4 + digitalRead(Din_pin[1]) * 2 + digitalRead(Din_pin[0]); } //#3 кнопка const int btn1_pin = A0; bool btn1, btn1_old; //нажатие кнопки void setup() { Serial.begin(9600); //#1 передатчик pinMode(Dout_pin[0], OUTPUT); pinMode(Dout_pin[1], OUTPUT); pinMode(Dout_pin[2], OUTPUT); pinMode(CLKout_pin, OUTPUT); digitalWrite(CLKout_pin, CLKout = 0); // линия свободна //#2 приемник pinMode(Din_pin[0], INPUT); pinMode(Din_pin[1], INPUT); pinMode(Din_pin[2], INPUT); pinMode(CLKin_pin, INPUT); CLKin = digitalRead(CLKin_pin); // опрос линии приемника //#3 кнопка pinMode(btn1_pin, INPUT_PULLUP); btn1 = digitalRead(btn1_pin); } void loop() { //#1 передатчик static uint32_t past_1 = 0 ; if (do_transmission && ! transmission) { // если команда "сделать передачу" и прередачи нет past_1 = millis(); // сделать отметку transmission = 1; // включить передачу do_transmission = 0; // снять команду digitalWrite(CLKout_pin, CLKout = 1); // линия занята digitalWrite(Dout_pin[0], bit3_Tx & 0x1 ); digitalWrite(Dout_pin[1], bit3_Tx & 0x2); digitalWrite(Dout_pin[2], bit3_Tx & 0x4); } if ( CLKout && millis() - past_1 >= 112) { // формирование 1\0 CLKout digitalWrite(CLKout_pin, CLKout = 0); } if ( transmission && millis() - past_1 >= 225) { // если истекло время передачи transmission = 0; // выключить передачу } //#2 приемник CLKin_old = CLKin; CLKin = digitalRead(CLKin_pin); // опрос линии приемника if (CLKin_old && ! CLKin) { // если произошел перепад 1\0 bit3_Rx = In_bit3(); Serial.println(bit3_Rx); } //#3 кнопка static uint32_t past_3 = 0 ; if (millis() - past_3 >= 1000) { // если прошло 1000 миллисек past_3 = millis() ; btn1_old = btn1; btn1 = digitalRead(btn1_pin); if (btn1_old && ! btn1 && ! CLKout) // если нажата кнопка 1 и нет передачи Out_bit3(0x5);// то передать 3 бита } }Спасибо, суть уловил.
Буду пробовать доработать, так как принять и распознать надо четыре цифры и сразу отправить правильный ответ, тоже четыре цифры. И так пять раз.