Задача: С помощью портов В и Д микроконтроллера ATtiny 2313,реализовать световой эффект, например ,бегущей точки.От PINB.0 до PINB.7 могу ,а как передать управление от PINB.7(когда бегущая точка дойдет до него) на PIND.0 ,для продолжения светового эффекта внутри порта Д???
Вот тут в теме говорилось про работу портов, хотелось бы добавить. Если внимательно посмотреть в даташит то там ясно написано что PINx представляет собой именно состояние выводов контроллера независимо от того в каком режиме они находятся, ввода или вывода. Это очень важно, поскольку иногда может быть такая ситуация что на выходе порта установлена "1" но он принудительно замкнут на общий провод, в таком случае PINx будет выдавать "0" на этом выводе.
PORTx - помещает переданное значение в регистр-защелку и даже если вывод находился в режиме ввода его состояние хранится в регистре, и как только переключить его на выход - оно тут же проступит наружу.
К чему это все. А к тому что есть такие команды для работы с отдельными битами порта, но аппаратно микроконтроллер не поддерживает побитный доступ - поэтому такие команды реализованы как операции над всем портом целиком, даже если меняем 1 бит - сначала СЧИТЫВАЕТСЯ значение всех 8 бит с порта, потом меняется бит и записывается в регистр. Вот здесь и кроется засада. Считывается то реальное состояние выводов - а значит если в регистре-защелке была записана "1" но снаружи этот вывод порта надежно сидит на "0"(кнопка например), то при следующей попытке изменить любой отдельный бит порта туда запишется "0" что может оказаться несколько неожиданным.
К чему это все. А к тому что есть такие команды для работы с отдельными битами порта, но аппаратно микроконтроллер не поддерживает побитный доступ - поэтому такие команды реализованы как операции над всем портом целиком, даже если меняем 1 бит - сначала СЧИТЫВАЕТСЯ значение всех 8 бит с порта, потом меняется бит и записывается в регистр.
Теперь открываем даташит, смотрим на команды CBI/SBI, и видим, что они выполняются за два такта. Как это еще можно провернуть, кроме как на аппаратном уровне?
Alexeyslav писал(а):Если внимательно посмотреть в даташит то там ясно написано что PINx представляет собой именно состояние выводов контроллера независимо от того в каком режиме они находятся, ввода или вывода. Это очень важно, поскольку иногда может быть такая ситуация что на выходе порта установлена "1" но он принудительно замкнут на общий провод, в таком случае PINx будет выдавать "0" на этом выводе.
правильно,а если порт при этом настроен на выход,то он еще и сгореть может
Alexeyslav писал(а):
PORTx - помещает переданное значение в регистр-защелку и даже если вывод находился в режиме ввода его состояние хранится в регистре, и как только переключить его на выход - оно тут же проступит наружу.
К чему это все. А к тому что есть такие команды для работы с отдельными битами порта, но аппаратно микроконтроллер не поддерживает побитный доступ - поэтому такие команды реализованы как операции над всем портом целиком,
что за чушь?есть такие функции,как выше уже было написано.только они не для всего диапазона вроде работают,там где много портов могут не работать в дальних портах (смотрим список распределения адресов в памяти)
Alexeyslav писал(а):Вот здесь и кроется засада. Считывается то реальное состояние выводов - а значит если в регистре-защелке была записана "1" но снаружи этот вывод порта надежно сидит на "0"(кнопка например), то при следующей попытке изменить любой отдельный бит порта туда запишется "0" что может оказаться несколько неожиданным.
вообще при изменении бита данных порта учитывается состояние того регистра,который меняется,а не регистра входа.тогда таких "ошибок"не будет.меняем состояние ног порта,значит считываем портх,а не пинх.а менять пинх смысла не имеет,поэтому его просто считываем там,где нам нужны эти данные.
тоже самое про ддрх если нужно считываем,меняем,заполняем .а никак не пинх .
только они не для всего диапазона вродерегистров работают,там где много портов могут не работать в дальних портах (смотрим список распределения адресов в памяти)
I/O registers within the address range $00 - $1F are directly bit-accessible using the SBI and CBI instructions. In these reg-
isters, the value of single bits can be checked by using the SBIS and SBIC instructions.
в портах ввода вывода на всех должны работать они чаще в начале таблицы регистров стоят(к нашей радости)
Последний раз редактировалось vitalik_1984 Чт фев 09, 2012 14:49:25, всего редактировалось 3 раза.
На правах оФФФтопа..
"Бедные AVR-щики.."
Битовый процессор и все операции с битами у МК51-х изначально: были, есть и будут есть..
[img]http://radiokot.ru/forum/download/file.php?id=93376[/img][i][color=#000080][size=85]Между людьми возникает напряжение, если у них разный потенциал...[/size][/color][/i]
ploop писал(а):
классическая 8 не знаю, 8А должна.
Че-то я в описалове этого не видел... Да и как-же программная совместимость с не-А?
МитяРа писал(а):"Бедные AVR-щики.."
Битовый процессор и все операции с битами у МК51-х изначально: были, есть и будут есть..
Ну да, первое время после 51 не удобно, потом быстро приспосабливаешься. Да и AVR все равно быстрее считает-изменит-запишет нужный бит, пока классический 51-й его одной командой проинвертирует
Engineer_Keen писал(а):AVR все равно быстрее считает-изменит-запишет нужный бит, пока классический 51-й его
Ещё один оФФФтоп и всё..
Раз пошла такая "пьянка", то надо сравнивать AVR-ки не с классикой, а с уже тогда имеющимися 51-ми с укороченным циклом..
Это, например, серия LPC9хх от Филлипса и МК от Cygnal-а, теперь SiLabs, а даже с той-же LPC-серией 51-х от того-же Атмела..
[img]http://radiokot.ru/forum/download/file.php?id=93376[/img][i][color=#000080][size=85]Между людьми возникает напряжение, если у них разный потенциал...[/size][/color][/i]
Че-то я в описалове этого не видел... Да и как-же программная совместимость с не-А?
Я тоже не видел, просто предположил. А проверить не на чем.
На счет совместимости - код из "не А" 100% будет работать на "А". Обратное верно частично, т.к. запись в PINx никто не запрещал, она просто не приведёт к желаемому эффекту. А может приведёт, просто эту возможность проще не документировать, чем специально изменять аппаратную часть, т.к. есть подозрение, что у x8 и новых "А"-серий она очень похожа.
Это всё чисто мои предположения, т.к. лень бесцельно рыть документацию...