Как сравнить цифровой сигнал ?

Обсуждаем контроллеры компании Atmel.
Ответить
Друг Кота
Аватара пользователя
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Сообщение Ivanoff-iv »

я диоды нарисовал для защиты каналов от КЗ, раз их не было, то и не надо... (либо они внутри реализованы как-то, например открытым коллектором, либо этому МК по какой-то другой причине пофиг на К.З.)
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Реклама
Мучитель микросхем
Сообщения: 403
Зарегистрирован: Ср янв 26, 2011 17:00:30

Сообщение prw07 »

ок. Не попробуешь - не узнаешь.
Буду пробовать.

Спасибо !!
Реклама
Мучитель микросхем
Сообщения: 403
Зарегистрирован: Ср янв 26, 2011 17:00:30

Сообщение prw07 »

тут бы, желательно осциллограмку заценить, она точнее чем рисунок.
Изображение
Вложения
20160320_711452.jpg
(245.88 КБ) 534 скачивания
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

Сообщение NStorm »

Так гораздо понятнее. Видно же 12-битный код, LSB первым передается. Даже таймеры не нужны. Интервалы же одинаковые, в отличии от вашей картинки в 1ом посте.
На выходе вообще элементарно - начало передачи по подъему фронта. Затем прерывание по спаду фронта и через 4 мкс спайка читаем уровень. Высокий = 0, низкий = 1. У клавиши А код 1, у B 2. Ну и обрабатывать ситуацию когда не нажато ничего (1ая картинка, "несущая").
Реклама
Эиком - электронные компоненты и радиодетали
Мучитель микросхем
Сообщения: 403
Зарегистрирован: Ср янв 26, 2011 17:00:30

Сообщение prw07 »

Более-менее понятно. Только там еще с десяток клавиш подключено, поєтому "1 - єто А", "0 - єто В" не пройдет.
Реклама
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

Сообщение NStorm »

Так вы все 12 бит разбирайте, а не только 1ый.

Добавлено after 26 minutes 16 seconds:
Изображение

Начало передачи с младшего бита. Код кнопки А = 0b000000000001 = 1, код кнопки B = 0b000000000010 = 2. Провалы в 0 на 4 мкс(ну или сколько там, не видно же на вашем скрине) отмечают начало нового бита.

Добавлено after 53 minutes 6 seconds:
Таймер всё-таки понадобится, если во время считывания кнопки, надо продолжать другие действия делать. Тут работать с таймером и прерыванием.
Вложения
btn-codes.png
(100.3 КБ) 280 скачиваний
Реклама
Друг Кота
Аватара пользователя
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Сообщение Ivanoff-iv »

ну, да, перед каждым байтом строб... - ловить можно по внешнему прерыванию по спаду...
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

Сообщение NStorm »

Конкретно с А и B всё просто, т.к. в их коде нет подряд идущих 1. Может и в коде других кнопок нет такого. Ну даже если и есть задача решается точными таймингами после начала передачи.
Друг Кота
Аватара пользователя
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Сообщение Ivanoff-iv »

да, хотелось бы глянуть, как выглядит код с 2мя "1" подряд, может и там краткий всплеск будет :roll:
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18678
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

чей-то мне всё это напоминает джойстики от Денди или подобное... алгоритмы приема кодов которых давным-давно разжеваны в сети...
тому, кто работал с 1-wire принять подобный код (как на осциллограммах) труда не составит вообще :)))
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Мучитель микросхем
Сообщения: 403
Зарегистрирован: Ср янв 26, 2011 17:00:30

Сообщение prw07 »

Понравилось мне решение "друга кота" Ivanoff-iv с сумматором, но хочется разобраться с кодами кнопок (на будущее так сказать) поэтому беру за основу именно этот вариант.
Теперь подскажите правильный ли у меня ход мысли:
- в режиме IC ждем спад
- после фиксирования спада считаем время до следующего фронта
- если время более 10мкс (с запасом), но меньше 100мкс (что бы отличить активную фазу передачи от несущей) то фиксируем "1", иначе - "0"
- проверяем кол-во зафиксированных бит (12) (или по кол-ву фронтов)

