Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Программирование ATMEL в BASCOM. » Исходники » Эмуляция 1-Wire устройства


Эмуляция 1-Wire устройства

Сообщений 1 страница 3 из 3

1

Завершил начатый еще до отпуска проект...

Что имеем в результате...
Эмуляция 1-Wire устройства "типа DS2408".
Эмулятор выполняет не весь набор команд DS2408, но этого вполне достаточно для обмена данными.
Почему в кавычках ? Потому, что получилась "плюшка" в виде независимых портов ввода/вывода на эмулируемом устройстве.
Это дает возможность существенно расширить схемотехнику применения.

В качестве эмулятора выбран ATMega48.

В железе не проверялось, но в течении декабря опробирование будет сделано, т.к. оригинальные DS2408 уже закончились, а новые стоят, как потасканый Боинг... ;)

Посмотреть работу в Протеусе можно, стянув архив отсюда:
https://yadi.sk/d/ktOPBG_b9jVQLA

PS  Использовались наработки как местных гуру, так и со сторонних сайтов... ;)

0

2

Тема в разделе исходников, а в архиве только прошивка.

0

3

Пётр написал(а):

Тема в разделе исходников, а в архиве только прошивка.

Биг сорри...  :blush:
Код Slave

Код:
'======================================================
' Свободно распространяемый код
' в программе использованы наработки сторонних авторов
' автор не накладывает ограничений на использование
'======================================================
' ATMega48 в качестве эмулятора
' двунаправленного двухпортового (раздельные порты ввода-вывда)
' 8 разрядного порта ввода/вывода по шине 1-Wire
' (расширенный аналог DS2408)
' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
' Реализованы следующие функциональные команды:
'
' Функциональные команды            - не проверялись в железе !
' - Search ROM &HF0
' - Skip ROM &HCC
' - Match ROM &H55
' - Read ROM &H33
'
' Контрольные функциональные команды
' - Channel Access Read &HF5
' - Channel Access Write &H5A
'======================================================
'======================================================
$Regfile="m48def.dat"
$Crystal=8000000
$hwstack=16
$swstack=16
$framesize=32

'======================================================
Const dqpin = 3                                     ' Номер бита порта шины 1-Wire эмулятора
Const Ipin = 0                                        ' значение DDRx, режим "вход"
Const Opin = 1                                      ' значение DDRx, режим "выход"
PORTC.dqpin = 0

Config PORTC.0 = Output                  'Конфигурирование вывода-эмулятора RSTZ/STRB
PORTC.0 = 1
Config PORTB = Output                     'Конфигурирование порта-эмулятора ВЫХОД
Config PORTD = Input                        'Конфигурирование порта-эмулятора ВХОД
PORTB = 255

Config Timer0 = Timer , Prescale = 64 , Compare A = Disconnect
Timer Alias TCNT0
On Timer0 Isr Nosave

'======================================================
' Временные задержки
Const Owpresent = 120                      ' 60us < OWPresent < 240us                                      150
Const Owpause = 40                          ' 15us < OWPause   < 60us
Const Owstrobe = 10                          ' read Dq value after Owstrobe, us                              15
Const Owdata = 25                             ' valid output data for Owdata, us                                 25
Const T1reset = 50                             ' T1us * 490 Min Reset width                                        60
Const Timeout = 170                          ' T1us * 970 Max Reset width                                       120

' Используемые переменные
Dim A As Byte                                     ' Служебная
Dim B As Byte                                     ' Служебная
'Dim C As Byte                                     ' Служебная
Dim Stek As Byte                                ' Указатель стека
Dim Bytedat As Byte                           ' Для передачи / приема ID
Dim Bitdat As Byte                              ' 0 - Для передачи / приема ID
                                                             ' 1 - флаг указателя сохранения стека
Dim pio As Byte                                  ' Значение PIO
Dim invpio As Byte                             ' Инвертированное значение PIO
Dim Myrom(8) As Byte                       ' ID эмулятора

'======================================================
Restore MyID                                     ' Считывание собственного ID
For B = 1 To 8
      Read Bytedat
      Myrom(B) = Bytedat
Next B

Waitms 50

Enable Interrupts
Enable Timer0
Stop Timer0
'======================================================
'                                         Главный цикл
Mainloop:
'======================================================
Waitreset:
Disable Interrupts
Timer = 0

Waitfall:
L1:
    sbis pinC, dqpin
    rjmp L1
L2:
    sbic pinC, dqpin
    rjmp L2

Start Timer0

Rwaitrise:
L01:
    sbic pinC, dqpin
    rjmp L01
L02:
    sbis pinC, dqpin
    rjmp L02

Stop Timer0

If Timer < T1reset Then Goto Waitreset
If Timer > Timeout Then Goto Waitreset

Sendpresense:
Waitus Owpause

DDRC.dqpin = Opin

Waitus Owpresent
DDRC.dqpin = Ipin

Start Timer0
Timer = 0
Enable Interrupts

