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

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

Вернуться   Форум программистов > Программная инженерия > Компьютерное железо
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 24.03.2012, 20:48   #11
С.М.С
Участник клуба
 
Аватар для С.М.С
 
Регистрация: 29.12.2008
Сообщений: 1,598
По умолчанию

И программа:
Код:
;Программа контроллера, управления вентилятором охлаждения ноутбука
;======================

;Ориентировачная тактовая частота МК 1 МГц. 

.device ATmega8
.include "C:\Program Files\Atmel\AVR Tools\AvrAssembler2\Appnotes\m8def.inc"

;=============== Прерывания =============
	.org 0		
	rjmp RESET ; Reset Handler
	.org OVF2addr ;
	rjmp OVF2
	.org OVF0addr ;
	rjmp OVF0
	.org ADCCaddr ;
	rjmp ADC_INT


.def Flag = r16		;0-флаг разрешения на включение вентилятора
			;1-флаг работы вентилятора в режиме-1
			
.def temp = r17			;
.def Skvazhnost = r18
.def ADC_value = r19

.def Razr0 = r20
.def Razr1 = r21
.def Razr2 = r22

;Подпрограмма сброса контроллера:
;================================
RESET:
 nop
 nop
 nop
 nop
 nop
 nop
 nop
 nop
 nop
 nop
 nop
 nop

	ldi temp,low(RAMEND)				;загрузка указателя стека
	out SPL,temp						;
	ldi temp,high(RAMEND)				;загрузка указателя стека
	out SPH,temp						;

	clr temp
	ldi temp,1<<ACD						;
	out ACSR,temp			;выключить аналоговый компаратор


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




;-----------Инициализация и запуск АЦП 1/8-----------------------------------------------------
;ADIE - бит разрешения прерывания АЦП
;ADPS0,ADPS1,ADPS2 - биты устанавливают коэф. деления тактового генератора МК для АЦП
;выбираем коэффициент делителя 1\8, что при 1МГц даст 125кГц на АЦП
	clr temp
	ldi temp,1<<ADEN|1<<ADIE|1<<ADPS0|1<<ADPS1|0<<ADPS2
	out ADCSRA,temp

;-------------------------------------------------
	clr temp
	ldi temp, 1<<TOIE0|1<<TOIE2
	out TIMSK,temp								;Разрешение прерываний таймеров


;Запускаем таймер_2 формирующий скважность ШИМ
	ldi Skvazhnost,0
	mov temp,Skvazhnost
	out TCNT2,temp
	ldi temp,4
	out TCCR2,temp

;Запускаем таймер_0 формирующий частоту ШИМ
	ldi temp,0
	out TCNT0,temp
	ldi temp,4
	out TCCR0,temp



	ldi temp,0b10000000	;останавливаем вентилятор
	OUT PortB,temp



	sbi ADCSRA,ADSC		;запуск преобразования АЦП

	sei



;ОСНОВНОЙ ЦИКЛ ПРОГРАММЫ ()
;=====================================
MAIN:
nop
nop
nop
nop
	sbrc Flag,1
	rcall Delay_bad
rjmp MAIN
С.М.С вне форума Ответить с цитированием
Старый 24.03.2012, 20:51   #12
С.М.С
Участник клуба
 
Аватар для С.М.С
 
Регистрация: 29.12.2008
Сообщений: 1,598
По умолчанию

Код:
;Подпрограмма обработки чтения по прерыванию АЦП
;==============================================================
ADC_INT:
	cli			;запрет всех прерываний

	in ADC_value,ADCL			;читаем АЦП
	in temp,ADCH
	
	cpi ADC_value,220	;сравниваем результат измерения с константой												
	brlo Temparature_step_0

	cpi ADC_value,221	;сравниваем результат измерения с константой												
	brlo Temparature_step_1

	cpi ADC_value,222	;сравниваем результат измерения с константой												
	brlo Temparature_step_2

	cpi ADC_value,223	;сравниваем результат измерения с константой												
	brlo Temparature_step_3

	cpi ADC_value,224	;сравниваем результат измерения с константой												
	brlo Temparature_step_4

	cpi ADC_value,225	;сравниваем результат измерения с константой												
	brlo Temparature_step_5

	cpi ADC_value,226	;сравниваем результат измерения с константой												
	brlo Temparature_step_6

	cpi ADC_value,226	;сравниваем результат измерения с константой
	brsh Temparature_step_7


Temparature_step_0:
	cbr Flag,0b00000001		;сбрасываем флаг работы вентилятора
	cbr Flag,0b00000010	;сбрасываем флаг работы в режиме-1
	ldi Skvazhnost,0
	sei			;разрешение всех прерываний
