Страница 50 из 400

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

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

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

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

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

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

Добавлено: Ср окт 13, 2010 13:42:56
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 появляется.

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

Добавлено: Ср окт 13, 2010 14:01:38
avreal
ARV писал(а):кроме того, компилятор Си по логике вещей обязан генерировать ассемблерный файл, как промежуточный.
Некоторые из попробованных мной компиляторов таки сразу генерировали объектник, а для -S у них был отдельный модуль, генерирующий скорее листинг, чем пригодный для компиляции ассемблерный исходник. Таким образом, возможно, несколько сокращалось необходимое на диске место для самого компилятора и временных файлов между последней стадией оптимизатора и собственно генертором объектного кода (сам компилятор, кажется, был оверлейным монолитом, а не cc, и исполняемые файлы проходов и часть информации типа таблиц символов между проходами вообще в ОЗУ пытался держать). У этого же компилятора проход cpp тоже был встроен в монолит, промежуточный файл после препроцессинга не создавлся. Препроцессор cpp был также отдельным файлом для обеспечения просмотра результата препроцессирования, но С-компилятор работал даже если препроцессор и ассемблер вообще стереть с диска.
В каком-то тонком случае этот отдельный препроцессор показывал явно не то, что делал основной компилятор :-)
ARV писал(а):какую альтернативу вы можете предложить для AVR? по-моему, все известное - убожище еще то!
Ещё в прошлом тысячелетии у Атмел на ftp лежал усечённый пакет от IAR - только ассемблер и линкер. Но бесплатно. Версия, кажется, 1.30. Вот как обнаружил, так и перестал пользоваться AVRASM. Благо, студия мне как-то не обязательна была, а IAR-овские асм+линкер из под борландовского make работали аж свистело. В качестве IDE был Qedit (позже переиенованный в Jedit). Из под него и компилировалось, и прошивалось в одно нажатие Alt-F9.

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

Добавлено: Ср окт 13, 2010 14:10:48
ARV
и чем хорошим усеченный (да хоть и полный) IAR-овский ассемблер отличается от avr-as и avrassembler2? чтобы быть в курсе :)

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

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

А отличается — линкер, секции кода с нормальным ими управлением, приличные макросы.
Кой-чего не хватало, но я недолго для AVR на асме задержался.
Как я на электрониксе писал в той теме про gas-макросы enter/leave — «и почему я не пишу на ассемблере?»
Да времени жалковато, пусть C за меня делает часть работы. Пусть и хуже, чем я смог бы сам, зато не я.
Допустим, Антонов мог бы выточить какой-то хитрый болт лучше среднего токаря (а в начале его карьеры авиаконструктора наверняка так и было), но если бы он продолжал этим заниматься сам — «Мрія» никогда не полетела бы.
Я не Антонов, но в миниатюре, с учётом пропорций и масштабного коэффициента, многое справедливо.

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

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

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

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

Добавлено: Ср окт 13, 2010 21:31:32
avreal
У меня так то там, то сям на скорую руку писанные кусочки валяются, а дополировать пусть не до статьи, а до заметки — всё как-то лениво времени нет.

Дык понятное дело, без асма иногда никак, просто легче и быстрее выходит явно всё на асме описать. Т.е. в таких случаях трудоёмкость асма оказывается ниже.
Ну будем считать, что это я «то там, то сям» тонус поддерживаю на случай вдруг понадобится :-)

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

Добавлено: Чт окт 21, 2010 00:30:47
JokerDVB
Здравствуйте
Я не совсем понял в обучалке вот эту команду
Поскольку мы переключаемся между четырьмя массивами - нам нужно только 2 двоичных разряда (2^2 = 4). Поэтому, все разряды старше 2-го мы хладнокровно вырезаем командой

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

andi ResCnt,0b00000111 ?

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

Добавлено: Чт окт 21, 2010 01:07:15
SII
Для кодирования номера от 0 до 3 (или, если угодно, от 1 до 4, хотя технически всё равно от 0 до 3) достаточно двух битов. Если нужно от пяти до восьми чего-то там (номера 0-7), то нужно три бита, 8-15 -- четыре и т.д. Если предположить, что нужный номер занимает младшие разряды, то выделить его можно именно такой командой (в ней будет столько младших единиц, сколько разрядов надо вырезать).

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

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

При симуляции слижу за регистром R21 (там находится число с которым производится манипуляции при нажатиях кнопок) Он введет себе так как надо. Может протеус не правильно работает?

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

Добавлено: Сб ноя 06, 2010 01:18:32
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: ;Начало программы (стек и прочее)
..........
......

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

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

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

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

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

Добавлено: Сб ноя 06, 2010 08:59:40
Doniak
Спасибо, буду переписывать обработчик нажатия кнопки.
Код писал по аналогии с обучалкой что находится на этом сайте и вектора объявлял как там написано.

ПС добавил до своей программы вывод ШИМ на PB0 так теперь кнопки вообще залипают раз нажал и на всегда :)
Но думается мне что в железе должно работать.

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

Добавлено: Сб ноя 06, 2010 11:14:24
GP1
Немного офтоп.
Doniak
По написанию, оформлению программ почитай здесь http://easyelectronics.ru/category/avr-uchebnyj-kurs
если следовать правилам там изложенным очень многих ошибок удастся избежать.
А обучлка уже не одного новичка отправила гулять по "граблям", и многое в ней, ИМХО, написано нерационально, и мне, как одному из последних АСМ-магикан :))) , обидно что многие новички "почитав обучалки-наступив на грабли" бросают асм.

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

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

А как вот такое понимать
goto.jpg
(170.46 КБ) 616 скачиваний
Нажал на кнопку установился лог 0 на ноге, отпустил а 0 так и остался висеть на ноге.

Файл с проектом прикрепил.

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

Добавлено: Сб ноя 06, 2010 20:52:38
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
; И т.д.

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

Добавлено: Сб ноя 06, 2010 21:04:51
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:

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

Добавлено: Сб ноя 06, 2010 21:11:31
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) извлечь сохранённое содержимое обратно.

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

Добавлено: Сб ноя 06, 2010 22:45:29
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				

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

Добавлено: Сб ноя 06, 2010 23:50:25
GP1
DX168B писал(а): Можно и задержки делать и вызывать из обработчика, но только в самом начале обработчика надо сохранить содержимое регистра SREG (запихнуть его например в ОЗУ)
и в самом конце обработчика(непосредственно перед командой reti) извлечь сохранённое содержимое обратно.
не надо давать таких советов новичкам, потом очень трудно отучать от дурного стиля программирования, а SREG и рабочие регистры сохранять необходимо в любом случае.