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

Dec 03, 2006 1 Replies

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


Salve!

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

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

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

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required