Страница 1 из 1

Помогите с гальван развязкой двунаправлен линни данных

Добавлено: Пт апр 17, 2009 11:47:00
lkote68
Уважаемые Коты. В приложении схема в PCadе, либы к ней, вариант проги (прога для Аtmega16 рабочая). Мне требуется отвязаться гальванически от MicroLana. В нете есть девайсы к примеру (ISO150 от Texas Instruments) позволяющие отвязаться, но все они предполагают наличие сигнала Read/Write. У меня такого не имеется. Может кто че подскажет. Может надо менять вообще архитектуру проекта.

Добавлено: Пт апр 17, 2009 13:55:49
Yellow Tiger
А для чего опторазвязка - заказчик может объяснить? Что-то не вижу я от нее пользы здесь - от перенапряга она не спасет, тогда нафига - модное слово услышали? :)))

А может шинными формирователями попробовать? Раз м/к - ведущий, то от него питать енаблю и дирекшн, прямо тем же самым 1-ваем. :о)
Учитывая, что он имеет третье состояние выходов, можно и два в параллель поставить - после него и перед шиной ставить оптопару. Где-то так. Порисовать сейчас некогда, но на первый взгляд - можно будет ничего не менять в софте.

Помогите с гальван развязкой двунаправлен линни данных

Добавлено: Пт апр 17, 2009 15:06:38
lkote68
Уважаемый ТигроКот Вы частенько помогаете мне своим советом. Если будет время набросайте вариант предложеной развязки, потому что как я не кручу все одно направление передачи никак не выловить и Лан будет переключать формирователь так же как и мастер.

И еще. Я смотрю все функции в конце концов обращаются к w1_read() w1_write() если не ошибаюсь?
Наконец, самое смешное, что некоторые функции хранятся в исполняемом модуле cvavr.exe (например, w1_init(), w1_read(), w1_write() и некоторые другие), я не знаю, нафига сделан такой странный ход, но и эти функции все же можно получить - из asm-листинга проекта (низовые написаны на asm'е).
Как ее оттуда достать, отредактить и подсунуть. Ведь компилятор небось будет при каждом проходе подсовывать встроенную. Или отредактить в асм файле и подставить его через командную строку ассемблеру. Можно бы было с помощью даже наверное одной w1_write() переключать бит направления на том же порту. Думаю что задача бы моя тогда упростилась?

Добавлено: Пт апр 17, 2009 19:59:01
Yellow Tiger
lkote68 писал(а):
... некоторые функции хранятся в исполняемом модуле cvavr.exe (например, w1_init(), w1_read(), w1_write() и некоторые другие), ... и эти функции все же можно получить - из asm-листинга проекта
Я смотрю все функции в конце концов обращаются к w1_read() w1_write() если не ошибаюсь? Как ее оттуда достать, отредактить и подсунуть.
Цитируешь мой ответ и все же спрашиваешь снова - как их достать. :о))) Вообще-то, эти функции не оконечные - есть еще __w1_write_bit0, __w1_write_bit1 и другие.
Вот их (всех) код, взятый, как я и говорил, из 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
Проще всего отвязаться от встроенных в CvAvr.exe определений этих функций простым переименованием их во что-то свое, например так - сначала копируешь функцию w1_write в свою функцию _myW1write и модифицируешь её, как тебе нужно, затем делаешь такое определение, зависящее от наличия макро _DBG_:

Код: Выделить всё

#define _DBG_
#ifdef _DBG_
  #define w1_write _myW1write
  // и так далее - для всех изменяемых функций
#endif
после такой подготовки можешь менять набор функций одним росчерком пера - откомментировал #define _DBG_ и работают стандартные функции, раскомментировал - работают твои. Можно, конечно, переопределить эти функции в своем проекте, но тогда может возникнуть путаница - будет сложно определить, какой набор функций слинкован сейчас.

Помогите с гальван развязкой двунаправлен линни данных

Добавлено: Вт апр 21, 2009 11:43:47
lkote68
Посмотрел код и думаю то ли лыжи не едут то ли я их не смазал
Сдесь я откоментил функцию 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 
Достаточно ли так изменить функцию write что бы определять направление передачи данных по 1wire

Код: Выделить всё

_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 

Re: Помогите с гальван развязкой двунаправлен линни данных

Добавлено: Вт апр 21, 2009 12:05:23
Yellow Tiger
lkote68 писал(а):w1_init ... не могу понять зачем там анализ бита с тем же номером в другом порту.
Это не другой порт, это другой регистр! Скажем, если __w1_port установлен на PORTB, то __w1_port - 1 будет соответствовать DDRB__w1_port - 2 - это PINB). Теперь прояснилось?
В R30 функция возвращает прочитанный бит, приблизительно так:

Код: Выделить всё

int   result = 0;
	if (Portb.N)
		++result;
	return result;
Видишь там два ret'а - первый просто так, а перед вторым - инкремент R30? Вот, это оно и есть.

Помогите с гальван развязкой двунаправлен линни данных

Добавлено: Вт апр 21, 2009 12:12:35
lkote68
А...Типа потому что _w1_port это адрес и в хедере
sfrb DDRB=0x17;
sfrb PORTB=0x18;