Мелкие вопросы по МК и ПЛИС.

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 362
Зарегистрирован: Вс окт 10, 2010 17:43:48
Откуда: Воронеж

Сообщение Necroteeth »

ploop писал(а): Когда в исходном коде мы делаем массив, мы ставим метку. Ну допустим команда rjmp метка сразу заносит адрес метки в счетчик, но как бы поделённый на два, чтоб программа перепрыгнула куда надо. Но нам надо не прыгать туда а извлечь данные, т.е. нужен реальный адрес.
а что тогда будет с данными, если адрес на 2 не буду умножать? программа будет пропускать половину данных?
Реклама
Друг Кота
Аватара пользователя
Сообщения: 20093
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

Mr.Denis писал(а):Что-то я там не нашёл ATmega16U2
Значит, не умеете пользоваться поиском по странице :)))
Это семейство "USB AVR". Правда, там действительно есть только U2, да и то с пометкой "1кв 2010", т.е. данные на странице немного устаревшие.
Necroteeth писал(а):а что тогда будет с данными, если адрес на 2 не буду умножать? программа будет пропускать половину данных?
Будет выдавать совсем не тот адрес, т.к. младший бит адреса указывает, старший или младший байт надо брать, а умножение на два эквивалентно сдвигу влево на один разряд.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Реклама
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

Такой вопрос: заказывал ща детали, хотел до кучи пару tiny2313 заказать и с удивлением обнаружил, что mega48 чуть ли не пополам дешевле. Читаю даташиты - так она и "нафарширована" покруче (мега же)...
В чём подвох?
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

