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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.08.2011, 23:05   #1
С.М.С
Участник клуба
 
Аватар для С.М.С
 
Регистрация: 29.12.2008
Сообщений: 1,598
По умолчанию Вытяжка для ванной комнаты на AVR tiny2313.

Здравствуйте. Думал, может, следует разместить тему в разделе "Железо", но раз проблема программная то, наверное, сюда.

Делаю, дома в ванную комнату вытяжку. Вот решил, сделать так: нажал кнопку, электромагнитный клапан (на базе автомобильного втягивающего реле стартера, с перемоткой) открывается, запускается вентилятор и вытягивает все запахи на улицу. После проветривания (программируется по времени вентиляции) вентилятор останавливается, клапан закрывается, дабы не выветривать тепло в зимнее время. Есть кнопка программирования времени вентиляции в минутах.
Электромагнитный клапан представляет собой фанерный круг диаметром 120мм, закрывающий под действием пружины круглое отверстие диаметром 100мм, через резиновое уплотнение.

Проблема в нестабильности работы, на данный момент бывают несрабатывания системы, после подачи питания загорается красный светодиод, который должен гореть, только в режиме программирования и при выполнении процедуры обесточивания и не запускается вентилятор. Приходится в таких случаях вытягивать вилку из розетки, для перезагрузки. Раньше было ещё некорректное выполнение процедуры обесточивания, но это решил. Там по ходу кода есть много команд "nop" это уже от злости, наверное, можно обойтись без них.

Состав:
1-МК Atmel tiny2313
1-микросхема ULN2003APG(7 транзисторных сборок по схеме Дарлингтона), для согласования МК и 12В реле.
1-монитор питания MC34064 для защиты ППЗУ
1 - реле переменного тока 220В, на шунтирование контактов кнопки Пуск и дальнейшей подача напряжения на трансформатор, вентилятор и выпрямитель эл. клапана.
3-реле постоянного тока (1 - с нормально замкнутыми контактами, которые размыкаются по команде МК и обесточивают схему, 1 - реле на вентилятор, 1- на эл.клапан).
1-трансформатор 220В\12В, для питания МК, интегральный стабилизатор напряжения 7805 с 12В\5В
И другие пассивные компоненты.

Конечно надо схему для понимания, пока рисую, сканера уже нет.

Ниже код, скажите, что не так из-за чего могут быть сбои?

Последний раз редактировалось С.М.С; 27.08.2011 в 23:21.
С.М.С вне форума Ответить с цитированием
Старый 27.08.2011, 23:06   #2
С.М.С
Участник клуба
 
Аватар для С.М.С
 
Регистрация: 29.12.2008
Сообщений: 1,598
По умолчанию

Код:
;__________Контроллер системы ветниляции ванной комнаты___________
;Задание: Контроллер управляет:1) эл.реле вытягивающего вентилятора
;2) эл.реле электромагнитного клапана. 
;Выполнение программы начинается сразу после подачи питания.
;Контроллер управляется одной кнопкой, которая устанавливает время
;вентиляции в минутах. Красный светодиод подтверждает принятие команды на увеличение
;уставки в минутах, времени вентиляции

;Тактирование от внутреннего генератора
;Кнопка подключена к порту 		PD0
;Светодиод подключен к порту 	PB7
;Реле отключения питания к 		PB6
;Реле вентилятора к 			PB5
;Реле эл.магнитного клапана к 	PB4
;
;
;
;

.include "C:\Program Files\Atmel\AVR Tools\AvrAssembler2\Appnotes\2313def.inc"

;======Прерывания=======
	.org 0								;Начало программы после сброса
	rjmp RESET 							; Reset Handler

	.org OVF1addr 
	rjmp OVF1


;.equ	INT0addr	= 0x0001	; External Interrupt Request 0
;.equ	INT1addr	= 0x0002	; External Interrupt Request 1
;.equ	ICP1addr	= 0x0003	; Timer/Counter1 Capture Event
;.equ	OC1addr	= 0x0004	; Timer/Counter1 Compare Match
;.equ	OVF1addr	= 0x0005	; Timer/Counter1 Overflow
;.equ	OVF0addr	= 0x0006	; Timer/Counter0 Overflow
;.equ	URXCaddr	= 0x0007	; UART, Rx Complete
;.equ	UDREaddr	= 0x0008	; UART Data Register Empty
;.equ	UTXCaddr	= 0x0009	; UART, Tx Complete
;.equ	ACIaddr	= 0x000a	; Analog Comparator



