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

Обсуждаем контроллеры компании Atmel.
scv
Открыл глаза
Сообщения: 44
Зарегистрирован: Чт ноя 04, 2010 20:47:50

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

Сообщение scv »

Подскажите пожалуйста литературу, где подробно описана работа с жки на ассемблере для avr. Почти везде встречается язык си. Из того,что нашел, "научился" выводить информацию с помощью масок. Задача предстоит выводить изменяющееся напряжение на элемене например каждую секунду. Настройка ацп, прерывание таймера по компоратору вроде ясно, а вот как вывести неизвестные заранее цифры на индикатор не понятно.
Реклама
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

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

Сообщение pyzhman »

Эта литература - даташит индикатора. В нем описаны и команды, и данные для вывода. Протокол опять же.
Docendo discimus
Реклама
scv
Открыл глаза
Сообщения: 44
Зарегистрирован: Чт ноя 04, 2010 20:47:50

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

Сообщение scv »

Все равно не понял. Например на вход АЦП контроллера поступило напряжение 3 В, он преобразовал его в цифровой сигнал 00000011. Теперь мне надо это значение вывести на ЖКИ, но цифре "3" соответствует кодировка 00110011 HD44780.
BVS
Потрогал лапой паяльник
Сообщения: 336
Зарегистрирован: Пн май 23, 2011 18:27:41

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

Сообщение BVS »

так прибавь 0x30

subi Rx,-0x30 исправил
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

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

Сообщение pyzhman »

Измеряемое напряжение находится в пределах от 0в до Хвольт. Вернее Х вольт - заданное Vref. На выходе АЦП будет от 0 до 1024. Убираем младшие два бита, т.к. они шумливые. Остается от 0 до 255. Делим 255 на Х и получаем количество отсчетов на один вольт. Это будет коэффициент пересчета, заранее подготовленное значение. А вот в программе уже этим коэффициентом переводите данные АЦП в число вольт, далее это число переводите в строку, которую и выпуливаете в ЖКИ.
Пример:
Vref задано 5вольт. 255/5= 51 значение на вольт. В процессе измерения получено с АЦП число 147. 147/51= 2.88. (Тут надо заметить, что алгоритмы деления могут быть разные. Опять же насколько точно нам надо.) Это число 2.88 переводим в строку - 0х32, 0х38, 0х38. И вот уже эти данные выпуливаем. Не забываем про точку.
Docendo discimus
Реклама
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

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

pyzh_man писал(а):Убираем младшие два бита, т.к. они шумливые.
:shock: Это у вас со схемой что-то не то. У меня АЦП восьмёрки чётко держала результат до последнего бита!
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Реклама
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

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

Сообщение pyzhman »

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

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

Сообщение GP1 »

+1
10 разрядный код АЦП как правило избыточен для большинства конструкций, а с 8битами на асме работать гораздо комфортнее.
Чем дальше, тем больше становлюсь занудой...
Изображение
Аватара пользователя
igor-x
Мудрый кот
Сообщения: 1817
Зарегистрирован: Пн ноя 29, 2010 15:58:43

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

Сообщение igor-x »

Добрый день

подскажите пож. есть такая команда ASM которая может за один раз выводить байт в разные порты?.
то есть переменную записать: часть битов в порт С, другую часть в порт D (atmega168),.

--
спасибо
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

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

Сообщение GP1 »

Чем дальше, тем больше становлюсь занудой...
Изображение
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

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

Сообщение pyzhman »

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

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

Сообщение ploop »

Да и не надо :)
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

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

Как бы мне 8-ми битное число со знаком прибавлять к младшему байту 16-ти битного числа со знаком?
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
akl
Друг Кота
Сообщения: 4445
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

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

Сообщение akl »

Как вариант

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

	.def	HIGH8	=R20
	.def	LOW8	=R21
	.def	HIGH16	=R10
	.def	LOW16	=R11

;*******************************************************
	CLR	HIGH8
	SBRC	LOW8,7
	SER	HIGH8
	ADD	LOW16,LOW8
	ADC	HIGH16,HIGH8
Добавил
Этот код имеет порок, т.к. действителен не для всей области определения 16-разрядного числа. Например 32760+100 получится лажа.
Так лучше

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

	.def	HIGH8	=R20
	.def	LOW8	=R21
	.def	HIGH24	=R9
	.def	HIGH16	=R10
	.def	LOW16	=R11

;*******************************************************
	CLR	R16		; расширим 16-разрядное число до 24 разрядов
	SBRC	HIGH16,7	;
	SER	R16		; со знаком
	MOV	HIGH24,R16
	
	CLR	HIGH8
	SBRC	LOW8,7
	SER	HIGH8
	ADD	LOW16,LOW8
	ADC	HIGH16,HIGH8
	ADC	HIGH24,HIGH8	; можно быть уверенным, что сделано правильно
Последний раз редактировалось akl Вт окт 11, 2011 13:30:40, всего редактировалось 2 раза.
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

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

akl писал(а):Как вариант

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

.def HIGH8=R20 .def LOW8=R21 	.def HIGH16=R10 	.def LOW16=R11
;*******************************************************
	CLR	HIGH8
	SBRC	LOW8,7
	COM	HIGH8
	ADD	LOW16,LOW8
	ADC	HIGH16,HIGH8
Спасибо! Меня больше устраивает этот код, т.к. он быстрее и компактнее. А защиту от переполнения я организую программно в другом месте.
Кстати, я чуток усовершенствовал ваш код: вместо "SER HIGH8" — "COM HIGH8", и теперь в качестве HIGH8 можно использовать младший регистр! Что скажете?
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
akl
Друг Кота
Сообщения: 4445
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

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

Сообщение akl »