Necroteeth, в студии кажется можно было открыть программу сразу в машинных кодах. Попробуйте написать несколько строк (хоть nop'ов) и метку с rjmp. И дальше пойдите отладчиком, поглядывая на счетчик команд и машинный код. И как метка изменяет его. Так же можно добавить данные (.db) их тоже будет видно.
И можете побаловаться с RJMP и JMP (надеюсь, отличие представляете?)
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Аватара пользователя
Сообщения: 20093
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

ploop писал(а):В чём подвох?
Может быть, Мега - складская позиция, а Тиньку будут заказывать у других. Корпус, опять же...
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Реклама
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 362
Зарегистрирован: Вс окт 10, 2010 17:43:48
Откуда: Воронеж

Сообщение Necroteeth »

ploop писал(а): И можете побаловаться с RJMP и JMP (надеюсь, отличие представляете?)
rjmp, если я правильно понял, это относительный переход, а jmp абсолютный, то бишь rjmp имеет ограничения по дальнобойности, но зато меньше байт памяти требует (судя по program counter).
вроде как rjmp 2 байтная команда, а jmp 4-байтная.
если мы для обращения к .db используем умножение на 2, почему при инициализации стека Ramend тоже не умножаем на 2? в чем отличие этих двух ситуаций? :dont_know:
Реклама
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

почему при инициализации стека Ramend тоже не умножаем на 2? в чем отличие этих двух ситуаций?
Да потому, что это не метка, а тупо число. Посмотрите, что в файле, который в include прописан. Ну например, у меня в tn2313.inc есть вот что:

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

;*****************************************************************************
; Data Memory Declarations
;*****************************************************************************

.equ    RAMEND      = 0xDF  ; Highest internal data memory (SRAM) address.
                            ;(128 Bytes RAM + IO + REG)
.equ    EEPROMEND   = 0x7F  ; Highest EEPROM address.
                            ;(128 Bytes)
.equ    EEADRBITS   =   7   ; no. of bits in EEPROM address register

.equ    RAM_SIZE    = 128
.equ говорит компилятору, чтоб вместо слова RAMEND, EEPROMEND и т.д. он подставлял в текст 0xDF или 0x7F. Поэтому ldi R16, RAMEND одно и то же, что ldi R16, 0xDF

Кстати, так любые константы задавать можно. Очень удобно.
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 326
Зарегистрирован: Сб сен 06, 2008 12:56:13

Сообщение ValBag »

Necroteeth писал(а):если мы для обращения к .db используем умножение на 2, почему при инициализации стека Ramend тоже не умножаем на 2? в чем отличие этих двух ситуаций?
Можно несколько по другому пояснить:
Программный счетчик (РС) использует пословную адресацию. Слово - это два байта, которые составляют одну строку для этого счетчика. РС считает строки с дискретностью еденицы. Но в каждой строке - 2 байта. Если встречается метка, то ей присваивается значение счетчика команд, т. е. номера строки, перед которой стоит эта метка. Поэтому, например, чтобы по команде правильно адресовать метку, ей нужно сообщить абсолютный байтовый адрес, а не словный, как у РС. Для этого адрес метки умножается на 2, как в тех примерах, что вы выше приводили.
По поводу Ramend вам уже пояснил ploop. Дополнительно можно сказать, что если в указатель стека загружаем адрес начала стека, то таких премудростей, как с программной памятью не будет, т. к. адресация RAM, т. е. счетчика оперативной памяти - байтовая.
Последний раз редактировалось ValBag Ср янв 19, 2011 00:38:09, всего редактировалось 3 раза.
Друг Кота
Аватара пользователя
Сообщения: 6324
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Сообщение Jack_A »

Necroteeth писал(а): а что тогда будет с данными, если адрес на 2 не буду умножать? программа будет пропускать половину данных?
Да нет, пропускать ничего не будет, но будет их брать совсем из другой области флеши, что лежит "на полпути" между желаемой областью и нулем ( начало памяти ).
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 362
Зарегистрирован: Вс окт 10, 2010 17:43:48
Откуда: Воронеж

Сообщение Necroteeth »

ValBag писал(а):Можно несколько по другому пояснить:
Программный счетчик (РС) использует пословную адресацию. Слово - это два байта, которые составляют одну строку для этого счетчика. РС считает строки с дискретностью еденицы. Но в каждой строке - 2 байта. Если встречается метка, то ей присваивается значение счетчика команд, т. е. номера строки, перед которой стоит эта метка. Поэтому, например, чтобы по команде правильно адресовать метку, ей нужно сообщить абсолютный байтовый адрес, а не словный, как у РС. Для этого адрес метки умножается на 2, как в тех примерах, что вы выше приводили.
По поводу Ramend вам уже пояснил ploop. Дополнительно можно сказать, что если в указатель стека загружаем адрес начала стека, то таких премудростей, как с программной памятью не будет, т. к. адресация RAM, т. е. счетчика оперативной памяти - байтовая.
если я вас правильно понял, то ЛЮБУЮ метку надо таким образом адресовать - будь она хоть идентификатором массива, хоть просто меткой перехода, так?
Вот в данном случае я правильно написал?

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

LDI ZL, LOW(M1*2)
LDI ZH, HIGH(M1*2)
ICALL M1
M1: NOP
NOP
Друг Кота
Аватара пользователя
Сообщения: 6324
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Сообщение Jack_A »

Necroteeth писал(а): если я вас правильно понял, то ЛЮБУЮ метку надо таким образом адресовать - будь она хоть идентификатором массива, хоть просто меткой перехода, так?
Вот в данном случае я правильно написал?

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

LDI ZL, LOW(M1*2)
LDI ZH, HIGH(M1*2)
ICALL M1
M1: NOP
NOP
Нет, неправильно. Если метка используется для выполнения команды, используется словная адресация, поскольку счетчик команд оперирует словами, а не байтами. А если для команды LPM, то адресация данных БАЙТОВАЯ.
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

если я вас правильно понял, то ЛЮБУЮ метку надо таким образом адресовать - будь она хоть идентификатором массива, хоть просто меткой перехода, так?
Метка, как и в примере выше - константа, тоже подставляется компилятором в hex-файл в виде числа. Разница только в том, что константа сразу интерпретируется как число, а метка вычисляется исходя из того, сколько команд было до неё, начиная с директивы .org только в словах, а не в байтах.
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 362
Зарегистрирован: Вс окт 10, 2010 17:43:48
Откуда: Воронеж

Сообщение Necroteeth »

кажется, начинает понемногу доходить... во всем виновата команда LPM, которая берет из регистровой пары Z байтовый адрес. она одна такая или какие-то команды тоже работают с байтовыми адресами?
Родился
Сообщения: 13
Зарегистрирован: Пн апр 19, 2010 09:58:37

Сообщение kyraxinoff »

прошу помощи с прерыванием от компаратора на mega8.
не понимаю как сформировать импульс примерно длительностью 5мс, на одной из ног мк (PB0), при совпадении сигналов на входах компаратора AIN1 и AIN0.
Сам компаратор запускается,
ACSR = 0<<ACD | 1<<ACIE | 1<<ACIC | 0<<ACIS1 | 0<<ACIS0;
на ACO уровень постояно скачет так как и надо.
но как сделать прерывание при любом измении на ACO не могу разобраться.
Друг Кота
Аватара пользователя
Сообщения: 20093
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

kyraxinoff писал(а):но как сделать прерывание при любом измении на ACO не могу разобраться.
Глобально прерывания разрешены?
kyraxinoff писал(а):| 1<<ACIC |
Зачем вам ACIC: Analog Comparator Input Capture Enable?
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 326
Зарегистрирован: Сб сен 06, 2008 12:56:13

Сообщение ValBag »

kyraxinoff писал(а): ACSR |= (0<<ACD) | (1<<ACIE )| (1<<ACIC) | (0<<ACIS1) | (0<<ACIS0);
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

Подскажите, чтоб использовать аппаратный UART (через согласователь уровней с компьютером, например) линии RxD контроллера надо соединять с TxD компа и наоборот?
Или Rx->Rx, Tx->Tx?
Chettuser

Сообщение Chettuser »

Rx - приём
Tx - передача
Соответственно Rx-Tx и Tx - Rx.
Держит паяльник хвостом
Аватара пользователя
Сообщения: 962
Зарегистрирован: Вт янв 04, 2011 13:26:17
Откуда: Лен.Обл.

Сообщение java »

Подскажите плиз, как выставить RC Генератора 4 мег?CKSEL3..0 0011 я выставил. вот как написано: <<Микроконтроллер тактируется от внутреннего RC генератора 4 мег. CKSEL3..0 0011>>
контроллер ATmega8L
Пишу с ошибками и опечатками.На это у меня есть разрешение и справка
Друг Кота
Аватара пользователя
Сообщения: 4793
Зарегистрирован: Пт июл 11, 2008 09:42:35
Откуда: Made in USSR

Сообщение DiGiCat »

java писал(а):вот как написано: <<Микроконтроллер тактируется от внутреннего RC генератора 4 мег. CKSEL3..0 0011>>
контроллер ATmega8L
Написано от внутреннего RC генератора 4МГц, а фьюзы даны под кварц.. Там не перепутано с CKSEL3..0 1100 ? Уточнить бы, от чего тактирование там.

На скрине для прошивки лошадью, под RC на 4МГц (в какой программе прошиваешь не указал)
4mgz.JPG
(31.05 КБ) 365 скачиваний
п.с. Не часы Мосина? так там кварц часовой...
scio me nihil scire...
_______________________

Изображение <= Жалобная кнопка в правом нижнем углу... )
Ответить

Вернуться в «Разные вопросы по МК»