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

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18561
Зарегистрирован: Чт дек 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
Ум, честь и совесть. И скромность.
Сообщения: 18561
Зарегистрирован: Чт дек 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
Ум, честь и совесть. И скромность.
Сообщения: 18561
Зарегистрирован: Чт дек 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 »

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

Дык понятное дело, без асма иногда никак, просто легче и быстрее выходит явно всё на асме описать. Т.е. в таких случаях трудоёмкость асма оказывается ниже.
Ну будем считать, что это я «то там, то сям» тонус поддерживаю на случай вдруг понадобится :-)
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
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 КБ) 208 скачиваний
Аватара пользователя
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 КБ) 228 скачиваний
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 КБ) 610 скачиваний
Нажал на кнопку установился лог 0 на ноге, отпустил а 0 так и остался висеть на ноге.

Файл с проектом прикрепил.
Вложения
Tiny_PWM_mod1.rar
(36.43 КБ) 210 скачиваний
Аватара пользователя
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»