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

Обсуждаем контроллеры компании Atmel.
Ответить
xkp
Опытный кот
Аватара пользователя
Сообщения: 781
Зарегистрирован: Ср ноя 18, 2009 12:50:31
Откуда: ковров

Сообщение xkp »

Ребят, подскажите, я правильно делаю?
На МК atmega8 при тактировании от внутреннего RC на 8мГц, необходимо сделать вншнее прерывание (Т2) от кварца 32768, оставив сам МК тактироваться от внутреннего RC. кварц подключен к выводам XTAL1 XTAL2 (PB6 PB7). Прерывание Т2 должно приходить раз в секунду. кусок инициализации

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

	ldi tmp,0b00000100		;0b00000100	;0.125мкс*256=32мкс
	out tccr0,tmp
	ldi tmp,(1<<toie0)|(1<<ocie2)
	out timsk,tmp		;Enable Timer/Counter0, timer2
	ldi tmp,(1<<wgm21)|(1<<CS22)|(1<<CS21)|(1<<CS20) ;/1024
	out TCCR2,tmp
	ldi tmp,32
	out ocr2,tmp
	sei
1. Какое при этом должно срабатывать прерывание? TIM2_COMP или TIM2_OVF ?
2. Правильно ли я все написал в программе?
R5VCH
Хотелки:
СпойлерАналоговый осциллограф С1-112, С1-118, другие
не/рабочие модули от комплекса ОДА-102
всё что касается AVR, arduino, raspberry
всё что касается КВ-УКВ-радиосвязи, mashtastic
Контактная информация:
Реклама
Друг Кота
Аватара пользователя
Сообщения: 15788
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Внимательно прочитай ерраты в даташите!
:beer:
Реклама
xkp
Опытный кот
Аватара пользователя
Сообщения: 781
Зарегистрирован: Ср ноя 18, 2009 12:50:31
Откуда: ковров

Сообщение xkp »

дело в том что с английским дружу по стольку по скольку... вот и прошу помощи у вас.
R5VCH
Хотелки:
СпойлерАналоговый осциллограф С1-112, С1-118, другие
не/рабочие модули от комплекса ОДА-102
всё что касается AVR, arduino, raspberry
всё что касается КВ-УКВ-радиосвязи, mashtastic
Контактная информация:
xkp
Опытный кот
Аватара пользователя
Сообщения: 781
Зарегистрирован: Ср ноя 18, 2009 12:50:31
Откуда: ковров

Сообщение xkp »

разобрался!

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

	ldi tmp,0b00000100		;0b00000100	;0.125мкс*256=32мкс
	out tccr0,tmp

	ldi tmp,(1<<toie0)|(1<<ocie2)
	out timsk,tmp		;Enable Timer/Counter0, timer2
	ldi tmp,(1<<wgm21)|(1<<CS22)|(1<<CS21)|(0<<CS20) ;110/256
	out TCCR2,tmp
	ldi tmp,128;128*256=32768
	out ocr2,tmp
	ldi tmp,(1<<as2)
	out assr,tmp
R5VCH
Хотелки:
СпойлерАналоговый осциллограф С1-112, С1-118, другие
не/рабочие модули от комплекса ОДА-102
всё что касается AVR, arduino, raspberry
всё что касается КВ-УКВ-радиосвязи, mashtastic
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
xkp
Опытный кот
Аватара пользователя
Сообщения: 781
Зарегистрирован: Ср ноя 18, 2009 12:50:31
Откуда: ковров

Сообщение xkp »

