2 недели разбирался с программным кодом программы CН. Высер писал на работе…. Всё нижесказанное- моё личное мнение. Есть свои плюсы и минусы. Начнём по порядку..
1. Применена более высокоскоростная платформа (Ардуино). Плюс сомнительный, поскольку эту же частоту (речь только о платформе пока) можно получить и на АТ Меге8.
2. Программной памяти на Ардуино 32, а не 8 Кб, как на Меге. Нужно менее 3кб… Ардуино дороже.
3. Качество пайки Ардуино не сравнимо с качеством изготовления корпуса микросхемы, это к вопросу о вибрации..
4. Габариты Ардуино больше корпуса Меги. Обвязку из кварца и кондёров для Меги не считаю минусом.
5. Плюс –имеется в определённых конфигурациях программатор на борту, но он мне по барабану – в дороге он мне не нужен, а дома я как-нибудь использую программатор (не забываем об увеличении габаритов).
По платформе пока всё.
6. По программе поддержки – оформлена красиво, ничего не скажешь, это хороший плюс программы.
7. Теперь о самой программе, лезем в дебри. Программная защита от помех хорошА, но смысла в ней не вижу, поскольку надо бороться с причинами помех, а не их последствиями. Это устраняется аппаратными средствами, а не программными. Чем скоро и займусь. Наработки есть.
8. Очень удивился, когда увидел, что АЦП измеряется только на минимальных оборотах. Это, кстати, в главном цикле.. Длина меток сражает наповал.. Чтобы не быть голословным, фрагменты из оригинала ниже:
Код: Выделить всё
; ОСНОВНАЯ ПРОГРАММА
loop: rcall ADCProcessIFStopMode
……
ADCProcessIFStopMode:
sbrs Status,StopModeBit
ret
К тому же он меряет не 0..255, а 0..3 (нет левого выравнивания). Замеры проверялись?
Код: Выделить всё
.equ StartADCCmd = 0b11000111 ;Включить АЦП и установить время….
…………………..
ldi A,StartADCCmd ;Включить АЦП и установить время……
ldi XL,ADCSRA
st X,A
Что он усредняет в кольцевом буфере, думаю, сами догадались?.. Всё время замера МК топчется на одном месте, отнимая ресурсы:
Код: Выделить всё
waitADCRdy:
ld A,Y
sbrc A,ADCnotRdyBit
rjmp waitADCRdy
ldi YL,ADCH
9. UART… Тут вообще отдельная песня. Зачем тратить пол килобайта ОЗУ на какой-то обмен-это слишком шикарно.
Код: Выделить всё
Rbuff: .byte 256 ;Буфер кольцевой принятых команд
Tbuff: .byte 256 ;Буфер кольцевой отправляемых данных
При настройке (когда подключён UART), ему пофиг, занимается ли процессор расчётом искры или нет –он шурует свой обмен, ну хоть бы флаги запрета поставили:
Код: Выделить всё
; ОСНОВНАЯ ПРОГРАММА
……..
rcall UARTMODE
……..
UARTMODE:
rcall TransmiteData //Y,B,A
rcall CheckUARTflags
rcall ReadCmd
ret
Я понимаю, что обмен идёт только при настройке. Но ведь именно при настройке вы меняете углы или смотрите график.
10. От блока декодирования 24 команд UART (284 строки программы) я слегка окосел.. А нельзя ли было создать индексный буфер в ОЗУ на адреса меток этих 24 команд и обращаться к ним через индексы? Командой ijmp. Буфер бы занял 24 байта, программа -10-15 байт, ну и плюс довесок на куски команд (к декодированию не относится) ещё 30..40 байт. А если бы было 1000 команд? То же касается массива отладочной информации, правда он не большой. Причём обработка этого куска идёт как на приёме, так и на передаче – не забываем, как работает здесь UART, писал выше.
11. Далее про каллиграфию- на скорость не влияет, но если вы решили допилить программу под новые фишки или просто в ней разобраться, вам это не помешает… В программе много подпрограмм, выполняющихся за цикл один раз. Почему они не внедрены в основное тело программы? Может это какой-то блок, ну так в комментарии укажи… Много «глухих» меток – опять укажи в комментариях..
12. Наличие 22 .def и 52 .equ (+24 заккоментированы, но обозначены далее в комментах) превратило программу в шифровки радистки Кэт – читать абсолютно трудно, тем более разбираться в командах. Если по коду команды ещё можно определить, регистр или данные, то различить-константа это или переменная-нет.
13. В силу предыдущего пункта, я допускаю это на время отладки программы, но дальше-нет. Приведено много констант, которые, как сказал asel, повару не нужны. Зачем мне эти коэффициенты непонятные Ка (сейчас понятные), внутреннее или внешнее тактирование, замена частоты МК и т.д., если они в инструкции как пользоваться не описаны.
14. Макросы длиной в 2 команды… Дублирование команд с константами, и даже двойные вызовы подпрограмм…
Код: Выделить всё
UARTMODE:
rcall TransmiteData //Y,B,A
rcall CheckUARTflags
rcall ReadCmd
……
ReadCmd: rcall CheckUARTflags
sbrs EStatus,RnewCMDBit ;Если нет новых команд, выход
ret
15. "Мёртвые макросы" на светодиоды.. Укладка подряд в стек по 11 регистров? Автору регистров не хватает или про ОЗУ забыл? Большинство регистров используется как временные, и сказать, что там хранится-затруднительно.. Что такое? Я понимаю, что тема «Конструктор - Допили сам…», ну так ты же пишешь для людей, оформи программу, чтобы её мог кто-то прочитать.. Из моего небольшого опыта- это самая трудночитаемая программа.. Потому и читал 2 недели.
16. Из хорошего могу только сказать, что продуман алгоритм защиты от помех (мне он ни к чему, причины выше) и хорошо изготовлено описание и управляшка… Но это всё только красивая витрина.. Вроде и 2 Ардуинки у меня появились, но желания ставить их туда нет…Хотел приспособить с неё ДАД и UART в прогу Флеша, но концепция программы не позволяет присобачить ДАД, несмотря на указанные недостатки. Постоянная барабанная дробь UARTa в порт с последующим полнодуплексным обменом (команды-данные) мне тоже ни к чему.
17. Что за порочная практика, складывать .def и .equ из другого .include? Это чтобы пользователь, чтобы разобраться склеивал их все вместе? Мне попадалось подобное с 20 инклудами.
Это не все моменты, можно, например, и про сам обмен Flash с ПЗУ, просто этого достаточно, чтобы я сделал свой выбор.
РЕЗЮМЕ. Повторю, ИМХО. Подключение ДАД (это не резистор, там программа обработки датчика и расчёт точек) невозможно без изменения концепции. А также программа перегружена сервисом, который можно сделать отдельной программой (у Флеша –Прака углов, у меня –Конфигуратор). Кроме того, настраивать кривые по отдельности как?
Программа, бесспорно, рабочая, но это тупик для дальнейших разработок.. Мусор, конечно, можно убрать, ну а толку? Автору писал в личку, но он, «мягко говоря» отказался признавать косяки… Я был бы не против, если бы мне указали недостатки.. Приведено не БЛА-БЛА, а реальная КОНКРЕТИКА. Если кто-то думает иначе, может посмотреть исходники сам.. Если автор не подсуетится. Даже пробовать программу не хочу.. Теперь всё..