Страница 2 из 3

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

Добавлено: Пн окт 28, 2019 12:06:26
Ivanoff-iv
я диоды нарисовал для защиты каналов от КЗ, раз их не было, то и не надо... (либо они внутри реализованы как-то, например открытым коллектором, либо этому МК по какой-то другой причине пофиг на К.З.)

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

Добавлено: Пн окт 28, 2019 12:10:32
prw07
ок. Не попробуешь - не узнаешь.
Буду пробовать.

Спасибо !!

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

Добавлено: Пн окт 28, 2019 22:33:24
prw07
тут бы, желательно осциллограмку заценить, она точнее чем рисунок.
Изображение

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

Добавлено: Вт окт 29, 2019 06:27:24
NStorm
Так гораздо понятнее. Видно же 12-битный код, LSB первым передается. Даже таймеры не нужны. Интервалы же одинаковые, в отличии от вашей картинки в 1ом посте.
На выходе вообще элементарно - начало передачи по подъему фронта. Затем прерывание по спаду фронта и через 4 мкс спайка читаем уровень. Высокий = 0, низкий = 1. У клавиши А код 1, у B 2. Ну и обрабатывать ситуацию когда не нажато ничего (1ая картинка, "несущая").

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

Добавлено: Вт окт 29, 2019 07:50:26
prw07
Более-менее понятно. Только там еще с десяток клавиш подключено, поєтому "1 - єто А", "0 - єто В" не пройдет.

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

Добавлено: Вт окт 29, 2019 09:39:44
NStorm
Так вы все 12 бит разбирайте, а не только 1ый.

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

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

Добавлено after 53 minutes 6 seconds:
Таймер всё-таки понадобится, если во время считывания кнопки, надо продолжать другие действия делать. Тут работать с таймером и прерыванием.

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

Добавлено: Вт окт 29, 2019 09:40:11
Ivanoff-iv
ну, да, перед каждым байтом строб... - ловить можно по внешнему прерыванию по спаду...

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

Добавлено: Вт окт 29, 2019 09:47:07
NStorm
Конкретно с А и B всё просто, т.к. в их коде нет подряд идущих 1. Может и в коде других кнопок нет такого. Ну даже если и есть задача решается точными таймингами после начала передачи.

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

Добавлено: Вт окт 29, 2019 09:52:28
Ivanoff-iv
да, хотелось бы глянуть, как выглядит код с 2мя "1" подряд, может и там краткий всплеск будет :roll:

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

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

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

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

?

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

Добавлено: Вт окт 29, 2019 21:49:31
NStorm
prw07, вы для начала покажите осц. другой какой-нибудь кнопки еще и ситуацию когда сразу А и B нажаты. Так точнее можно будет ответить.

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

Добавлено: Ср окт 30, 2019 11:23:49
prw07
Изображение

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

Добавлено: Ср окт 30, 2019 12:33:05
Ivanoff-iv
а всего сколько клавиш? и отрабатывается ли их одновременное нажатие?
это к вопросу - а может каждый бит - своя клавиша? тогда достаточно проверять только первые 2 бита...

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

Добавлено: Ср окт 30, 2019 12:42:00
Самсусамыч
Теперь по картинкам можно уверенно сказать, что каждому биту принадлежит своя клавиша. И прослеживается алфавитный порядок. В таком случае можно уверенно отслеживать любое количество одновременно нажатых клавиш.

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

Добавлено: Ср окт 30, 2019 13:46:36
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 везде одинаковый получается, смотрите сами какая там частота по ослику.

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

Добавлено: Ср окт 30, 2019 16:36:46
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 ?

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

Добавлено: Ср окт 30, 2019 18:47:33
NStorm
prw07, потому что ICP для захвата временных интервало. А время у вас всегда фиксированное. Вам нужно захватывать событие перехода уровня, для этого и есть внешние прерывания INTx.
Можно конечно и через ICP и смотреть "сколько времени прошло". Просто из-за большого разброса интервалов, на 8-битном таймере, например, это может быть неудобным. Да и логика программы запутаннее будет.
В вашем варианте с ICP придется точно смотреть значения, чтобы определять ситуации, когда нажато несколько кнопок. Просто "более 10мкс (с запасом), но меньше 100мкс" будет у вас пропускать ситуции с нажатием нескольких кнопок.

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

Добавлено: Чт окт 31, 2019 09:20:40
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

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

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

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