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

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

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

Сообщение ploop »

а что будет когда со старшим случится переполнение ?
Ничего, просто флаг С опять установится.
Реклама
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

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

Сообщение vitalik_1984 »

Alexeyslav писал(а): Причем, <метка>*2 адресует один байт, а <метка>*2+1 адресует следующий байт. Поэтому у вас в примере ошибка - старшая и младшая часть слова у вас будут равны одному и тому же байту из памяти.
Это в скобках, а что будет после применения модификатора или как его там LOW() и HIGH()?
Реклама
Alexeyslav
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич
Контактная информация:

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

Сообщение Alexeyslav »

Они от результата возьмут старший/младший байт слова и всего-то.
Valek174
Первый раз сказал Мяу!
Сообщения: 21
Зарегистрирован: Ср апр 24, 2013 19:33:05

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

Сообщение Valek174 »

Всем привет!!!
У меня начальные знания програмирования AVR.
Как я понял из книг, чтобы заработали прерывания нужно:
организовать безусловный переход на те прерывания которые нам необходимы, например - rjmp RESET
настроить определенные регистры, а именно MCUCR и GIMSK, таким образзом как нам надо (читаем описание к контроллеру).
Потом разрешаем прывания sei.
И дальше у меня стоп!
Например я хочу получить генаратор прямоугольных импульсов.
Управление генератором осуществляется одной кнопкой (подключена к EXT_INT0)
При нажатии на кнопку запускается генератор, а при повторном нажатии выключается и микроконтроллер уходит в режим Power-down, при следующем нажатии запускается, и т. д.
Так вот, вопрос: если срабатывает прерывание, то с какого места начинает выполняться программа? Например контроллер в режиме sleep, при срабатывании прерывания,выполняет следующую команду за sleep или программа начинает выполнятся с какой-то определенной метки?
И еще вопрос. Когда мы организовываем безусловный переход на прерывания, компилятор ругается, типа что такая метка уже задействована. Выход, как я прочитал, обозвать прерывания другим именем, но тогда как контроллер поймет что задействовано именно то прерывание которое мне нужно?
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

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

Сообщение FreshMan »

я тут читал что сброс программы может быть вызван тремя причинами
1)кнопкой ресет
2)сторожевым таймером
3)подачей питания

а как в системе отследить чем именно в данный момент был вызван сброс ?
Tell Me The Truth
Реклама
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

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

Сообщение pyzhman »

2FreshMan: MCUCSR
2Valek174:
с какого места
с того самого, откуда ушла в обработчик прерывания. Например:
а
б
в
г
плямс, сработало прерывание. В стеке сохраняется адрес следующей команды(в данном случае адрес команды "д").Ушли на его обработку......Обработка завершена, вертаемся сюда же(адрес возврата хранится в стеке).
д
е
ё
ж
обозвать прерывания
называть можно как угодно, главное - соблюдать адреса.
Docendo discimus
Реклама
Аватара пользователя
ranger93
Вымогатель припоя
Сообщения: 560
Зарегистрирован: Пт июл 02, 2010 19:30:22
Откуда: Новосибирск / Магнитогорск

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

Сообщение ranger93 »

Помогите разобраться со power-down.
Пишу следующее:
Спойлер...
ldi r16, 0b10100010
out MCUCR, r16 ; хотим работать со спадающим фронтом с прерыванием int0 и выключаться по команде sleep
sleepmode:
ldi r16,0b00000000
out timsk,r16; запрещаем прерывания по таймеру
ldi r16, 0
out tcnt2, r16; сбросим таймер нахрен!
ldi r16, 0b01000000
out GICR, r16 ; разрешаем прерывание int0
sei
sleep
nop
В avr-studio все работает нормально: контроллер засыпает и при нажатии кнопке на 4-й ноге уходит в прерывание, а вот в реальной жизни как-то не работает... В чем может быть причина?
Главное, чтоб был источник ЭДС, а с остальным разберемся :).
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

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

Сообщение ploop »

В чем может быть причина?
Даже и смотреть не станем, пока не научитесь называть константы осмысленно.
Что у вас в MCUCR?
Аватара пользователя
ranger93
Вымогатель припоя
Сообщения: 560
Зарегистрирован: Пт июл 02, 2010 19:30:22
Откуда: Новосибирск / Магнитогорск

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

Сообщение ranger93 »

Извините, не понял, какие константы :) ?
Главное, чтоб был источник ЭДС, а с остальным разберемся :).
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

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

Сообщение ploop »

Те, которые вот тут например показаны:

Изображение

Обратите внимание, у каждого бита есть имя. И его знает ваш компилятор.
Аватара пользователя
ranger93
Вымогатель припоя
Сообщения: 560
Зарегистрирован: Пт июл 02, 2010 19:30:22
Откуда: Новосибирск / Магнитогорск

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

Сообщение ranger93 »

