Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Эмулятор DS1990
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Kovrov
Предистория...
после разборки накопившегося за многие годы барахла нашел платочку контроллер ключей точ мемори
от домофона наверное... повозился с подключением и даже занес в память один из далласовских ключей DS1990 - все работает все хорошо...
а потом подумал надо бы попробовать сделать эмулятор онного на тиньке с автономным питанием
...
полчаса писал прогу считать ds 1990 на МЕГЕ 16 все получилось без проблем
;----
решил написать эмулятор на той же меге16 (пока)
вообщем RESET, Presence pulse, написал
а также чтение комманд от мастера
получил $33 команду типа "дай данные ром"
и все на этом тупик
выложил строку заранее считанную а контроллер не понимает
возможно чето с процедурами передачи байта, хотя там все ясно!
8 байт данных от ключа 100% достоверные
:---
единственное за че боюсь может тайминги че не так или контроллер домофона ещё какие темы
дает - а я незнаю....
если у кого есть исходничек !!!слейва!!! лучше асм 1WIRE буду принателен
aaarrr
Вот мой исходник для 2313 @ 4MHz. Работает, но частоту лучше повыше поднять -
у 1-Wire довольно жесткие требования на времянку вида: "фронт мастера"-"удержание линии слейвом".

Нажмите для просмотра прикрепленного файла
Kovrov
спасибо огромное - буду разбираться
упустил из виду то, что когда слейв передает данные мастер на 15 мкс линию вниз опускает
после этого заработало но,
как то мне ненравиться
временный разброс +- 0,5мкс - и уже не работает
aaarrr
Многое от мастера зависит. Хотя, +/- 0.5мкс, по идее, ничего менять не должно.
Иванов
В Вашем случаи возможны две ситуации не работы эмулятора. Первый случай: не совсем правильная работа мастера. Второй случай: контролер рассчитан для приема не только DS1990, но и еще ключей типа «метаком» или «цифрал». В первом случаи проблема решается подбором временных интервалов (не очень вериться, что разброс +- 0,5мкс, недавно делал считыватель ключей и обратил внимание, что новые ключи срабатывают по минимальным интервалам указанных в даташатах, а для старых ключей пришлось расширять ворота до указанных в мануале. Второй случай не имеет программного решение, а только аппаратное из-за совершенно иного электрического протокола.
Kovrov
Цитата(Иванов @ Jan 27 2006, 23:27) *
(не очень вериться, что разброс +- 0,5мкс, недавно делал считыватель ключей и обратил внимание,

а че не вериться то?
временные интервалы считает таймер 0 делитель 1/8
и того один тик =500 нс при кварце 16 мнz
так вот в моей процедуре чтобы задать 15 мкс стоит типа макроса
;-----------------------
clr temp
out tcnt0,temp
w1:
in temp,tcnt0
cpi temp,15*2 (!!!!15 - подчеркиваю)
brlo w1
;-------------------
при 14 или 16 не работает вообще!!!
при 15 достаточно надежно
О как! конечно я сам в некотором недоумении
есть конечно некоторые зацепки - в понедельник проверю

насчет аппартной не совместимости
на контролере стоит пик 12с508 счит нога через резистор 200 ом+ защитн стабиллитрон подведена
на контактор- питалово 5 в
куда уж больше совместимости то?
Иванов
Когда делал преобразователь кода в 1-Ware использовал диаграмму которая лежат в прикрепленном файле. Код дома не нашел, поэтому в двух словах логика работы моего эмулятора: Во-первых использовал вход внешнего прерывания (необязательно), и после передачи каждого слота переводил контролер в спящий режим. По отрицательному импульсу контролер просыпался, если нужно было передать “1” засыпал до следующего синхронизирующего отрицательного импульса. Если нужно было передать “0” то отсчитывал 15мкс, а затем переключал порт на выход и удерживал “0” 45мкс, далее опять переводил порт в ход и засыпал. И так весь пакет данных. Да кстати внутренней подтягивающей резистор не использовал. Проверял на контролерах нескольких производителей работал без нареканий. Нажмите для просмотра прикрепленного файла
Последний
Это я удачно зашёл! (с)
Неделю назад сам начал переделывать эмулятор с телесистем под АВР. Поставил себе цель использовать минимум деталей. Поэтому пишу для тини2313 (временно отлаживаю на 90s2313) из расчёта использовать встроенный генератор. 2 полные ночи убил, но так и не смог даже считать ключ sad.gif.

2 Kovrov
Предлагаю скооперироваться в разработке - на данный момент могу помочь написать интерфейс (кнопочки, индикаторы) и работу с ЕЕПРОМ. Буду оооочень рад, если сможешь переписать считывание и эмулирование под 1 мег - я убеждён, что это реально (на телесистемах 2051 заводили на 12 мег, но команда там за 12 тактов выполняется).
Что скажешь, сработаемся?
Kovrov
Цитата(Иванов @ Jan 28 2006, 22:43) *
Если нужно было передать “0” то отсчитывал 15мкс, а затем переключал порт на выход и удерживал “0” 45мкс, далее опять переводил порт в ход и засыпал. И так весь пакет данных. Да кстати внутренней подтягивающей резистор не использовал. Проверял на контролерах нескольких производителей работал без нареканий. Нажмите для просмотра прикрепленного файла

собственно идеи у нас одинаковые, после того как отлажу временные диаграммы тоже хотел пересесть
на инт0
временные интервалы имеено такие какие и у приведенной диаграммы...
Цитата
Неделю назад сам начал переделывать эмулятор с телесистем под АВР. Поставил себе цель использовать минимум деталей.

зачем индикаторы зачем кнопочки?
для меня видиться так тини13 в соике и диод и конденсатор для реализации паразитного питания
все
aaarrr
Цитата(Kovrov @ Jan 29 2006, 09:07) *
для меня видиться так тини13 в соике и диод и конденсатор для реализации паразитного питания
все


Про паразитное питание лучше забудьте - частота нужна довольно высокая,
электричества кушает изрядно, а через резистор 4К7 много не пролезет sad.gif

Цитата
считывание и эмулирование под 1 мег - я убеждён, что это реально


Реально, но с некоторым напрягом - после фронта со стороны мастера есть меньше 10мкс
(если делать совсем по-честному, то 1мкс) для выставления бита, а нужно еще решить,
что выставлять, и выставлять ли вообще smile.gif
Kovrov
Цитата(aaarrr @ Jan 29 2006, 15:25) *
Про паразитное питание лучше забудьте - частота нужна довольно высокая,
электричества кушает изрядно, а через резистор 4К7 много не пролезет sad.gif


Не зачем забывать... ибо на тини уже работает даже с предидущем алгоритмом
и именно с паразитным питанием диод кд522+ 200мкф
на кустарной платке круглого вида и на соике
главное обеспечить грамотный спящий режим
мало того сделал через еепром в цикле перебор 5 ключей вроде ок
хотя завтра поработаю над новым алгоритмом чтения есть кое какие мысли
aaarrr
Цитата(Kovrov @ Jan 29 2006, 18:22) *
на тини уже работает даже с предидущем алгоритмом
и именно с паразитным питанием диод кд522+ 200мкф


Это не паразитное питание, а камень на шею мастера smile.gif С резистором
4К7 кондер будет заряжаться примерно 3.5 сек. И как
поведет себя тини на мееедленно растущем питании без
BOD и супервизора (ибо они жруть)?
Я не хочу сказать, что это не должно работать (сам пробовал - немного работает),
просто такой подход, ИМХО, не есть хорошо.

P.S. DS1990 жрет единицы мка, что в случае с контроллером недостижимо.
Иванов
Подброшу идею: Контролер взять с индексом V и питать его 1.8В, а для согласования с мастером сделать транзисторный преобразователь уровня. Схема конечно усложниться, но проблему питания частично решите.
Kovrov
чем же камень?
что разве проще таскать с собой батарею?
и почему 3,5 сек? что 5 вольт?
почему 5 вольт?
почему без бод?
а чем же это не хорошо?
плавно растущее питание не хорошо только тем когда есть процедуры с еепром!!! и то когда нет бода
все остальное не важно в этом представлении проекта..
и главное повторюсь (это паразитное питалово) - а это много значит!!!!
эпоксидкой залил и вперед
я думаю многие с этим согласяться...
на самом деле сам люблю что было как часы но тут .... наплевать.... да и особо страшного ничего нету

Цитата(Иванов @ Jan 29 2006, 21:03) *
Подброшу идею: Контролер взять с индексом V и питать его 1.8В, а для согласования с мастером сделать транзисторный преобразователь уровня. Схема конечно усложниться, но проблему питания частично решите.

какие преобразователи то? зачем?
V как раз то что доктор прописал...
лог 0 формируется открытым мосфетным переходом, тут да, - опираемся только на заряд кондера
лог 1 - вообще ничего не надо Z -состояние вся надежда на резистор шины :-)
а при приеме все ограничется встроенными диодами
aaarrr
Цитата(Kovrov @ Jan 29 2006, 21:09) *
чем же камень?
что разве проще таскать с собой батарею?
и почему 3,5 сек? что 5 вольт?
почему 5 вольт?
почему без бод?
а чем же это не хорошо?
плавно растущее питание не хорошо только тем когда есть процедуры с еепром!!!

Зачем же столько эмоций? smile.gif
Почему 3.5 сек - посчитайте.
Чем не хорошо - посмотрите со стороны мастера, для него это будет выглядеть как 0 на
шине, т.е. мертвое устройство.
Плавно растущее питание не хорошо всегда.

Цитата
какие преобразователи то? зачем?
V как раз то что доктор прописал...
лог 0 формируется открытым мосфетным переходом, тут да, - опираемся только на заряд кондера
лог 1 - вообще ничего не надо Z -состояние вся надежда на резистор шины :-)
а при приеме все ограничется встроенными диодами

