Ассемблер (ASM) для AVR в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение ARV »

SII, все заключается в терминологии - и вопрос, и ответ, и правда, и ложь :)
GCC, как вы верно отметили, не компилятор, а диспетчер, но я исходил из принципа, когда GCC на "бытовом" уровне расшифровывают как "гнутый компилятор С" - согласитесь, что для начинающих нет никакой разницы, в каких именно недрах что генерируется - главное одно: на входе текст, на выходе - результат. а в данном контектсе форума вообще GCC есть почти синоним "Си для AVR, но не CVAVR" :)))

кроме того, компилятор Си по логике вещей обязан генерировать ассемблерный файл, как промежуточный. в таком ключе выходит, что вообще нет компилятров Си, генерирующих прямой объектный код :) опять же, все дело в нюансах - на каком этапе ПОЛНОЙ КОМПИЛЯЦИИ рассматривать процесс.

и в заключение: я сравнивал возможности студийного ассемблера с avr-as - и нашел, что последний кардинально мощнее первого. и об этом сказал. к сожалению, кроме как с перечисленными ранее, я с другими ассемблерами дел не имел и потому сравнивать более не с чем - возможно, у вас есть в качестве образца что-то иное... но о нем, видимо, мало кому известно, и потому обсуждать здесь его просто не с кем :) стоит ли об этом говорить вообще?

имхо, даже если нет приказа сверху - какую альтернативу вы можете предложить для AVR? по-моему, все известное - убожище еще то!
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
avreal
Опытный кот
Сообщения: 842
Зарегистрирован: Чт дек 31, 2009 19:27:45
Откуда: Бровари, Україна
Контактная информация:

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение avreal »

SII писал(а):Ведь ГЦЦ -- это не транслятор, это всего лишь "диспетчер", разбирающийся, кто и в каком порядке должен делать заданную работу. Вот он и вызывает транслятор с соответствующего языка (Си, Си++, Фортран, Си-шарп, Жаба, Ада -- вроде как всё), который на выходе производит именно ассемблерный файл,
Ну так вот и ответ — зачем в каждом компиляторе иметь "окончательный" кодогенератор, если можно всю низовую работу по формированию секций, вычислению смещений и т.д. и т.п. сбросить ассемблеру, одному на всех? А из back-end-а выюросить текстовое представление. Заодно проще ассемблерные вставки обрабатывать, при их наличии всё равно нужно «ассемблирование» - вот пусть оно и сидит в отдельной программе.
Да и as вместе с ld, ar, objdump и т.д. - это из отдельного пакета binutils, а не из gcc, он вполне себе рассчитн на самостоятельное использование. И иногда его (пакет binutils) совершенно независимо портируют на нужную платформу, даже не планируя туда портировать С-компилятор.
Так что то, что backend плаформы из GCC выдаёт наружу asm, не означает автоматически, что этот asm — «подпорка, негодная для самотоятельного использования». Есть пакеты, выдающие результат своей работы в виде C-программы, так что, С после этого становится «попоркой»? Нет, просто люди кое-что сэкономили в процессе.

SII писал(а):не вижу никакой реальной нужды использовать левый транслятор, проще использовать родной для студии
В студии уже давно при создании проекта выбирается его тип - AVRASM или WinAVR.
AVR Studio 4 features

* Integrated Assembler
* Integrated Simulator
* Integrates with GCC compiler plug-in
а там уже всё равно, будет проект из с-файлов или из S-файлов.
В чём выражается «левизна»?
Посмотрите avrfreaks - Atmel давно оказывает поддержку проекту WinAVR, а в начале этого года вообще забрала под своё крыло
http://www.avrfreaks.net/index.php?name ... ic&t=95389
летний WinAVR так называется уже условно, берут его тут
http://www.atmel.no/beta_ware/
(там сначала AVR32, а ниже «AVR Toolchain Installer for use with AVR Studio 4.18» — это дл AVR).

SII писал(а):я-то не на ПК начинал
Так что, будем вспоминать С-компиляторы для PDP-11 :)
Там тоже был «драйвер» CC и тоже в цепочке стоял ассемблер. В двух из трёх вариантов - MACRO-11 был «подпоркой», в одном - свой as с немного другим синтаксисом.

Да, некоторые вещи у «дедовских» ассемблеров были получше, но тогда на них операционки писали. Сейчас объективно от ассемблера меньше требутся. Но всё равно gnu as вместе с ld ближе по своим возможностям к «нормальным» ассемблерам, чем к AVRASM*.