Мяу вам.
помогите разобраться с необходимостью плавности индикации значения ацп. То есть надо что бы при значительном изменении уровня ацп число на индикаторе не скакало, а как бы нарастало или убывало постепенно.
примерно подсчет следующий:
((старое значение АЦП) * 9 + (новое значение АЦП)) / 10
но тут остается остаток, который дает погрешность в 9 единиц при нарастании сигнала АЦП. то есть ели значение АЦП прыгнуло со 100 до 150, то на индикаторе оно меняется до 141. А если наоборот значение АЦП упало со 150 до 100, то на индикаторе все правильно отображается. Вот и вопрос: Что делать с остатком после деления?
Спойлерlds r18,ADC1 ;берем старое значение
ldi r21,0
ldi r20,9 ;множитель 9
rcall mul_2_1 ;R18 * R21,R20 = R26,R25,R24
rcall ADC_opros ;берем новое значение в tmp
ldi tmp0,0
clc
add r24,tmp
adc r25,tmp0
ldi r20,10 ;делитель 10
rcall div_3_1 ;R26,R25,R24 / R20 = R26,R25,R24...R21-остаток
;что делать с остатком R21?
sts ADC1,r24 ;сохраняем значение
R5VCH
Хотелки:
СпойлерАналоговый осциллограф С1-112, С1-118, другие
не/рабочие модули от комплекса ОДА-102
всё что касается AVR, arduino, raspberry
всё что касается КВ-УКВ-радиосвязи, mashtastic
Контактная информация:
Реклама
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

Это можно сделать усреднением. Считаете среднее арифметическое по большому количеству отсчётов, например по 16384 или 65536. Затем делите результат на это число (в последнем случае просто откидываете два младших байта)
Делений/умножений не надо, просто сдвиги и сложения. Быстро и эффективно.
Реклама
xkp
Опытный кот
Аватара пользователя
Сообщения: 781
Зарегистрирован: Ср ноя 18, 2009 12:50:31
Откуда: ковров

Сообщение xkp »

то есть надо:
начало:
X = Y ;копируем X в Y
цикл:
Y - 1
считываем АЦП
(старое) + (новое) ;значения АЦП, результат в "старое"
если Y > 0 то на "цикл"
если Y = 0 то:
(значение) / X ;результат в "значение"
сохраняем значение.
где X-количество считываний
R5VCH
Хотелки:
СпойлерАналоговый осциллограф С1-112, С1-118, другие
не/рабочие модули от комплекса ОДА-102
всё что касается AVR, arduino, raspberry
всё что касается КВ-УКВ-радиосвязи, mashtastic
Контактная информация:
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

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

Сообщение pyzhman »

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

Сообщение ploop »

Ну это смотря как усреднять. По 16 отсчётам - одно, а по 1024 уже никакой МК не справится. Тут другой алгоритм нужен.
xkp
Опытный кот
Аватара пользователя
Сообщения: 781
Зарегистрирован: Ср ноя 18, 2009 12:50:31
Откуда: ковров

Сообщение xkp »

ploop писал(а):Есть и другие, ищите.
Вот и ищу у вас :)) ну или помощь ищу с моим алгоритмом.
R5VCH
Хотелки:
СпойлерАналоговый осциллограф С1-112, С1-118, другие
не/рабочие модули от комплекса ОДА-102
всё что касается AVR, arduino, raspberry
всё что касается КВ-УКВ-радиосвязи, mashtastic
Контактная информация:
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

Пожалуйста: http://we.easyelectronics.ru/Theory/che ... filtr.html
Готовый код в конце, 2 строчки на Си.
Родился
Аватара пользователя
Сообщения: 8
Зарегистрирован: Пн мар 24, 2014 19:35:59
Откуда: Курган

Сообщение alexsaska »

Всем привет! Добрался до 7 сегментников...

Набираю код как в статье тык и в протеусе выходит одна и та же ошибка. При копировании кода то же самое.

И если есть у кого по проще реализация динамической индикации то поделитесь пожалуйста)))
Вложения
ошибка.JPG
(119.16 КБ) 531 скачивание
Вымогатель припоя
Аватара пользователя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

Сообщение zero648 »

В коде после sei нужно вставить примерно следующее:
...
out TIMSK,temp
sei

main:
...
rjmp main

.
service_T1COMPA: ;обработчик прерывания по совпадению OCR1A
in temp,SREG ;при входе сохраняем в стеке
push temp ;регистры temp, SREG
clr temp
...