Иначе у Вас всегда контроллер будет запитан через встроенные диоды. Очень красивая картина:
входная нога->встроенный диод->внешний конденсатор на много-много мкф.

Еще раз оговорюсь: для единичного экземпляра, пашущего на одного
мастера, сойдет. Как универсальное решение - нет.
Иванов
>а чем же это не хорошо?
>плавно растущее питание не хорошо только тем когда есть процедуры с еепром!!! и то когда нет бода
Вы не правы. Лично наблюдал изделия на AVR которые запитовались по длинным шлейфам. Так вот часть устройств просто не запускались, причем принудительный ресет пинцетом не выводил его из ступора. Запускался только после сокращение длинны шлейфа и заново подачи напряжения.
P.S. Правда это было давно, во времена AT90S.
Kovrov
а при чем сдесь плавно растущее питание?
и потом любой линейный стабилизатор - и есть плавно растущее питание...

Цитата(aaarrr @ Jan 29 2006, 21:29) *
Почему 3.5 сек - посчитайте.
Чем не хорошо - посмотрите со стороны мастера, для него это будет выглядеть как 0 на
шине, т.е. мертвое устройство.
Плавно растущее питание не хорошо всегда.

Еще раз оговорюсь: для единичного экземпляра, пашущего на одного
мастера, сойдет. Как универсальное решение - нет.