p.s[0] Кстати, ключики для ld --relax и --gc-sections работают и для asm-программ ;-)

p.s[1] Вот avreal для студии действительно левый, Klen сделал плугин к студии, но без полной поддержки. Фьюзы, кажется, не поддерживаются. Но в меню студии avreal появляется.
Последний раз редактировалось avreal Ср окт 13, 2010 14:02:10, всего редактировалось 1 раз.
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Аватара пользователя
avreal
Опытный кот
Сообщения: 842
Зарегистрирован: Чт дек 31, 2009 19:27:45
Откуда: Бровари, Україна
Контактная информация:

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение avreal »

ARV писал(а):кроме того, компилятор Си по логике вещей обязан генерировать ассемблерный файл, как промежуточный.
Некоторые из попробованных мной компиляторов таки сразу генерировали объектник, а для -S у них был отдельный модуль, генерирующий скорее листинг, чем пригодный для компиляции ассемблерный исходник. Таким образом, возможно, несколько сокращалось необходимое на диске место для самого компилятора и временных файлов между последней стадией оптимизатора и собственно генертором объектного кода (сам компилятор, кажется, был оверлейным монолитом, а не cc, и исполняемые файлы проходов и часть информации типа таблиц символов между проходами вообще в ОЗУ пытался держать). У этого же компилятора проход cpp тоже был встроен в монолит, промежуточный файл после препроцессинга не создавлся. Препроцессор cpp был также отдельным файлом для обеспечения просмотра результата препроцессирования, но С-компилятор работал даже если препроцессор и ассемблер вообще стереть с диска.
В каком-то тонком случае этот отдельный препроцессор показывал явно не то, что делал основной компилятор :-)

ARV писал(а):какую альтернативу вы можете предложить для AVR? по-моему, все известное - убожище еще то!
Ещё в прошлом тысячелетии у Атмел на ftp лежал усечённый пакет от IAR - только ассемблер и линкер. Но бесплатно. Версия, кажется, 1.30. Вот как обнаружил, так и перестал пользоваться AVRASM. Благо, студия мне как-то не обязательна была, а IAR-овские асм+линкер из под борландовского make работали аж свистело. В качестве IDE был Qedit (позже переиенованный в Jedit). Из под него и компилировалось, и прошивалось в одно нажатие Alt-F9.
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение ARV »

и чем хорошим усеченный (да хоть и полный) IAR-овский ассемблер отличается от avr-as и avrassembler2? чтобы быть в курсе :)
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
avreal
Опытный кот
Сообщения: 842
Зарегистрирован: Чт дек 31, 2009 19:27:45
Откуда: Бровари, Україна
Контактная информация:

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение avreal »

Ассемблер усечённым не был. Иаровский пакет был усечён отрезанием С до голого асма.
avr-as тогда ещё не было в природе. А когда появился, то уже вместе с avr-gcc 2.95 и я слез уже не с асм, а с ломаного IAR C на gcc.
AVRASSEMBLER2 тогда тоже не существовало.

А отличается — линкер, секции кода с нормальным ими управлением, приличные макросы.
Кой-чего не хватало, но я недолго для AVR на асме задержался.
Как я на электрониксе писал в той теме про gas-макросы enter/leave — «и почему я не пишу на ассемблере?»
Да времени жалковато, пусть C за меня делает часть работы. Пусть и хуже, чем я смог бы сам, зато не я.
Допустим, Антонов мог бы выточить какой-то хитрый болт лучше среднего токаря (а в начале его карьеры авиаконструктора наверняка так и было), но если бы он продолжал этим заниматься сам — «Мрія» никогда не полетела бы.
Я не Антонов, но в миниатюре, с учётом пропорций и масштабного коэффициента, многое справедливо.
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение ARV »

я про enter/leave хочу статеечку написать :)
не смотря на справедливость ваших слов про трудоемкость ассемблера, порой все-таки без него сложновато. откуда у меня эти enter-ы взялись? да вот решил сделать по образу и подобию Чена табличный синтезатор звука, и вышло, что без ассемблера тут делать нечего, максимум 2 инструмента можно выжать: GCC такие фокусы с умножением творит - любо-дорого! да и трехбайтовые счетчики не так-то просто сделать... в общем, можно было попытаться какие-то трюки GCC применять, но я решил, что чистый асм лучше. и буквально попал в просак как раз на том, что забыл из стека выпихнуть один регистр... два дня ломал башку с макетом, пока не взял в руки отладчик - привычка скорописания на Си сказалась :) и тогда я решил сделать макрос для всех случаев жизни :)

еще раз хочу вам сказать спасибо за идею для макроса.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
avreal
Опытный кот
Сообщения: 842
Зарегистрирован: Чт дек 31, 2009 19:27:45
Откуда: Бровари, Україна
Контактная информация:

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение avreal »

У меня так то там, то сям на скорую руку писанные кусочки валяются, а дополировать пусть не до статьи, а до заметки — всё как-то [s]лениво[/s] времени нет.

Дык понятное дело, без асма иногда никак, просто легче и быстрее выходит явно всё на асме описать. Т.е. в таких случаях трудоёмкость асма оказывается ниже.
Ну будем считать, что это я «то там, то сям» тонус поддерживаю на случай вдруг понадобится :-)
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
JokerDVB
Родился
Сообщения: 17
Зарегистрирован: Ср окт 20, 2010 23:59:08

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение JokerDVB »

Здравствуйте
Я не совсем понял в обучалке вот эту команду

Поскольку мы переключаемся между четырьмя массивами - нам нужно только 2 двоичных разряда (2^2 = 4). Поэтому, все разряды старше 2-го мы хладнокровно вырезаем командой

andi ResCnt,0b00000011

Ну вот собственно вопрос
А если нам надо сдлеать на 5 массивов? Надо записать

andi ResCnt,0b00000111 ?
SII
Вымогатель припоя
Сообщения: 635
Зарегистрирован: Пт янв 30, 2009 14:50:35
Откуда: Солнечногорск

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение SII »

Для кодирования номера от 0 до 3 (или, если угодно, от 1 до 4, хотя технически всё равно от 0 до 3) достаточно двух битов. Если нужно от пяти до восьми чего-то там (номера 0-7), то нужно три бита, 8-15 -- четыре и т.д. Если предположить, что нужный номер занимает младшие разряды, то выделить его можно именно такой командой (в ней будет столько младших единиц, сколько разрядов надо вырезать).
Doniak
Встал на лапы
Сообщения: 137
Зарегистрирован: Вс дек 02, 2007 14:11:07
Откуда: Кривой Рог

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Doniak »

Прикрепил файл проекта. В нем исходник на асме, хекс файл уже прокомпилирован и схемка в протеусе.
Проектик не закончен но не в этом дело.
При симуляции проекта вылазит баг ввиде не корректно работающих кнопок, а именно бывает нажмешь на кнопку, а она или отсчитает 2 раза или прибавит а потом отнимет единицу. При этом ощущение такое что сначала я нажал на одну кнопку потом на вторую, тоисть при изменение цифры на индикаторе присутствует задержка.

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

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение DX168B »

Заметил. Попробую разобраться. Но мне кажется, что это исходник имеет ошибки.
А пока можешь посмотреть мой проект во вложении. Там реверсивный счётчик с динамической индикацией и проектом в протеусе. Можешь например его подогнать под нужное и немного переделать.
Ну и вектора у Вас. Наверное лучше будет сделать их так:

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

.cseg
.org 0x0000
rjmp RESET            ;Вектора прерываний 1-19 для ATtiny2313 
reti;rjmp INT_0
reti;rjmp INT_1
reti;rjmp Timer1_capt1
rjmp Timer1_comp1A
reti;rjmp Timer1_OVF1
reti;rjmp Timer0_OVF0
reti;rjmp UART_RX
reti;rjmp UART_UDRE
reti;rjmp UART_TX
reti;rjmp ANA_COMP
reti;rjmp PC_INT
reti;rjmp Timer1_comp1B
reti;rjmp Timer1_comp0A
reti;rjmp Timer1_comp0B
reti;rjmp I2C_start
reti;rjmp I2C_overflow
reti;rjmp EE_ready
reti;rjmp WDT_overflow
**********************************
TIMER1_COMP1A: //Начало обработчика прерывания      
 ldi    R16,      0x00   ;Обнуляем счётчик таймера
..........
.......
reti
;----------
RESET:
ldi    R16,    RAMend
out   SPL,    R16
.........
......

А можно и так:

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

.cseg
.org 0x0000
rjmp   RESET
.org 0x0004
rjmp TIMER1_COMP1A
;----------
TIMER1_COMP1A: ;Прерывание таймера по сравнению.
.............
........
reti
;----------
RESET: ;Начало программы (стек и прочее)
..........
......
Вложения
COUNTER.rar
Реверсивный счётчик
(32.5 КБ) 227 скачиваний
I am DX168B and this is my favourite forum on internet!
Аватара пользователя
DX168B
Друг Кота
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)
Контактная информация:

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение DX168B »

