Доброго времени суток! Разрабатываю контроллер управления антенным коммутатором на Attiny2313. Пишу на Си, вооружившись Proteus с прикрученным WinAVR. Программа для управления с ПК кое-как написана на C# (да и дело не в ней). Сам не программист, только учусь. Прошивка в основном работает. Описание работы, исходники прошивки положил к себе на сайт https://unlis.ru/?p=1944. Посмотреть как работает:
Но в прошивке есть один баг. Дело в том, что реализован функционал программного отключения антенных портов. То есть заходим в настройки программы, снимаем галки на ненужных нам антеннах, нажимаем Сохранить, и программа отсылает команду в МК - восемь бит, каждый бит соответствует антенне. Галка снята - соответствующий бит сброшен, установлена - установлен. А прошивка при обработке нажатия кнопки проверяет - если бит, соответствующий номеру кнопки, в байте установлен - значит можно включить антенну. А по факту получается....
То есть при включении портов 5-8 они не работают до тех пор, пока я не нажму какую-нибудь кнопку из разрешенных РАНЕЕ портов, а после этого все работает как надо. То есть были включены 1,2,3,4, включаем 5,6,7,8. Сразу после этого при нажатии 5,6,7,8 ничего не происходит пока я не нажму что-нибудь из 1,2,3,4, а потом все начинает работать как и должно быть - все 8 портов. Причем прошивка эти настройки в EEPROM сохраняет, переменной, отвечающей за биты разрешенных/запрещенных антенн, присваивается значение, которое с компа пришло. А вот пока процедура обработки кнопок не выполнится хотя бы раз - только что разрешенные кнопки не работают...
нихрена не понял нахуя отключать антены от фидера удалено для этого есть суматоры/филтры сложения это есди RX\TX ну и стандартных дисекоф если толка нам прием хватает выше крыши пилот сигнал 3Ч...
Я конечно извиняюсь, но вопрос стоял не в том зачем их отключать....
Баг, кстати, выловлен. Если кому интересно: компилятор Си решил при сборке, что переменная enabled в условии
Код:
if ((enabled & (1<<count)) != 0 )
будет храниться в регистре. При вызове прерываний регистры никто естественно не сохраняет, этот же компилятор собрал программу так, что прерывание использует этот же самый регистр. В процессе обработки прерывания регистр напрочь затирается (потом каким-то образом восстанавливается при выполнении другого куска кода программы) - и условие не выполняется, кнопки не работают. Как только я сказал компилятору волшебное слово volatile - храни переменную в оперативке - все стало работать как надо. Молодой еще, неопытный)
blackheart, volatile - это не о "храни переменную в оперативке". Это о том, что значение переменной может измениться "из вне" поэтому при оптимизации нужно это учитывать. Нюанс в том, что с точки зрения компилятора, он не знает когда возникает прерывание. Из кода прямых переходов нет, поэтому с его точки зрения в прерывании обычная переменная не может поменяться, потому что туда нет перехода, поэтому её можно "оптимизировать" соответственно. Вплоть до превращения в константу. Поэтому любая переменная, которая изменяется из прерывания, должна быть помечена как volatile. Также, как и регистры, к примеру, определены.
Еще советы по коду. Во-первых вы немного изобрели велосипед функциями EEPROM_*(). Все это есть в avr/eeprom.h, сходите по ссылке. Во-вторых, вы пишете по фиксированному адресу в EEPROM. Если переключения достаточно частые, то в итоге вы "выжжете" ячейку EEPROM. Конечно там много циклов перезаписи, даже больше заявленных 100К по факту. Но всё-таки если запись идет часто и этот ресурс можно за обозримый срок исчерпать. Если конечно переключение ручками, раз-два в день, то это не страшно. Если с компа автоматом часто очень переключается - прикиньте ресурс. И если что, надо делать т.н. wear leveling. Ну и еще в обмен по UART добавить бы некий контроль целостности пересылки. Если придет битый пакет? Хотя бы банально CRC туда-сюда добавить в конце. Тоже если что, всё уже готовое есть: https://www.nongnu.org/avr-libc/user-ma ... __crc.html
Во-вторых, вы пишете по фиксированному адресу в EEPROM. Если переключения достаточно частые, то в итоге вы "выжжете" ячейку EEPROM. Конечно там много циклов перезаписи, даже больше заявленных 100К по факту. Но всё-таки если запись идет часто и этот ресурс можно за обозримый срок исчерпать. Если конечно переключение ручками, раз-два в день, то это не страшно. Если с компа автоматом часто очень переключается - прикиньте ресурс. И если что, надо делать т.н. wear leveling.l
Если так надо часто писать в EEPROM, то FRAM в помощь. Если не хочется иметь два корпуса, то MSP430FRxxx в помощь.
parovoZZ, менять контроллер слишком радикально. Можно просто несчастных 2 байта писать по кругу, тем самым увеличив ресурс в 64 раза (т.к. 128 байт имеется) максимум (если не использовать ID записи, а просто скажем затирая до FF прошлое значение после записи и поэтому находя последнюю запись). Ес-но в определенных случаях может и этого не хватить... но скорее всего в данном случае менять МК не придется всё-таки )
Просто к примеру, скажем у нас события пишутся раз 500 в день. Это чуть больше чем пол года гарантированной работы МК до выхода из строя при записи в одни и те же ячейки. Если ввести примитивный кольцевой буфер - это уже ~32 года что уже более, чем достаточный срок службы. Ну плюс тут еще есть нюанс - контроль целостности. Можно еще CRC добавить, размер блока вырастет, но будет гарантия достоверности считанных данных.
проблема актуалная был какой недотелк где ДЕБИЛЫ сэкономили копечную еромку 24ххх а писали в память проца... в результате некоторые ячейки выходили из строя через 3-5лет отказывало переключени програм и громкость глючила...
Во-вторых, вы пишете по фиксированному адресу в EEPROM. Если переключения достаточно частые, то в итоге вы "выжжете" ячейку EEPROM.
Над этим я думаю, буду модернизировать прошивку. Эта прошивка - вообще первое, что я написал в жизни на Си под AVR, поэтому ни разу не претендует на правильность.
Ну и еще в обмен по UART добавить бы некий контроль целостности пересылки.
Об этом тоже думал. См. выше)
Ну а в общем - большое спасибо за советы, обязательно учту всё сказанное. Ибо я не программист, и у меня существует такая проблема, что написать-то вроде можно, но как написать - красиво, правильно и компактно или с кучей костылей, но чтоб в конечном итоге работало - спросить лишний раз не у кого (нет таких знакомых поблизости), приходится самому изучать; и порой непонятно - забил ли я тут костыль, либо это не костыль, а правильное решение...
Всем привет ! Ребята, подскажите знающие, проблема при прошивке PIC16F648A. Операционка винда7, программатор ic prog 105D. Программатор собрал сам, еще не раз не прошивал с ним, собирал по схеме, проверил, все нормально. Почему я не могу поставить галочку "Вкл. NT/2000/XP драйвер" Фото. https://img.radiokot.ru/files/143475/2hcau1qacj.png Извините что не в ту тему написал.
eeprom.h знаю, но я взял примеры из datasheet микроконтроллера. Так захотелось, для наглядности что ли...
Даташит - он о железе. А функции готовой библиотеки - это о компиляторе. Так что еще в мануал на компилятор стоит поглядывать, ссылку я давал. Там много стандартных вещей для периферии уже реализовано просто.
Ребята, подскажите пож! Сюда, на этот программатор еще дополнительное подача напряжение нужно? Это по прошивки pic16F648A. Или же достаточно с ком порта?
Так а схема программатора какая?? Наверное имеется в виду JDM-программатор? Там питание с COM-порта приходит Вот какая должна быть схема. Лично собирал, всё работает
Так а схема программатора какая?? Наверное имеется в виду JDM-программатор? Там питание с COM-порта приходит Спасибо! Попробую его собрать. А так, у меня ЖДМ программатор. Даже пробовал питание отдельно подать 5-12в, все без толку
Ссылка рабочая. Google Chrome выделывается скорее всего, там в ссылке http указано вместо https, а ему такие ссылки не нравятся. В новом окне откройте или "сохранить по ссылке"
Поправил ссылку, должна без танцев с бубном открываться