Мне необходимо обеденить две меги (например 32 и . Другие шины пока не интересуют, по той причине что в дальнейшем
буду применять радиоудленитель RS232, имеющейся у меня в наличии. В программировании я пока новичек и написать прогу
обмена, а конкретно 32 мега должна читать переменные из меги 8, которые в 32 меге будут выполнять соответствующие действия
согласно программе которую пишу. Интересует сам код который необходимо для обмена конкретно для 32 меге и отдельно для 8 меге.
Пока не могу понять каким образом переменную из буфера 8 меги передать в буфер 32 меги. Работаю компилятором BASCOM, но и на Ассемблере тоже подойдет.
Для начала нужно определиться с протоколом. Кто будет ведущим, кто ведомым - или попеременно ? В каком формате передавать данные ? Не обязательно углубляться в недра стандартных протоколов, нужно соглашение, которое бы однозначно понималось на обоих концах линии. А уж физическая реализация ненамного отличается у обоих Мег. Переменную передать нельзя, можно передать значение переменной ( переменных ) в виде последовательности байт - сообщения ( пакета ) .
Для конкретного совета, кроме общих мест, нехватает информации. Нужно соединить 2 Меги? Что тут можно посоветовать ? -- соединяй, не возражаю
AleksanderG писал(а): А вообще хочется что-бы ведущим был 32 мега и чтобы была возможность чтение и запись с каждой стороны.
Одно другому не мешает. Ведущий может предать ведомому команду с ( без ) данными, а может и затребовать : а передай-ка ты, товарисч, свои данные из блока N 5. Главное - алгоритм работы всего устройства. Если ведущему требуются данные в определенный момент времени, он запрашивает их у ведомого, а тот терпеливо ждет запроса, при необходимости обновляя информацию у себя в мозгах, если по алгоритму нужна самая "свежая" информация. Может быть обратная ситуация : ведущий настраивает прерывание на ввод и занимается своими делами, периодически посматривая на флажок : пришли данные или нет.
Если надо, могу кинуть пример реализации - не догма, но связь, устойчиво работающаяя в десятках моих поделок.
Jack_A спасибо за ответ. Сейчас сам разбираьсь с кодом. Думаю на этой недели выдать на гора. Посмотрим и обсудим мой вариант. Но тем неменее если можно выложи свой вариант
для познания.
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 'Прием значений температуры
' назначение векторов прерывания
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
AleksanderG писал(а):Мне необходимо обеденить две меги (например 32 и . Другие шины пока не интересуют, по той причине что в дальнейшем
буду применять радиоудленитель RS232, имеющейся у меня в наличии. В программировании я пока новичек и написать прогу
обмена, а конкретно 32 мега должна читать переменные из меги 8, которые в 32 меге будут выполнять соответствующие действия
согласно программе которую пишу. Интересует сам код который необходимо для обмена конкретно для 32 меге и отдельно для 8 меге.
Пока не могу понять каким образом переменную из буфера 8 меги передать в буфер 32 меги. Работаю компилятором BASCOM, но и на Ассемблере тоже подойдет.
Подилитесь мыслами, как вы хототе соединить две меги + rs232, когда их невозможно соединять параллельно ? вроде по даташиту у меги32 только один порт.