Мост UART-UDP — различия между версиями

Материал из roboforum.ru Wiki
Перейти к: навигация, поиск
(Новая: '''Мост UART-UDP''')
 
 
(не показаны 3 промежуточные версии 1 участника)
Строка 1: Строка 1:
 
'''Мост UART-UDP'''
 
'''Мост UART-UDP'''
 +
 +
Здесь рассмотрен проект на BASCOM-AVR ethernet контроллера на чипе RTL8019 и микроконтроллере AVR Atmega32. Все инструкции приведены в пошаговом режиме, от простого к сложному.
 +
 +
Все исходные коды примеров могут быть откомпилированы в BASCOM-AVR.
 +
 +
Используется внешний кварцевый резонатор.
 +
 +
 +
Шаг 1.
 +
 +
В Atmega32 есть несколько FUSE-битов, которые требуется правильно установить:
 +
 +
<source lang="vb">
 +
' Fusebits:
 +
' A987:1111 = Crystal/Boden enabled
 +
' H: 1 = JTAG disabled
 +
' G: 0 = Preserve EEprom when chip erase
 +
</source>
 +
 +
В Bascom-AVR в свойствах проекта на вкладке Compiller задать Hardware stack, Soft stack и Framesize по 64 байта.
 +
 +
====Рисунок 1.====
 +
 +
<source lang="vb">
 +
' Hardware:
 +
'
 +
' PA0 - SD0 - Databus
 +
' PA1 - SD1
 +
' PA2 - SD2
 +
' PA3 - SD3
 +
' PA4 - SD4
 +
' PA5 - SD5
 +
' PA6 - SD6
 +
' PA7 - SD7
 +
 +
' PB0 - SA0 - Addressbus
 +
' PB1 - SA1
 +
' PB2 - SA2
 +
' PB3 - SA3
 +
' PB4 - SA4
 +
' PB5 - MOSI
 +
' PB6 - MISO
 +
' PB7 - SCK
 +
 +
' PC0 - I2c SLC
 +
' PC1 - I2c SDA
 +
' PC2 - PC2
 +
' PC3 - PC3
 +
' PC4 - PC4
 +
' PC5 - PC5
 +
' PC6 - PC6
 +
' PC7 - PC7
 +
 +
' PD0 - RXD
 +
' PD1 - TXD
 +
' PD2 - INT0
 +
' PD3 - LE - Latch Enable
 +
' PD4 - RSTDRV
 +
' PD5 - EEDO
 +
' PD6 - IORB
 +
' PD7 - IOWB
 +
 +
$crystal = 7372800
 +
$regfile = "M32def.dat"
 +
$baud = 57600
 +
 +
const debug = 1
 +
 +
#if debug = 1
 +
print "Hello world"
 +
#endif
 +
 +
end
 +
</source>
 +
 +
$crystal - частота кварца, задается для получения требуемых задержек в циклах.В данном проекте использован кварц на 7.372.800 МГц.
 +
 +
$regfile - включение описания контроллера в программу.
 +
 +
$baud - частота UART
 +
 +
Директивы #if debug = 1 ... #endif служат для отладки проекта и при значении debug=1 включают секцию кода между ними.
 +
 +
Скомпилируйте программу и запрограммируйте чип. Подключив чип к COM порту компьютера (57600 бод, 8 бит, нет контроля четности), видим в программе Hyper Terminal "Hello world".
 +
 +
 +
Шаг 2. Настройка портов.
 +
 +
Поместите следующий код перед директивой end.
 +
 +
<source lang="vb">
 +
'====Настройка портов МК===
 +
'порт данных будет занимать весь Porta
 +
Databus Alias Porta
 +
_databus Alias Pina
 +
Rtldata Alias Porta
 +
Databus_ddr Alias Ddra
 +
 +
'а порт адреса - весь Portb
 +
Addrbus Alias Portb
 +
Addrbus_ddr Alias Ddrb
 +
 +
'
 +
Resetport Alias Portd
 +
Ior_pin Alias Portd.6
 +
Iow_pin Alias Portd.7
 +
Resetport_ddr Alias Ddrd
 +
 +
Inputport1 Alias Pinc
 +
Inputport2 Alias Portc
 +
 +
Latch Alias Portd.3
 +
Resetport_ddr = &HF8 ' leave RXD and TXD  11111000 
 +
</source>
 +
 +
Шаг 3. Написание процедур ввода-вывода для RTL8039
 +
Нам потребуется две процедуры:для приема данных от RTL8039 - Read_rtl8019as и для передачи данных Write_rtl8019as.
 +
 +
Сначала мы должны объявить эти процедуры в начале программы, сразу после задания скорости UART нужно вставить следующий код:
 +
 +
