Перейти к содержанию

Подключение Кнопок И Переключателей К Мк


Рекомендуемые сообщения

Ключевые слова «делитель напряжения». Два резистора включены последовательно, один конец нашей сборки подключен на «+», второй через кнопку на землю, средний на АЦП. Для подключения нескольких кнопок воспользуйся в поиске фразой R-2RИМХО: но так кнопки подключать не стоит.

Так мне ни напряжения мерить,если я вас правильно понил,а чисто кнопки.

Изменено пользователем robot-5

Электроника эта пламя страсти без неё никуда.

Ссылка на комментарий
Поделиться на другие сайты

  • Ответов 89
  • Создана
  • Последний ответ

Топ авторов темы

Топ авторов темы

Изображения в теме

Чсито кнопки ... ХмХм... а если подумать самому? и почему они у тебя подключаются к АЦП если это КНОПКА?

Или быть может, тебе надо подключить 6 кнопок на один вывод контроллера используя АЦП? тогда смотри совет выше ...

Учение - изучение правил. Опыт - изучение исключений.

Ссылка на комментарий
Поделиться на другие сайты

Разверну свою фразу. «Но так кнопки подключать не стоит»

Сделать то можно и даже будет работать. Но надо учитывать маленький и противный факт, что кнопка в ходе эксплуатации меняет своё сопротивление и может тем самым выскочить из «ворот» Вашего программного компаратора и тем самым не правильно срабатывать. Причем чем больше Вы повесите кнопок на одну линию, тем вероятней это произойдет

Это сообщение поставляется "как есть", без каких либо гарантий. Автор сообщения не несёт какой либо ответственности

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

Ссылка на комментарий
Поделиться на другие сайты

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Как я подключаю кнопки: микросхема 561ИЕ8, на управление надо 2 вывода контроллера, и от 1-го до N выводов с клавиатуры, тем самым сразу получаем возможность организовать матрицу 10xN кнопок. Если на возврат используется больше двух выводов, а надо съекономить - можно поставить сдвиговый регистр, и используя один управляющий вывод и один на вход, сканировать 8 или 16 линий с клавиатуры, тем самым используя всего 4 вывода контроллера и 2 микросхемы можно организовать клавиатуру на 80 кнопок(160 кнопок если использовать 3 микросхемы). Правда что, в любой момент может быть нажата лишь одна кнопка, но если поставить на каждую кнопку диод - практически в любых комбинациях.

Учение - изучение правил. Опыт - изучение исключений.

Ссылка на комментарий
Поделиться на другие сайты

  • 11 месяцев спустя...

Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. 

Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств. Подробнее параметры и результаты тестов новой серии PLM по ссылке.

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Вобщем как выводить надпись на дисплей с attiny2313 я более мение разобрался. Но уже второй день бьюся над такой задачей:

Надпись 1. - нажали кнопку - стерли надпись 1 - вывели надпись 2.

Пожалуйста помогите! Зарание спасибо!

Извините за то что задаю много вопросов, просто я начинающий в МК. С уважением, Андрей, можно на ты.

Ссылка на комментарий
Поделиться на другие сайты

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Работайте через внешнее прерывание - реакция на нажатие кнопки. Выделите регистр, разряды которого (с 7 по 0) будут отвечать за признак выводимого сообщения. В прерывании последовательно проверяйте биты, и в соответствии с результатами проверки выводите то или иное сообщение. Например. Начало работы. Все биты регистра сброшены. Нажатие кнопки - вызов прерывания. Проверяется бит 0 = не установлен -> переход по метке к очистке экрана, выводу первого сообщения и установке бита 0 -> выход из прерывания. Следующее нажатие -> проверка бита 0 = установлен -> переход к проверке бита 1 = не установлен -> переход по метке к очистке экрана, выводу второго сообщения и установке бита 1 -> выход из прерывания. И так далее. На проверке 7 (или другого) бита выполняете вывод сообщения и очищаете регистр. Это закольцует выводимые на экран сообщения.

Ссылка на комментарий
Поделиться на другие сайты