Gudd-Head писал(а): ...вместо "SER HIGH8" — "COM HIGH8", и теперь в качестве HIGH8 можно использовать младший регистр!
Да, так лучше.
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

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

Сообщение vitalik_1984 »

возник тут на днях вопрос по практическому применению микроконтроллера тини13а
накидал на си код:

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

#include <avr/io.h>
//#include <stdint.h>
#include <avr/interrupt.h>
//#include <avr/eeprom.h>

#define IN_K 11060
#define OUT_K 5060
#define SIGN_OUT 2

float IMP = 0;
float const addition =OUT_K/IN_K;

//Прерывание 0
ISR(INT0_vect){
	IMP += addition;
}

int main(void){
	asm("sei"); 
	//sei();
    while(1){
		if (IMP >=1 ){
			IMP--;
			PORTB ^= _BV(SIGN_OUT);
		}//if
    }//while (1)
}//main

теперь бы это всё перекинуть на ассемблер.

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

в даташите написано
Table 9-2. Interrupt 0 Sense Control
ISC01 ISC00 Description
0 0 The low level of INT0 generates an interrupt request.[/list]
0 1 Any logical change on INT0 generates an interrupt request.
1 0 The falling edge of INT0 generates an interrupt request.
1 1 The rising edge of INT0 generates an interrupt request.[/list]

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

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

.include "D:\Program Files\Atmel\AVR Studio 5.0\avrassembler\include\tn13Adef.inc"

.def		Temp=R16
.def		Temp1=R17
.def		Temp2=R18
.def		Temp3=R19
.def		Temp4=R20
.macro		outi //  Макрос отправка константы в регистр в/в
			ldi		r16, @1
			out		@0, r16
.endmacro
.macro		sbit //  Макрос установка битов в регистре в/в
			in		r16,@0
			sbr		r16, @1
			out		@0, r16
.endmacro
.macro		cbit //  Макрос очистка битов в регистре в/в
			in		r16, @0
			cbr		r16, @1
			out		@0, r16
.endmacro
.cseg
.org 0
			rjmp RESET		;External Pin, Power-on Reset,rown-out Reset, Watchdog Reset
			rjmp INT_0		;External Interrupt Request 0
			rjmp PCINT_0	;Pin Change Interrupt Request 0
			rjmp TIM0_OVF	;Timer/Counter Overflow
			rjmp EE_RDY		;EEPROM Ready
			rjmp ANA_COMP	;Analog Comparator
			rjmp TIM0_COMPA	;Timer/Counter Compare Match A
			rjmp TIM0_COMPB	;Timer/Counter Compare Match B
			rjmp WDT			;Watchdog Time-out
			rjmp ADC_Complete ;ADC Conversion Complete

;RESET:
;INT_0:
;PCINT_0:
TIM0_OVF:
EE_RDY:
ANA_COMP:
TIM0_COMPA:
TIM0_COMPB:
WDT:
ADC_Complete:
reti


reset:		outi SPL,low(RAMEND) ; инициализация стека
			cbit MCUCR,(1<<PUD)|(1<<ISC01)|(1<<ISC00)	;подтяжка портов включена
			sbit MCUCR,(1<<SE)	;Активация режима сна
			outi GIMSK,0x40
			outi DDRB,0b00000010; Пин 1 выход остальные вход
			outi PORTB,0x01;подтяжка Пин 0

			outi PCMSK,0x01
			in temp1,0x20
			sei

main:		rjmp main

INT_0:		reti

PCINT_0:	in temp1,PINB
			lsl temp1
			out portb,temp1
exit_int:	reti

.eseg
IN_K:		.dw in_K
OUT_K:		.dw out_K
вопрос в том как организовать правильно прерывание ИНТ0 от любого изменения ноги инт0.
Последний раз редактировалось vitalik_1984 Пн ноя 07, 2011 21:52:50, всего редактировалось 1 раз.
В поисках истины человек развивается.
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

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

Сообщение GP1 »

vitalik_1984 писал(а): в даташите написано
Table 9-2. Interrupt 0 Sense Control
ISC01 ISC00 Description
0 0 The low level of INT0 generates an interrupt request.[/list]
0 1 Any logical change on INT0 generates an interrupt request.
1 0 The falling edge of INT0 generates an interrupt request.
1 1 The rising edge of INT0 generates an interrupt request.[/list]

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

			cbit MCUCR,(1<<PUD)|(1<<ISC01)|(1<<ISC00)	;подтяжка портов включена
а теперь сравни :wink:
Чем дальше, тем больше становлюсь занудой...
Изображение
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

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

Сообщение vitalik_1984 »

GP1 писал(а):
vitalik_1984 писал(а): в даташите написано
Table 9-2. Interrupt 0 Sense Control
ISC01 ISC00 Description
0 0 The low level of INT0 generates an interrupt request.[/list]
0 1 Any logical change on INT0 generates an interrupt request.
1 0 The falling edge of INT0 generates an interrupt request.
1 1 The rising edge of INT0 generates an interrupt request.[/list]

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

			cbit MCUCR,(1<<PUD)|(1<<ISC01)|(1<<ISC00)	;подтяжка портов включена
а теперь сравни :wink:
да это я уже в процессе запуска по разному пробовал.
работает только этот вариант, но он в мою конструкцию никак не подходит.

а в студии второй пункт вообще(0 1 Any logical change on INT0) подписан как Резерв! :shock: :kill:
кому верить?
я понимаю, что пожно по другому прерыванию активировать, но у него приоритет ниже чем у ИНТ0 и через ИНТ0 прерывание можно из сна пробуждать насколько я понял.
В поисках истины человек развивается.
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

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

Сообщение GP1 »

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

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