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

Обсуждаем контроллеры компании Atmel.
Ответить
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город

Сообщение Мастер Ломастер »

Engineer_Keen писал(а):Мастер Ломастер Опередил, как раз хотел вариант с LDI выложить :)))
да, блин, вас опредешь... поспешил вон - и облажался :)))

категорически не рекомендую помещать код в область таблицы векторов! мало того, что в случае с AVR-GCC это весьма нетривиально, так еще и мало модифицируемо впоследствии. как правило, жалкие 20 байт таблицы погоды в программе не делают.
битва с дураками проиграна, победители торжествуют. слава победителям!
Контактная информация:
Реклама
Опытный кот
Аватара пользователя
Сообщения: 785
Зарегистрирован: Сб фев 27, 2010 21:45:37
Откуда: Ростов-на-Дону

Сообщение Coolish »

ага, всё понятно.

Если ldi не меняет SREG, то тогда вообще замечательно
Сделать хотел грозу, а получил КоЗу
Контактная информация:
Реклама
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

категорически не рекомендую помещать код в область таблицы векторов!
Я тоже не рекомендую, это такой мелкий хак, делал, когда пытался вывести на порт программный меандр с максимально возможной частотой. Там каждый такт на счету.
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

Мастер Ломастер писал(а):категорически не рекомендую помещать код в область таблицы векторов! мало того, что в случае с AVR-GCC это весьма нетривиально, так еще и мало модифицируемо впоследствии.
Это да.
Мастер Ломастер писал(а):как правило, жалкие 20 байт таблицы погоды в программе не делают.
С точки зрения размера да, а вот если критично быстродействие...
Coolish писал(а):ага, всё понятно.
Если ldi не меняет SREG, то тогда вообще замечательно
Кстати есть еще SER, которая выставляет все биты в регистре (в противоположность CLR) - она тоже SREG не меняет.
Реклама
Эиком - электронные компоненты и радиодетали
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

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

Сообщение vitalik_1984 »

чего непонятного то? clr выставляет флаг нуля,а cer чего там выставит?
В поисках истины человек развивается.
Контактная информация:
Реклама
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

Да чего угодно, N например, результат-то отрицателен...
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город

Сообщение Мастер Ломастер »

так все элементарно: CLR Rx - это просто дополнительный мнемокод операции EOR Rx, Rx, т.е. логической операции, а все логические операции изменяют регистр флагов.

а SER Rx- это мнемокод команды LDI Rx, 0xFF - а команды загрузки не меняют регистр флагов. то есть фактически пары CLR - EOR и SER - LDI есть синонимы :)))
битва с дураками проиграна, победители торжествуют. слава победителям!
Контактная информация:
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

Я так и понял. Не зря же компилятор везде EOR для очистки суёт.
CBR/SBR из той же оперы (ANDI/ORI)

Экономят, буржуи, экономят!!! :)))
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город

Сообщение Мастер Ломастер »

ploop писал(а):Экономят, буржуи, экономят!!! :)))
в данном случае как раз наоборот: разбрасываются командами :) вон микрочиповцы раньше всегда кричали - у нас всего 23 команды! RISС! а у AVR аж больше сотни! :))) а на поверку добрая половина из этой сотни тупо переводит стрелки на коды из другой половины :)))
битва с дураками проиграна, победители торжествуют. слава победителям!
Контактная информация:
Опытный кот
Аватара пользователя
Сообщения: 785
Зарегистрирован: Сб фев 27, 2010 21:45:37
Откуда: Ростов-на-Дону

Сообщение Coolish »

Всё работает! Спасибо

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

// Timer0 overflow
ISR(TIMER0_OVF_vect, ISR_NAKED)
{

//	PORTA|= 0x02;
//	state = 0;

	asm volatile(
"		sbi	0x1b, 1	  ; PORTA	\n"

"		push	r20				\n"
"		ldi	r20,  0			\n"
"		sts	state, r20			\n"
"		pop	r20				\n"

"		reti					\n"
	);

}

// Timer0 compare
ISR(TIMER0_COMP_vect, ISR_NAKED)
{

	//PORTA &= ~0x02;

	asm volatile(
"		cbi 	0x1b, 1   ; PORTA		\n"
"		reti				          	\n"
	);

}
Сделать хотел грозу, а получил КоЗу
Контактная информация:
Первый раз сказал Мяу!
Сообщения: 38
Зарегистрирован: Пн авг 01, 2011 21:59:21

Сообщение slavik.ksu »

Доброго времени суток!

Объясните пожалуйста такую вещь:

1 случай:
ldi temp , 0b00000011 ; активирую таймер с делением частоты на 64
out TCCR1B,temp
ldi temp,(1<<TOIE1 ) ;активирую прерывание по переполнению!
out TIMSK,temp

обработчик прерывания:
perepolnenie:
in temp, PortB
eor temp,r18
out PortB,temp
reti
В этом случае светодиод моргает с частотой 1 раз в скунду

2 случай:
ldi temp , 0b00001101 ; запуск таймера T\C1 с делением !!! на 1024 !!!
out TCCR1B,temp ; режим(CTC) сброс при совпадении

ldi temp, 0xFF ;здесь записываю максимальное число
out OCR1AL,temp ;по сути получается "прерывание по переполнению"
ldi temp, 0xFF ;
out OCR1AH,temp ;