О спасибо, потихоньку разбираюсь. Уже родилось начало проги. Пожалуйста, скажите, правильно-ли.

;---
.include "tn2313def.inc"
.list
.def     temp = R16
;---
.cseg
.org     0
;---
Ldi      temp, RAMEND
out      SPL, temp
;---
Ldi      temp, 0
out      DDRD, temp
Ldi      temp, 0xFF
out      DDRB, temp
out      PORTD, temp
;---
main:    in     temp, PIND

Извините за то что задаю много вопросов, просто я начинающий в МК. С уважением, Андрей, можно на ты.

Ссылка на комментарий
Поделиться на другие сайты

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

				.include			"tn2313def.inc"

			.cseg
			.org				0

			rjmp				RESET
			rjmp				INT0_EXT
			rjmp				INT1_EXT
			rjmp				TIM1_CAPT
			rjmp				TIM1_COMPA
			rjmp				TIM1_OVF
			rjmp				TIM0_OVF
			rjmp				USART0_RXC
			rjmp				USART0_UDRE
			rjmp				USART0_TXC
			rjmp				ANA_COMP
			rjmp				PCINT
			rjmp				TIMER1_COMPB
			rjmp				TIMER0_COMPA
			rjmp				TIMER0_COMPB
			rjmp				USI_START
			rjmp				USI_OVERFLOW
			rjmp				EE_READY
			rjmp				WDT_OVERFLOW

RESET:

INT0_EXT:			reti
INT1_EXT:			reti
TIM1_CAPT:			reti
TIM1_COMPA:			reti
TIM1_OVF:			reti
TIM0_OVF:			reti
USART0_RXC:			reti
USART0_UDRE:			reti
USART0_TXC:			reti
ANA_COMP:			reti
PCINT:				reti
TIMER1_COMPB:			reti
TIMER0_COMPA:			reti
TIMER0_COMPB:			reti
USI_START:			reti
USI_OVERFLOW:			reti
EE_READY:			reti
WDT_OVERFLOW:			reti

			.exit

Ссылка на комментарий
Поделиться на другие сайты

Спасибо, буду рожать прогу дальше.

Извините за то что задаю много вопросов, просто я начинающий в МК. С уважением, Андрей, можно на ты.

Ссылка на комментарий
Поделиться на другие сайты

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

Извините за то что задаю много вопросов, просто я начинающий в МК. С уважением, Андрей, можно на ты.

Ссылка на комментарий
Поделиться на другие сайты

Извините за глупый вопрос: Я решил пользоватся командой .include "***.asm" Кинул Ваш исходник в папку с проэктом, нача компилиравать прогу, выдало штук 50 ошибок. Я думаю что это из-за того что как подпрогу я пытаюсь использавать самостоятельную прогу. ПЫтался по разному её урезать - результат один и тотже. Подскажите, как переделать её в подпрограмму. Зарание спасибо.

П.С. Со мной можно на ты.

Извините за то что задаю много вопросов, просто я начинающий в МК. С уважением, Андрей, можно на ты.

Ссылка на комментарий
Поделиться на другие сайты

Не делай так ... что такое include? Это директива которая в это место один в один вставляет содержимое файла... если инклудишь файл-программу, для компилятора это выглядит как полный бред.

Учение - изучение правил. Опыт - изучение исключений.

Ссылка на комментарий
Поделиться на другие сайты

П.С. Со мной можно на ты.

Хорошо. Со мной тоже. :)

Давай разберем следующий пример реализации твоего задания. Код:

				.include			"tn2313def.inc"

			.def				TEMP	=	r16
			.def				MISC	=	r17
			.def				CNT	=	r18
			.def				DATA	=	r19
			.def				STMSG	=	r20 ;Регистр признака выводимого сообщения

			.equ				SDEL	=	0
			.equ				INIT	=	1
			.equ				A0	=	0
			.equ				RW	=	1
			.equ				E	=	2
			.equ				LCD	=	PORTB

			.cseg
			.org				0

			rjmp				RESET
			rjmp				INT0_EXT
			rjmp				INT1_EXT
			rjmp				TIM1_CAPT
			rjmp				TIM1_COMPA
			rjmp				TIM1_OVF
			rjmp				TIM0_OVF
			rjmp				USART0_RXC
			rjmp				USART0_UDRE
			rjmp				USART0_TXC
			rjmp				ANA_COMP
			rjmp				PCINT
			rjmp				TIMER1_COMPB
			rjmp				TIMER0_COMPA
			rjmp				TIMER0_COMPB
			rjmp				USI_START
			rjmp				USI_OVERFLOW
			rjmp				EE_READY
			rjmp				WDT_OVERFLOW

