Мост UART-UDP

Материал из roboforum.ru Wiki

Перейти к: навигация, поиск

Мост UART-UDP

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

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

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


Шаг 1.

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

' Fusebits:
' A987:1111 = Crystal/Boden enabled
' H: 1 = JTAG disabled
' G: 0 = Preserve EEprom when chip erase

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

Рисунок 1.

' 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

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

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

$baud - частота UART

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

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


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

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

'====Настройка портов МК===
'порт данных будет занимать весь 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

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

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

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)

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

'==========================================
' ПРОЦЕДУРА ЧТЕНИЯ РЕГИСТРА 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

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

'==========================================
' ПРОЦЕДУРА ЗАПИСИ РЕГИСТРА 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

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

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

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

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

Добавим в секцию инициализации строку:

Declare Sub Init_rtl8019as

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

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

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

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

Пока MAC-flhtc не столь важен для нас, но все же приведем инициализацию массива, которую нужно будет вставить в код позже.

Mymac(1) = 00
Mymac(2) = 10
Mymac(3) = 20
Mymac(4) = 30
Mymac(5) = 40
Mymac(6) = 50


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

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

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

'инициализация RTL
Call init_rtl8019as
'разрешаем прерывания
Enable Interrupts
'разрешаем INT0
Enable Int0
 
'по указанному прерыванию выполнить функцию
On Int0 Rtl8019as_interrupt
'start the NIC
Call Write_rtl8019as(cr , &H22)
'главный цикл
Do
Loop
end

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

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

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