Всётаки опрос кнопок оочень извратен.
Отследить отдельные ноги МК можно командами sbis и sbic
sbis - Пропустить следующую команду, если на ноге присутствует лог. 1 (на ней есть напряжение)
sbic - Пропустить следующую команду, если на ноге лог. 0 (напряжение отсутствует)
А вот синтаксис:

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

sbis  PinD,  3 ;Проверим вывод PD3 и если на нём будет 1, то пропустим след. команду.
rjmp  КУДА-ТО ;Вот эта команда и пропустится если будет лог.1.
..........
........
.....

Так же и с командой sbic
I am DX168B and this is my favourite forum on internet!
Doniak
Встал на лапы
Сообщения: 137
Зарегистрирован: Вс дек 02, 2007 14:11:07
Откуда: Кривой Рог

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Doniak »

Спасибо, буду переписывать обработчик нажатия кнопки.
Код писал по аналогии с обучалкой что находится на этом сайте и вектора объявлял как там написано.

ПС добавил до своей программы вывод ШИМ на PB0 так теперь кнопки вообще залипают раз нажал и на всегда :)
Но думается мне что в железе должно работать.
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение GP1 »

Немного офтоп.
Doniak
По написанию, оформлению программ почитай здесь http://easyelectronics.ru/category/avr-uchebnyj-kurs
если следовать правилам там изложенным очень многих ошибок удастся избежать.
А обучлка уже не одного новичка отправила гулять по "граблям", и многое в ней, ИМХО, написано нерационально, и мне, как одному из последних АСМ-магикан :))) , обидно что многие новички "почитав обучалки-наступив на грабли" бросают асм.
Чем дальше, тем больше становлюсь занудой...
Изображение
Doniak
Встал на лапы
Сообщения: 137
Зарегистрирован: Вс дек 02, 2007 14:11:07
Откуда: Кривой Рог

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Doniak »

Ну так давайте с этим чтота делать :) Ну там питицыю админу чтоб исправил, дополнил обучалку. А обучалка тут довольно не плохая в плане описания, оформления все очень доходчиво описано. К примеру про работу тавоже таймера, лутчше имхо не где нет.

А как вот такое понимать
goto.jpg
(170.46 КБ) 609 скачиваний

Нажал на кнопку установился лог 0 на ноге, отпустил а 0 так и остался висеть на ноге.

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

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение DX168B »

Видать отправляешь в этот порт целый байт.
Отправив целый байт целиком в порт, ты влияешь на все выводы этого порта.
Если одна часть выводов, например порта D, настроена на выход, а другая на вход, то
лучше управлять выходами порта по отдельности и отслеживать
входы тоже по отдельности(как я писАл выше).
Ещё 2 полезные команды:
sbi - подать на отдельную ногу лог. 1 (подать ток)
cbi - подать на отдельную ногу лог. 0 (убрать ток)
А вот синтаксис:

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

sbi  PortD,  0 ;Запустить ногу PD0
cbi  PortD,  0 ;Отрубить ногу PD0

sbi  PortD,  1 ;Запустить ногу PD1
cbi  PortD,  1 ;Отрубить ногу PD1

sbi  PortD,  2 ;Запустить ногу PD2
cbi  PortD,  2 ;Отрубить ногу PD2

sbi  PortD,  3 ;Запустить ногу PD3
cbi  PortD,  3 ;Отрубить ногу PD3
; И т.д.
I am DX168B and this is my favourite forum on internet!
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение GP1 »

Doniak

По программе: ковырять чужой код при отсутсвии коментов - есть бездарная трата времени.
Задача тривиальная, вы сами поймете это после 2-3х программ, но при таком стиле программирования уже через пару недель сами не сможете разобрать как работает (должна работать) программа.
От себя добавлю, но это ИМХО:
1. оформляйте прерывания по адресам
2. вместо имен регистров использовать осмысленные имена

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

.def      R16=temp
.def      R17=count

3. не вызывайте из обработчиков прерываний подпрограмм, ну и конечно НИ КОГДА не делайте програмную задержку в обработчике прерывания.
4. разделяйте куски программ строками из * или -, самому же потом будет проще.
5.

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

   ldi R16,0b01000000 ;разрешаем прерывание по компоратору A Таймера1 
   out TIMSK,R16


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

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

   ldi temp,1<<OCIE1A ;разрешаем прерывание по компоратору A Таймера1 
   out TIMSK,temp