RESET:				ldi				TEMP,		low(RAMEND)
			out				SPL,		TEMP
			ldi				TEMP,		0b11111111
			out				DDRB,		TEMP
			ldi				TEMP,		0b00000000
			out				PORTB,		TEMP
			ldi				TEMP,		0b00000000
			out				DDRD,		TEMP
			ldi				TEMP,		0b11111111
			out				PORTD,		TEMP

			rcall				TIM_SEC				;Вызов подпрограммы установки таймера
			cbr				MISC,		(1<<SDEL)	;Сброс бита для проверки таймера
			sei								;Разрешение глобальных прерываний

DELONST:			wdr
			sbrs				MISC,		SDEL
			rjmp				DELONST
;В трех строчках выше реализуется задержка при включении на 1 секунду (при 1 МГц тактовой частоте).
;Пока бит SDEL регистра MISC сброшен, будет выполняться переход по метке DELONST.
;Бит SDEL будет установлен только тогда, когда сработает прерывание от таймера по совпадению - TIM1_COMPA
			cli								;Запрет глобальных прерываний
			rcall				TIM_STOP			;Останавливаем таймер
			cbr				MISC,		(1<<SDEL)
			rcall				LCD_INIT			;Вызываем подпрограмму инициализации ЖКИ
			rcall				TIM_TWO
			sei

DELLCDINIT:			wdr
			sbrs				MISC,		SDEL
			rjmp				DELLCDINIT			;Помигаем курсором для разнообразия
			cli
			rcall				TIM_STOP
			cbr				MISC,		(1<<SDEL)
			ldi				DATA,		0b00001100	;Выключаем мигающий курсор
			rcall				LCD_OUT
			ldi				ZH,		high(MSG_HELLO<<1);Получаем адрес приветственного сообщения
			ldi				ZL,		low(MSG_HELLO<<1)
			rcall				MSG_OUT				;Вывод сообщения на ЖКИ
			clr				STMSG
			ldi				TEMP,		0x40
			out				GIMSK,		TEMP
			ldi				TEMP,		0x03
			out				MCUCR,		TEMP		;В этих четырех строчках задается работа внешнего
											;прерывания INT0
			sei

LOOP:				wdr								;Бесконечный цикл
			rjmp				LOOP
;Подпрограмма инициализации ЖКИ
LCD_INIT:			cbi				LCD,		A0
			cbi				LCD,		RW
			sbr				MISC,		(1<<INIT)			
			ldi				DATA,		0b00110000
			rcall				LCD_OUT
			rcall				LCD_OUT
			rcall				LCD_OUT
			ldi				DATA,		0b00100000
			rcall				LCD_OUT
			cbr				MISC,		(1<<INIT)
			ldi				DATA,		0b00101000
			rcall				LCD_OUT
			ldi				DATA,		0b00001000
			rcall				LCD_OUT
			ldi				DATA,		0b00000001
			rcall				LCD_OUT
			ldi				DATA,		0b00000110
			rcall				LCD_OUT
			ldi				DATA,		0b00001101
			rcall				LCD_OUT
			ret

LCD_OUT:			sbrs				DATA,		7
			cbi				LCD,		7
			sbrc				DATA,		7
			sbi				LCD,		7
			sbrs				DATA,		6
			cbi				LCD,		6
			sbrc				DATA,		6
			sbi				LCD,		6
			sbrs				DATA,		5
			cbi				LCD,		5
			sbrc				DATA,		5
			sbi				LCD,		5
			sbrs				DATA,		4
			cbi				LCD,		4
			sbrc				DATA,		4
			sbi				LCD,		4
			sbi				LCD,		E