;======рабочие переменные======
.def delay_set = r16 			;заданая задержка времени на вентиляцию в минутах
.def temp = r17 				;служебная переменная
.def worker_variable = r18		;рабочая переменная

.def Razr0 = r19				;переменные процедуры прямой задержки
.def Razr1 = r20				;
.def Razr2 = r21				;




;13======процедура reset ======
RESET:

	clr delay_set
	clr temp
	clr worker_variable
	clr Razr0
	clr Razr1
	clr Razr2


	ldi temp,low(RAMEND) 				; загрузка указателя стека
	out SPL, temp
	ldi temp,1<<ACD
	out ACSR, temp 						; выкл. аналог. компаратор

	ldi temp,0b00000000
	out DDRD,temp
	ldi temp,0b00000001
	out PORTD,temp

	ldi temp,0b11110000
	out DDRB,temp

	ldi temp, (1<<TOIE1) 
	out TIMSK,temp						;Разрешение прерываний таймеров


	ldi Razr0,255						;загружаем число обеспечивающее
	ldi Razr1,255						;задержку на 30 сек
	ldi Razr2,9							;

rcall Delay_on_led						;вызываем процедуру задержки

	cli

rcall READING_CONSTANTS					;загружаем из ППЗУ время вентиляции

	sei




;Подпрограмма работы контроллера
;================================================================================
Start_cicle:
	ldi worker_variable, 0b00110000		;Открываем эл.маг. клапан и запускаем вентилятор
	out PORTB, worker_variable			;

	rcall Timer_Delay					;


;------------Основной цикл программы----------------------------------------------------
Program_Set_step_1: 
	nop
	nop
	nop
	nop
	sbic pinD,0 						;Ожидание нажатия кнопки программирования 
rjmp Program_Set_step_1					;времени вентиляции
;----------------------------------------------------------------------------------------


;-----------Группа процедур обеспечивающих установку параметра время вентиляции---------
	clr temp
	out TCCR1B,temp						;останавдиваем счётчик
										;
	ldi worker_variable, 0b10000000		;Зажигаем красный светодиод
	out PORTB, worker_variable			;
	ldi Razr0,255						;загружаем число обеспечивающее
	ldi Razr1,255						;задержку горения светодиода на 1минуту
	ldi Razr2,16						;
	rcall Delay_on_led					;вызываем процедуру задержки
	ldi worker_variable, 0b00000000		;Гасим красный светодиод
	out PORTB, worker_variable			;

	clr delay_set						;очищяем предыдущее значение времени на вентиляцию




Program_Set_step_2: 

	subi Razr0,1						;Если пользователь долго не нажимает на кнопку
	sbci Razr1,0						;производится запись параметра времени
	sbci Razr2,0						;вентиляции в ППЗУ
	breq WRITING_CONSTANTS				;

	sbic pinD,0 						;Ожидание нажатия кнопки программирования 
rjmp Program_Set_step_2					;времени вентиляции

	inc delay_set						;увеличиваем на 1 значение времени на вентиляцию
	rcall Delay_set_indication			;
rjmp Program_Set_step_2

Последний раз редактировалось С.М.С; 27.08.2011 в 23:11.
С.М.С вне форума Ответить с цитированием
Старый 27.08.2011, 23:07   #3
С.М.С
Участник клуба
 
Аватар для С.М.С
 
Регистрация: 29.12.2008
Сообщений: 1,598
По умолчанию

продолжение
Код:
Delay_on_led:
	subi Razr0,1
	sbci Razr1,0
	sbci Razr2,0
	brcc Delay_on_led
reti



Delay_set_indication:				;
	ldi worker_variable, 0b10000000		;Зажигаем красный светодиод
	out PORTB, worker_variable			;

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

	rcall Delay_on_led					;

	ldi worker_variable, 0b00000000		;Гасим красный светодиод
	out PORTB, worker_variable			;

	ldi Razr0,255						;загружаем число обеспечивающее
	ldi Razr1,255						;задержку перед сохранением параметра
	ldi Razr2,40						;время вентиляции на 2.6 минуты

reti








