Регистрация | Вход

[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: ivan_fd  
эмулятор ds1990a в Pbp
zero Дата: Пт, 04.06.2010, 21:01  |                                                                                                                Сообщение # 1
Группа: Проверенные
Ранг:  Новенький
Сообщений: 2
Репутация: 0   ±
Замечания:   ±
На сайте с 14.01.2010

Статус: Offline

Добрый вечер, господа!
Прошу помощи в написании программы для эмуляции продукта фирмы Dallas Semiconductor, таблетки ds1990. Уже неделю прогоняю все возможные варианты в протеусе, но это ни к чему не приводит. Проект - два pic16f628 - один мастер, другой слэйв. К мастеру подключен жк дисплей 16х2. Каждую секунду он посылает команду $33, считывает и выводит на LCD принятые 8 байт. Прекрасно работает с дс 1990, отлажен в железе. Однако отказывается корректно считывать информацию эмуляторы в протеусе.
Эмулятор постоянно ждет, пока мастер не уронит на землю шину. Через 500 микросекунд мастер ее поднимает, и ждет сигнала присутствия. Если эмулятор на шине, он (эмулятор) ответно роняет шину на 60 - 240 микросекунд, после чего принимает команду (1байт). Если это $33 или $0F, то он передает 8 байт идентификационного номера, ждет 50 миллисекунд и возвращается в начало цикла. Либо сразу возвращается, если принятые команды не являются командами READ_ROM.
Code

   DEFINE osc 4

trisb = %11111111
cmcon = %00000111
VRCON = 0

dq  var portb.0
x   var byte
id  var byte[8]

main:
    gosub waiting
    pauseus 520
    trisb.0 = 0
    dq = 0
    pauseus 100
    dq = 1
    owin dq, 4, [x]
    if x = $33 or x = $0f or then tx

goto waiting
      
waiting:
    while dq = 1
    wend
return

tx:
    owout dq, 0, [$01, $ff, $ff, $ff, $ff, $00,$00, $9b ]
    pause 50
goto main
end

Подскажите пожалуйста, как лучше осуществить эмуляцию

Сообщение отредактировал zero - Пт, 04.06.2010, 21:02
ЯНДЕКС Дата: 04.06.2010
demanik Дата: Пт, 04.06.2010, 21:59  |                                                                                                                Сообщение # 2
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 448
Репутация: 10   ±
Замечания:   ±
На сайте с 11.12.2007

Статус: Offline

Quote (zero)
Подскажите пожалуйста, как лучше осуществить эмуляцию

Смотрите тут:http://www.picbasic.ru/forum/5-130-1
но на протоне. cool


Попробуй всё и вся... может быть пол...

zero Дата: Вт, 14.12.2010, 23:58  |                                                                                                                Сообщение # 3
Группа: Проверенные
Ранг:  Новенький
Сообщений: 2
Репутация: 0   ±
Замечания:   ±
На сайте с 14.01.2010

Статус: Offline

вот тут считыватель, если нужно
спасибо!)

Добавлено (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
Прикрепления: 1wire_reader.dsn (75.8 Kb) · READING.hex (2.2 Kb)

Сообщение отредактировал zero - Ср, 15.12.2010, 00:07
Aleksey_174 Дата: Пт, 27.01.2017, 16:42  |                                                                                                                Сообщение # 4
Группа: Проверенные
Ранг:  Новенький
Сообщений: 17
Репутация: 17   ±
Замечания:   ±
На сайте с 22.01.2017

Статус: Offline

долго искал расчет, ты гений

Добавлено (27.01.2017, 16:42)
---------------------------------------------
долго искал расчет, ты гений

  • Страница 1 из 1
  • 1
Поиск: