Обсуждаем контроллеры компании Atmel.
Ответить

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

Пн окт 28, 2019 12:06:26

я диоды нарисовал для защиты каналов от КЗ, раз их не было, то и не надо... (либо они внутри реализованы как-то, например открытым коллектором, либо этому МК по какой-то другой причине пофиг на К.З.)

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

Пн окт 28, 2019 12:10:32

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

Спасибо !!

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

Пн окт 28, 2019 22:33:24

тут бы, желательно осциллограмку заценить, она точнее чем рисунок.

Изображение
Вложения
20160320_711452.jpg
(245.88 KiB) Скачиваний: 503

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

Вт окт 29, 2019 06:27:24

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

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

Вт окт 29, 2019 07:50:26

Более-менее понятно. Только там еще с десяток клавиш подключено, поєтому "1 - єто А", "0 - єто В" не пройдет.

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

Вт окт 29, 2019 09:39:44

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

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

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

Добавлено after 53 minutes 6 seconds:
Таймер всё-таки понадобится, если во время считывания кнопки, надо продолжать другие действия делать. Тут работать с таймером и прерыванием.
Вложения
btn-codes.png
(100.3 KiB) Скачиваний: 265

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

Вт окт 29, 2019 09:40:11

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

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

Вт окт 29, 2019 09:47:07

Конкретно с А и B всё просто, т.к. в их коде нет подряд идущих 1. Может и в коде других кнопок нет такого. Ну даже если и есть задача решается точными таймингами после начала передачи.

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

Вт окт 29, 2019 09:52:28

да, хотелось бы глянуть, как выглядит код с 2мя "1" подряд, может и там краткий всплеск будет :roll:

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

Вт окт 29, 2019 10:08:01

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

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

Вт окт 29, 2019 20:47:58

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

?

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

Вт окт 29, 2019 21:49:31

prw07, вы для начала покажите осц. другой какой-нибудь кнопки еще и ситуацию когда сразу А и B нажаты. Так точнее можно будет ответить.

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

Ср окт 30, 2019 11:23:49

Изображение
Вложения
20160322_102747.jpg
(66.57 KiB) Скачиваний: 379

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

Ср окт 30, 2019 12:33:05

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

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

Ср окт 30, 2019 12:42:00

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

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

Ср окт 30, 2019 13:46:36

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

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

а всего сколько клавиш? и отрабатывается ли их одновременное нажатие?...
Всего на єту линию подключено 10 клавиш: 0b000000000001, 0b000000000010, 0b000000000100, 0b000000001000, 0b000000010000, 0b000000100000, 0b000001000000, 0b000010000000, 0b000100000000, 0b001000000000.
, одновременное нажатие отрабатывают.

NStormПочему INT, а не ICP ?

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

Ср окт 30, 2019 18:47:33

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

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

Чт окт 31, 2019 09:20:40

Как вариант. Подать код клавиатуры на вход 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

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

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