Соединение двух МEGA по UART(USART)

Обсуждаем цифровые устройства...
Ответить
AleksanderG
Родился
Сообщения: 18
Зарегистрирован: Пт фев 04, 2011 11:42:18

Соединение двух МEGA по UART(USART)

Сообщение AleksanderG »

Мне необходимо обеденить две меги (например 32 и 8). Другие шины пока не интересуют, по той причине что в дальнейшем
буду применять радиоудленитель RS232, имеющейся у меня в наличии. В программировании я пока новичек и написать прогу
обмена, а конкретно 32 мега должна читать переменные из меги 8, которые в 32 меге будут выполнять соответствующие действия
согласно программе которую пишу. Интересует сам код который необходимо для обмена конкретно для 32 меге и отдельно для 8 меге.
Пока не могу понять каким образом переменную из буфера 8 меги передать в буфер 32 меги. Работаю компилятором BASCOM, но и на Ассемблере тоже подойдет.
Реклама
Аватара пользователя
Jack_A
Друг Кота
Сообщения: 6312
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Re: Соединение двух МEGA по UART(USART)

Сообщение Jack_A »

Для начала нужно определиться с протоколом. Кто будет ведущим, кто ведомым - или попеременно ? В каком формате передавать данные ? Не обязательно углубляться в недра стандартных протоколов, нужно соглашение, которое бы однозначно понималось на обоих концах линии. А уж физическая реализация ненамного отличается у обоих Мег. Переменную передать нельзя, можно передать значение переменной ( переменных ) в виде последовательности байт - сообщения ( пакета ) .
Для конкретного совета, кроме общих мест, нехватает информации. Нужно соединить 2 Меги? Что тут можно посоветовать ? -- соединяй, не возражаю :-)
Реклама
AleksanderG
Родился
Сообщения: 18
Зарегистрирован: Пт фев 04, 2011 11:42:18

Re: Соединение двух МEGA по UART(USART)

Сообщение AleksanderG »

Jack_A спасибо за ответ. Буду пробывать ваять. А вообще хочется что-бы ведущим был 32 мега и чтобы была возможность чтение и запись с каждой стороны.
Аватара пользователя
Jack_A
Друг Кота
Сообщения: 6312
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Re: Соединение двух МEGA по UART(USART)

Сообщение Jack_A »

AleksanderG писал(а): А вообще хочется что-бы ведущим был 32 мега и чтобы была возможность чтение и запись с каждой стороны.
Одно другому не мешает. Ведущий может предать ведомому команду с ( без ) данными, а может и затребовать : а передай-ка ты, товарисч, свои данные из блока N 5. Главное - алгоритм работы всего устройства. Если ведущему требуются данные в определенный момент времени, он запрашивает их у ведомого, а тот терпеливо ждет запроса, при необходимости обновляя информацию у себя в мозгах, если по алгоритму нужна самая "свежая" информация. Может быть обратная ситуация : ведущий настраивает прерывание на ввод и занимается своими делами, периодически посматривая на флажок : пришли данные или нет.

Если надо, могу кинуть пример реализации - не догма, но связь, устойчиво работающаяя в десятках моих поделок.
Реклама
Эиком - электронные компоненты и радиодетали
AleksanderG
Родился
Сообщения: 18
Зарегистрирован: Пт фев 04, 2011 11:42:18

Re: Соединение двух МEGA по UART(USART)

Сообщение AleksanderG »

Jack_A покажи пожалуста пример.
Реклама
Аватара пользователя
Jack_A
Друг Кота
Сообщения: 6312
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Re: Соединение двух МEGA по UART(USART)

Сообщение Jack_A »

Если вопрос еще актуальный, то уже освободился от текучки и могу пример закинуть.
Реклама
AleksanderG
Родился
Сообщения: 18
Зарегистрирован: Пт фев 04, 2011 11:42:18

Re: Соединение двух МEGA по UART(USART)

Сообщение AleksanderG »

Jack_A спасибо за ответ. Сейчас сам разбираьсь с кодом. Думаю на этой недели выдать на гора. Посмотрим и обсудим мой вариант. Но тем неменее если можно выложи свой вариант
для познания.
AleksanderG
Родился
Сообщения: 18
Зарегистрирован: Пт фев 04, 2011 11:42:18

Re: Соединение двух МEGA по UART(USART)

Сообщение AleksanderG »

Jack_A выкладываю свой вариант. МЕГА 32 запршивает МЕГА8 отвечает.
Отдельно код для одного и для другого. Писал на БАСКОМе с вкраплениями Ассемблера.