LCD_OUT_DEL1:			wdr
			inc				TEMP
			cpi				TEMP,		0x80
			brlo				LCD_OUT_DEL1
			clr				TEMP
			cbi				LCD,		E
LCD_OUT_DEL2:			wdr
			inc				TEMP
			cpi				TEMP,		0x80
			brlo				LCD_OUT_DEL2
			sbrc				MISC,		INIT
			rjmp				EXIT_LOUT
			sbrs				DATA,		3
			cbi				LCD,		7
			sbrc				DATA,		3
			sbi				LCD,		7
			sbrs				DATA,		2
			cbi				LCD,		6
			sbrc				DATA,		2
			sbi				LCD,		6
			sbrs				DATA,		1
			cbi				LCD,		5
			sbrc				DATA,		1
			sbi				LCD,		5
			sbrs				DATA,		0
			cbi				LCD,		4
			sbrc				DATA,		0
			sbi				LCD,		4
			sbi				LCD,		E
			clr				TEMP
LCD_OUT_DEL3:			wdr
			inc				TEMP
			cpi				TEMP,		0x80
			brlo				LCD_OUT_DEL3
			clr				TEMP
			cbi				LCD,		E
LCD_OUT_DEL4:			wdr
			inc				TEMP
			cpi				TEMP,		0x80
			brlo				LCD_OUT_DEL4
EXIT_LOUT:			ret
;Подпрограмма задержки, требуемой при очистке экрана индикатора
LCD_PAUSE:			push				MISC
			clr				TEMP
			clr				MISC
LCD_PDEL:			wdr
			inc				TEMP
			cpi				TEMP,		0x80
			brlo				LCD_PDEL
			clr				TEMP
			inc				MISC
			cpi				MISC,		0x80
			brlo				LCD_PDEL
			pop				MISC
			ret
;Подпрограмма очистки экрана ЖКИ
LCD_CLR:			cbi				LCD,		A0
			ldi				DATA,		0x01
			rcall				LCD_OUT
			rcall				LCD_PAUSE
			ret
;Подпрограмма вывода сообщения на индикатор
;Чтобы упростить задачу с выводом сообщения,
;для перевода строки используем символ $,
;а конец сообщения будет определять символ #
MSG_OUT:			sbi				LCD,		A0		;Сброс бита порта ввода/вывода
SMSG_FSYM:			lpm				DATA,		Z+		;Читаем в регистр DATA символ из адреса Z
											;и увеличиваем адрес на 1
			cpi				DATA,		'$'		;Проверка на наличие контрольного символа
			breq				SMSG_NSTR			;Если $, то переходим к переводу строки
			rcall				LCD_OUT				;Вызов подпрограммы вывода на ЖКИ
			rjmp				SMSG_FSYM			;Возврат к чтению символов
SMSG_NSTR:			cbi				LCD,		A0				
			ldi				DATA,		0b11000000	;Устанавливаем адрес
			rcall				LCD_OUT						
			sbi				LCD,		A0
SMSG_SSYM:			lpm				DATA,		Z+
			cpi				DATA,		'#'		;Проверка на конец сообщения
			breq				END_MSG_OUT
			rcall				LCD_OUT
			rjmp				SMSG_SSYM
END_MSG_OUT:			ret
;Подпрограмма таймера на 1 секунду (при тактовой частоте 1 МГц)
TIM_SEC:			push				TEMP
			ldi				TEMP,		0x40
			out				TIMSK,		TEMP
			ldi				TEMP,		0x03
			out				TCCR1B,		TEMP
			ldi				TEMP,		0x3D
			out				OCR1AH,		TEMP
			ldi				TEMP,		0x09
			out				OCR1AL,		TEMP
			clr				TEMP
			out				TCNT1H,		TEMP
			out				TCNT1L,		TEMP
			pop				TEMP
			ret