я не думаю что это все фатально отразиться на работе мастера- типа увидел 0 на шине в течении 3.5 секунд и перегорел :-)
и что значит универсальное решение?
Kovrov
Ну, господа набаловался вволю!!!
вечерком пошел к подъездной двери вытащил 24c16 из дверного магнита контроллера
без труда нашел код мастера ключа - адрес еепрома где храниться мастер приводить не буду
, кто шарит тот без проблем знает где он!!
зашил в эмулятор...
скорее всего в нашем городке одна контора обслуживает домофоны..
вообщем открыл все поъезды на нашей улице!!!
о как!!!

PS... все это конечно собачьи радости... через час энтузиазм пропал...
а поповоду вышеизложенного. сделаем вывод
кому нравиться ходить с кроной (или лучше с 3мя элементами 373)- пусть ходит ;-)
кому нравиться - "чтоб особо не париться" - так пусть не париться!!!
ВСЁ!
phstranger
Уважаемые!. Можно ли у кого поиметь исходник на ассемблере для реализации слэйва в 1-wire?
aaarrr
Да пожалуйста. Но без комментариев и гарантий.
CODE

;*******************************************************************************
;*
;* Version: 0.00
;* Build: Апрель 11, 2005 19:49:50
;*
;*******************************************************************************

.include "2313def.inc"

;******** Constants ************************************************************

.equ fck = 4000000

;******** Global Register Variables ********************************************

.def sreg = r15
.def a = r16
.def b = r17
.def txcnt = r18
.def txbcnt = r19
.def shift = r20

.def flags = r21
.equ MODE = 0x00
.equ RXD = 0x01

;******** SRAM Variables *******************************************************

.dseg

.org 0x60

.cseg

;******** Reset/Interrupt Vectors **********************************************

