Микроконтроллер от и до.......

Здесь принимаются все самые невообразимые вопросы... Главное - не стесняйтесь. Поверьте, у нас поначалу вопросы были еще глупее :)
Аватара пользователя
путник
Открыл глаза
Сообщения: 43
Зарегистрирован: Сб дек 25, 2010 19:43:06
Откуда: Великй Новгород

Re: Микроконтроллер от и до.......

Сообщение путник »

Доброго времени.

YS писал(а):Ну и сходите наконец сюда - http://easyelectronics.ru/category/avr-uchebnyj-kurs . Там все разжевано до состояния манной каши. Для начала - самое то.


Выбрал пока это. Считаю самое то (поправте если не то).
1 AVR Studio ликбез (не совсем покапонятнно)
2 AVR. Учебный курс. Макроассемблер
3 AVR. Учебный курс. Простейшая программа.
4 AVR. Учебный курс. Скелет программы (анатомия)

Спасибо.
Ищу мудрого кота, который будет моим гуру.
Аватара пользователя
путник
Открыл глаза
Сообщения: 43
Зарегистрирован: Сб дек 25, 2010 19:43:06
Откуда: Великй Новгород

Re: Микроконтроллер от и до.......

Сообщение путник »

Доброго времни.

Из обучалки
PortX содержит информацию, предназначенную для вывода.
PinX содержит вводимую информацию
DDRX содержит информацию о том, какой канал настроен на ввод, какой - на вывод.

То есть, DDRX определяет, грубо говоря, какая ножка микросхемы будет подключена к PinX, какая - к PortX:


порт х, есть порт х.
пин х, это вывода порта х. На них записывается либо 0, либо 1 (светодиод не горит/горит)
ддр вообще не понял, разъясните.

Спасибо.
Ищу мудрого кота, который будет моим гуру.
Аватара пользователя
DX168B
Друг Кота
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)
Контактная информация:

Re: Микроконтроллер от и до.......

Сообщение DX168B »

Каждый регистр состоит из восьми битов(8 единиц или нулей)
8 бит равно одному байту. То есть в один регистр вмещается 1 байт, или 8 бит.
В микроконтроллере, к каждому порту относится по 3 регистра.
PORTX - регистр выходов
PINX - регистр входа
DDRX - регистр конфигурации.

DDRX - это регистр, предназначенный для настройки порта.
Например в DDRA настраивается PORTA, в DDRB настраивается PORTB, в DDRD настраивается PORTD. Порты микроконтроллера могут быть и входами и выходами. Какая ножка порта будет входом, а какая выходом - определяет DDRX.
Например нам надо, чтобы первые 4 ноги PORTB были входами, а остальные 4 выходами.
Тогда мы отправим в DDRB значение 11110000.

Код: Выделить всё

ldi  r16,  0b11110000  ;кидаем в один из регистров РОН(r16 например) значение
out  DDRB,  r16  ;и отправляем его в DDRB

Или, если нам надо, чтобы ноги PB0 и PB2
были входами, а остальные выходами, то в DDRB отправим значение 11111010. То есть, где будет 0 - там будет вход, а где 1 - там будет выход.

Код: Выделить всё

ldi  r16,  0b11111010  ;кидаем в регистр r16 значение
out  DDRB,  r16  ;и отправляем его в DDRB

К одному регистру PORTX(X имеется в виду - индекс порта, например PORTA или PORTB и т.д.) относится аж целых 8 ног микроконтроллера. Например к PORTB микроконтроллера ATtiny2313 относятся ноги, начиная с PB0 и заканчивая PB7. Но у этого МК несколько портов: PORTD - с PD0 по PD6(порт восьмибитный, но последнюю ногу не вывели(не хватило)) и ещё PORTA - c PA0 по PA2(тоже самое - порт сам восьмибитный, а вывели наружу только 3 его ноги)
Допустим, что весь PORTB настроен на выход. Если например отправишь в PORTB значение 11111110 , то на первой ноге(PB0) этого порта тока не будет, а на остальных(PB1...PB7) ток появится.

Код: Выделить всё

ldi  r16,  0b11111110  ;присвоим значение регистру r16
out  PORTB,  r16  ;и отправим его в порт Б

PINX - регистр, который принимает состояние ножек порта.
Допустим, что весь PORTB настроен на вход и мы подали ток на PB0 и PB6.
Если считать значение с PINB, то мы получим значение 01000001

Код: Выделить всё