;Подпрограмма таймера на 2 секунды (при тактовой частоте 1 МГц)
TIM_TWO:			push				TEMP
			ldi				TEMP,		0x40
			out				TIMSK,		TEMP
			ldi				TEMP,		0x03
			out				TCCR1B,		TEMP
			ldi				TEMP,		0x7A
			out				OCR1AH,		TEMP
			ldi				TEMP,		0x12
			out				OCR1AL,		TEMP
			clr				TEMP
			out				TCNT1H,		TEMP
			out				TCNT1L,		TEMP
			pop				TEMP
			ret
;Подпрограмма сброса таймера
TIM_STOP:			push				TEMP
			clr				TEMP
			out				TIMSK,		TEMP
			out				TCCR1B,		TEMP
			out				OCR1AH,		TEMP
			out				OCR1AL,		TEMP
			out				TCNT1H,		TEMP
			out				TCNT1L,		TEMP
			pop				TEMP
			ret
;Внешнее прерывание INT0
INT0_EXT:			sbrc				STMSG,		0			;Если бит 0 сброшен,
												;пропускаем следующую команду
			rjmp				MSG2
			ldi				ZH,		high(FIRST_MSG<<1)	;Получаем адрес сообщения
			ldi				ZL,		low(FIRST_MSG<<1)
			rcall				LCD_CLR					;Очищаем дисплей
			rcall				MSG_OUT					;Выводим сообщение
			sbr				STMSG,		(1<<0)			;Устанавливаем признак сообщения
			rjmp				EXIT_INT0				;Выход из прерывания
;Далее аналогично проверяется бит 1
MSG2:				sbrc				STMSG,		1
			rjmp				MSG3
			ldi				ZH,		high(SECOND_MSG<<1)
			ldi				ZL,		low(SECOND_MSG<<1)
			rcall				LCD_CLR
			rcall				MSG_OUT
			sbr				STMSG,		(1<<1)
			rjmp				EXIT_INT0
;Далее проверку не выполняем, а только выводим сообщение и сбрасываем регистр STMSG
;Таким образом закольцовываем выводимые сообщения
MSG3:				ldi				ZH,		high(THIRD_MSG<<1)
			ldi				ZL,		low(THIRD_MSG<<1)
			rcall				LCD_CLR
			rcall				MSG_OUT
			clr				STMSG
EXIT_INT0:			reti
INT1_EXT:			reti
TIM1_CAPT:			reti

TIM1_COMPA:			sbr				MISC,		(1<<SDEL)
			reti

TIM1_OVF:			reti
TIM0_OVF:			reti
USART0_RXC:			reti
USART0_UDRE:			reti
USART0_TXC:			reti
ANA_COMP:			reti
PCINT:				reti
TIMER1_COMPB:			reti
TIMER0_COMPA:			reti
TIMER0_COMPB:			reti
USI_START:			reti
USI_OVERFLOW:			reti
EE_READY:			reti
WDT_OVERFLOW:			reti

MSG_HELLO:			.db				"Hello,$World#"
FIRST_MSG:			.db				"First$Message#"
SECOND_MSG:			.db				"Second$Message#"
THIRD_MSG:			.db				"Third$Message#"
			.exit

Интересно, код с прокруткой можно как-нибудь сделать.

В общем, алгоритм приблизительно такой. Кнопки обрабатываются во внешнем прерывании INT0. Я прикладываю архив с проектом из AVR Studio 4 и файлом Proteus'а. В программе используются самостоятельно созданные задержки, так что при проблемах с временем вывода сообщения на ЖКИ, можно самостоятельно подобрать величины этих задержек. Код несколько не оптимальный. Можно эстетичнее сделать, особенно в отношении алгоритма вывода четырехразрядного кода в порт. Но это уже импровизация. Это, Андрей, я оставляю тебе. :)

LCD Test 2313.zip

Ссылка на комментарий
Поделиться на другие сайты

Это, Андрей, я оставляю тебе. :)

Этим я займусь, вроде всё понятно. Спасибо большое!

Изменено пользователем Андрей Шпакунов

Извините за то что задаю много вопросов, просто я начинающий в МК. С уважением, Андрей, можно на ты.

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...