6. и пожалуй самое главное, прежде чем писать асм-код, возмите листок бумаги и карандаш и нарисуйте АЛГОРИТМ работы вашей программы, и пройдитесь по нему, как бы представляя что должен делать мк в тот или иной момент времени программа, и только после того как алгоритм заработает на бумаге можно переходить к написанию программы.
уверяю - это позволит тратить гораздо меньше времени на отладку.

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

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение DX168B »

Я например так оформляю программы:

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

;***************************************************************************
;* Generator     DX168B (c) 2010      ATtiny26L      QUARTZ    -    8MHz   *
;***************************************************************************
;---------- Включенные заголовочники
.include         "tn26def.inc"
;***************************************************************************
;* ОПРЕДЕЛЕНИЕ ИМЁН РЕГИСТРОВ ОБЩЕГО НАЗНАЧЕНИЯ (РОН)                      *
;***************************************************************************
.def            temp0               = R16
.def            temp1               = R17
.def            del0               = R18
.def            del1               = R19
.def            front               = R20
.def            count               = R21
;***************************************************************************
;* ВЫДЕЛЕНИЕ МЕСТА В ОЗУ (Static RAM)                                      *
;***************************************************************************
.dseg
etalon:            .byte               5
;***************************************************************************
;* МАССИВ ДАННЫХ В EEPROM (4 ЗНАЧЕНИЯ ЧАСТОТ И ЗНАЧ. ПОДДЕЛИТЕЛЯ ТАЙМЕРА)  *
;***************************************************************************
.eseg
.db 0x3F, 0x2F, 0x1F, 0x0F, 0x89
;***************************************************************************
;* ПРОГРАММА                                                               *
;***************************************************************************
.cseg
.org            0x0000
rjmp            RESET
;---------- Обработчики прерываний
.org            0x0004
TIM_COMP1B:                                 ;Прерывание таймера 1
in               temp1,               SREG
cpi               front,               0x00
breq            SET1
cbi               PortA,               6
clr               front
out               SREG,               temp1
reti
SET1:
sbi               PortA,               6
ser               front
out               SREG,               temp1
reti
;---------- Начало программы (настройка портов и стека)
RESET:
ldi               temp0,               RAMend
out               SP,                  temp0
ldi               temp0,               (1<<PB3)+(1<<PB2)+(1<<PB1)
out               DDRB,               temp0
sbi               PortB,               6
sbi               DDRA,               6
clr               front
;---------- Инициализация
ldi               YL,                  Low(etalon)
ldi               YH,                  High(etalon)
clr               count
INIT:
out               EEAR,               count
sbi               EECR,               EERE
in               temp0,               EEDR
st               Y+,                  temp0
inc               count
cpi               count,               0x05 ;5
brmi            INIT
;---------- Начальный режим работы
ldi               count,               0x02
lds               temp0,               etalon+2
out               OCR1C,               temp0
;---------- Настройка и старт таймера
ldi               temp0,               (1<<OCIE1B)
out               TIMSK,               temp0
lds               temp0,               etalon+4 ;(1<<CTC1)+(1<<CS13)+(0<<CS12)+(0<<CS11)+(1<<CS10)
out               TCCR1B,               temp0
;---------- Опрос кнопки (Основной цикл опроса)
MAIN:
sei
sbic            PinB,               6
rjmp            MAIN
;---------- Обработка нажатой кнопки (смена частоты)
cli
clr               front
cbi               PortB,               3
rcall            DELAY
sbic            PinB,               6
rjmp            MAIN
KEY0:
sbis            PinB,               6
rjmp            KEY0
ldi               YL,                  Low(etalon)
ldi               YH,                  High(etalon)
add               YL,                  count
adc               YH,                  del0
ld               temp0,               Y
out               OCR1C,               temp0
inc               count
cpi               count,               0x04
brmi            MAIN
clr               count
rjmp            MAIN
;---------- Задержка для "антидребезга" контактов кнопки
DELAY:
dec               del0
brne            delay
dec               del1
brne            delay
ret
;---------- Описания
; В EEPROM записываются 5 значений.
; При старте по умолчанию загружается 3я частота (3е значение из массива)
; 1й байт - значение частоты для первой частоты
; 2й байт - значение частоты для второй частоты
; 3й байт - значение частоты для третьей частоты
; 4й байт - значение частоты для четвёртой частоты
; 5й байт - режим работы таймера. (по умолчанию 0x89 или 0x49)
;   5й байт:
;   ----------
;   | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
;   ----------
;   | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 1 | (0x49)
;   ----------
; Биты 0, 1, 2 и 3 - значение подделителя таймера.
; Биты 4 и 5 - не используются
; Бит 6 - очистка таймера по достижению счетчика установленного значения.
; Бит 7 - очистка подделителя таймера по достижению счетчика установленного значения.
;----------
;AVR Studio 4.0 (c) ATMEL Corp.

