Ежли с обычной ОЗУ вопросы...
То с таблицей в ПЗУ их еще больше будет - хотя бы по размещению данных в ячейках ПЗУ и поведению указателя Z (бит Z.0) при отработке команды LPM.
Приветствую.
В даташитах на тини контроллеры, в разделе "Self-Programming the Flash" присутствуют строчки:
"The CPU is halted during the Page Erase operation."
"The CPU is halted during the Page Write operation."
Означает ли это, что периферия (в частности USART) тоже остановится на время прожига?
Задача разряда "for fun". Хочу реализовать бутлоадер для ATtiny2313, который бы сам принимал по UART файл прошивки .hex, декодировал его и прошивался. Таким образом планирую избавиться от зависимости от ОС-зависимого софта. Проблема в том, что контроллеру нужно 4.5 мс на прошивку страницы, во время которых он не сможет принимать данные. Следовательно, нужно организовать управление потоком. Хотелось бы обойтись без RTS/CTS, попробую заюзать XOn/XOff. Прощупываю, насколько это реально. Конечно, есть еще вариант заставить комп отсылать файл с паузами.
kolpakchi, написано, что CPU останавливается. Больше ничего. Читаем как написано, для начала.
Можно ещё передавать на скорости 2400 бод с чётностью - время передачи одного байта будет 4,58мс (если ничего не напутал). А с учетом буферизации в USART можно и на 4800.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Проблема в том, что контроллеру нужно 4.5 мс на прошивку страницы, во время которых он не сможет принимать данные. Следовательно, нужно организовать управление потоком. Хотелось бы обойтись без RTS/CTS, попробую заюзать XOn/XOff. Прощупываю, насколько это реально. Конечно, есть еще вариант заставить комп отсылать файл с паузами.
Я делал так: при старте ПК запрашивает размер страницы и потом пересылает по одной странице с LRC-кодом контроля (LRC - метод, используемый для контроля HEX-файлов, просто сумма переданных байтов), потом контроллер посылает отчет об успехе.
Не нашел у себя в списке команд. Видимо программист из меня хреновый.
Как поменять (инвертировать) один бит в регистре. Причем довольно быстро.
Т.е. пришел в прерывание, а до этого в порту уже стояло какое-то значение, и в прерывании просто перевернул его на обратное и вышел. А при очередном входе в прерывание тоже самое, т.е. просто постоянно меняет значение бита на обратное.
Нужно два, вообще-то. Но пока мне не важно было, что с остальными выводами порта происходит, ибо на них пока ничего не подключено.
А потом, конечно думать надо.
Выделяете один РОН, под маску для инвертирования. Тогда в прерывании понадобится одна однотактовая команда, OUT PINX, РОН.
Если Ваше прерывание ничего больше не делает, кроме как инвертирует порт, то не надо ничего скидывать на стек и забирать оттуда. Думаю быстрее некуда.
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Ладныть... гляну...
АВР конечно не mcs51 с CPL bit но усе же чегось нашкарябать можно.
Кстати... у 2313 "троглобит" поддерэивается, так что можно с портом отак схимичить:
ldi tmp,(1<<bit_a | 1<<bit_b)
out pin_х,tmp
где bit_a и bit_b требуемые позиции, а pin_х регистр выводов соответствующего порта. Z_h_e
держать маску в регистрвом файле по ресурсам накладно (ежли только не в r2-r15).
скорее или непосредственная загрузка или получение из ОЗУ...
интересно...
а будет ли равноценно при (1<<bit_a | 1<<bit_b) предварительно загруженном в ячейку mask ОЗУ воть такой конструктив:
lds tmp,mask
sts (pin_х+0x20),tmp
??
Еще одна версия "троглодитства" с учетом особенностей 2313 и порта би... (для диапазона портов УВВ 0x00-0x1f)
банальное
sbi pin_х,(1<<bit_a | 1<<bit_b)
Последний раз редактировалось BOB51 Вт окт 04, 2016 20:30:32, всего редактировалось 3 раза.
BOB51 писал(а):держать маску в регистрвом файле по ресурсам накладно (ежли только не в r2-r15).
Я конечно задачу СКАЗОЧНИКа не знаю. Но почти наверняка, не будет никакого накладства, особенно, если стоит задача максимально быстро инвертировать порт. Некоторые процы вобще одним РОН обходятся - аккумулятором, а тут аж 32 штуки, даже скорее всего можно пожертвовать из блатных РОН, а не только r2-r15, но смысла конечно нет в этом.
BOB51 писал(а):lds tmp,mask
sts (pin_х+0x20),tmp
Эти команды двухтактовые, плюс придется сохранять на стек tmp.
sbi pin_х,(1<<bit_a | 1<<bit_b)
Команда двухтактовая и работает только с одним битом.
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.