;======================== Процедура задержки времени на вентиляцию=======================
Timer_Delay:
	ldi temp, high(6930)				;загружаем в регистр счёта старший байт 
	out TCNT1H, temp					;числа начального счёта
	ldi temp, low(6930)					;загружаем в регистр счёта младший байт
	out TCNT1L, temp					;числа начального счёта

	ldi temp, 0b00000101				;запускаем таймер и устанавливаем коэф.деления 1024
	out TCCR1B, temp

sei										;разрешаем все прерывания
reti
;--------------------------------------Конец процедуры-----------------------------------------



;======================== Процедура переполнения счётчик-таймера 1 =======================
OVF1:
	clr temp
	out TCCR1B,temp


	dec delay_set
	breq Stop_cicle

	rcall Timer_Delay


reti
;--------------------------------------Конец процедуры-----------------------------------------



;======================== Процедура остановки контроллера ===============================
Stop_cicle:


	ldi worker_variable, 0b11000000		;Закрываем эл.маг. клапан, останавливаем вентилятор,
	out PORTB, worker_variable			;подаём сигнал на обесточивание схемы, сигнализируем красным светодиодом.
	ldi worker_variable, 0b11000000		;Закрываем эл.маг. клапан, останавливаем вентилятор,
	out PORTB, worker_variable			;подаём сигнал на обесточивание схемы, сигнализируем красным светодиодом.

Stop_cicle_2:
	nop
	nop
	nop
	nop
rjmp Stop_cicle_2								;
;--------------------------------------Конец процедуры-----------------------------------------







;Группа подпрограмм обеспечивающих считывание\запись времени вентиляции из ППЗУ:
;======================================================================================================

READING_CONSTANTS:
		
	ldi ZH,100						;Загружаем бит адреса параметра Время вентиляции
	rcall ReadEEP						;Вызываем подпрограмму считывания из ППЗУ ReadEEP
	mov delay_set,temp					;Переносим считанный параметр
reti

ReadEEP:								;в ZH-адрес откуда читать, возврат temp-прочтённый байт
	sbic EECR,EEWE						;ожидание очистки флага записи
	rjmp ReadEEP
	out EEAR,ZH							;байт адреса
	sbi EECR,EERE						;устанавливаем бит чтения
	sbi EECR,EERE						;устанавливаем бит чтения
	in temp,EEDR						;чтение
reti
;--------------------------------------




;--------------------------------------
WRITING_CONSTANTS:
		
	ldi ZH,100							;Загружаем бит адреса параметра Время вентиляции
	mov temp,delay_set					;Переносим параметры для записи
	
	rcall WriteEEP						;Вызываем процедуру записи данных в ППЗУ WriteEEP
	
rjmp RESET

WriteEEP:								;в ZH-адрес куда писать, в temp- записываемый байт
	sbic EECR,EEWE						;ожидание очистки флага записи
	rjmp WriteEEP
	CLI
	out EEAR,ZH							;байт адреса
	out EEDR,temp						;данные
	sbi EECR,EEMWE						;устанавливаем флаг разрешения записи
	sbi EECR,EEWE						;устанавливаем бит разрешения
reti

;--------------------------------------Конец группы подпрограмм-----------------------------------------
С.М.С вне форума Ответить с цитированием
Старый 27.08.2011, 23:37   #4
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

Цитата:
Проблема в нестабильности работы, на данный момент бывают несрабатывания системы, после подачи питания загорается красный светодиод, который должен гореть, только в режиме программирования и при выполнении процедуры обесточивания и не запускается вентилятор.
код не смотрел, а скажите: как у вас с фильтрацией по питанию для МК? Стоит ли керамика по высокой и электролит по низкой для МК, стоят ли фильтры и сглаживающие на входе и выходе КРЕН, развязаны ли цепи питания МК и ключевого силового каскада, нет ли бросков тока из-за недостаточно мощного блока питания? Как запитан преобразователь уровней ULN ? Стоит ли защитный диод в цепи катушки реле? ...как затактирован МК, внутренним или кварц навешен? ...и т.д. и т.п.

p.s.: ждем схему.
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 28.08.2011, 01:36   #5
С.М.С
Участник клуба
 
Аватар для С.М.С
 
Регистрация: 29.12.2008
Сообщений: 1,598
По умолчанию