in  r16,  PINB ;копируем значение из PINB в регистр r16
I am DX168B and this is my favourite forum on internet!
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

Re: Микроконтроллер от и до.......

Сообщение YS »

Ножка порта может быть настроена либо на вывод (управляем ей из программы), либо на ввод (внешнее устройство устанавливает на ней уровень, мы в программе его читаем).

Так вот, регистр DDR указывает, вход ножка или выход. Если в соответствующем бите "1" - выход, "0" - вход.

Регистр PORT служит для записи. Если ножка сконфигурирована как выход, то запись в соответствующий бит PORT нуля или единицы приведет к установке ножки в соответствующий уровень. Если ножка сконфигурирована как вход, запись в соответствующий бит PORT единицы приведет к включению подтягивающего резистора на ней. Очевидно, ноль - к его выключению.

Текущий логический уровень на ножке мы можем прочитать из регистра PIN. Собственно, для этого он и нужен. Если на ножке "1" - в соответствующем бите PIN 1, если "0" - 0.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Аватара пользователя
путник
Открыл глаза
Сообщения: 43
Зарегистрирован: Сб дек 25, 2010 19:43:06
Откуда: Великй Новгород

Re: Микроконтроллер от и до.......

Сообщение путник »

Доброго времени.

То что вывод порта можыт быть входом или выходом, понтно.

DX168B писал(а):В микроконтроллере, к каждому порту относится по 3 регистра.


Если вывод порта имеет 3 регистра, а значений два "0" или "1"

ldi запись
r16 значение константы (r16 - r31 как изменяются)
out вывод значения

Спасибо.
Ищу мудрого кота, который будет моим гуру.
Аватара пользователя
sergeys
Поставщик валерьянки для Кота
Сообщения: 1946
Зарегистрирован: Сб сен 11, 2010 13:45:01
Откуда: Екатеринбург

Re: Микроконтроллер от и до.......

Сообщение sergeys »

Мяяяяяяяяяяяяяу всем! Раз уж всем помогаете, подскажите плиз и мне.

Вот если у МК восьмибитный порт, а выведено допустим три ноги (как здесь уже писалось), то остальных ног уже нигде не найти? ну то есть вот эти три ноги есть и усе?

тогда как писать

Код: Выделить всё

ldi Temp, 0b000         ; если три ноги то так
ldi Temp, 0b00000000          ; или так?
out DDRX, Temp
Ко мне можно на "ты", так даже лучше!
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Re: Микроконтроллер от и до.......

Сообщение Gudd-Head »

sergeys писал(а):тогда как писать

Чтобы не было недоразумений, лучше писать так

Код: Выделить всё

0b00000ХХХ
, если выведены три (младшие) ноги. Хотя вообще говоря, можно писать и так:

Код: Выделить всё

0bYYYYYXXX
, при этом Y будет игнориться, а Х будет записываться в порт.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

Re: Микроконтроллер от и до.......

Сообщение YS »

mr december, я не совсем понял Ваш вопрос...
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Re: Микроконтроллер от и до.......

Сообщение Gudd-Head »

YS писал(а):mr december, я не совсем понял Ваш вопрос...

Так это был вопрос? :)))
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

Re: Микроконтроллер от и до.......

Сообщение YS »

Ну, мне так показалось исходя из общих морфолого-орфографических признаков. :)))
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Аватара пользователя
путник
Открыл глаза
Сообщения: 43
Зарегистрирован: Сб дек 25, 2010 19:43:06
Откуда: Великй Новгород

Re: Микроконтроллер от и до.......

Сообщение путник »

Доброго времени.

Код: Выделить всё

ldi      R16, 0b00001001 ;   загрузка константы в регистр общего назначения (R16 - R32)


что происходт в (R16 - R32), как я понял это ячейки (16 шт). Где ячейки (R1 - R15)

В инете нашол список каманд,

Регистры ввода/вывода:

CBI - сброс бита порта
SBI - установка лог. "1" бита порта
IN -загрузка значения из порта в регистр
OUT - загрузка значения в регистр
SBIC - пропуск следующей команды, если бит порта сброшен
SBIS - пропуск следующей команды, если бит порта установлен


Ветвление:

CALL -абсолютный вызов
RCALL - относительный вызов
RET - возврат из подпрограммы
RETI - возврат из прерывания, флаг разрешения прерываний I "жестко" устанавливается
JMP - абсолютный переход
RJMP - относительный переход
BRBC - переход, если бит регистра SREG сброшен
BRBS - переход, если бит регистра SREG установлен
SBRC - пропустить следующую команду, если бит регистра сброшен
SBRS - пропустить следующую команду, если бит регистра установлен