ret

Temparature_step_1:
	sbr Flag,0b00000001		;устанавливаем флаг работы вентилятора
	sbr Flag,0b00000010		;устанавливаем флаг работы в режиме-1
	ldi Skvazhnost,40

	ldi Razr0,255			;загружаем число обеспечивающее
	ldi Razr1,255			;работу вентилятора на _ сек.
	ldi Razr2,70	

	sei		;разрешение всех прерываний
ret

Temparature_step_2:
	sbr Flag,0b00000001		;устанавливаем флаг работы вентилятора
	cbr Flag,0b00000010		;сбрасываем флаг работы в режиме-1
	ldi Skvazhnost,83
	sei			;разрешение всех прерываний
ret

Temparature_step_3:
	sbr Flag,0b00000001	;устанавливаем флаг работы вентилятора
	cbr Flag,0b00000010	;сбрасываем флаг работы в режиме-1
	ldi Skvazhnost,126
	sei				;разрешение всех прерываний
ret

Temparature_step_4:
	sbr Flag,0b00000001	;устанавливаем флаг работы вентилятора
	cbr Flag,0b00000010	;сбрасываем флаг работы в режиме-1
	ldi Skvazhnost,169
	sei			;разрешение всех прерываний
ret

Temparature_step_5:
	sbr Flag,0b00000001		;устанавливаем флаг работы вентилятора
	cbr Flag,0b00000010		;сбрасываем флаг работы в режиме-1
	ldi Skvazhnost,212
	sei				;разрешение всех прерываний
ret

Temparature_step_6:
	sbr Flag,0b00000001	;устанавливаем флаг работы вентилятора
	cbr Flag,0b00000010	;сбрасываем флаг работы в режиме-1
	ldi Skvazhnost,255
	sei			;разрешение всех прерываний
ret

Temparature_step_7:
	sbr Flag,0b00000001	;устанавливаем флаг работы вентилятора
	cbr Flag,0b00000010	;сбрасываем флаг работы в режиме-1
	ldi Skvazhnost,255
	sei			;разрешение всех прерываний
ret
;----------------------Конец подпрограммы----------

;Подпрограмма обработки прерывания по переполнению таймера 1 частота ШИМ
;======================
OVF0:
	cli

	clr temp
	out TCCR0,temp
	out TCCR2,temp
	out TCNT0,temp
	out TCNT2,temp
	

	ldi temp,0b10000000		;фронт импульса
	OUT PortB,temp


;Запускаем таймер_2 формирующий скважность ШИМ
	mov temp,Skvazhnost
	out TCNT2,temp
	ldi temp,4
	out TCCR2,temp

;Запускаем таймер_0 формирующий частоту ШИМ
	ldi temp,0
	out TCNT0,temp
	ldi temp,4
	out TCCR0,temp

	sbrs Flag,1		;если флаг установлен АЦП не запускаем
	sbi ADCSRA,ADSC
	sei
ret
;---------------------------Конец подпрограммы---------------------


;Подпрограмма обработки прерывания по переполнению таймера 2 скважность ШИМ
;==================================
OVF2:
	cli

	clr temp
	out TCCR2,temp

	sbrc Flag,0	;если флаг сброшен не включаем вентилятор
	out PortB,temp			;спад импульса


	sei
ret	
;------------------------Конец подпрограммы----------------



Delay_bad:
	
	subi Razr0,1
	sbci Razr1,0
	sbci Razr2,0
	brcc Delay_bad

	cbr Flag,0b00000001	;сбрасываем флаг работы вентилятора
	sbr Flag,0b00000010	;устанавливаем флаг работы в режиме-1

	ldi Razr0,255		;загружаем число обеспечивающее
	ldi Razr1,255		;задержку на 30 сек.
	ldi Razr2,150	
	ldi temp,0b10000000	;фронт импульса
	OUT PortB,temp

Delay_bad_2:
	subi Razr0,1
	sbci Razr1,0
	sbci Razr2,0
	brcc Delay_bad_2


	cbr Flag,0b00000001	;сбрасываем флаг работы вентилятора
	cbr Flag,0b00000010	;сбрасываем флаг работы в режиме-1

ret
С.М.С вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Блокирование спящего режима tryamsik Общие вопросы C/C++ 3 05.12.2011 22:46
блокировка безопасного режима DeDoK Общие вопросы Delphi 12 28.08.2010 10:24
байт режима адресации fermat_c Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 10.04.2008 15:39