МК тактируется внутренне 1МГц, защитные диоды входят в ULN. Прикрепил схему начерченную в SprintLayout, попробую перевести в что-нибудь из наглядного, если у Вас нет этой программы. Пока без номиналов, блок сейчас в работе. Лепил из того, что было близкого. Завтра попробую списать. По питанию, конечно надо посмотреть осциллографом, но монитор MC34064, при правалх, должен сбрасывать МК. А тут, как будто МК сам выходит из цикла отслеживания нажатия кнопки программирования.
Вложения
Тип файла: rar principle_scheme.rar (28.1 Кб, 18 просмотров)

Последний раз редактировалось С.М.С; 28.08.2011 в 01:44.
С.М.С вне форума Ответить с цитированием
Старый 28.08.2011, 10:01   #6
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

Цитата:
Пока без номиналов, блок сейчас в работе
нонсенс, а отсюда телепатически догадываться?

Цитата:
SprintLayout, попробую перевести в что-нибудь из наглядного, если у Вас нет этой программы
SprintLayout - предназачен для печатных плат, лучше уже сразу в OrCad-е/pcad-e ...у меня то есть, а разве не в курсе возможности экспорта в ней jpg/gif/emf/bmp ?



1- номиналы сопротивлений на схеме не указаны, нельзя выяснить какой выходной ток
2- отсутствует подача питания на ULN + ваши встроенные диоды висят в воздухе
3- отсутствуют блокировочные емкости по питанию для МК (керамика вообще отсутствует)
4- не подписаны реле, непонятно на какой они ток и напряжение
5- отсутствует нумерация выводов MC34064, нельзя однозначно сказать правильно ли подключен монитор питания ...рекомендую от него вообще избавиться и поставить резистор с конденсатором, ибо у вас запитка МК осуществлена от КРЕН, нет никакого смысла в мониторе
6- PD0 желательно подключить сопротивлением на землю для помехоустойчивости и коммутировать плюс
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation

Последний раз редактировалось raxp; 28.08.2011 в 10:04.
raxp вне форума Ответить с цитированием
Старый 28.08.2011, 13:36   #7
С.М.С
Участник клуба
 
Аватар для С.М.С
 
Регистрация: 29.12.2008
Сообщений: 1,598
По умолчанию

Цитата:
Сообщение от raxp Посмотреть сообщение
а разве не в курсе возможности экспорта в ней jpg/gif/emf/bmp ?
Нет, теперь буду знать.

Цитата:
Сообщение от raxp Посмотреть сообщение
2-отсутствует подача питания на ULN + ваши встроенные диоды висят в воздухе
А где у неё +, вижу общий вывод через раздельные диоды с каждого каскада, 7 входов, 7 выходов и один общий.

Цитата:
Сообщение от raxp Посмотреть сообщение
3- отсутствуют блокировочные емкости по питанию для МК (керамика вообще отсутствует)
Вооот, вообще забыл в спешки. Добавил, теперь вроде работает, по крайней мере, пока гоняю ни одного сбоя не было.

Прикрепляю схему с номиналами и исправлениями.

Реле К1 - 220В переменного тока сопротивление обмотки 1300 Ом
К2 - 12В постоянного тока сопротивление обмотки 137 Ом
К3,К4 - 12В постоянного тока сопротивление обмотки 128 Ом

Реле К2,К3,К4 - выпаяны с автомобильной сигнализации, производитель Siemens, по токам точно не известно, но эти реле стоят в цепи центрального замка, а там предохранители обычно 15А.

raxp спасибо Вам, а то я бы ещё долго ковырялся с прошивкой.
Вложения
Тип файла: rar Вентиляция ванной комнаты.rar (64.9 Кб, 17 просмотров)

Последний раз редактировалось С.М.С; 28.08.2011 в 13:56.
С.М.С вне форума Ответить с цитированием
Старый 29.08.2011, 11:58   #8
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию


MC34064 уже не нужен.

1- каков смысл установки C4 на 1 мкФ?
2- каков смысл установки реле K1? Да, при нажатии кнопки "Старт" оно срабатывает и своими контактами поддерживает подачу питания для себя и всей схемы далее, но при срабатывании реле K2 вы его обесточиваете и тем самым оно размыкает цепь подачи питания на всю схему далее и МК работает пока держит емкость С1 и С2 (работоспособность МК сохраняется до уровня 3 вольт). В дальнейшем схема уже обесточена и даже, если сам МК еще некоторое время продержится, то остаточного заряда для срабатывания реле не хватит.

