Ассемблер (ASM) для AVR в вопросах и ответах
Ну да, если нужен регистр данных порта - то PORTB, а если регистр выводов - то PINB. Я же написал ...если необходимо считать состояние вывода порта... Там только через PINB.
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
- Реклама
- Сообщения: 20
- Зарегистрирован: Вс апр 05, 2009 08:55:15
Код: Выделить всё
ldi r16,low(ramend)
out spl, r16
ldi r16, high(ramend)
out sph, r16- Реклама
Подскажите, что означают команды:
Код: Выделить всё
.DB 255,255,31,25,19,13,7,1
.org flashend-79
.dw VCR | (5 << 8)
Сдесь есть деление, правда, только 8-разрядных чисел.Как на ассемблере осуществить деление 351 на 1579?
http://atmel.ru/Articles/Atmel21.htm
Умножьте 351 на 10'000'000 и, пользуясь подпрограммой "DIV" по ссылке ниже, разделите на 1579. Получите результат умноженный на 10'000'000.RUNA писал(а): ...Как на ассемблере осуществить деление 351 на 1579?
Умножать не обязательно на 10'000'000, а на число, которое позволит получить результат с достаточной точностью.
http://radiokot.ru/forum/viewtopic.php?p=193610#193610
Фраза "Сразу после таблицы прерываний" ничего не дает. главное какая метка стоит после нее.
Я обычно после РЕСЕТА произвожу инициализацию стека, портов, ну и всякую дребедень которая пригодиться, после этого завожу основной цикл программы и в нем уже пишу остальной код, т.к. в цикле нет смысла инициализировать несколько раз (исключения составляют те модули, которые отключаются/включаются в цикле, тогда их инициализацию ставлю не после РЕСЕТа а в цикл)
Я обычно после РЕСЕТА произвожу инициализацию стека, портов, ну и всякую дребедень которая пригодиться, после этого завожу основной цикл программы и в нем уже пишу остальной код, т.к. в цикле нет смысла инициализировать несколько раз (исключения составляют те модули, которые отключаются/включаются в цикле, тогда их инициализацию ставлю не после РЕСЕТа а в цикл)
Ставим плюсы: )
по-моему, вы являетесь очередной жертвой неудачного тезиса из обучалкиAndrey3377 писал(а):Двигаюсь потихоньку... Прерывания.
Как по вашему опыту лучше все эти дела организовывать, стек инициализировать, разрешение, конфигурация внешних и других прерываний? Сразу после таблицы прерываний или внутри обработчика RESET?
в подавляющем большинстве AVR RESET - это НЕ ВЕКТОР ПРЕРЫВАНИЯ, а сброс - НЕ ПРЕРЫВАНИЕ!!! это адрес начала исполнения программы, стартовый адрес. непосредственно со следующей ячейки памяти начинается таблица векторов прерываний.
так вот, обработчика RESET не существует - это есть основная программа. если вы используете прерывания, то таблица векторов будет использоваться по прямому назначению, следовательно, по адресу RESET должна быть команда безусловного перехода к телу основной программы - и ничего более!!! где это тело начнется - сразу после таблицы прерываний или глубже по памяти - абсолютно все равно. но иного места, кроме как в начале основной программы (реальном начале, а не по адресу RESET), для установки указателя стека и настройки периферии просто быть не может!!!
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Угу, вкурил. Тут виной не столько обучалка, сколько даташиты контроллеров с рыбой таблицы векторов прерываний. Где по нулевому адресу прописан Reset Handler.ARV писал(а):по-моему, вы являетесь очередной жертвой неудачного тезиса из обучалкиAndrey3377 писал(а):Двигаюсь потихоньку... Прерывания.
Как по вашему опыту лучше все эти дела организовывать, стек инициализировать, разрешение, конфигурация внешних и других прерываний? Сразу после таблицы прерываний или внутри обработчика RESET?
в подавляющем большинстве AVR RESET - это НЕ ВЕКТОР ПРЕРЫВАНИЯ, а сброс - НЕ ПРЕРЫВАНИЕ!!! это адрес начала исполнения программы, стартовый адрес. непосредственно со следующей ячейки памяти начинается таблица векторов прерываний.
В принципе по нулевому адресу может быть написано даже не rjmp НАЧАЛО_ПРОГРАММЫ, а какие-то команды на месте неиспользуемых векторов и rjmp можно поставить прямо перед используемым в конкретной программе вектором. Я правильно понял?
теоретически вы правильно поняли, вы в праве использовать память контроллера по своему усмотрению, только нужно точно знать, что никакое прерывание не произойдет. иначе PC присвоится адрес по которому должен быть вектор прерывания, а там на самом деле будет другая команда.
ИМХО лучший вариант вместо неиспользуемых векторов прерываний написать reti. (всегда если что можно заменить на rjmp метка)
ИМХО лучший вариант вместо неиспользуемых векторов прерываний написать reti. (всегда если что можно заменить на rjmp метка)
Ставим плюсы: )
- Сообщения: 3
- Зарегистрирован: Пн июн 15, 2009 12:07:01
Добрый день. Подскажите пожалуйста как решить мою проблему. Бьюсь головой в стену уже 2 дня
Нужно использовать USART1 в atmega64
Инициализация из даташита
Но AVR sudio категорически не признает строки
out UBRR1H, r17 и out UBRR1L, r16 говоря
error: Operand 1 out of range: 0x9b
Что делать? заранее спасибо.
Нужно использовать USART1 в atmega64
Инициализация из даташита
- USART_Init:
; Set baud rate
out UBRRH, r17
out UBRRL, r16
итд...
ret
Но AVR sudio категорически не признает строки
out UBRR1H, r17 и out UBRR1L, r16 говоря
error: Operand 1 out of range: 0x9b
Что делать? заранее спасибо.
- Сообщения: 828
- Зарегистрирован: Пн мар 16, 2009 21:40:57
Модет out не в масть тут ? help чтить надобно про инструкцию out или даташит.
Студия понапрасну говорить не станет наверно.
Студия понапрасну говорить не станет наверно.
Для загрузки регистров в старших адресах необходимо использовать команду ST, а для чтения LDAlspro писал(а):Добрый день. Подскажите пожалуйста как решить мою проблему. Бьюсь головой в стену уже 2 дня
Нужно использовать USART1 в atmega64
Инициализация из даташита
Так как мне нужен USART1 то будет UBRR1H и UBRR1L
- USART_Init:
; Set baud rate
out UBRRH, r17
out UBRRL, r16
итд...
ret
Но AVR sudio категорически не признает строки
out UBRR1H, r17 и out UBRR1L, r16 говоря
error: Operand 1 out of range: 0x9b
Что делать? заранее спасибо.
- Сообщения: 459
- Зарегистрирован: Вс июн 01, 2008 12:16:38
Чуть чуть подправлю, в случае с регистрами общего назначения нужно загружать их значения командой STS, т.е.GP1 писал(а):Для загрузки регистров в старших адресах необходимо использовать команду ST, а для чтения LD
Код: Выделить всё
sts UBRR1H, r17Код: Выделить всё
lds r17, UBRR1H



