Мост UART-UDP — различия между версиями
Malvin (обсуждение | вклад) |
EdGull (обсуждение | вклад) |
||
(не показаны 2 промежуточные версии 1 участника) | |||
Строка 1: | Строка 1: | ||
'''Мост UART-UDP''' | '''Мост UART-UDP''' | ||
− | Здесь рассмотрен проект на BASCOM-AVR ethernet контроллера на чипе | + | Здесь рассмотрен проект на BASCOM-AVR ethernet контроллера на чипе RTL8019 и микроконтроллере AVR Atmega32. Все инструкции приведены в пошаговом режиме, от простого к сложному. |
Все исходные коды примеров могут быть откомпилированы в BASCOM-AVR. | Все исходные коды примеров могут быть откомпилированы в BASCOM-AVR. | ||
Строка 84: | Строка 84: | ||
Скомпилируйте программу и запрограммируйте чип. Подключив чип к COM порту компьютера (57600 бод, 8 бит, нет контроля четности), видим в программе Hyper Terminal "Hello world". | Скомпилируйте программу и запрограммируйте чип. Подключив чип к 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
- 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 будет выдаваться сообщение из обработчика при каждом принятом пакете, а желтый светодиод будет мигать.