Цитата:
А где у неё +, вижу общий вывод через раздельные диоды с каждого каскада, 7 входов, 7 выходов и один общий.
ну как где, общий вывод (в.9) всех диодов и нужен, он и выполняет собственно параллельное подключение диода к катушке.

Цитата:
Реле К2,К3,К4 - выпаяны с автомобильной сигнализации, производитель Siemens, по токам точно не известно, но эти реле стоят в цепи центрального замка, а там предохранители обычно 15А.
предохранители совсем не показатель, да и стоят они в цепи коммутации сервов стеклоподъемников (т.е. в цепи коммутации контактов реле, но не катушки), они для данной схемы неинтересны, интересен сам ток и напряжение срабатывания реле.

Допустим в ULN теряем на переходе 0.7 вольт, тогда токи через реле (12-0.7)/137 ~ 82 мА и (12-0.7)/128 ~ 88 мА. Общий ток, при одновременном срабатывании, 82 + 88 + 88 = 258 мА. В принципе немного, а какова мощность транса?
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 29.08.2011, 13:55   #9
С.М.С
Участник клуба
 
Аватар для С.М.С
 
Регистрация: 29.12.2008
Сообщений: 1,598
По умолчанию

Цитата:
=raxp;868118
MC34064 уже не нужен.

1- каков смысл установки C4 на 1 мкФ?
2- каков смысл установки реле K1? Да, при нажатии кнопки "Старт" оно срабатывает и своими контактами поддерживает подачу питания для себя и всей схемы далее, но при срабатывании реле K2 вы его обесточиваете и тем самым оно размыкает цепь подачи питания на всю схему далее и МК работает пока держит емкость С1 и С2 (работоспособность МК сохраняется до уровня 3 вольт). В дальнейшем схема уже обесточена и даже, если сам МК еще некоторое время продержится, то остаточного заряда для срабатывания реле не хватит.

ну как где, общий вывод (в.9) всех диодов и нужен, он и выполняет собственно параллельное подключение диода к катушке.

предохранители совсем не показатель, да и стоят они в цепи коммутации сервов стеклоподъемников (т.е. в цепи коммутации контактов реле, но не катушки), они для данной схемы неинтересны, интересен сам ток и напряжение срабатывания реле.

Допустим в ULN теряем на переходе 0.7 вольт, тогда токи через реле (12-0.7)/137 ~ 82 мА и (12-0.7)/128 ~ 88 мА. Общий ток, при одновременном срабатывании, 82 + 88 + 88 = 258 мА. В принципе немного, а какова мощность транса?
MC34064 - убрал.
1 там опечатка, С4 тоже 0,1мкФ
2 Так и планируется. Проветривать приходится не особо часто, в сравнении с простоем, тем более ночью. Чтобы после выполнения, ни трансформатор ни МК не были в работе.
За параллельное включение я принял, диод между эмиттером и коллектором выходного транзистора. Общий вывод тоже включу. Изначально придал ему другую функцию.
Предохранители привёл, как коммутационную способность контактов реле.
Трансформатор, не особо мощный магнитопровод имеет размеры 34мм\30мм.

Пока блок работает без электромагнитного клапана. Не нашёл достаточно обмоточного провода для перемотки, как разживусь, может ещё что выплывет в работе.
С.М.С вне форума Ответить с цитированием
Старый 29.08.2011, 14:38   #10
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

Цитата:
Не нашёл достаточно обмоточного провода для перемотки
ммм... смотать можно попробовать со старых катушек реле или ламповых трансов.
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Компилятор МикроПаскаль для AVR SERG1980 Помощь студентам 2 15.08.2011 16:23
Excel - Создать в Excel таблицу для расчета расхода материала для покраски пола комнаты Дашкаа Помощь студентам 2 20.06.2011 15:44
программа для микроконтроллера AVR pilot76 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 04.05.2011 19:46
с/c++ для avr gaka1995 Общие вопросы C/C++ 1 25.10.2009 13:55
Вычисление количества рулонов обоев для поклейки комнаты Golovastik Общие вопросы C/C++ 5 17.07.2009 11:50