'Бутет прием от МЕГИ8 значение переменной по температуре и
'передача на LCD WINSTAR - МЕГА32, передача обратно на МЕГА8 будет реализована позже

$regfile = "m32def.dat"

$crystal = 7372800
$hwstack = 40 ' default use 32 for the hardware stack
$swstack = 40 ' default use 10 for the SW stack
$framesize = 40
Config Com1 = 9600 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
'Это конфигурация КОМ порта (Synchrone = 0) - ассинхронный режим,(Clockpol = 0) - полярность клока

$lib "lcd4.lib" 'используем 4-х битное подключение дисплея с помощью альтернативной библиотеки

'
'LCD = ATmega32
'---------------
'Rs = PortB.0
'RW = PortB.1 в данном варианте не используется - просто подключен (так же его можно подключить на землю)
' E = PortB.2
'E2 = PortB.3 данный вывод используется для подключения некоторых дисплеев с двумя чипами (здесь не используется)
'Db4 = PortB.4
'Db5 = PortB.5
'Db6 = PortB.6
'Db7 = PortB.7
Dim A As Word 'Прием значений температуры

'указываем конфигурацию подключения дисплея к портам МК
Config Lcdpin = Pin , Rs = Portb.0 , E = Portb.2 , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7
Config Lcd = 16 * 2

' ......
'---------------------
' UART:
$baud = 9600 'скорость 9.6 кБ
Enable Urxc 'разрешить прерывание приемника UART
Enable Utxc 'разрешить прерывание передатчика UART
Enable Interrupts 'разрешить прерывания

' назначение векторов прерывания
On Urxc Rxd_int Nosave 'вектор прерывания от приемника UART
On Utxc Txd_int Nosave 'вектор прерывания от приемника UART

$asm
' Объявления
.def Temptx = R16 'Рабочий регистр только передача
.def Temprx = R17 'Рабочий регистр только прием


'Инициализация прерывания на прием
Rxd_int:
'Ожидаем пока данные будут получены
sbis UCSRA, RXC
rjmp Rxd_int
in Temprx,UDR 'Принятый байт в Temprx
cbi UCSRA,RXC 'Запрещаем прерывание "прием закончен"
'очищаем бит RXC в регистре UCSRA

'далее анализируем команду, если это не та команда
'опять разрешаем прерывание "прием закончен" и выходим
'из процедуры

sbi UCSRB,RXCIE 'разрешаем прерывание "регистр данных пуст
'устанавливаем бит RXCIE в регистре UCSRB
reti 'Выход из подпрограммы
$end Asm


'Далее у нас почти немедленно возникает прерывание "регистр данных пуст"
'Оброботчик этого прерывания посылает байт, содержащийся в переменной
'Temprx и готовит данные для следующей посылки

$asm
Txd_int:
Out Udr , Temptx 'посылаем байт в Udr
cbi UCR,UDRIE ' запрещаем прерывание "регистр данных пуст"
'очищаем бит UDRIE в регистре UCR

'Готовим данные,следующий байт - в Temptx. Если же был отправлен
'последний нужный байт, то опять разрешаем прерывание
'"прием закончен" и далее выходим из процедур, иначе выполняем
'следующий оператор

sbi UCR,UDRIE 'разрешаем прерывание "регистр данных пуст
'устанавливаем бит UDRIE в регистре UCR
reti 'Выход из подпрограммы
$end Asm

Cls 'команда очистки дисплея
Cursor Off
Do
A = Udr
Lcd "ЁepeгaАa ѕo БёЅe" 'выводим надпись
Lowerline ' переходим на нижнюю строчку
Lcd "Teјѕepaїypa" ; A ; " " 'выводим надпись

Waitms 50


'Обратим внимание на то что после обработки первого прерывания переменная Temptx здесь
'может содержать подготовленный для отправки байт и не должна в промежутках между
'прерываниями использоваться еще где-то. В противном случае подготовленные данные
'необходимо сохранять, например в стеке или отвести для этого специальный регистр
'промежуточного хранения данных.
Loop
End




'Мега8 - работает АЦП и передает данные на Мегу32, пока используем только передачу




$regfile = "m8def.dat"

$crystal = 7372800
$hwstack = 40 ' default use 32 for the hardware stack
$swstack = 40 ' default use 10 for the SW stack
$framesize = 40
Config Com1 = 9600 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
'Это конфигурация КОМ порта (Synchrone = 0) - ассинхронный режим,(Clockpol = 0) - полярность клока

