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

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

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

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


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Приём и передача двухбайтных чисел по UART!!!


Приём и передача двухбайтных чисел по UART!!!

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

1

Подскажите пожалуйста кто знает, мне нужно принимать и передавать между ПК и контроллером двухбайтные числа. Решил пойти по такому пути, программа ПК разбивает двухбайтное число на старший и младший байт и отправляет их в ком порт.Контроллер получает эти два байта, соединяет их в двухбайтное число.В зависимости от этого числа программа МК формирует другое  двухбайтное число, разбивает его на старший и младший байт и отправляет их обратно в ком порт. Программа работает в цикле, ПК-МК-ПК и так до бесконечности. Вот что у меня получилось:

Код:
$regfile = "m32def.dat"       'выбираем чип ATmega32 
$crystal = 11059200           'частота кварцевого генератора
$baud = 9600                     'установка скорости приёма-передачи UART

Dim Dannie As Word            'переменная для хранения числа
Dim A As Byte
Dim Byte_lsb As Byte           'переменная для хранения младшего байта
Dim Byte_msb As Byte         'переменная для хранения старшего байта

Enable Urxc                        'разрешить прерывение UART
On Urxc Usart_receive_transmit    'при возникновении прерывания UART перейти в Usart_receive_transmit    
Enable Interrupts                 'разрешить прерывания

Do                                'начало главного цикла программы
Loop                              'конец главного цикла программы
End                               'конец программы


'подпрограмма обработки прерывания UART
Usart_receive_transmit:
  Incr A                                    'увеличить значение перем. A на 1 
  Select Case A
    Case 1 : Byte_msb = Udr             'принять старший байт по UART    
    Case 2 : Byte_lsb = Udr               'принять младший байт по UART
              A = 0                                'обнулить перем. А
              Dannie = Makeint(byte_lsb , Byte_msb)     'соединить два байта и результат записать в перем. Dannie 
               . . . . .
              здесь по определённому алгоритму меняется значение перем. Dannie (например пришло с ком порта 
              число 2436, здесь значение перем. Dannie стало 8654 и уже это число нужно отправить обратно в ком порт)
               . . . . . . 
              Byte_msb = High(dannie)     'возьмём из перем. Dannie старший байт и запишем его в перем. Byte_msb
              Byte_lsb = Low(dannie)       'возьмём из перем. Dannie младший байт и запишем его в перем. Byte_lsb
              Udr = Byte_msb                  'передать старший байт по UART
              Waitms 10                          'временная задержка 10 мс
              Udr = Byte_lsb                    'передать младший байт по UART
  End Select
Return

Отсюда вопрос, может кто нибудь знает лучший вариант реализации данной задачи?

Отредактировано emal-05 (2013-03-01 15:28:06)

0

2

Например, принимаем два числа &H1F (37) и &HFA (250), следующие друг за другом.
Можем получить или (256 * MSB) + LSB = (256 * 37) + 250 = 9722
или (256 * LSB) + MSB = (256 * 250) + 37 = 64037

тогда лучше ввести байт начала передачи, например, &H55 и контрольную сумму
принимаем байт за байтом в массив из 4-х байт
если первый байт &H55, начинаем запись в массив побайтно
после приема всех байтов данных + 1 (контрольная сумма) [&H1F &HFA &H], начинаем считать по алгоритму, ну, скажем, первый байт складываем со вторым, если больше &HFF, то вычитаем из него &HFF, сравниваем с контрольной суммой (&H1A). все сошлось - значит, используем эти данные. если нет - обнуляем массив и переходим к приему новых
Checksum = &HFF - (&H1F + &HFA) = &H1A

Отредактировано demonizer (2013-03-01 17:09:25)

0

3

demonizer написал(а):

Например, принимаем два числа &H1F (37) и &HFA (250), следующие друг за другом.
Можем получить или (256 * MSB) + LSB = (256 * 37) + 250 = 9722
или (256 * LSB) + MSB = (256 * 250) + 37 = 64037

тогда лучше ввести байт начала передачи, например, &H55 и контрольную сумму
принимаем байт за байтом в массив из 4-х байт
если первый байт &H55, начинаем запись в массив побайтно
после приема всех байтов данных + 1 (контрольная сумма) [&H1F &HFA &H], начинаем считать по алгоритму, ну, скажем, первый байт складываем со вторым, если больше &HFF, то вычитаем из него &HFF, сравниваем с контрольной суммой (&H1A). все сошлось - значит, используем эти данные. если нет - обнуляем массив и переходим к приему новых
Checksum = &HFF - (&H1F + &HFA) = &H1A

Алготим то вроде понятен, ну как это красиво в баском переложить, то бишь, как красиво принять и передать, не знаю.

0

4

printbin

0


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Приём и передача двухбайтных чисел по UART!!!