Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Как сравнить цифровой сигнал ?
я диоды нарисовал для защиты каналов от КЗ, раз их не было, то и не надо... (либо они внутри реализованы как-то, например открытым коллектором, либо этому МК по какой-то другой причине пофиг на К.З.)
Для тех, кто не учил магию мир полон физики 
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
- Реклама
- Сообщения: 403
- Зарегистрирован: Ср янв 26, 2011 17:00:30
- Сообщения: 403
- Зарегистрирован: Ср янв 26, 2011 17:00:30
тут бы, желательно осциллограмку заценить, она точнее чем рисунок.
- Вложения
-
- 20160320_711452.jpg
- (245.88 КБ) 534 скачивания
- Сообщения: 1978
- Зарегистрирован: Ср июл 17, 2013 13:55:57
Так гораздо понятнее. Видно же 12-битный код, LSB первым передается. Даже таймеры не нужны. Интервалы же одинаковые, в отличии от вашей картинки в 1ом посте.
На выходе вообще элементарно - начало передачи по подъему фронта. Затем прерывание по спаду фронта и через 4 мкс спайка читаем уровень. Высокий = 0, низкий = 1. У клавиши А код 1, у B 2. Ну и обрабатывать ситуацию когда не нажато ничего (1ая картинка, "несущая").
На выходе вообще элементарно - начало передачи по подъему фронта. Затем прерывание по спаду фронта и через 4 мкс спайка читаем уровень. Высокий = 0, низкий = 1. У клавиши А код 1, у B 2. Ну и обрабатывать ситуацию когда не нажато ничего (1ая картинка, "несущая").
- Сообщения: 403
- Зарегистрирован: Ср янв 26, 2011 17:00:30
Более-менее понятно. Только там еще с десяток клавиш подключено, поєтому "1 - єто А", "0 - єто В" не пройдет.
- Реклама
- Сообщения: 1978
- Зарегистрирован: Ср июл 17, 2013 13:55:57
Так вы все 12 бит разбирайте, а не только 1ый.
Добавлено after 26 minutes 16 seconds:

Начало передачи с младшего бита. Код кнопки А = 0b000000000001 = 1, код кнопки B = 0b000000000010 = 2. Провалы в 0 на 4 мкс(ну или сколько там, не видно же на вашем скрине) отмечают начало нового бита.
Добавлено after 53 minutes 6 seconds:
Таймер всё-таки понадобится, если во время считывания кнопки, надо продолжать другие действия делать. Тут работать с таймером и прерыванием.
Добавлено after 26 minutes 16 seconds:

Начало передачи с младшего бита. Код кнопки А = 0b000000000001 = 1, код кнопки B = 0b000000000010 = 2. Провалы в 0 на 4 мкс(ну или сколько там, не видно же на вашем скрине) отмечают начало нового бита.
Добавлено after 53 minutes 6 seconds:
Таймер всё-таки понадобится, если во время считывания кнопки, надо продолжать другие действия делать. Тут работать с таймером и прерыванием.
- Вложения
-
- btn-codes.png
- (100.3 КБ) 280 скачиваний
ну, да, перед каждым байтом строб... - ловить можно по внешнему прерыванию по спаду...
Для тех, кто не учил магию мир полон физики 
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
- Сообщения: 1978
- Зарегистрирован: Ср июл 17, 2013 13:55:57
Конкретно с А и B всё просто, т.к. в их коде нет подряд идущих 1. Может и в коде других кнопок нет такого. Ну даже если и есть задача решается точными таймингами после начала передачи.
да, хотелось бы глянуть, как выглядит код с 2мя "1" подряд, может и там краткий всплеск будет 
Для тех, кто не учил магию мир полон физики 
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
чей-то мне всё это напоминает джойстики от Денди или подобное... алгоритмы приема кодов которых давным-давно разжеваны в сети...
тому, кто работал с 1-wire принять подобный код (как на осциллограммах) труда не составит вообще
тому, кто работал с 1-wire принять подобный код (как на осциллограммах) труда не составит вообще
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Сообщения: 403
- Зарегистрирован: Ср янв 26, 2011 17:00:30
Понравилось мне решение "друга кота" Ivanoff-iv с сумматором, но хочется разобраться с кодами кнопок (на будущее так сказать) поэтому беру за основу именно этот вариант.
Теперь подскажите правильный ли у меня ход мысли:
- в режиме IC ждем спад
- после фиксирования спада считаем время до следующего фронта
- если время более 10мкс (с запасом), но меньше 100мкс (что бы отличить активную фазу передачи от несущей) то фиксируем "1", иначе - "0"
- проверяем кол-во зафиксированных бит (12) (или по кол-ву фронтов)
?
Теперь подскажите правильный ли у меня ход мысли:
- в режиме IC ждем спад
- после фиксирования спада считаем время до следующего фронта
- если время более 10мкс (с запасом), но меньше 100мкс (что бы отличить активную фазу передачи от несущей) то фиксируем "1", иначе - "0"
- проверяем кол-во зафиксированных бит (12) (или по кол-ву фронтов)
?
- Сообщения: 1978
- Зарегистрирован: Ср июл 17, 2013 13:55:57
prw07, вы для начала покажите осц. другой какой-нибудь кнопки еще и ситуацию когда сразу А и B нажаты. Так точнее можно будет ответить.
- Сообщения: 403
- Зарегистрирован: Ср янв 26, 2011 17:00:30
а всего сколько клавиш? и отрабатывается ли их одновременное нажатие?
это к вопросу - а может каждый бит - своя клавиша? тогда достаточно проверять только первые 2 бита...
это к вопросу - а может каждый бит - своя клавиша? тогда достаточно проверять только первые 2 бита...
Для тех, кто не учил магию мир полон физики 
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Теперь по картинкам можно уверенно сказать, что каждому биту принадлежит своя клавиша. И прослеживается алфавитный порядок. В таком случае можно уверенно отслеживать любое количество одновременно нажатых клавиш.
- Сообщения: 1978
- Зарегистрирован: Ср июл 17, 2013 13:55:57
Угу, так и есть. Теперь точно понятно. Я так и думал что будет. При одновременно нажатых клавишах строба никакого нет. Так что читать биты клавиш нужно строго по временным "слотам".
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 везде одинаковый получается, смотрите сами какая там частота по ослику.
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
[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 ?
, одновременное нажатие отрабатывают.
NStormПочему INT, а не ICP ?
- Сообщения: 1978
- Зарегистрирован: Ср июл 17, 2013 13:55:57
prw07, потому что ICP для захвата временных интервало. А время у вас всегда фиксированное. Вам нужно захватывать событие перехода уровня, для этого и есть внешние прерывания INTx.
Можно конечно и через ICP и смотреть "сколько времени прошло". Просто из-за большого разброса интервалов, на 8-битном таймере, например, это может быть неудобным. Да и логика программы запутаннее будет.
В вашем варианте с ICP придется точно смотреть значения, чтобы определять ситуации, когда нажато несколько кнопок. Просто "более 10мкс (с запасом), но меньше 100мкс" будет у вас пропускать ситуции с нажатием нескольких кнопок.
Можно конечно и через ICP и смотреть "сколько времени прошло". Просто из-за большого разброса интервалов, на 8-битном таймере, например, это может быть неудобным. Да и логика программы запутаннее будет.
В вашем варианте с ICP придется точно смотреть значения, чтобы определять ситуации, когда нажато несколько кнопок. Просто "более 10мкс (с запасом), но меньше 100мкс" будет у вас пропускать ситуции с нажатием нескольких кнопок.
Как вариант. Подать код клавиатуры на вход 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
NStorm, 
И еще...зачем флаг сработки по фронту или спаду, если можно проверять состояние регистра MCUCR? Если 0b00000011 то по фронту, если 0b00000010 то по спаду.
Это в основной программе или в обработчике прерывания ?5. Прерывание INT0 пока отключаем. Перенастраиваем таймер и начинаем просто считывать по биту каждый заданный (одинаковый) интервал времени. У нас это должно попадать в серединки более длительных импульсов, пропуская 4мкс пики, если они будут.
использовать безусловный переход для выхода из прерывания ?4. В том же INT другая ситуация, если флаг был поднят (else if). Т.е. мы попали сюда при спаде. Смотрим таймер. Если он по длительности насчитал нам столько, что это похоже на "режим ожидания", то сбрасываем флаг и идем назад на шаг 2.
И еще...зачем флаг сработки по фронту или спаду, если можно проверять состояние регистра MCUCR? Если 0b00000011 то по фронту, если 0b00000010 то по спаду.


