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