.org $000
rjmp reset ; Reset Handler
rjmp irq0 ; IRQ0 Handler
reti ; IRQ1 Handler
reti ; Timer1 Capture Handler
reti ; Timer1 Compare Handler
reti ; Timer1 Overflow Handler
rjmp tim0_ovf ; Timer0 Overflow Handler
reti ; UART RX Complete Handler
reti ; UDR Empty Handler
reti ; UART TX Complete Handler
reti ; Analog Comparator Handler

;******** Setup ****************************************************************

reset:

; Stack Pointer Initialization

ldi a, RAMEND
out SPL, a

; PIO Initialization

ldi a, 0b00000000
out DDRD, a
ldi a, 0b00000000
out PORTD, a
ldi a, 0b11000000
out DDRB, a
ldi a, 0b01000000
out PORTB, a

; Sleep Mode/WatchDog Initialization (PowerDown; WD Disabled)

ldi a, 0b00110010 ; INT0 Falling edge
out MCUCR, a
ldi a, 0b00011000
out WDTCR, a
ldi a, 0b00010000
out WDTCR, a

; Analog Comparator Initialization

ldi a, 0b10000000
out ACSR, a

; Timer0 Initialization

ldi a, 0b00000100 ; CK/256
out TCCR0, a

; Interrupt Initialization

ldi a, (1<<INT0)
out GIMSK, a

cli

;*******************************************************************************
; Main Program
;*******************************************************************************

clr flags
ldi shift, 0x80
sei

main0:
ldi shift, 0x80
andi flags, ~((1<<RXD)+(1<<MODE))
main:
sbrs flags, RXD
rjmp main
cpi shift, 0x33
brne main0
andi flags, ~(1<<RXD)

sbi PORTB, 0x07

ldi ZL, low(code * 0x02)
ldi ZH, high(code * 0x02)
lpm
mov shift, r0
ldi txbcnt, 0x08
ori flags, (1<<MODE)
rjmp main

;*******************************************************************************

irq0:
in sreg, SREG
sbrc flags, MODE
rjmp irq0_1

sbrc flags, RXD ; RX Mode
rjmp irq0_exit
ldi b, 0x14 ; 15us @ 4MHz
irq0_0:
dec b
brne irq0_0
clc
sbic PIND, 0x02
sec
ror shift
brcc irq0_exit
ori flags, (1<<RXD)
rjmp irq0_exit

irq0_1:
lsr shift ; TX Mode
brcs PC+0x02
sbi DDRD, 0x02
ldi b, 0x3c ;28 ; 30us @ 4MHz
irq0_2:
dec b
brne irq0_2
cbi DDRD, 0x02
ldi b, (1<<INT0)
out GIFR, b
dec txbcnt
brne irq0_exit
adiw ZL, 0x01
cpi ZL, low(code * 0x02) + 0x08
breq irq0_4
lpm
mov shift, r0
ldi txbcnt, 0x08

irq0_exit:
ldi b, (1<<TOIE0)
out TIFR, b
out TIMSK, b
ldi b, 0xf4 ; ~720us @ 4MHz
out TCNT0, b
out SREG, sreg
reti

irq0_4:
ldi shift, 0x80
andi flags, ~((1<<RXD)+(1<<MODE))
rjmp irq0_exit

tim0_ovf:
in sreg, SREG
ldi b, 0x00
out TIMSK, b
cbi DDRD, 0x02
tim0_ovf0:
sbis PIND, 0x02
rjmp tim0_ovf0
ldi b, 0x35 ; 40us @ 4MHz
tim0_ovf1:
dec b
brne tim0_ovf1
sbi DDRD, 0x02
ldi b, 0xc8 ; 150us @ 4MHz
tim0_ovf2:
dec b
brne tim0_ovf2
cbi DDRD, 0x02
ldi b, (1<<INT0)
out GIFR, b
ldi shift, 0x80
andi flags, ~((1<<RXD)+(1<<MODE))
out SREG, sreg
reti

;*******************************************************************************

code:
.db 0x01, 0x35
.db 0xb1, 0x87
.db 0x09, 0x00
.db 0x00, 0x68

;******** Revision *************************************************************

.org FLASHEND

rev:
.dw 0x0000
phstranger
Большое человеческое спасибо.
Serjio
Цитата(phstranger @ Apr 13 2009, 12:32) *
Большое человеческое спасибо.

Есть еще вариант. (я не проверял...).
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.