Readb:
Gosub Readbyte

Readb1:
If Bytedat = &H33 Then Goto Readrom      ' работает
If Bytedat = &HF0 Then Goto Sendrom      ' работает
If Bytedat = &HCC Then Goto Funct          '
If Bytedat = &H55 Then Goto Matchrom     '

Goto Readb

End

'======================================================
Isr:

If PINC.dqpin = 0 Then
Timer = T1reset
      LDI ZL , low(Rwaitrise)                   ' Забираем адрес метки
      LDI ZH , high(Rwaitrise)                ' Забираем адрес метки
      SEI                                                 ' Так как мы в прерывании и не выходим по RETI (Return),
''                                                               разрешаем прерывания
      IJMP                                                ' Переход на метку без последствий для стека
Else
      LDI ZL , low(Waitreset)
      LDI ZH , high(Waitreset)
'      SEI
IJMP
End If

Return
'======================================================
Readrom:
For B = 1 To 8
      Bytedat = Myrom(B)
      Gosub Sendbyte
Next B
Goto Readb

'======================================================
Matchrom:
For B = 1 To 8
      Gosub Readbyte
      If Bytedat <> Myrom(B) Then Goto Mainloop
Next B
'----------------------------------
Funct:
Gosub Readbyte

If Bytedat = &HF5 Then Gosub Read_PIO
If Bytedat = &H5A Then Gosub Write_PIO

Goto Readb1

'======================================================
' Передача состояния PIO мастеру (команда Channel Access Read)
Read_PIO:

Waitus 3
Bytedat = PIND                                      ' Чтение состояния порта-эмулятора PIO
Gosub Sendbyte                                   ' Отправка считанного состояния PIO мастеру

Return

'======================================================
' Прием состояния PIO от мастера (команда Channel Access Write)
Write_PIO:

Gosub Readbyte                                   ' Принимаем байт нового состояния
pio = Bytedat
Gosub Readbyte                                   ' Принимаем инвертированный байт состояния
invpio = Bytedat

invpio = Not invpio

Bytedat = &HAA                                     ' Отправляем мастеру
Gosub Sendbyte                                   ' подтверждение приема

If pio = invpio Then                               ' Если прием правильный, то:
      PORTB = pio                                   ' - передаем в порт новое значение PIO
      PORTC.0 = 0                                  ' - выставляем сигнал STRB
End If

Bytedat = pio                                         ' Отправляем мастеру
Gosub Sendbyte                                  ' значение принятого состояния PIO

Waitus Owstrobe
PORTC.0 = 1                                        ' Убираем сигнал STRB

Return

'======================================================
' Прием байта от мастера
Readbyte:
For A = 0 To 7

L11:
    sbis pinC, dqpin
    rjmp L11
L12:
    sbic pinC, dqpin
    rjmp L12
         Timer = 256 - T1reset
         Start Timer0

         Rotate Bytedat , Right
         Waitus Owstrobe

         Bytedat.7 = PINC.dqpin

Next A
Stop Timer0
Return

'======================================================
' Передача байта мастеру
Sendbyte:
For A = 0 To 7

L21:
    sbis pinC, dqpin
    rjmp L21
L22:
    sbic pinC, dqpin
    rjmp L22
Timer = 256 - T1reset
Start Timer0

If Bytedat.0 = 0 Then DDRC.dqpin = Opin
Waitus Owdata
DDRC.dqpin = Ipin

Rotate Bytedat , Right

Next A
Stop Timer0
Return

'======================================================
Sendrom:
For A = 1 To 8
      Bytedat = Myrom(A)
For B = 0 To 7
'----------------------------
Sendcbit1:

L31:
    sbis pinC, dqpin
    rjmp L31
L32:
    sbic pinC, dqpin
    rjmp L32

           If Bytedat.0 = 0 Then DDRC.dqpin = Opin
           Waitus Owdata
           DDRC.dqpin = Ipin
'----------------------------
Sendcbit2:

L41:
    sbis pinC, dqpin
    rjmp L41
L42:
    sbic pinC, dqpin
    rjmp L42

           If Bytedat.0 = 1 Then DDRC.dqpin = Opin
           Waitus Owdata
           DDRC.dqpin = Ipin
'--------------------------
Readcbit:

L51:
    sbis pinC, dqpin
    rjmp L51
L52:
    sbic pinC, dqpin
    rjmp L52

Waitus Owstrobe

Bitdat.0 = PINC.dqpin
If Bitdat.0 <> Bytedat.0 Then Goto Mainloop
Rotate Bytedat , Right
Next B
Next A

Goto Readb

'======================================================

MyID:
Data &HF0 , &H24 , &H08 , &H01 , &H00 , &H00 , &H00 , &H9F

Отредактировано Nord (2018-12-04 19:48:28)

0

Похожие темы


Вы здесь » Программирование ATMEL в BASCOM. » Исходники » Эмуляция 1-Wire устройства