Страница 1 из 1
Соединение двух МEGA по UART(USART)
Добавлено: Вт фев 22, 2011 17:40:15
AleksanderG
Мне необходимо обеденить две меги (например 32 и

. Другие шины пока не интересуют, по той причине что в дальнейшем
буду применять радиоудленитель RS232, имеющейся у меня в наличии. В программировании я пока новичек и написать прогу
обмена, а конкретно 32 мега должна читать переменные из меги 8, которые в 32 меге будут выполнять соответствующие действия
согласно программе которую пишу. Интересует сам код который необходимо для обмена конкретно для 32 меге и отдельно для 8 меге.
Пока не могу понять каким образом переменную из буфера 8 меги передать в буфер 32 меги. Работаю компилятором BASCOM, но и на Ассемблере тоже подойдет.
Re: Соединение двух МEGA по UART(USART)
Добавлено: Вт фев 22, 2011 22:39:12
Jack_A
Для начала нужно определиться с протоколом. Кто будет ведущим, кто ведомым - или попеременно ? В каком формате передавать данные ? Не обязательно углубляться в недра стандартных протоколов, нужно соглашение, которое бы однозначно понималось на обоих концах линии. А уж физическая реализация ненамного отличается у обоих Мег. Переменную передать нельзя, можно передать значение переменной ( переменных ) в виде последовательности байт - сообщения ( пакета ) .
Для конкретного совета, кроме общих мест, нехватает информации. Нужно соединить 2 Меги? Что тут можно посоветовать ? -- соединяй, не возражаю

Re: Соединение двух МEGA по UART(USART)
Добавлено: Ср фев 23, 2011 10:05:29
AleksanderG
Jack_A спасибо за ответ. Буду пробывать ваять. А вообще хочется что-бы ведущим был 32 мега и чтобы была возможность чтение и запись с каждой стороны.
Re: Соединение двух МEGA по UART(USART)
Добавлено: Ср фев 23, 2011 11:48:39
Jack_A
AleksanderG писал(а): А вообще хочется что-бы ведущим был 32 мега и чтобы была возможность чтение и запись с каждой стороны.
Одно другому не мешает. Ведущий может предать ведомому команду с ( без ) данными, а может и затребовать : а передай-ка ты, товарисч, свои данные из блока N 5. Главное - алгоритм работы всего устройства. Если ведущему требуются данные в определенный момент времени, он запрашивает их у ведомого, а тот терпеливо ждет запроса, при необходимости обновляя информацию у себя в мозгах, если по алгоритму нужна самая "свежая" информация. Может быть обратная ситуация : ведущий настраивает прерывание на ввод и занимается своими делами, периодически посматривая на флажок : пришли данные или нет.
Если надо, могу кинуть пример реализации - не догма, но связь, устойчиво работающаяя в десятках моих поделок.
Re: Соединение двух МEGA по UART(USART)
Добавлено: Ср фев 23, 2011 12:37:22
AleksanderG
Jack_A покажи пожалуста пример.
Re: Соединение двух МEGA по UART(USART)
Добавлено: Вс фев 27, 2011 20:05:41
Jack_A
Если вопрос еще актуальный, то уже освободился от текучки и могу пример закинуть.
Re: Соединение двух МEGA по UART(USART)
Добавлено: Пн фев 28, 2011 09:04:00
AleksanderG
Jack_A спасибо за ответ. Сейчас сам разбираьсь с кодом. Думаю на этой недели выдать на гора. Посмотрим и обсудим мой вариант. Но тем неменее если можно выложи свой вариант
для познания.
Re: Соединение двух МEGA по UART(USART)
Добавлено: Пн фев 28, 2011 13:52:31
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
Re: Соединение двух МEGA по UART(USART)
Добавлено: Ср мар 02, 2011 16:54:13
Jack_A
Положил файл на свой обменник : нужно зайти на сайт tut.by а на нем в ящик cat_murzik, пароль MYAU43. В теме UART.
Re: Соединение двух МEGA по UART(USART)
Добавлено: Ср мар 02, 2011 17:18:07
AleksanderG
Jack_A сайт нашел, но как найти cat_murzik, пароль MYAU43. В теме UART я не пойму.
Может быть каким нибудь вариантом попроще -
agor1956@mail.ru
Re: Соединение двух МEGA по UART(USART)
Добавлено: Ср мар 02, 2011 23:18:04
Jack_A
Отправил.
Re: Соединение двух МEGA по UART(USART)
Добавлено: Чт мар 03, 2011 09:32:18
AleksanderG
Jack_A почту получил. Спасибо. Буду разбираться.
Re: Соединение двух МEGA по UART(USART)
Добавлено: Пн мар 07, 2011 10:40:47
svd71
AleksanderG писал(а):Мне необходимо обеденить две меги (например 32 и

. Другие шины пока не интересуют, по той причине что в дальнейшем
буду применять радиоудленитель RS232, имеющейся у меня в наличии. В программировании я пока новичек и написать прогу
обмена, а конкретно 32 мега должна читать переменные из меги 8, которые в 32 меге будут выполнять соответствующие действия
согласно программе которую пишу. Интересует сам код который необходимо для обмена конкретно для 32 меге и отдельно для 8 меге.
Пока не могу понять каким образом переменную из буфера 8 меги передать в буфер 32 меги. Работаю компилятором BASCOM, но и на Ассемблере тоже подойдет.
Подилитесь мыслами, как вы хототе соединить две меги + rs232, когда их невозможно соединять параллельно ? вроде по даташиту у меги32 только один порт.
Re: Соединение двух МEGA по UART(USART)
Добавлено: Пн мар 07, 2011 17:05:50
AleksanderG
Соединение MEGA8 c MEGA32 - RS232(UART).