Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
19.08.2011, 10:46
|
|
Прохожий
Регистрация: 19.04.2009
Адрес: Ижевск
Сообщений: 7
Сказал спасибо: 0
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
|
Перенос из PortX в PinX или два дня как изучаю AVR Assembler
Два дня как начал изучать контроллеры avr и соответственно их ассемблер. Изучаю по книге Дж.Моргана "Микроконтроллеры AVR. Вводный курс". В данный момент читаю и вникаю в программы включения светодиода и кнопки. При отладке второй проги заметил интересную вешь, которую и изложу сейчас.
Часть кода:
.device at90s1200
.nolist
.include "C:\Program Files\Atmel\AVR Tools\AvrAssembler\Appnotes\1200def.inc"
.list
.def temp=r16
rjmp Init
Init:
;определяем порты на вход-выход
ser temp ;задаем все выводы порта В выходами
out DDRB,temp
ldi temp,0b11111110 ;задаем 0 вывод порта D входом, остальные выходами
out DDRD,temp
;задаём начальные значения напряжения на выводах
clr temp
out PortB,temp ;сбрасываем в 0 выводы порта В
sbi PortD,0
;ldi temp,0b0000001 ;включаем подтяжку на нулевой вывод порта D, остальные в 0
;out PortD,temp
sbi PortB,0
rjmp Init
Start:
Дальше копировать не стал, ибо не суть. А суть вот в чем. На сколько я понял, при установке в порту, например, B какого-либо двоичного числа, при выполнении любой следущей команды, это число переносится в регистр PinB. А вот здесь после выполнения команды sbi PortD,0 (или совокупности команд ldi temp,0b0000001 и out PortD,temp, законментированных здесь временно), единичка логическая НЕ ПЕРЕНОСИТСЯ в PinD при выполнении следующего шага. А вот после установки бита в PortB,0, при выполнении rjmp Init (знаю, что команда лишена смысла, она служит просто любым следущим шагом в данном случае) эта единица появляется в PinD... Это как так?
|
|
|
Сказали "Спасибо" artem-izh
|
|
|
19.08.2011, 10:57
|
|
Прохожий
Регистрация: 19.04.2009
Адрес: Ижевск
Сообщений: 7
Сказал спасибо: 0
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
|
Re: Перенос из PortX в PinX или два дня как изучаю AVR Assembler
Ну и ещё спрошу здесь же... Вобще начальник мне повелел изучать архитектуру семейства Mega (в частности 128 и 64 контроллеров) и программирование на Си. Друг мой, который уже давно работает в avr, сказал, что нужно сначала хорошо изучить ассемблер и только потом переходить на си. Интуиция моя солидарна с другом, но начальство ограничивает во времени. Вопрос. Есть ли какая-нибудь литература, по которой можно начать изучение си применительно именно к контроллерам? Ранее я ни разу в жизни не сталкивался ни с ассмеблером, ни с си, ни с контроллерами. Да и вобще с программированием. По ассмеблеру и мк читаю книги Моргана и Ефстифеева, по Си посоветовали Кернигана и Ричи. Но насклько я понял из вступления, книга расчитана на тех, кто уже имеет представление о программировании.... Вобщем, мозги мои кипят. Хочется составить четкий план обучения.
|
|
|
Сказали "Спасибо" artem-izh
|
|
|
19.08.2011, 10:59
|
|
Почётный гражданин KAZUS.RU
Регистрация: 01.04.2009
Адрес: Рязань
Сообщений: 1,140
Сказал спасибо: 21
Сказали Спасибо 635 раз(а) в 344 сообщении(ях)
|
Re: Перенос из PortX в PinX или два дня как изучаю AVR Assembler
PORTD.0 настроен на ввод. Записью 1 в него Вы включаете подтяжку к плюсу. Хотите проверить включилась ли она - выполните код
Код:
|
in temp, PIND;
out PORTB, temp |
И посмотрите состояние 0 порта B.
|
|
|
Сказали "Спасибо" _guardianangel
|
|
|
19.08.2011, 11:00
|
|
Почётный гражданин KAZUS.RU
Регистрация: 01.04.2009
Адрес: Рязань
Сообщений: 1,140
Сказал спасибо: 21
Сказали Спасибо 635 раз(а) в 344 сообщении(ях)
|
Re: Перенос из PortX в PinX или два дня как изучаю AVR Assembler
Посмотрите Шпака Программирование микроконтроллеров на С. http://easyelectronics.ru/shpak-yua-...trollerov.html
|
|
|
Сказали "Спасибо" _guardianangel
|
|
|
19.08.2011, 11:06
|
|
Гражданин KAZUS.RU
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
|
Re: Перенос из PortX в PinX или два дня как изучаю AVR Assembler
PinX - это ваши входы. Когда вы выводите какое-то значение в PORTD оно появляется на выходе. Естественно не сразу а после выполнения команды. Поскольку выход и вход - это физически один и тот же пин, то понятно, что если вы выведете туда единицу, то вы её и прочитаете ...
Чисто теоретически - это не факт ... Если вы посадите эту ножку на землю (может привести к выходу из строя) и выведете в PORT 1, то она выведется (если прочитать PORT - она там будет), при этом PIN будет читаться 0, так как там физически находится 0.
|
|
|
Сказали "Спасибо" SasaVitebsk
|
|
|
19.08.2011, 11:07
|
|
Прохожий
Регистрация: 19.04.2009
Адрес: Ижевск
Сообщений: 7
Сказал спасибо: 0
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
|
Re: Перенос из PortX в PinX или два дня как изучаю AVR Assembler
Только сечас дошло, что лучше все таки использовать совокупность команд "ldi temp,0b0000001 и out PortD,temp", ибо в регистре может быть т.н. мусор, и установкой одного бита мы его ен вычистим, а записью целого числа мы его вычистим. Но это не касается сути вопроса. Написал на всякий случай, что бы знатоки не наругали =)
|
|
|
Сказали "Спасибо" artem-izh
|
|
|
19.08.2011, 11:15
|
|
Прохожий
Регистрация: 19.04.2009
Адрес: Ижевск
Сообщений: 7
Сказал спасибо: 0
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
|
Re: Перенос из PortX в PinX или два дня как изучаю AVR Assembler
Такс... Т.е. получается, что при настройке вывода на вход он не зеркалируется в регистр PinX, и подачей 1 мы просто включаем подтяжку... А если настроен на вывод, то зеркалируется и, то что бы туда выдали, то и прочитали. Т.е. по сути регистр PinX может мониторить PortX только при настройке сего порта на вывод?
|
|
|
Сказали "Спасибо" artem-izh
|
|
|
19.08.2011, 11:21
|
|
Прохожий
Регистрация: 19.04.2009
Адрес: Ижевск
Сообщений: 7
Сказал спасибо: 0
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
|
Re: Перенос из PortX в PinX или два дня как изучаю AVR Assembler
guardianangel, спасибо за книгу.
|
|
|
Сказали "Спасибо" artem-izh
|
|
|
19.08.2011, 11:22
|
|
Почётный гражданин KAZUS.RU
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,616
Сказал спасибо: 65
Сказали Спасибо 315 раз(а) в 264 сообщении(ях)
|
Re: Перенос из PortX в PinX или два дня как изучаю AVR Assembler
Сообщение от artem-izh
|
Два дня как начал изучать контроллеры avr и соответственно их ассемблер. Изучаю по книге Дж.Моргана "Микроконтроллеры AVR. Вводный курс".
|
Рекомендую не заострять свое внимание только на программировании. Не менее важно "увидеть" и понять архитектуру единичного порта. Для этого достаточно открыть PDF на любого представителя Меги и найти описание портов ввода/вывода. Если английский вам не чужд и с пониманием "кубиков" все в порядке, вы сразу увидите, где PORT, а где PIN. Заодно и про "подтяжки" прочитаете.
Можно и в русском переводе. Книг по Мегам в переводе уже достаточно.
|
|
|
|
19.08.2011, 11:44
|
|
Прохожий
Регистрация: 19.04.2009
Адрес: Ижевск
Сообщений: 7
Сказал спасибо: 0
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
|
Re: Перенос из PortX в PinX или два дня как изучаю AVR Assembler
Такс... Очередная ступень понимания (или заблуждения)... В регистр PinX записывается всё то, что поступает на ножки порта из внешнего мира. Разумеется если порт предварительно настроен на ввод иформации. При такой настройке мы можем включить подтяжку записав в регистр PortX еденицу в нужный бит. А вот если порт настроен на вывод, то регистр PinX будет зеркалировать PortX с отставанием на одну команду. Я правильно понял?
|
|
|
Сказали "Спасибо" artem-izh
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 10:00.
|
|