Config Adc = Single , Prescaler = Auto , Reference = Avcc 'конфигурация АЦП

'объявляем переменные
Dim W As Word
Dim A As Word
Start Adc 'запускаем аналого-цифровое преобразование
' ......
'---------------------
' UART:
$baud = 9600 'скорость 9.6 кБ
Enable Urxc 'разрешить прерывание приемника UART
Enable Utxc 'разрешить прерывание передатчика UART
Enable Interrupts 'разрешить прерывания

' назначение векторов прерывания

On Utxc Txd_int Nosave 'вектор прерывания от передатчика UART

$asm
' Объявления
.def Temptx = R16 'Рабочий регистр только передача
.def Temprx = R17 'Рабочий регистр только прием
.def Temp = R18
.def Znatcenie = R19

rjmp Init ' Первая выполняемая программа

' =====
Init:

'Инициализация АЦП
ldi Temp,0b11100011
Out Adcsra , Temp

ldi Temp,0b01100000
Out Admux , Temp

ldi Temp,0b0000000
Out Sfior , Temp
$end Asm
'=====++++++++==========++++++++++=================

Do
$asm
Txd_int: 'Подпрограмма передачи данных
Out Udr , Temptx 'посылаем байт в Udr

sbis ucsra, udre 'Проверяем опустошение сдвигового регистра
rjmp Txd_int 'если не пустой возвращаемся на Txd_int

cbi UCSRB,UDRIE 'Сбрасываем бит UDRIE - Запрещаем прерывание по передачи

in Temptx,ADCH 'Копируем значение из ADCH в Temptx


'Готовим данные,следующий байт - в Temptx. Если же был отправлен
'последний нужный байт, то опять разрешаем прерывание


sbi UCR,UDRIE 'разрешаем прерывание "регистр данных пуст
'устанавливаем бит UDRIE в регистре UCR
ret 'Выход из подпрограммы

$end Asm
Waitms 30
Loop
End
Аватара пользователя
Jack_A
Друг Кота
Сообщения: 6312
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Re: Соединение двух МEGA по UART(USART)

Сообщение Jack_A »

Положил файл на свой обменник : нужно зайти на сайт tut.by а на нем в ящик cat_murzik, пароль MYAU43. В теме UART.
AleksanderG
Родился
Сообщения: 18
Зарегистрирован: Пт фев 04, 2011 11:42:18

Re: Соединение двух МEGA по UART(USART)

Сообщение AleksanderG »

Jack_A сайт нашел, но как найти cat_murzik, пароль MYAU43. В теме UART я не пойму.
Может быть каким нибудь вариантом попроще - agor1956@mail.ru
Аватара пользователя
Jack_A
Друг Кота
Сообщения: 6312
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Re: Соединение двух МEGA по UART(USART)

Сообщение Jack_A »

Отправил.
AleksanderG
Родился
Сообщения: 18
Зарегистрирован: Пт фев 04, 2011 11:42:18

Re: Соединение двух МEGA по UART(USART)

Сообщение AleksanderG »

Jack_A почту получил. Спасибо. Буду разбираться.
svd71
Открыл глаза
Сообщения: 41
Зарегистрирован: Вс фев 06, 2011 16:18:39

Re: Соединение двух МEGA по UART(USART)

Сообщение svd71 »

AleksanderG писал(а):Мне необходимо обеденить две меги (например 32 и 8). Другие шины пока не интересуют, по той причине что в дальнейшем
буду применять радиоудленитель RS232, имеющейся у меня в наличии. В программировании я пока новичек и написать прогу
обмена, а конкретно 32 мега должна читать переменные из меги 8, которые в 32 меге будут выполнять соответствующие действия
согласно программе которую пишу. Интересует сам код который необходимо для обмена конкретно для 32 меге и отдельно для 8 меге.
Пока не могу понять каким образом переменную из буфера 8 меги передать в буфер 32 меги. Работаю компилятором BASCOM, но и на Ассемблере тоже подойдет.
Подилитесь мыслами, как вы хототе соединить две меги + rs232, когда их невозможно соединять параллельно ? вроде по даташиту у меги32 только один порт.
[url=http:///]:-)[/url]
AleksanderG
Родился
Сообщения: 18
Зарегистрирован: Пт фев 04, 2011 11:42:18

Re: Соединение двух МEGA по UART(USART)

Сообщение AleksanderG »

Соединение MEGA8 c MEGA32 - RS232(UART).
Ответить

Вернуться в «Цифровая техника»