<source lang="vb">
 +
Dim Regaddr as byte
 +
Dim Regdata as byte
 +
Dim Byte_read as byte
 +
 +
Declare Sub Write_rtl8019as(byval Regaddr as Byte, Byval Regdata as Byte)
 +
Declare Sub Read_rtl8019as(byval Regaddr as byte)
 +
</source>
 +
 +
Теперь рассмотрим процедуры чтения-записи в RTL8039.
 +
 +
<source lang="vb">
 +
'==========================================
 +
' ПРОЦЕДУРА ЧТЕНИЯ РЕГИСТРА RTL
 +
'==========================================
 +
Sub Read_rtl8019as(regaddr)
 +
'переводим шину данных на чтение и включаем под. резисторы
 +
Databus_ddr = &H00
 +
Databus = &HFF
 +
'выставляем на шину адреса адрес, по которому считываем данные
 +
Addrbus = Regaddr
 +
'инициируем операцию чтения данных
 +
Reset Ior_pin                                              'инициируем операцию чтения данных
 +
nop
 +
'чтиаем данные из буфера RTL
 +
Byte_read = Pina
 +
nop
 +
'завершение операции чтения
 +
Set Ior_pin
 +
nop
 +
End Sub
 +
</source>
 +
 +
В данной процедуре мы настраиваем шину данных, выставляем на шину адреса адрес считываемого регистра, устанавливаем строб чтения IOR_PIN и считываем данные из RTL.
 +
 +
<source lang="vb">
 +
'==========================================
 +
' ПРОЦЕДУРА ЗАПИСИ РЕГИСТРА RTL
 +
'==========================================
 +
Sub Write_rtl8019as(regaddr , Regdata)
 +
'выставляем на шину адреса адрес, по которому записываем данные
 +
Addrbus = Regaddr
 +
'переводим шину данных на запись и выставляем на нее данные
 +
Databus = Regdata
 +
Databus_ddr  = &HFF
 +
nop
 +
'инициируем операцию записи данных
 +
Reset Iow_pin
 +
nop
 +
'завершение операции записи
 +
Set Iow_pin
 +
nop
 +
'снова переводим шину данных на чтение и включаем под. резисторы
 +
Databus_ddr = &H00
 +
Databus = &HFF
 +
End Sub
 +
</source>
 +
 +
В данной процедуре мы настраиваем шину данных, выставляем на шину адреса адрес считываемого регистра, устанавливаем строб записи IOW_PIN. Затем снова переводим шину данных на чтение.
 +
 +
На этом шаге программный код должен компилироваться без ошибок. Программа так же выдает в UART Hello world. На подключенной RTL8019as зеленый и желтый светодиоды должны гореть.
 +
 +
Шаг 4. Инициализация RTL8019as
 +
 +
Напишим процедуру инициализации Init_rtl8019as, которая будет пользоваться двумя предыдущими процедурами ввода-вывода.
 +
 +
Добавим в секцию инициализации строку:
 +
<source lang="vb">
 +
Declare Sub Init_rtl8019as
 +
</source>
 +
 +
В секцию определения констант добавим:
 +
 +
<source lang="vb">
 +
Const Rstport = &H18
 +
Const Isr = &H07
 +
Const Msg_initfail = "Init failed"
 +
Const Cr =&H00
 +
Const Dcrval = &H58
 +
Const Dcr = &H0E
 +
Const Rbcr0 = &H0A
 +
Const Rbcr1 = &H0B
 +
Const Rcr = &H0C
 +
Const Tpsr = &H04
 +
Const Txtstart = &H40
 +
Const Tcr = &h0D
 +
Const Pstart = &h01
 +
Const Rxstart = &H46
 +
Const Bnry = &H03
 +
Const Pstop = &H02
 +
Const Rxstop = &H60
 +
Const Curr = &H07
 +
 +
Const Imr = &H0F
 +
Const Imrval = &H11
 +
Const Tcrval = &H00
 +
</source>
 +
 +
В секцию кода вставим код собственно функции инициализации:
 +
 +
============================
 +
============================
 +
Пока MAC-flhtc не столь важен для нас, но все же приведем инициализацию массива, которую нужно будет вставить в код позже.
 +
<source lang="vb">
 +
Mymac(1) = 00
 +
Mymac(2) = 10
 +
Mymac(3) = 20
 +
Mymac(4) = 30
 +
Mymac(5) = 40
 +
Mymac(6) = 50
 +
</source>
 +
 +
 +
Шаг 5. Проверка RTL
 +
 +
Подсоединим сетевой кабель к RTL.
 +
 +
Добавим несколько строк кода чтобы следить за реакцией от RTL. Создадим обработчик прерывания, который будет вызываться каждый раз когда приходит пакет из сети. Для начала активируем прерывание в главной секции программы:
 +
 +