ldi temp,( 1<<OCIE1A) ; разрешение прерывание по сравнению
out TIMSK,temp

НО!!! в этом случае, не смотря на то что деление частоты большее,
т.е. таймер должен работать медленней,а моргание происходит чаще!
Как такое может быть?


Работаю на отладочной плате STK500, на Atmega8515
полный код прилагаю.
Вложения
прерывание.rar
(2.1 КБ) 144 скачивания
Опытный кот
Аватара пользователя
Сообщения: 785
Зарегистрирован: Сб фев 27, 2010 21:45:37
Откуда: Ростов-на-Дону

Сообщение Coolish »

У вас в OCR1A вместо 0xFFFF записывается чёрт знает что, скорее всего 0x00FF. Отсюда прерывания чаще в 256 раз, а предделитель больше всего в 16 раз. Итого, мигание происходит чаще в 16 раз.

Доступ к 16-разрядным регистрам

Регистры TCNTn, OCRnA/B/C и ICRn являются 16-разрядными, поэтому, доступ к ним через 8-разр. шину данных AVR ЦПУ может быть осуществлен с помощью двух инструкций чтения или записи.
.....
Таким образом, чтобы записать данные в 16-разр. регистр, необходимо сначала записать старший байт, а затем младший. А при чтении 16-разр. регистра, наоборот, сначала считывается младший байт, а затем старший.

Прочитайте про временный регистр подробнее, это важно
Сделать хотел грозу, а получил КоЗу
Контактная информация:
Первый раз сказал Мяу!
Сообщения: 38
Зарегистрирован: Пн авг 01, 2011 21:59:21

Сообщение slavik.ksu »

АГА правда,оказывается в этом была ошибка! СПАСИБО большое!
Родился
Сообщения: 3
Зарегистрирован: Пн фев 20, 2012 19:08:42

Сообщение killeo »

atiny2313

на PB0 кнопка1, вторая нога на земле.
на PB1 кнопка2, вторая нога на земле.
на PD0 св.диод1, вторая нога на +.
на PD1 св.диод2, вторая нога на +.

логика - нажал-отпусил кн.1 - горит св.диод1, нажал-отпусил кн.2 - горит св.диод2

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

/* */ 
.cseg
.org 0

;стек
ldi r16,low(RAMEND)
out spl,r16
ldi r16,high(RAMEND)

;порт D на выход
ldi r16,0b0000011
out DDRD,r16

;порт B на вход
ldi r16,0
out DDRB,r16

; ждём нажатия кнопки 1 или 2 (в симуляторе ставлю бит в PINB)
one:
     in r16,PINB
     cpi r16,0b0000001
     breq two

     in r16,PINB
     cpi r16,0b0000010
     breq two
rjmp one

two:
     out portd,r16
     rcall del5;del
rjmp one

;====
del5: wdr
		ldi	YL,low(5)
		ldi YH,high(5)
	d5_1: sbiw YL,1
	brne d5_1
	ret
на симуляторе в AVRStudio5 работает. На МК нет.
что я сделал не так, подскажите пожалуйста.
Последний раз редактировалось killeo Пн фев 20, 2012 21:22:26, всего редактировалось 2 раза.
Друг Кота
Аватара пользователя
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск

Сообщение pyzhman »

Для начала свое описание вот с этим сравните:

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

;порт D на выход
ldi r16,0b0000011
out DDRD,r16

;порт B на вход
ldi r16,0
out DDRB,r16
А это для чего?:

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

ldi r16,high(RAMEND)
Docendo discimus
Контактная информация:
Родился
Сообщения: 3
Зарегистрирован: Пн фев 20, 2012 19:08:42

Сообщение killeo »

ммда вроде не пил, перепаиваю. пост вверху поправил.

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

ldi r16,high(RAMEND)
забыл стереть
Последний раз редактировалось killeo Пн фев 20, 2012 23:33:42, всего редактировалось 1 раз.
Родился
Сообщения: 3
Зарегистрирован: Пн фев 20, 2012 19:08:42

Сообщение killeo »

добавил подтягиающие в порт В

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

.cseg
.org 0
; инициализация стека
ldi r16,low(RAMEND)
out spl,r16

ldi r16,0b11111111
out ddrd,r16
out PORTB,r16 ;подтяжка к порту B

ldi r16,0
out DDRB,r16

one:in r16,PINB
    cpi r16,0b11111110
    breq two
    in r16,PINB
    cpi r16,0b11111101
    breq two
rjmp one
two:out portd,r16
    rcall del5;del
rjmp one
;====
del5:wdr
     ldi   YL,low(5)
     ldi YH,high(5)
   d5_1: sbiw YL,1
   brne d5_1
  ret
запустил!
Друг Кота
Аватара пользователя
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск

Сообщение pyzhman »

:beer:
Docendo discimus
Контактная информация:
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич

Сообщение Alexeyslav »

Кстати, вот подумалось что для начинающих было бы лучше начинать осваивать программирование с метода черного ящика. Вот недавно наткнулся на статью http://ru.wikipedia.org/wiki/%D0%A7%D0% ... 0%B8%D0%BA и понял что же я оказывается постоянно использую при написании каких бы то нибыло программ и в разработке устройств.

самое главное там:
Все иные свойства полностью исключаются из рассмотрения, и о самом их существовании требуется забыть (наиболее трудный момент).
И правда, это самый трудный момент.
Контактная информация:
Ответить

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