В блоке main уже можно менять значения выводимые на индикатор.
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1368
Зарегистрирован: Вс мар 28, 2010 12:52:22
Откуда: Беларусь

Сообщение dr.doc »

Кстати, цифровой фильтр, приведенный на easyelectronics - хорошая вещь. Писал для однополупериодного выпрямителя, так можно добиться отсутствия дергания МЗР, причем без труда.
«Еще я хотел бы, чтобы наши ученые изобрели какой-то новый источник энергии, чтобы мы на коленях не ползали даже перед нашими братьями, умоляя их и выпрашивая тонну нефти или кубометр газа», — рассказал белорусский президент.
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

Да, я тоже с ним экспериментировал (правда на ассемблер не перекладывал). Прост и эффективен.
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич

Сообщение Alexeyslav »

Реализовал на ассемблере, только до этого ничерта не знал про эти фильтры, и прочитав эту тему понял что изобрел. Бывает же...
Контактная информация:
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1368
Зарегистрирован: Вс мар 28, 2010 12:52:22
Откуда: Беларусь

Сообщение dr.doc »

А Вы попробуйте порядок повыше - отработка выхода заметно выше, а пульсации практически около 0.
«Еще я хотел бы, чтобы наши ученые изобрели какой-то новый источник энергии, чтобы мы на коленях не ползали даже перед нашими братьями, умоляя их и выпрашивая тонну нефти или кубометр газа», — рассказал белорусский президент.
Родился
Аватара пользователя
Сообщения: 8
Зарегистрирован: Пн мар 24, 2014 19:35:59
Откуда: Курган

Сообщение alexsaska »

Подскажите как сделать счетчик. Только код не кидайте. А скажите куда копать.

По нажатию на кнопку увеличивает число и выводит на семисегментник
Спойлер

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

.include "m8def.inc"

.DSEG	
			.def temp1=r16
			.def temp2=r17
			digit: .byte 2 

.CSEG
			ldi r16,high(RAMEND)
			out SPH,r16
			ldi r16,low(RAMEND)
			out SPL,r16
				
reset:		
			sts digit+1,r16 
			ldi r16,0xff    
			out DDRD,r16
			out DDRB,r16
			ldi r16,(0<<DDC0)
			out DDRC,r16
			ldi r16,(1<<PC0)
			out PORTC,r16
			ldi r18,1  //число для вывода на 7 сегм
main:		in r16,PINC
			sbrc r16,0
			rjmp main
			rjmp decr
decr:	  	mov r16,r18
			inc r16  // увеличиваем его на 1
			mov r18,r16
			call display
			rjmp main
decoder:	ldi ZL,low(M*2)
			ldi ZH,high(M*2)
			add ZL,temp1
			ldi temp2,0
			adc ZH,temp2
			lpm temp1,Z
			ret
M:
			; hgfedcba   hgfedcba
			.db 0b00111111,0b00000110	;0,1
			.db 0b01011011,0b01001111	;2,3
			.db 0b01100110,0b01101101	;4,5
			.db 0b01111101,0b00000111	;6,7
			.db 0b01111111,0b01101111	;8,9
Delay:
			ldi 	temp1,0
			ldi 	temp2,4
Dll: 
			dec 	temp1
			brne	Dll
			dec 	temp2
			brne 	Dll
			ret
display:	ldi 	temp1,0b00111101
			out 	PortB,temp1			  
			lds 	temp1,digit
		    call 	decoder        
			out 	PortD,temp1     
		    call 	Delay 
			ret
			
						
Последний раз редактировалось Gudd-Head Вт мар 25, 2014 15:29:36, всего редактировалось 1 раз.
Причина: Нарушение п.2.5 Правил Форума
Друг Кота
Аватара пользователя
Сообщения: 20117
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

alexsaska писал(а):Подскажите как сделать счетчик.
Вот так и делать:
По нажатию на кнопку увеличивает число и выводит на семисегментник
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Ответить

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