?
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

Сообщение NStorm »

prw07, вы для начала покажите осц. другой какой-нибудь кнопки еще и ситуацию когда сразу А и B нажаты. Так точнее можно будет ответить.
Мучитель микросхем
Сообщения: 403
Зарегистрирован: Ср янв 26, 2011 17:00:30

Сообщение prw07 »

Изображение
Вложения
20160322_102747.jpg
(66.57 КБ) 406 скачиваний
Друг Кота
Аватара пользователя
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Сообщение Ivanoff-iv »

а всего сколько клавиш? и отрабатывается ли их одновременное нажатие?
это к вопросу - а может каждый бит - своя клавиша? тогда достаточно проверять только первые 2 бита...
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Самсусамыч

Сообщение Самсусамыч »

Теперь по картинкам можно уверенно сказать, что каждому биту принадлежит своя клавиша. И прослеживается алфавитный порядок. В таком случае можно уверенно отслеживать любое количество одновременно нажатых клавиш.
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

Сообщение NStorm »

Угу, так и есть. Теперь точно понятно. Я так и думал что будет. При одновременно нажатых клавишах строба никакого нет. Так что читать биты клавиш нужно строго по временным "слотам".

prw07, алгоритм в целом примерно такой, для AVR с INT0 и таймером:
1. Выход подрублен к INT0. Заводим флаг начала передачи и буфер.
2. Взводим прерывание INT0 на rising edge.
3. Внутри прерывания если флаг опущен - поднимаем его, пошло начало передачи. Прерывание переводим на falling edge. Запускаем таймер на отсчет. Настройки таймера подгоняем, чтобы переполнение было больше длительности высокого уровня вашей 1ой картинки - ожидания.
4. В том же INT другая ситуация, если флаг был поднят (else if). Т.е. мы попали сюда при спаде. Смотрим таймер. Если он по длительности насчитал нам столько, что это похоже на "режим ожидания", то сбрасываем флаг и идем назад на шаг 2.
Если же таймер значительно ниже порога, значит пошла фактическая передача идем дальше.
5. Прерывание INT0 пока отключаем. Перенастраиваем таймер и начинаем просто считывать по биту каждый заданный (одинаковый) интервал времени. У нас это должно попадать в серединки более длительных импульсов, пропуская 4мкс пики, если они будут.
6. После считывания 12 бит сбрасываем флаг, переходим к шагу 1.

Изображение

Шаги 2-3 помечены зелеными стрелками, нужны для определения начала передачи и того, что хоть какая-то клавиша нажата. Зеленым пунктиром условная граница между передачей состояния нажатости клавиш A и B, строба никакого нет, разбивка исключительно по времени. Синие вертикальные линии - примерное место, где надо считывать сигнал. Интервал X везде одинаковый получается, смотрите сами какая там частота по ослику.
Мучитель микросхем
Сообщения: 403
Зарегистрирован: Ср янв 26, 2011 17:00:30

Сообщение prw07 »