Работа со стеком:

PUSH - сохранить регистр в стеке
POP - извлечение регистра из стека


Важные команды:

NOP - команда, которая ничего не делает
CLI - запретить прерывания
SEI - разрешить прерывания
CP - сравнить значения двух регистров общего назначения
CPI - сравнить значение регистра с константой
LDI - загрузить константу в регистр общего назначения
CLR - очистить регистр общего назначения

Железо, железом а команды тоже важно, как понял это не все команды. Сколько их всего, хочу изучить.

Спасибо.
Последний раз редактировалось путник Пн янв 10, 2011 21:07:10, всего редактировалось 1 раз.
Ищу мудрого кота, который будет моим гуру.
Аватара пользователя
DX168B
Друг Кота
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)
Контактная информация:

Re: Микроконтроллер от и до.......

Сообщение DX168B »

mr december писал(а):Доброго времени.
То что вывод порта можыт быть входом или выходом, понтно.
DX168B писал(а):В микроконтроллере, к каждому порту относится по 3 регистра.

Если вывод порта имеет 3 регистра, а значений два "0" или "1"
ldi запись
r16 значение константы (r16 - r31 как изменяются)
out вывод значения
Спасибо.

3 три регистра - PORTx, PINx и DDRx :)
Через PORTx мы выводим данные наружу.
Через PINx мы принимаем данные снаружи.
В DDRx мы настраиваем порт.

R16...R31 - это оперативные регистры.
С из помощью мы работаем с данными уже внутри микроконтроллера.
R0...R15 - они тоже есть, но с ними не работают. В них можно только что-то хранить, а вот проделывать какие-нибудь операции с ними(сложение, вычитание, сравнение и т.д.) нельзя.
В основном там сам МК что-то делает.

По поводу команд. Найди в даташите к микроконтроллеру
страницу Instruction set summary Там указаны все команды, которые поддерживает данный микроконтроллер. А так же описан правильный формат их использования.
Второй вариант - в AVR Studio. Help -> Assembler Help.

А вообще, если это очень по простому изобразить, то внутренняя архитектура микроконтроллеров AVR чем-то напоминает этот бублик: :))) :))) :)))
Изображение

Как видно, мы не можем выполнить команду, например: LDI PORTB, 0b01010101
Мы обязательно должны забить значение сначала в один из регистров R16...R31
и потом отправить его в порт:
LDI R16, 0b01010101
OUT PORTB, R16
Вложения
MICROCONTROLLER.PNG
(22.48 КБ) 1108 скачиваний
Последний раз редактировалось DX168B Пн янв 10, 2011 22:03:47, всего редактировалось 1 раз.
I am DX168B and this is my favourite forum on internet!
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

Re: Микроконтроллер от и до.......

Сообщение YS »

R16...R31 - это оперативные регистры.
С из помощью мы работаем с данными уже внутри микроконтроллера.
R0...R15 - они тоже есть, но с ними не работают. В них можно только что-то хранить, а вот проделывать какие-нибудь операции с ними(сложение, вычитание, сравнение и т.д.) нельзя.
В основном там сам МК что-то делает.


"Кто Вам сказал такую глупость?" (c)

Единственное ограничение, накладываемое на регистры с R0 по R15 - для них не работает команда LDI, т.е., в них нельзя загружать константу. Все остальные операции возможны. Более того, команда MUL (умножение) вообще фиксированно помещает результат в R0:R1. А вообще, в документации в AVR Studio (по F1) к каждой команде есть подробный комментарий, включающий в том числе и список регистров, для которых она действует.

"Сам" МК в этих регистрах ничего не делает. Тем более, если мы пишем на ассемблере, что по определению означает полный контроль над всем. Вот компилятор, скажем, C может использовать эти регистры для каких-то своих нужд. А из ассемблера нам доступно все.

ldi R16, 0b00001001 ; загрузка константы в регистр общего назначения (R16 - R32)


что происходт в (R16 - R32), как я понял это ячейки (16 шт). Где ячейки (R1 - R15)


В R16 загружается число 0b00001001 . Ячейки R0 - R15 там же где и все, на кристалле. :)

mr december, заучивать сразу все команды совершенно необязательно. Некоторые из них вообще используются преимущественно компиляторами языков высокого уровня. Перечисленного списка хватит Вам пока за глаза и за уши.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Аватара пользователя
DX168B
Друг Кота
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)
Контактная информация:

Re: Микроконтроллер от и до.......

Сообщение DX168B »

YS писал(а):"Кто Вам сказал такую глупость?" (c)

Где-то краем глаза прочитал. :o
Я с ними никогда не работал, за исключением R0, R1. :)
Стараюсь пользоваться r16...r31 и по возможности использовать ОЗУ.
I am DX168B and this is my favourite forum on internet!
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

Re: Микроконтроллер от и до.......

Сообщение YS »

Где-то краем глаза прочитал.


Скорее всего, это был трактат про транслятор с чего-то высокоуровневого типа С. В этом случае, действительно, с непосредственным доступом к регистрам (например, в ассемблерных вставках) надо быть очень осторожным, ибо компилятор использует их по своему усмотрению. Например, в документации по AVR-GCC этим вопросам посвящен отдельный раздел. И, кстати, как раз регистры с R16 по R25 там указываются как "безопасные", если мне не изменяет память.

В ассемблере, повторюсь, ограничение только на загрузку константы.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Аватара пользователя
DX168B
Друг Кота
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)
Контактная информация:

Re: Микроконтроллер от и до.......

Сообщение DX168B »

На Си стараюсь не программировать МК. Как-то сделал одну программу на Си в GCC.
Когда посмотрел, что этот компилятор вывел в ассемблере, то схватился за голову. :o
Вышла полная бурда. Больше всего убило то, что компилятор пихал почти все регистры в стек при вызове прерываний. :))) Пойдёт разве, что в некритичных по времени проектах и если надо что-то сложное в короткий срок. А так - только АСМ. :)
I am DX168B and this is my favourite forum on internet!
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

Re: Микроконтроллер от и до.......

Сообщение YS »

Тут многое зависит от настроек оптимизации. Но да - С не для критичных по времени участков. Для этого пишут либо целиком на асме, либо ассемблерные модули.

P.S.

Глянул, чего у меня GCC генерит при входе в прерывание:

Код: Выделить всё

+00000588:   921F        PUSH    R1               Push register on stack
+00000589:   920F        PUSH    R0               Push register on stack
+0000058A:   B60F        IN      R0,0x3F          In from I/O location
+0000058B:   920F        PUSH    R0               Push register on stack
+0000058C:   2411        CLR     R1               Clear Register
+0000058D:   938F        PUSH    R24              Push register on stack
+0000058E:   93EF        PUSH    R30              Push register on stack
+0000058F:   93FF        PUSH    R31              Push register on stack


Вообще все не так и страшно...
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Аватара пользователя
DX168B
Друг Кота
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)
Контактная информация:

Re: Микроконтроллер от и до.......

Сообщение DX168B »

У меня было в полтора раза больше. Проект конечно не сохранился.
Но были и другие приколы.
Один пустой цикл for там сожрал 8 строк, когда я на асме это-же делаю в 4 строки.
Про switch с case вообще молчу. Хотя и в АСМе тоже громоздко получается. Вот я вчера делал на АСМе парсер для работы со шрифтами для бегущей строки. Много вышло. 2 алфавита, цифры и знаки препинания.
Типа так:

Код: Выделить всё

PARSER:
ldi            ZH,            High(SYMBOLS_CYR*2)
ldi            ZL,            Low(SYMBOLS_CYR*2)
;----------
cpi            temp0,         'А'
breq         RET_1
adiw         Z,            6
cpi            temp0,         'Б'
breq         RET_1
adiw         Z,            6
cpi            temp0,         'В'
breq         RET_1
adiw         Z,            6
cpi            temp0,         'Г'
breq         RET_1
adiw         Z,            6
cpi            temp0,         'Д'
breq         RET_1
adiw         Z,            6
..................
.........
I am DX168B and this is my favourite forum on internet!
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

Re: Микроконтроллер от и до.......

Сообщение YS »

Хм, а какую версию AVR-GCC Вы используете? Честно говоря, у себя в листингах я не замечал каких-то совсем уж неоптимальных вещей. Хотя да, что-то можно сделать гораздо эффективнее на асме.

Жутким кодом славен CodeVision AVR. :)
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Аватара пользователя
DX168B
Друг Кота
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)
Контактная информация:

Re: Микроконтроллер от и до.......

Сообщение DX168B »

WinAVR 2008 04 07
GCC 4.3.0
I am DX168B and this is my favourite forum on internet!
Ответить

Вернуться в «Теория»