DS18B20. Hе работает!

Salve!

Что-то ничего не получается с сабжем :( Мастер шины - PIC16F628A с внутренним RC. Hа сброс импульс присутствия вроде выдает, а вот общаться с девайсом не получается никак :(

Частота 4 MHz, соответственно 1 us на команду. После вызовов SimpleDelay в комментарии указана задержка в расчете на 4 MHz (я считаю, что частота внутреннего генератора в точности не равна четырем мегагерцам, поэтому где-то

+/- 1%, что не существенно, имхо). Линия 1-Wire - седьмой бит порта A:

pin_Data_IO equ 7

И еще вопрос - в функциях ReadByte/WriteByte я закоментировал переключение линии на запись/чтение. Во многих исходниках, которые я видел, в подобных функциях такого переключения небыло, и тем не менее оно как-то работало же..

Вот основные процедуры. Я все писал согласно даташиту и даласовскому апноуту #162.

- ---> /*_<!>_*/ PIC16 Assembler <--- --- --- --- --- --- --- --- --- --- ---

- ---> /*_<!>--- ; ============================================================================= ; Процедура простой задержки. ; W = Кол-во кругов (Вход) ; ============================================================================= SimpleDelay movwf Universal Again decfsz Universal, F goto Again return

; ============================================================================= ; Сброс устройств на линии ; * Reset1Wire_Result - результат ; ============================================================================= Reset1Wire bcf PORTA, pin_Data_IO

; Импульс сброса movlw 0A6h call SimpleDelay ; 503 us

bsf PORTA, pin_Data_IO

; Ждем ответа movlw 15h ; 68 us call SimpleDelay

call SwitchDirect ; Переключаем направление линии movlw 1 btfss PORTA, pin_Data_IO movlw 0 movwf Reset1Wire_Result

; Ждем конца импульса присутствия movlw 45h ; 268 us call SimpleDelay

return

; ============================================================================= ; Пишет байт в линию ; * W - Вход ; ============================================================================= WriteByte movwf Temp movlw 8 movwf Count

; movlw 60h ; b'01100000' ; bsf STATUS, RP0 ; movwf TRISA ; bcf STATUS, RP0

NextBitW bcf PORTA, pin_Data_IO

movlw 3 ; 14uS call SimpleDelay

btfsc Temp, 0 bsf PORTA, pin_Data_IO rrf Temp, F

movlw 0Dh ; 44 uS call SimpleDelay

bsf PORTA, pin_Data_IO nop decfsz Count, F goto NextBitW

return

; ============================================================================= ; Читает байт с линии ; * W - Выход ; ============================================================================= ReadByte ; movlw 0E0h ; b'11100000' ; bsf STATUS, RP0 ; movwf TRISA ; bcf STATUS, RP0

movlw 8 movwf Count clrf Temp

NextBitR bcf PORTA, pin_Data_IO nop nop nop nop bsf PORTA, pin_Data_IO ; Release line

movlw 3 ; 14 uS call SimpleDelay

btfsc PORTA, pin_Data_IO bsf Temp, 7 rrf Temp, F

movlw 0Dh ; 44 uS call SimpleDelay

decfsz Count, F goto NextBitR movf Temp, W

return

; Вот это вызов далее по тексту:

bcf INTCON, GIE clrf PORTB ; Выключаем сегменты

; До этого момента вызывается Reset1Wire с проверкой ; присутствия узлов на линии. Вроде работает, т.к. ; если девайс/ы с линии снять - возващает ошибку.

movlw 0CCh call WriteByte

movlw 44h call WriteByte

movlw 50h call LongDelay ; Тут около 850 ms

call Reset1Wire movlw 0CCh call WriteByte

movlw 0BEh call WriteByte

; Пока для отладки чтение без косвенной адресации в массив call ReadByte movwf TLSB

call ReadByte movwf TMSB

call ReadByte movwf THU1

call ReadByte movwf TLU2

call ReadByte movwf CFGB

call ReadByte ; call ReadByte ; call ReadByte ;

call ReadByte movwf SCRC

call Reset1Wire

bsf INTCON, GIE

; Предварительная настройка делается так:

; ============================================================================= ; Точка входа ; ============================================================================= Start clrf INTCON

; Это для динамической индикации clrf Index clrf TMR0

movlw 1 movwf Order

; Hачальная инициализация и настройка периферии ; -->

movlw 7 movwf CMCON

bsf STATUS, RP0

movlw 060h ; 01100000 movwf TRISA ; PortA.0:PortA.3, PortA.4 is in write mode ; ( Sections and power ) ; PortA.7 is currently in write mode ( ; 1-Wire I/O ) ; PortA.5:PortA.6 in read mode ( Buttons ) clrf TRISB ; PortB.0:PortB.7 is in write mode (digit ; segments)

movlw 0C9h ; 11001001 movwf OPTIONR ; 7: -RBPU = 1 { resistors unconnected } ; 6: INTEDG = 1 { interrupt by forward } ; 5: T0CS = 0 { internal CLKOUT(TMR0) } ; 4: T0SE = 0 { inc by forward (TMR0) } ; 3: PSA = 1 { Prescaller before WDT } ; 2:0: PS2:PS0 = 001 { WDT 1:2 }

bcf STATUS, RP0

movlw 0A0h ; 10100000 movwf INTCON ; 7: GIE = 1 { global interrupts on } ; 6: PEIE = 0 { perferial modules interrupt ; off } ; 5: T0IE = 1 { TMR0 overfolw interrupt on} ; 4: INTE = 0 { RB0 INT off } ; 3: RBIE = 0 { RB7:RB4 INT off } ; 2: T0IF = 0 { Drop flag } ; 1: INTF = 0 { Drop flag } ; 0: RBIF = 0 { Drop flag }

- ---> _<!>_ End Of List <--- --- --- --- --- --- --- --- --- --- --- --- ---

- ---> _<!>---

Пытался просто прочитать байты TLSB, TMSB - в них ничего нет. Вместо преобразования пытался слать 33h и читать адресную информацию. Результат тот же. Кто знает в чем дело - пожалуйста подскажите.

Best Regards, J.V.Gurin, 03 Dec 2006

Reply to
Juriy Gurin
Loading thread data ...

Salve!

03 Dec 2006, /*_Juriy Gurin_*/ wrote to */All/* the following:

JG> Что-то ничего не получается с сабжем :(

Гм.. вроде интерфейс заработал :] Ладно, поедем дальше - посмотрим, как оно там будет :) Вот так всегда - только задашь вопрос в конференцию - сразу же все получается:) Best Regards, J.V.Gurin, 04 Dec 2006

Reply to
Juriy Gurin

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.