Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.04.2016, 22:40   #1
AlisterBlack
Новичок
Джуниор
 
Регистрация: 10.04.2016
Сообщений: 2
По умолчанию Вывод старших разрядов с АЦП

Составьте новый проект, вывод старших разрядов с ацп на светодиоды с подбором коэффициента преобразования

Вот на чем базироваться
Код:
/*********************************************************/
/*          УПРАВЛЕНИЕ ШАГОВЫМ ДВИГАТЕЛЕМ - симул. АЦП               */
/*********************************************************/

/*Директивы для транслятора*/
.include "m16def.inc"		//подключение внешних библиотек

.cseg				//размещение в памяти программ
.org 0x0000			//указывает, что следующая команда будет находиться по адресу 0x0000
	rjmp _rst		//команда, находящаяся по 0000 адресу, осуществляет безусловный переход к метке _rst
.org 0x0030 			// код программы размещать с адреса 0030
.org OC1Aaddr			//безусловный переход при вых. сравн. = OC1Aaddr
	rjmp  _timer1oc1a	// имя подпрограммы обр-ки прер-я

_rst:

.macro outi			//определение макроса для исключения из текста
	ldi R16,@1		//программы промежуточного РОН r16
	out @0,R16
.endmacro 

	outi SPL,low(RAMEND)		//инициализация стека, 
	outi SPH,High(RAMEND)		//определение его границ согласно m16def.inc 
	rjmp _start			//переход в начало программы

/*Обработчик прерывания по таймеру*/
_timer1oc1a:
	//cli				//временный запрет всех прерываний – не нужно, т.к. вып-ся аппаратно
	in r16,TCCR1B		//| останов Т/С1 (очистка бита предделителя): 
	cbr r16,1<<CS10		//| «1<<» - указатель бита. CS10 - только для симуляции,
	out TCCR1B,r16		//| для заливки ставить (1<<CS11)|(1<<CS10)	
	in r18, PORTA		//запись данных из PORTA в регистр R18
	andI r18, 0b00011110	//выделение выходных разрядов PORTA
	cp r18,r17			//|сравнение порта c границей и переход на _m0, если равны
	breq _m0			//|
	lsl r18				//сдвиг на 1 бит влево в регистре R18
	ori r18, 0b10100001	//свободные биты порта А работают как входы с подтяг
	out PORTA,r18			//запись в PORTA значений регистра R18
	rjmp _end0			//переход к окончанию процедуры обработки прерывания

_m0:	outi PORTA,0b10100011	//запись в PORTA правой границы и реж."входы с подтяг"
	clz				//сброс служебного флага Z
	
_end0:
      in r16, TCCR1B			//| запуск Т/С1: 
	sbr r16, 1<<CS10		//| на макс. частоте счета (01) - только для симуляции,
	out TCCR1B,r16 			//| для заливки ставить (1<<CS11)|(1<<CS10)	
	//sei				//разрешение всех прерываний
	reti				//выход из процедуры обработки прерывания

/*Основная программа*/
_start:			 
	outi DDRA,0b00011110	//биты 1-4 порта А работают как выходы
	outi PortA,0b10100011	//свободные биты порта А работают как входы с подтяг.
	ldi r17,0b00010000	// уст-ка границы сдвига по фазам ШД. 
				//|загрузка в 16-ти битный регистр сравнения OC1A Т/С1
	outi OCR1AH,high(60000)	//|значения вых. сравнения, задающего период 
	outi OCR1AL,low(60000)	//|повторения прерываний по сравнению (06 - только для симуляции)
				
	outi TCCR1B,0		//| очистка регистров упр-я/сост-я Т/С1 
	outi TCCR1A,0		//|
	in r16, TCCR1B		//|
	sbr r16, 1<<WGM12	//|установка «сброс после сравнения»		
	out TCCR1B,r16 		//| (установка бита в РВВ)
	outi TIMSK,1<<OCIE1A	//|разрешаем прерывание по равенству счетного р-ра и ОС1А 
       				//|(установка маски прерываний)
	sei
	in r16, TCCR1B		//| запуск Т/С1: 
	sbr r16,(1<<CS11)|(1<<CS10)		//| на макс. частоте счета 01 - только для симуляции,
	out TCCR1B,r16 		//| для заливки ставить (1<<CS11)|(1<<CS10)	
	;outi PORTA, 0x04		//запись в порт А константы 0x04
	
					//настройка АЦП и работа с ним
	outi ADMUX,0x26		//|коммутатор - на канал 6 и
					//|выравнивание результата – влево (ADLAR)
	outi ADCSRA,0b10000110	//иниц-я регистра упр-я/сост-я и разрешение (режим одиноч)
					//делитель такт. частоты АЦП - 64 с ускор-ем
	ldi r24,0x80		//установка масштаба "АЦП - OC1A" (0x80 соотв. 0,5)
_adm:	
    	in r16, ADCSRA		//|
	sbr r16, $40		//|запуск ADC
	out ADCSRA,r16 		//| 
_nrdy:
	in r16,ADCSRA		//чтение  регистра упр-я/сост-я
	sbrs r16,ADIF		//test the ready flag
	rjmp _nrdy		//jump if ready flag not set
     	in r16, ADCSRA		//|
	sbr r16, 1<<ADIF	//|сброс флага готовности (запроса прерывания)
	out ADCSRA,r16 		//| 
	in r25,ADCH		//чтение результата в РОН					
	;ldi r25,0b00000000	//ТОЛЬКО ДЛЯ ПРОВЕРКИ ПРОГРАММЫ
	ldi r23,0xFF		// "переворачивание" показания АЦП:ADEN 7 6
	sub r23,r25		// "чем больше рез-т, тем меньше OC1A"
	mul r24,r23		//масштабирование задания OCR1A
	nop
	out OCR1AH,r1		//|обновление величины OCR1A
	out OCR1AL,r0
	rjmp _adm

_w0:	rjmp _w0			//ожидание переполнения Т/С1 – заменён циклом АЦП
AlisterBlack вне форума Ответить с цитированием
Старый 10.04.2016, 23:39   #2
С.М.С
Участник клуба
 
Аватар для С.М.С
 
Регистрация: 29.12.2008
Сообщений: 1,598
По умолчанию

А зачем там таймер?
С.М.С вне форума Ответить с цитированием
Старый 11.04.2016, 10:17   #3
AlisterBlack
Новичок
Джуниор
 
Регистрация: 10.04.2016
Сообщений: 2
По умолчанию

Цитата:
Сообщение от С.М.С Посмотреть сообщение
А зачем там таймер?
его можно убрать,предполагаю
AlisterBlack вне форума Ответить с цитированием
Старый 11.04.2016, 12:07   #4
С.М.С
Участник клуба
 
Аватар для С.М.С
 
Регистрация: 29.12.2008
Сообщений: 1,598
По умолчанию

так не интересно, интересно когда вы начнёте писать и спрашивать, что не понятно, а не кинули кусок левого кода, так что извеняйте
С.М.С вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Новый стандарт для старших классов в России - Ваше мнение Blondy Свободное общение 47 15.06.2012 15:14
Параллельный АЦП на С Анастасий Общие вопросы C/C++ 4 05.01.2012 15:54
Мантисса 6 разрядов mastar Помощь студентам 2 26.03.2011 18:10
Распределение памяти перемещаемыми разделами с перемещением в сторону старших адресов со сжатием Лисичкина Помощь студентам 4 08.12.2009 21:12
АЦП на ATmega48 hobin Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 04.02.2009 04:21