вот тут считыватель, если нужно
спасибо!) Добавлено (04.07.2010, 17.28.09)
---------------------------------------------
Изучил поплотнее протокол 1-wire, изучил прерывания, попробовал перевести программу в протон. Ниже привожу код эмулятора, к сожалению не получается в протеусе осуществить считывание с эмулятора ds1990 на pic12f629 с помощью считывателя на pic16f628, приведеннного выше. Если он не работает в протеусе, будет ли он работать в железе? Возможно ли вообще осуществить эмуляцию на скорости микроконтроллера в 8мгц? В чем могут быть ошибки? Помогите пожалуйста.
Code
Device = 12F629
On_Interrupt GoTo write_bit
Xtal 8
Symbol GPIF = INTCON.0 ' Port Change Interrupt Flag
Symbol INTF = INTCON.1 ' GP2/INT External Interrupt Flag
Symbol T0IF = INTCON.2 ' TMR0 Overflow Interrupt Flag
Symbol GPIE = INTCON.3 ' Port Change Interrupt Enable
Symbol INTE = INTCON.4 ' GP2/INT External Interrupt Enable
Symbol T0IE = INTCON.5 ' TMR0 Overflow Interrupt Enable
Symbol PEIE = INTCON.6 ' Peripheral Interrupt Enable
Symbol GIE = INTCON.7 ' Global Interrupt Enable
Symbol INTEDG = OPTION_REG.6 ' Interrupt Edge Select
Symbol NOT_GPPU = OPTION_REG.7 ' GPIO Pull-up Enable
Symbol tx = PORTB.0
Symbol rx = TRISB.0
Dim ID[9] As Byte
Dim x As Byte
Dim y As Byte
Dim z As Byte
Dim i As Bit
Dim j As Byte
ID[0] = $ff 'этот байт занимает место комманды на чтение,
'приходящей от мастера. Вместо того чтобы читать ее, сра-
'внивать с $33 и $0f мы просто после любой команды начинаем
'высылать ID таблетки
ID[1] = $01
ID[2] = $ff
ID[3] = $ff
ID[4] = $ff
ID[5] = $ff
ID[6] = $ff
ID[7] = $ff
ID[8] = $2f
init:
OPTION_REG = %00000000 'подтяжка и прерывание по спаду на gp2
TRISB = %1111111
GIE = 0
INTE = 1
INTF = 0
GoTo start1
write_bit: 'высылаем ID побитно
j = ID[x]
i = GetBit j, y
If i = 0 Then
rx = 0
tx = 0
DelayUS 56
rx = 1
Else
DelayUS 58
EndIf
y = y + 1
If y = 8 Then x = x + 1: y = 0
If x = 9 Then init
INTF = 0
Context Restore
start1: ' ;ждем пока мастер не опустит шину на 0
If GPIO.0 = 0 Then init
If rx = 1 Then start1
start2: 'ждем пока мастер не поднимет ее обратно
If GPIO.0 = 0 Then init
If rx = 0 Then start2
DelayUS 13
rx = 0
tx = 0
DelayUS 120 'импульс присутствия
rx = 1
x = 0
y = 0
i = 0
j = 0
GIE = 1
loop:
If GPIO.0 = 0 Then init
GoTo loop
End
Добавлено (14.12.2010, 23.58.32)
---------------------------------------------
снова вернулся к вопросу об эмуляции таблеток ds1990. Посвятил уйму времени экспериментам, но ничего особо не добился - разве что прерывания освоил) вот в очередной раз перебрал код, все равно не работает. Что я не так делаю? Почему некоторые эмуляторы работают даже на 4х мегагерцах? Очень прошу о помощи, к сожалению не смог найти ничего полезного в этой ссылке http://www.picbasic.ru/forum/5-130-1
Code
'-------------------------------------------------------------------------------------
Device = 12F629
Xtal 20
'-------------------------------------------------------------------------------------
Symbol INTEDG = OPTION_REG.6 ' Interrupt Edge Select
Symbol INTF = INTCON.1 ' GP2/INT External Interrupt Flag
Symbol INTE = INTCON.4 ' GP2/INT External Interrupt Enable
Symbol GIE = INTCON.7 ' Global Interrupt Enable
'-------------------------------------------------------------------------------------
Dim ID[8] As Byte
Dim CNTR As Byte
Dim DSBT As Bit
Dim w As Byte
Dim x As Byte
Dim y As Byte
Dim z As Word
'-------------------------------------------------------------------------------------
CMCON = 0x07 'отключаем компараторы
TRISIO = %00111111 'конфигуририруем все порты как высокоимпедансные входы
INTEDG = 0 'прерывание по порту gpio.2 на ниспадающем фронте
GIE = 1 'разрешаем прерывания вообще
INTE = 0 'временно отключаем прерывания на gpio.2
INTF = 0 'сбрасываем, на всякий случай, флаг вышеуказанного прерывания
'-------------------------------------------------------------------------------------
On_Interrupt GoTo TRBT
'-------------------------------------------------------------------------------------
STRT:
z = 0
CNTR = 0
DSBT = 1
ID[0] = $01
ID[1] = $23
ID[2] = $45
ID[3] = $67
ID[4] = $89
ID[5] = $ab
ID[6] = $cd
ID[7] = $ef
GoTo PRSN
'-------------------------------------------------------------------------------------
TRBT:
If CNTR < 7 Then GoTo CNCL 'пропускаем команду от мастера
If DSBT = 0 Then TRISIO.2 = 0: GPIO.2 = 0: DelayUS 60: TRISIO.2 = 1 'если бит = 0
If DSBT = 1 Then GoTo CNCL 'если бит = 1
If CNTR = 7 Then y = ID[0]
If CNTR = 15 Then y = ID[1]
If CNTR = 23 Then y = ID[2]
If CNTR = 31 Then y = ID[3] 'загружаем байты серийного номера
If CNTR = 39 Then y = ID[4]
If CNTR = 47 Then y = ID[5]
If CNTR = 55 Then y = ID[6]
If CNTR = 63 Then y = ID[7]
DSBT = GetBit y,0 'вычленяем биты, начитая с младшего
y = y >> 1 'потихоньку их сдвигаем
CNCL:
Inc CNTR 'прибавляем единичку к счетчику
INTF = 0 'сбрасываем флаг прерывания по порту GPIO.2
Context Restore 'восстанавливаем содержимое регистров и возвращаемся в программу
PRSN:
While GPIO.2 = 1:Wend
While GPIO.2 = 0:Wend
DelayUS 38
TRISIO.2 = 0
GPIO.2 = 0
DelayUS 150 'выдаем имульс присутствия
TRISIO.2 = 1
INTE = 1 'врубаем прерывания
While CNTR < 73 'пока счетчик меньше 73 переданных бит, крутимся в цикле
Wend
GoTo STRT
End
вот кстати расчет crc8 на proton picbasic для ds 1990 других 1-wire устройств, можт кому пригодится:
Code
Calculating_crc:
crc = 0
i = 0
TestBit = 0
crcdata = ID[0]
GoSub CRC8
crcdata = ID[1]
GoSub CRC8
crcdata = ID[2]
GoSub CRC8
crcdata = ID[3]
GoSub CRC8
crcdata = ID[4]
GoSub CRC8
crcdata = ID[5]
GoSub CRC8
crcdata = ID[6]
GoSub CRC8
Return
CRC8:
For i = 0 To 7 ' для всех 8ми битов
TestBit = crc.0 ^ crcdata.0
crcdata = crcdata >> 1
If TestBit = 0 Then Shift
crc = crc ^ $18
Shift:
crc = crc >> 1
crc.7 = TestBit
Next
return