- Вложения
-
- Pcad схема и либа.zip
- (66.11 КБ) 182 скачивания
-
- Sources.rar
- (138.13 КБ) 179 скачиваний
Помогите с гальван развязкой двунаправлен линни данных
Уважаемые Коты. В приложении схема в PCadе, либы к ней, вариант проги (прога для Аtmega16 рабочая). Мне требуется отвязаться гальванически от MicroLana. В нете есть девайсы к примеру (ISO150 от Texas Instruments) позволяющие отвязаться, но все они предполагают наличие сигнала Read/Write. У меня такого не имеется. Может кто че подскажет. Может надо менять вообще архитектуру проекта.
- Реклама
- Сообщения: 1148
- Зарегистрирован: Вт июл 08, 2008 12:24:17
А для чего опторазвязка - заказчик может объяснить? Что-то не вижу я от нее пользы здесь - от перенапряга она не спасет, тогда нафига - модное слово услышали? 
А может шинными формирователями попробовать? Раз м/к - ведущий, то от него питать енаблю и дирекшн, прямо тем же самым 1-ваем. :о)
Учитывая, что он имеет третье состояние выходов, можно и два в параллель поставить - после него и перед шиной ставить оптопару. Где-то так. Порисовать сейчас некогда, но на первый взгляд - можно будет ничего не менять в софте.
А может шинными формирователями попробовать? Раз м/к - ведущий, то от него питать енаблю и дирекшн, прямо тем же самым 1-ваем. :о)
Учитывая, что он имеет третье состояние выходов, можно и два в параллель поставить - после него и перед шиной ставить оптопару. Где-то так. Порисовать сейчас некогда, но на первый взгляд - можно будет ничего не менять в софте.
Уважаемый ТигроКот Вы частенько помогаете мне своим советом. Если будет время набросайте вариант предложеной развязки, потому что как я не кручу все одно направление передачи никак не выловить и Лан будет переключать формирователь так же как и мастер.
И еще. Я смотрю все функции в конце концов обращаются к w1_read() w1_write() если не ошибаюсь?
И еще. Я смотрю все функции в конце концов обращаются к w1_read() w1_write() если не ошибаюсь?
Как ее оттуда достать, отредактить и подсунуть. Ведь компилятор небось будет при каждом проходе подсовывать встроенную. Или отредактить в асм файле и подставить его через командную строку ассемблеру. Можно бы было с помощью даже наверное одной w1_write() переключать бит направления на том же порту. Думаю что задача бы моя тогда упростилась?Наконец, самое смешное, что некоторые функции хранятся в исполняемом модуле cvavr.exe (например, w1_init(), w1_read(), w1_write() и некоторые другие), я не знаю, нафига сделан такой странный ход, но и эти функции все же можно получить - из asm-листинга проекта (низовые написаны на asm'е).
- Сообщения: 1148
- Зарегистрирован: Вт июл 08, 2008 12:24:17
Цитируешь мой ответ и все же спрашиваешь снова - как их достать. :о))) Вообще-то, эти функции не оконечные - есть еще __w1_write_bit0, __w1_write_bit1 и другие.lkote68 писал(а):Я смотрю все функции в конце концов обращаются к w1_read() w1_write() если не ошибаюсь? Как ее оттуда достать, отредактить и подсунуть.... некоторые функции хранятся в исполняемом модуле cvavr.exe (например, w1_init(), w1_read(), w1_write() и некоторые другие), ... и эти функции все же можно получить - из asm-листинга проекта
Вот их (всех) код, взятый, как я и говорил, из asm'листинга (куда он помещен из тела CvAvr.exe):
Код: Выделить всё
_w1_init:
clr r30
cbi __w1_port,__w1_bit
sbi __w1_port-1,__w1_bit
__DELAY_USW 0x375
cbi __w1_port-1,__w1_bit
__DELAY_USB 0x22
sbis __w1_port-2,__w1_bit
ret
__DELAY_USB 0xBB
sbis __w1_port-2,__w1_bit
inc r30
__DELAY_USW 0x2CF
ret
__w1_read_bit:
sbi __w1_port-1,__w1_bit
__DELAY_USB 0x5
cbi __w1_port-1,__w1_bit
__DELAY_USB 0x1B
clc
sbic __w1_port-2,__w1_bit
sec
ror r30
__DELAY_USB 0xC5
ret
__w1_write_bit:
clt
sbi __w1_port-1,__w1_bit
__DELAY_USB 0x5
sbrc r23,0
cbi __w1_port-1,__w1_bit
__DELAY_USB 0x20
sbic __w1_port-2,__w1_bit
rjmp __w1_write_bit0
sbrs r23,0
rjmp __w1_write_bit1
ret
__w1_write_bit0:
sbrs r23,0
ret
__w1_write_bit1:
__DELAY_USB 0xB8
cbi __w1_port-1,__w1_bit
__DELAY_USB 0xC
set
ret
_w1_read:
ldi r22,8
__w1_read0:
rcall __w1_read_bit
dec r22
brne __w1_read0
ret
_w1_write:
ldi r22,8
ld r23,y+
clr r30
__w1_write0:
rcall __w1_write_bit
brtc __w1_write1
ror r23
dec r22
brne __w1_write0
inc r30
__w1_write1:
ret
Код: Выделить всё
#define _DBG_
#ifdef _DBG_
#define w1_write _myW1write
// и так далее - для всех изменяемых функций
#endif
Посмотрел код и думаю то ли лыжи не едут то ли я их не смазал
Сдесь я откоментил функцию w1_init и не могу понять зачем там анализ
бита с тем же номером в другом порту.
и те же яйца в функциях read write
и зачем очищать и инкрементировать r30
Достаточно ли так изменить функцию write что бы определять направление передачи данных по 1wire
Сдесь я откоментил функцию w1_init и не могу понять зачем там анализ
бита с тем же номером в другом порту.
и те же яйца в функциях read write
и зачем очищать и инкрементировать r30
Код: Выделить всё
_w1_init:
clr r30 //Clear Register r30
cbi __w1_port,__w1_bit //Clear __w1_bit in Reg __w1_port
sbi __w1_port-1,__w1_bit //Set __w1_bit in Reg w1_port-1
__DELAY_USW 0x375 //delay
cbi __w1_port-1,__w1_bit //Clear__w1_bit in Reg __w1_port-1
__DELAY_USB 0x22 //delay
sbis __w1_port-2,__w1_bit //Skip if __w1_bit in Reg __w1_port-2 Set
ret //return
__DELAY_USB 0xBB //delay
sbis __w1_port-2,__w1_bit //Skip if __w1_bit in Reg __w1_port-2 Set
inc r30 //increnement r30
__DELAY_USW 0x2CF //delay
ret Код: Выделить всё
_w1_write:
sbi sameport, transfer_bit //mine addition
ldi r22,8
ld r23,y+
clr r30
__w1_write0:
rcall __w1_write_bit
brtc __w1_write1
ror r23
dec r22
brne __w1_write0
inc r30
__w1_write1:
cbi sameport, transfer_bit //mine addition
ret
- Реклама
- Сообщения: 1148
- Зарегистрирован: Вт июл 08, 2008 12:24:17
Это не другой порт, это другой регистр! Скажем, если __w1_port установлен на PORTB, то __w1_port - 1 будет соответствовать DDRB (а __w1_port - 2 - это PINB). Теперь прояснилось?lkote68 писал(а):w1_init ... не могу понять зачем там анализ бита с тем же номером в другом порту.
В R30 функция возвращает прочитанный бит, приблизительно так:
Код: Выделить всё
int result = 0;
if (Portb.N)
++result;
return result;
Последний раз редактировалось Yellow Tiger Вт апр 21, 2009 12:19:56, всего редактировалось 2 раза.
А...Типа потому что _w1_port это адрес и в хедере
sfrb DDRB=0x17;
sfrb PORTB=0x18;
sfrb DDRB=0x17;
sfrb PORTB=0x18;