[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=3727519#p3727519"]а всего сколько клавиш? и отрабатывается ли их одновременное нажатие?...[/uquote]Всего на єту линию подключено 10 клавиш: 0b000000000001, 0b000000000010, 0b000000000100, 0b000000001000, 0b000000010000, 0b000000100000, 0b000001000000, 0b000010000000, 0b000100000000, 0b001000000000.
, одновременное нажатие отрабатывают.

NStormПочему INT, а не ICP ?
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

Сообщение NStorm »

prw07, потому что ICP для захвата временных интервало. А время у вас всегда фиксированное. Вам нужно захватывать событие перехода уровня, для этого и есть внешние прерывания INTx.
Можно конечно и через ICP и смотреть "сколько времени прошло". Просто из-за большого разброса интервалов, на 8-битном таймере, например, это может быть неудобным. Да и логика программы запутаннее будет.
В вашем варианте с ICP придется точно смотреть значения, чтобы определять ситуации, когда нажато несколько кнопок. Просто "более 10мкс (с запасом), но меньше 100мкс" будет у вас пропускать ситуции с нажатием нескольких кнопок.
akl
Друг Кота
Сообщения: 4450
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

Как вариант. Подать код клавиатуры на вход PD4/T0 (для ATtiny2313).
Спойлер

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

;проба принять данные с клавиатуры
;A==0b000000000001
;B==0b000000000010
;C==0b000000000100
;D==0b000000001000
;E==0b000000010000
;F==0b000000100000
;
.INCLUDE "tn2313def.inc"

.equ	Fo=8000000

.org	$0
	RJMP	START
.org	$06
OVER_T0:
	OUT	TCCR0A,R19
	OUT	TCCR0B,R17

	OUT	TIMSK,R18
	OUT	TIFR,ZL

	RETI
.org	$0D
COMP0_A:
	CLC
	SBIC	PIND,4
	SEC
	ROR	R20
	ROR	R21
	ROR	R22
	BRCC	KEY_OUT
	OUT	TCCR0B,ZH
	SET				; регистры заполнились, значит опрос клавы завершен
KEY_OUT:
	RETI
;
START:
	CLI
	LDI	R16,LOW(RAMEND)
	OUT	SPL,R16

	SER	ZL
	CLR	ZH

	SBI	PORTD,4

	LDI	R20,0b10000000
	CLR	R21
	CLR	R22

	OUT	TCCR0A,R22		; запретить режим CTC

	LDI	R18,1<<OCIE0A	;предустановка для прерывания 5мкс
						; каждый раз после начала работы
	LDI	R19,1<<WGM01

	LDI	R16,1<<SE
	OUT	MCUCR,R16

	LDI	R16,(5*Fo/1000000-1)
	OUT	OCR0A,R16		; интервал 5мкс

	LDI	R16,-1
	OUT	TCNT0,R16		; предустановка для начала работы

	LDI	R16,1<<TOIE0	; прерывание по переполнению 
	OUT	TIMSK,R16
	OUT	TIFR,ZH

	LDI	R17,1<<CS02|1<<CS01|1<<CS00	; +1 по фронту на PD4/T0
	OUT	TCCR0B,R17

	LDI	R17,1<<CS00		; Fo/1

	CLT
	SEI
WAIT:
	SLEEP
	BRTC	WAIT
; в R20, R21, R22 код нажатых клавиш,
; который нужно обработать
; каждый нечетный бит несёт информацию о состоянии клавиши
; R22,1 состояние клавиши A
; R22,3 состояние клавиши B
; R22,5 состояние клавиши C
; и т.д.
	RJMP	START
.EXIT
Мучитель микросхем
Сообщения: 403
Зарегистрирован: Ср янв 26, 2011 17:00:30

Сообщение prw07 »

NStorm,
5. Прерывание INT0 пока отключаем. Перенастраиваем таймер и начинаем просто считывать по биту каждый заданный (одинаковый) интервал времени. У нас это должно попадать в серединки более длительных импульсов, пропуская 4мкс пики, если они будут.
Это в основной программе или в обработчике прерывания ?
4. В том же INT другая ситуация, если флаг был поднят (else if). Т.е. мы попали сюда при спаде. Смотрим таймер. Если он по длительности насчитал нам столько, что это похоже на "режим ожидания", то сбрасываем флаг и идем назад на шаг 2.
использовать безусловный переход для выхода из прерывания ? :shock:

И еще...зачем флаг сработки по фронту или спаду, если можно проверять состояние регистра MCUCR? Если 0b00000011 то по фронту, если 0b00000010 то по спаду.
Ответить

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