Доброго времени суток! Разрабатываю контроллер управления антенным коммутатором на 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Ч...
будет храниться в регистре. При вызове прерываний регистры никто естественно не сохраняет, этот же компилятор собрал программу так, что прерывание использует этот же самый регистр. В процессе обработки прерывания регистр напрочь затирается (потом каким-то образом восстанавливается при выполнении другого куска кода программы) - и условие не выполняется, кнопки не работают. Как только я сказал компилятору волшебное слово 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
[uquote="NStorm",url="/forum/viewtopic.php?p=4008070#p4008070"]Во-вторых, вы пишете по фиксированному адресу в EEPROM. Если переключения достаточно частые, то в итоге вы "выжжете" ячейку EEPROM. Конечно там много циклов перезаписи, даже больше заявленных 100К по факту. Но всё-таки если запись идет часто и этот ресурс можно за обозримый срок исчерпать. Если конечно переключение ручками, раз-два в день, то это не страшно. Если с компа автоматом часто очень переключается - прикиньте ресурс. И если что, надо делать т.н. wear leveling.l[/uquote]
Если так надо часто писать в EEPROM, то FRAM в помощь. Если не хочется иметь два корпуса, то MSP430FRxxx в помощь.
parovoZZ, менять контроллер слишком радикально. Можно просто несчастных 2 байта писать по кругу, тем самым увеличив ресурс в 64 раза (т.к. 128 байт имеется) максимум (если не использовать ID записи, а просто скажем затирая до FF прошлое значение после записи и поэтому находя последнюю запись). Ес-но в определенных случаях может и этого не хватить... но скорее всего в данном случае менять МК не придется всё-таки )
Просто к примеру, скажем у нас события пишутся раз 500 в день. Это чуть больше чем пол года гарантированной работы МК до выхода из строя при записи в одни и те же ячейки. Если ввести примитивный кольцевой буфер - это уже ~32 года что уже более, чем достаточный срок службы. Ну плюс тут еще есть нюанс - контроль целостности. Можно еще CRC добавить, размер блока вырастет, но будет гарантия достоверности считанных данных.
проблема актуалная был какой недотелк где ДЕБИЛЫ сэкономили копечную еромку 24ххх
а писали в память проца... в результате некоторые ячейки выходили из строя через 3-5лет отказывало переключени програм и громкость глючила...
[uquote="NStorm",url="/forum/viewtopic.php?p=4008070#p4008070"]Во-первых вы немного изобрели велосипед функциями EEPROM_*(). Все это есть в avr/eeprom.h, сходите по ссылке.[/uquote]
Про eeprom.h знаю, но я взял примеры из datasheet микроконтроллера. Так захотелось, для наглядности что ли...
[uquote="NStorm",url="/forum/viewtopic.php?p=4008070#p4008070"]Во-вторых, вы пишете по фиксированному адресу в EEPROM. Если переключения достаточно частые, то в итоге вы "выжжете" ячейку EEPROM.[/uquote]
Над этим я думаю, буду модернизировать прошивку. Эта прошивка - вообще первое, что я написал в жизни на Си под AVR, поэтому ни разу не претендует на правильность.
[uquote="NStorm",url="/forum/viewtopic.php?p=4008070#p4008070"]Ну и еще в обмен по UART добавить бы некий контроль целостности пересылки.[/uquote]
Об этом тоже думал. См. выше)
Ну а в общем - большое спасибо за советы, обязательно учту всё сказанное. Ибо я не программист, и у меня существует такая проблема, что написать-то вроде можно, но как написать - красиво, правильно и компактно или с кучей костылей, но чтоб в конечном итоге работало - спросить лишний раз не у кого (нет таких знакомых поблизости), приходится самому изучать; и порой непонятно - забил ли я тут костыль, либо это не костыль, а правильное решение...
Всем привет ! Ребята, подскажите знающие, проблема при прошивке PIC16F648A. Операционка винда7, программатор ic prog 105D. Программатор собрал сам, еще не раз не прошивал с ним, собирал по схеме, проверил, все нормально. Почему я не могу поставить галочку "Вкл. NT/2000/XP драйвер" Фото. https://img.radiokot.ru/files/143475/2hcau1qacj.png Извините что не в ту тему написал.
Попробуйте вот эту оболочку/софтинку: http://picpgm.picprojects.net
Ежли на компе имеется СОМ порт на материнке можно JDM (в моей модификации) прицепить....
[uquote="blackheart",url="/forum/viewtopic.php?p=4009297#p4009297"]eeprom.h знаю, но я взял примеры из datasheet микроконтроллера. Так захотелось, для наглядности что ли...[/uquote]
Даташит - он о железе. А функции готовой библиотеки - это о компиляторе. Так что еще в мануал на компилятор стоит поглядывать, ссылку я давал. Там много стандартных вещей для периферии уже реализовано просто.
[uquote="NStorm",url="/forum/viewtopic.php?p=4008070#p4008070"]Во-первых вы немного изобрели велосипед функциями EEPROM_*(). Все это есть в avr/eeprom.h, сходите по ссылке.[/uquote]
Я тоже пишу свои функции. Атмеловские немного тяжёлые. Мои и быстрее, и меньше места занимают.
Ребята, подскажите пож! Сюда, на этот программатор еще дополнительное подача напряжение нужно? Это по прошивки pic16F648A. Или же достаточно с ком порта?
Так а схема программатора какая?? Наверное имеется в виду JDM-программатор? Там питание с COM-порта приходит
Вот какая должна быть схема. Лично собирал, всё работает
К себе даже стырил https://unlis.ru/?p=231
[uquote="BOB51",url="/forum/viewtopic.php?p=4009872#p4009872"]Попробуйте вот эту оболочку/софтинку: http://picpgm.picprojects.net
Ежли на компе имеется СОМ порт на материнке можно JDM (в моей модификации) прицепить.... [/uquote]
К сожалению не получилось и с этой программой
Добавлено after 4 minutes 1 second:
[uquote="blackheart",url="/forum/viewtopic.php?p=4010311#p4010311"]Так а схема программатора какая?? Наверное имеется в виду JDM-программатор? Там питание с COM-порта приходит
Спасибо! Попробую его собрать. А так, у меня ЖДМ программатор. Даже пробовал питание отдельно подать 5-12в, все без толку
Добавлено after 6 minutes 40 seconds:
К себе даже стырил https://unlis.ru/?p=231[/uquote]
Почему то ссылка не открываеться на печатную плату.
Ссылка рабочая. Google Chrome выделывается скорее всего, там в ссылке http указано вместо https, а ему такие ссылки не нравятся. В новом окне откройте или "сохранить по ссылке"
Поправил ссылку, должна без танцев с бубном открываться