Контроллер для кордовых электричек

Маркс

ISP это интерфейс внутрисхемного программирования, под наши задачи не подходит,
разве что каждый раз прошивать прошивку в камне таймера ))
Регулятор подключается к обычному цифровому выходу,
его в принципе можно сделать двунаправленным, что бы и передавать и принимать через него,
но это реально лишняя головная боль, в плане написания протокола обмена.
Тогда уж проще использовать UART.
Может так и надо сделать, тем более, что UART на таймере всяко будет выведен,
надо же к чему то подключать программатор, если использовать не Arduino NANO или MICRO, а Arduino MINI.

Вот так может выглядеть

размер 70х25 мм, слева разъем для подключения USB-UART, к нему же будет подключен программатор,
справа разъем для кнопки (2-х контактный) и (3-х контактный) для регулятора, с регулятора будет питание.

RandomJ
Маркс:

Если есть связка Uno+LCD+Key, можно потестить.

Загрузил, картинка есть кнопочки клацают. Немного интуитивно не понятна навигация по меню.
ИМХО надо так:
перемещение по пунктам меню “up/down”,
вход в настройку параметра “select”
изменение параметра “up/down”, выбор позиции курсора “left/right”
выход из настройки “select”.

Ждём для теста схему и ПО для связки таймер - программатор. Использование для настройки RS232 имеет место быть, благо у “мини” он уже выведен на край платы.

RandomJ
Маркс:

Вот так может выглядеть
\

Разъём для регулятора то же надо штырями выводить.

Маркс
RandomJ:

Разъём для регулятора то же надо штырями выводить.

это понятно, с точки зрения EasyEDA и травления
на плате все равно три отверстия ) с шагом 1,25

RandomJ:

ИМХО надо так:

пока реализовано одноуровневое меню, с многоуровневым свои трудности

Маркс

Думаю к выходным закончу обмен данными между программатором и таймером,
на данный момент работает чтение данных из таймера в программатор по UART,
пришлось повозится с протоколом обмена, что бы не зависало при потере данных или сбое передачи/приема.
Таймаут вылечил )), если дошло дело до таймаута, процесс тупо начинается с начала.

Маркс

как же все сложно у Мег при работе с железным UART, да и в реализации на Ардуино,
на STM32 настроил прерывание на прием байта и “кури бамбук”, пока оно не придет.
а здесь надо в цикле проверять “а есть ли данные в буфере”
и не дай бог попробуешь прочитать Serial.read () больше чем есть в буфере,
как можно прочитать то, чего нет, что за хрень такая, нет данных верните ошибку.
а самое паршивое, что всю эту хрень надо обязательно предусмотреть.

Маркс

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

RandomJ

Главное переменной “w0dka” не придавать значение больше 500 😃

Маркс

не, “w0dka” она не просто константа, так еще и глобальная.

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

во второй половине дня приеду с работы, “дорисую” обратный обмен, “рыба” уже есть и она вполне съедобная
и думаю к вечеру интегрирую обмен в программу таймера.
Пока на втором конце Ардуино Нано читает команды и отправляет данные по запросу.
команд осталось три,

  • 0x55 установить соединение, ответ таймера 0x55, готов к обмену
  • 0x5A запрос пакета с таймера, ждем пакет от таймера 0,2 секунды
  • 0xA5 передача пакета таймеру, отправляем пакет и ждем ответ 0xA5.

5 и A потому как чередование 0101 1010, а это самое удобное для синхронизации ))

Маркс

Работоспособность самого таймера не проверял,
пока, ВРОДЕ КАК, полностью реализован обмен.
Данные в таймере будут сохраняться в EEPROM, сейчас при старте в EEPROM будут загружены стоковые данные,
для обмена будут использоваться данные из EEPROM, но пока сохранение того что вернул программатор не допилил, там пару команд добавить, решил пока не ломать то, что работает

Timer_for_Plane_v5_Programmer.zip

Маркс

как оно должно работать, проверяйте.

  • если при включении программатора таймер не включен, на экране сообщение - “not connection”
  • после подключения таймера, программатор переходит в режим - “Read”
  • кнопкой SELECT считываем данные с таймера, сообщение - “Complete”
  • после корректировки переходим в меню - “Write”
  • соответствие принятого отправленному проверяется в программаторе автоматически, повторным чтением.
  • если запись прошла успешно, сообщение - “Coomplete”
  • если при записи выявлена ошибка, сообщение - “ERROR”, можно еще раз попробовать записать )

Будет добавлено в программу, при успешной проверке отправленных данных, программатор передаст команду на запись в EEPROM,
этот кусок еще не реализован, пока надо все остальное проверить.
ближе к вечеру сооружу стендик и буду тестить.

Маркс

В плане, добавить переменные

  • GYRO on - если используется гироскоп, теоретически режим с гироскопом сейчас должен работать, если в этой версии я ничего не сломал.
  • RPM sensor - если подключен датчик оборотов, на будущее
    и под них будем делать софт )
RandomJ

Ещё бы схему электрическую подключений… к каким ногам какие проводки подключать.

Маркс

GND-GND - на LCD это две гоги между 5V и VСС на MINI разъем UART (снизу) подписано GND

RX-TX и TX-RX, на мини подписаны, на LCD RX-правый крайний, TX-рядом с ним

Если вдруг случка не произойдет, можно RT/TX на одной из плат поменять местами

После этого Reset на таймере обязателен, Таймер будет ждать соединения не сильно долго, сейчас стоит 10 секунд, после подключения питания,
если за 10 секунд соединение не произошло, таймер выходит из режима программирования и отправляется в нормальный режим.

Маркс

Собрал стенд, с записью какой то косяк, записывает через раз.
Будем искать ((

Маркс

Исправил ошибку
Programmer.zip
сейчас есть другая трабла, не понятно на что влияющая и где искать концы,
при записи может подвиснуть на 1-2 секунды, но не всегда

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

Маркс

в общем, продолжу отыскивать траблы, еще пара вылезла,
последовательный порт работает значительно медленнее процессора ))))
так что “по простому” не получится

Маркс

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

Маркс

нашел огромный “косяк”, теперь надо понять, как его “выкурить”.
обмен можете даже не смотреть, таймер отдает все правильно, а вот получает - всякую хрень.

Маркс

как же быстро привыкаешь к хорошему )),
я имею в виду отладку на STM32, остановил программу в любом месте, просто так или по условию
и смотришь, что куда пришло и что где лежит ) Атмега в этом смысле полный отстой,
как можно заниматься отладкой обмена по UART, если данные можно только в него и выводить.

Маркс

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

ПЕЧАЛЬНО (