у меня вот так:
Изображение
И ассемблер принимает биты в таком же порядке. А выходной файл беру из папки с проектом, стало быть он правильно собран...
Главное, чтоб был источник ЭДС, а с остальным разберемся :).
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

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

Сообщение ploop »

Что правильно? У меня скриншот с даташита другого контроллера :)
Я про сам принцип. Вот эти строки будут равнозначны:

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

ldi r16, 0b10100010
ldi r16, (1<<ISC01)|(1<<SM1)|(1<<SE)
Разница только в том, что последняя легко читается, т.к. это сокращения, например SM - Sleep Mode Select Bits

И теперь хорошо видно, что у вас включено прерывание по спаду на INT0 (ISC01), режим power-down (SM1), и, собственно, разрешение сна (SE). Вроде всё нормально.
А вот 0b10100010 - совершенно ни о чём не говорит :)
Alexeyslav
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич
Контактная информация:

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

Сообщение Alexeyslav »

Как по мне, так ни первый ни второй вариант некрасивы и непонятны. было бы куда проще если записать как ISC01+SM1+SE Но это требует дополнительных определений.
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

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

Сообщение ploop »

Но это требует дополнительных определений.
Похоже на то были причины. Ведь ни что не мешало определить SM не как 5, а как 0х20 (или 32). Тогда бы ваш способ работал.
akl
Друг Кота
Сообщения: 4445
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

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

Сообщение akl »

ranger93 писал(а):Помогите разобраться со power-down.
В avr-studio все работает нормально: контроллер засыпает и при нажатии кнопке на 4-й ноге уходит в прерывание, а вот в реальной жизни как-то не работает... В чем может быть причина?
По мне, при входе в режим power-down нужно ещё устранить предысторию нажатия кнопки и учесть, что только низкий уровень, а не спад может вывести из него; при выходе из режима нужно дождаться начала генерации и стабилизации частоты тактирования
Спойлер

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

.include 	"m8def.inc"	; используем mega8

	RJMP	START
	RJMP	ISR_INT0
START:
	LDI	R16,HIGH(RAMEND)
	LDI	R17,LOW(RAMEND)
	OUT	SPH,R16
	OUT	SPL,R17

	LDI R16, 0b10100000
	out MCUCR, r16 ; хотим работать по низкому уровню с прерыванием int0 и выключаться по команде sleep sleepmode:
;	ldi r16, 0b10100010
;	out MCUCR, r16 ; хотим работать со спадающим фронтом????? с прерыванием int0 и выключаться по команде sleep sleepmode:
	ldi r16,0b00000000
	out timsk,r16; запрещаем прерывания по таймеру
;	ldi r16, 0
	out tcnt2, r16; сбросим таймер нахрен!
	ldi r16, 0b01000000
	out GICR, r16 ; разрешаем прерывание int0
   OUT GIFR,R16 ; сбрасываем флаг

	sei
	sleep
	nop
	rjmp	START
ISR_INT0:
	CLR	YH
	CLR	YL
	SBIW	YL,1
	BRNE	PC-1     ;программная задержка для начала генерации и стабилизации тактирования
	OUT	GICR,YH
	
	RET		; выход с запретом всех прерываний
Аватара пользователя
ranger93
Вымогатель припоя
Сообщения: 560
Зарегистрирован: Пт июл 02, 2010 19:30:22
Откуда: Новосибирск / Магнитогорск

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

Сообщение ranger93 »

ploop, игрался только с mega8, поэтому не знал, что в других контроллерах есть такие же регистры но с другими битами. Учту, так действительно понятнее.
akl,
akl писал(а):что только низкий уровень, а не спад может вывести из него
Кстати очень может быть, надо попробовать.
Главное, чтоб был источник ЭДС, а с остальным разберемся :).
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

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

ranger93 писал(а):Кстати очень может быть, надо попробовать.
Не очень может быть, а в ДШ это явно прописано:
Изображение
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

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

Сообщение FreshMan »

pyzhman писал(а):2FreshMan: MCUCSR
можно ли тогда сделать так, если в атмеге 8 я хочу повесить кнопку на вывод ресет то для этого мне уже не обязательно с помощью фьюзов данную ногу конфигурировать на ввод, а потом с помощью паралельного прогера все это исправлять......, теперь мне просто надо следить за 1 битом регистра MCUCSR и при его установке выполнять некие события в проге.
Tell Me The Truth
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

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

Сообщение pyzhman »

Ё! Я в ауте! Не, на самом деле. Я бы в жисть не догадался так сделать. Как красиво-то придумано! Нафига программировать вход сброса как порт фьюзом? Если можно отследить битом источника сброса. FreshMan, зачет! Только учитываем, что при сбросе вся память херится к чертовой матери. :))
Docendo discimus
Alexeyslav
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич
Контактная информация:

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

Сообщение Alexeyslav »

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

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