3. не вызывайте из обработчиков прерываний подпрограмм, ну и конечно НИ КОГДА не делайте програмную задержку в обработчике прерывания.

Можно и задержки делать и вызывать из обработчика, но только в самом начале обработчика надо сохранить содержимое регистра SREG (запихнуть его например в ОЗУ)
и в самом конце обработчика(непосредственно перед командой reti) извлечь сохранённое содержимое обратно.
I am DX168B and this is my favourite forum on internet!
mig-11101
Открыл глаза
Сообщения: 62
Зарегистрирован: Вс янв 17, 2010 01:04:34

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение mig-11101 »

Помогите пожалуйста, вчера только начал учиться работать с аврками на ассамблере, по этому вопрос вожможно глупый, но -

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

Усыпить выходит, разбудить - нет. =)) В поиске по форуму искал - непомогло.

Задержок много - это от дребезга, ну и что-бы не пропустить момент когда (не)горят диоды.

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

.include "tn13def.inc"

.def     Temp=R16
.def     Temp1=R17
.def     Temp2=R18
.def     Temp3=R19
.def     Temp4=R20
.def       ResCnt=R21

.cseg
.org 0

rjmp Reset
rjmp INT_0
rjmp INT_1
rjmp Timer1_capt1
rjmp Timer0_OVF0
rjmp Timer1_OVF1
rjmp Timer1_comp1
rjmp UART_RX
rjmp UART_UDRE
rjmp UART_TX
rjmp ANA_COMP



;Reset:
;INT_0:
INT_1:
Timer1_capt1:
UART_RX:
Timer1_OVF1:
Timer1_comp1:
Timer0_OVF0:
UART_UDRE:
UART_TX:
ANA_COMP:
         
;*************инициализация*********************
Reset:
   
   ldi Temp,0b00010010 ;power-down режим сна
   out MCUCR,Temp      ;инициализация прерывания по падающему фронту

   ldi Temp,0b01000000 ;Разрешить внешнее прерывание
   out GIMSK,Temp

   ldi Temp,RamEnd    
   out SPL,Temp

   ldi Temp,0b00011101 ;Настройка портов
   out DDRB,Temp

   sei

;***************Старт***************************
Start:               
   
   ldi temp,0      ;задержка
   ldi temp1,0
delay:
   dec Temp
   brne delay
   dec Temp1
   brne Delay

   ldi Temp,0b00110001 ;разрешаю режим сна
   out MCUCR,Temp
   
   sleep         ;сон

   ldi temp,0      ;задержка
   ldi temp1,0
delay1:
   dec Temp
   brne delay1
   dec Temp1
   brne Delay1
         
   ldi temp,0b00011101   ;зажечь все диоды
   out PortB,Temp

   ldi temp,0      ;задержка
   ldi temp1,0
   ldi temp2,100
delay2:   dec Temp
      brne delay2
      dec Temp1
      brne delay2

      ldi temp,0b00000000
      out PortB,temp
      rjmp Start

INT_0:            ;выход из сна - внешнее прерывание
   ldi temp,0      ;задержка
   ldi temp1,0
delay3:            
   dec Temp
   brne delay3
   dec Temp1
   brne Delay3
   ldi Temp,0b00010001   ;запрещаю спать
   out MCUCR,Temp
   reti            
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение GP1 »

DX168B писал(а):Можно и задержки делать и вызывать из обработчика, но только в самом начале обработчика надо сохранить содержимое регистра SREG (запихнуть его например в ОЗУ)
и в самом конце обработчика(непосредственно перед командой reti) извлечь сохранённое содержимое обратно.

не надо давать таких советов новичкам, потом очень трудно отучать от дурного стиля программирования, а SREG и рабочие регистры сохранять необходимо в любом случае.
Чем дальше, тем больше становлюсь занудой...
Изображение
Ответить

Вернуться в «AVR»