Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Соединение двух МEGA по UART(USART)


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

Сообщений 1 страница 7 из 7

1

Мне необходимо обеденить две меги (например 32 и 8). Другие шины пока не интересуют, по той причине что в дальнейшем
буду применять радиоудленитель RS232, имеющейся у меня в наличии. В программировании я пока новичек и написать прогу
обмена, а конкретно 32 мега должна читать переменные из меги 8, которые в 32 меге будут выполнять соответствующие действия
согласно программе которую пишу. Интересует сам код  который необходимо для обмена конкретно для 32 меге и отдельно для 8 меге.
Пока не могу понять каким образом переменную из буфера 8 меги передать в буфер 32 меги.

0

2

когдато тоже возился с таким )) сейчас то вожусь только с TCP передачей ... конкретно код не думаю что мега 8 от 32 чем то отличится может (не функционал) можно написать один код и туда и туда просто как будет работать устройства?
только одно передает другое только принимает или в две стороны , сколько будет устройств .1,2,3..  ну и сам протокол.. Я применял HART протокол немного урезал так как у меня только одно ведушее устр. думаю тебе он тоже пойдет... если чего пиши в личку...

0

3

на передающей стороне командой print отправляешь нужные данные, а со стороны приемника смотришь что пришло по uart (командой input).

***со стороны передатчика***
print X    ' отправили значение переменной Х

***со стороны приемника организовываешь прерывание от UART, где смотришь что пришло***
input X
а дальше делаешь с этим Х что хочешь.

вот гляньтут

-1

4

да.... но желательно к X переменной CRC проверку прикрутить бо иногда можешь получить не то что хотел бы тем более это радио модемы..))

-1

5

Ребята я вот попытался нарисовать такой код. Это по теме которую я и создал. Давайте вместе посмотрим, думаю
что наверняка что-нибудь накосячил, не ругайте очень а подскажите если что не так, я только учусь.Итак --------

МЕГА 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

0

6

a зачем такая вермешель васика с ассемблером? хочешь в коде выиграть... так код и так мизер..

0

7

набросал ... опрашивать можешь любое кол. датчиков отправляешь dat1.....dat N  получаешь значение  с проверкой CRC...

Код:
...
....
On Urxc Priem
Enable Interrupts
Enable Urxc
...
...


Main:
Do
...
измеряем темпер. 
...
If B > 0 Then 
     If CRC = CRC1 then Goto Komand
end if
end if
Loop

Komand:

'** Команды датчиков **

If Data = "dat1" Then
  Cod = Temper2
  Gosub Send
End If

If Data = "dat2" Then
  Cod = Temper1 
  Gosub Send
End If
...
..
...
Enable Urxc
B = 0
Goto Main




'-----------------------прием данных 8 байт------------------------------
Priem:
Disable Urxc
       Input Cod Noecho
       CRC = Right(cod , 4)
       Data = Left(cod , 4)
       Lenn = Len(Data)
       CRC1 = Hex(crc16uni(Data , Lenn , 0 , &H1021 , 0 , 0))
Return

'-----------------------отправка данных------------------------------
Send:
Lenn = Len(cod)
Crc = Hex(crc16uni(cod , Lenn , 0 , &H1021 , 0 , 0))
Cod = Cod + Crc
Print Cod 
Return
End

0


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Соединение двух МEGA по UART(USART)