<source lang="vb">
 +
'инициализация RTL
 +
Call init_rtl8019as
 +
'разрешаем прерывания
 +
Enable Interrupts
 +
'разрешаем INT0
 +
Enable Int0
 +
 +
'по указанному прерыванию выполнить функцию
 +
On Int0 Rtl8019as_interrupt
 +
'start the NIC
 +
Call Write_rtl8019as(cr , &H22)
 +
'главный цикл
 +
Do
 +
Loop
 +
end
 +
</source>
 +
 +
В секции подпрограмм вставить обработчик прерывания:
 +
 +
<source lang="vb">
 +
Rtl8019as_interrupt:
 +
    Print "Interrupt from RTL8019as"
 +
    'Обнуляем биты прерывания в RTL
 +
    Call Write_rtl8019as(isr , &HFF)
 +
    'снова запускаем RTL
 +
    Call Write_rtl8019as(cr, &H22)
 +
Return
 +
</source>
 +
 +
Все, после компилляции на UART будет выдаваться сообщение из обработчика при каждом принятом пакете, а желтый светодиод будет мигать.

Текущая версия на 16:33, 2 июля 2008

Мост UART-UDP

Здесь рассмотрен проект на BASCOM-AVR ethernet контроллера на чипе RTL8019 и микроконтроллере AVR Atmega32. Все инструкции приведены в пошаговом режиме, от простого к сложному.

Все исходные коды примеров могут быть откомпилированы в BASCOM-AVR.

Используется внешний кварцевый резонатор.


Шаг 1.

В Atmega32 есть несколько FUSE-битов, которые требуется правильно установить:

<source lang="vb"> ' Fusebits: ' A987:1111 = Crystal/Boden enabled ' H: 1 = JTAG disabled ' G: 0 = Preserve EEprom when chip erase </source>

В Bascom-AVR в свойствах проекта на вкладке Compiller задать Hardware stack, Soft stack и Framesize по 64 байта.

Рисунок 1.

<source lang="vb"> ' Hardware: ' ' PA0 - SD0 - Databus ' PA1 - SD1 ' PA2 - SD2 ' PA3 - SD3 ' PA4 - SD4 ' PA5 - SD5 ' PA6 - SD6 ' PA7 - SD7

' PB0 - SA0 - Addressbus ' PB1 - SA1 ' PB2 - SA2 ' PB3 - SA3 ' PB4 - SA4 ' PB5 - MOSI ' PB6 - MISO ' PB7 - SCK

' PC0 - I2c SLC ' PC1 - I2c SDA ' PC2 - PC2 ' PC3 - PC3 ' PC4 - PC4 ' PC5 - PC5 ' PC6 - PC6 ' PC7 - PC7

' PD0 - RXD ' PD1 - TXD ' PD2 - INT0 ' PD3 - LE - Latch Enable ' PD4 - RSTDRV ' PD5 - EEDO ' PD6 - IORB ' PD7 - IOWB

$crystal = 7372800 $regfile = "M32def.dat" $baud = 57600

const debug = 1

  1. if debug = 1

print "Hello world"

  1. endif

end </source>

$crystal - частота кварца, задается для получения требуемых задержек в циклах.В данном проекте использован кварц на 7.372.800 МГц.

$regfile - включение описания контроллера в программу.

$baud - частота UART

Директивы #if debug = 1 ... #endif служат для отладки проекта и при значении debug=1 включают секцию кода между ними.

Скомпилируйте программу и запрограммируйте чип. Подключив чип к COM порту компьютера (57600 бод, 8 бит, нет контроля четности), видим в программе Hyper Terminal "Hello world".


Шаг 2. Настройка портов.

Поместите следующий код перед директивой end.

<source lang="vb"> '====Настройка портов МК=== 'порт данных будет занимать весь Porta Databus Alias Porta _databus Alias Pina Rtldata Alias Porta Databus_ddr Alias Ddra

'а порт адреса - весь Portb Addrbus Alias Portb Addrbus_ddr Alias Ddrb

' Resetport Alias Portd Ior_pin Alias Portd.6 Iow_pin Alias Portd.7 Resetport_ddr Alias Ddrd

Inputport1 Alias Pinc Inputport2 Alias Portc

Latch Alias Portd.3 Resetport_ddr = &HF8 ' leave RXD and TXD 11111000 </source>

Шаг 3. Написание процедур ввода-вывода для RTL8039 Нам потребуется две процедуры:для приема данных от RTL8039 - Read_rtl8019as и для передачи данных Write_rtl8019as.

Сначала мы должны объявить эти процедуры в начале программы, сразу после задания скорости UART нужно вставить следующий код:

<source lang="vb"> Dim Regaddr as byte Dim Regdata as byte Dim Byte_read as byte

Declare Sub Write_rtl8019as(byval Regaddr as Byte, Byval Regdata as Byte) Declare Sub Read_rtl8019as(byval Regaddr as byte) </source>

Теперь рассмотрим процедуры чтения-записи в RTL8039.

<source lang="vb"> '========================================== ' ПРОЦЕДУРА ЧТЕНИЯ РЕГИСТРА RTL '========================================== Sub Read_rtl8019as(regaddr) 'переводим шину данных на чтение и включаем под. резисторы Databus_ddr = &H00 Databus = &HFF 'выставляем на шину адреса адрес, по которому считываем данные Addrbus = Regaddr 'инициируем операцию чтения данных Reset Ior_pin 'инициируем операцию чтения данных nop 'чтиаем данные из буфера RTL Byte_read = Pina nop 'завершение операции чтения Set Ior_pin nop End Sub </source>

В данной процедуре мы настраиваем шину данных, выставляем на шину адреса адрес считываемого регистра, устанавливаем строб чтения IOR_PIN и считываем данные из RTL.

<source lang="vb"> '========================================== ' ПРОЦЕДУРА ЗАПИСИ РЕГИСТРА RTL '========================================== Sub Write_rtl8019as(regaddr , Regdata) 'выставляем на шину адреса адрес, по которому записываем данные Addrbus = Regaddr 'переводим шину данных на запись и выставляем на нее данные Databus = Regdata Databus_ddr = &HFF nop 'инициируем операцию записи данных Reset Iow_pin nop 'завершение операции записи Set Iow_pin nop 'снова переводим шину данных на чтение и включаем под. резисторы Databus_ddr = &H00 Databus = &HFF End Sub </source>

В данной процедуре мы настраиваем шину данных, выставляем на шину адреса адрес считываемого регистра, устанавливаем строб записи IOW_PIN. Затем снова переводим шину данных на чтение.

На этом шаге программный код должен компилироваться без ошибок. Программа так же выдает в UART Hello world. На подключенной RTL8019as зеленый и желтый светодиоды должны гореть.

Шаг 4. Инициализация RTL8019as

Напишим процедуру инициализации Init_rtl8019as, которая будет пользоваться двумя предыдущими процедурами ввода-вывода.

Добавим в секцию инициализации строку: <source lang="vb"> Declare Sub Init_rtl8019as </source>

В секцию определения констант добавим:

<source lang="vb"> Const Rstport = &H18 Const Isr = &H07 Const Msg_initfail = "Init failed" Const Cr =&H00 Const Dcrval = &H58 Const Dcr = &H0E Const Rbcr0 = &H0A Const Rbcr1 = &H0B Const Rcr = &H0C Const Tpsr = &H04 Const Txtstart = &H40 Const Tcr = &h0D Const Pstart = &h01 Const Rxstart = &H46 Const Bnry = &H03 Const Pstop = &H02 Const Rxstop = &H60 Const Curr = &H07

Const Imr = &H0F Const Imrval = &H11 Const Tcrval = &H00 </source>

В секцию кода вставим код собственно функции инициализации:

================
================

Пока MAC-flhtc не столь важен для нас, но все же приведем инициализацию массива, которую нужно будет вставить в код позже. <source lang="vb"> Mymac(1) = 00 Mymac(2) = 10 Mymac(3) = 20 Mymac(4) = 30 Mymac(5) = 40 Mymac(6) = 50 </source>


Шаг 5. Проверка RTL

Подсоединим сетевой кабель к RTL.

Добавим несколько строк кода чтобы следить за реакцией от RTL. Создадим обработчик прерывания, который будет вызываться каждый раз когда приходит пакет из сети. Для начала активируем прерывание в главной секции программы:

<source lang="vb"> 'инициализация RTL Call init_rtl8019as 'разрешаем прерывания Enable Interrupts 'разрешаем INT0 Enable Int0

'по указанному прерыванию выполнить функцию On Int0 Rtl8019as_interrupt 'start the NIC Call Write_rtl8019as(cr , &H22) 'главный цикл Do Loop end </source>

В секции подпрограмм вставить обработчик прерывания:

<source lang="vb"> Rtl8019as_interrupt:

   Print "Interrupt from RTL8019as"
   'Обнуляем биты прерывания в RTL
   Call Write_rtl8019as(isr , &HFF)
   'снова запускаем RTL
   Call Write_rtl8019as(cr, &H22)

Return </source>

Все, после компилляции на UART будет выдаваться сообщение из обработчика при каждом принятом пакете, а желтый светодиод будет мигать.