Регистрация | Последние сообщения | Персональный список | Поиск | Настройка конференции | Личные данные | Правила конференции | Список участников | Top 64 | Статистика раздела | faq | Что нового v.2.3 | Чат
Skunk Forum - Техника, Наука, Общество » Форум разработчиков РЭА »
работа с двумя USARTa на Atmega128 (2)

Версия для печати (настроить)

Новая тема | Написать ответ

Подписаться

Автор Тема:   работа с двумя USARTa на Atmega128 (2)
Spaider
Junior Member

Сообщений: 4
Откуда: Махачкала
Регистрация: Июль 2003

написано 23 Июля 2003 10:05ИнфоПравкаОтветитьIP

У меня используются асинхронный(скорость 9600 бод) и синхронный(2400 бод)порт при этом принимаю данные по асинхронному порт 32бита,передаю по синхронному порту 42бита.
Так скорости разные нужно сохранять принятую информацию в микроконтроллере чтобы при передаче не потерять данные сложность еще в том что принимаемые данные по формату не соответствуют передаваемым и получается что мне необходимо преобразовать данные в нужный формат как их преобразовать я знаю но просто не понимаю как можно их записать в буфер?

Весельчак У
Moderator

Сообщений: 3842
Откуда: Санктъ-Питербурхъ
Регистрация: Декабрь 2000

написано 24 Июля 2003 04:11ИнфоПравкаОтветитьIP

Принятые по асинхронному порту данные складываются в программный буфер. Данные обрабатываются, затем складываются во второй программный буфер, из которого уже по прерыванию (или опросу готовности) пересылаются в синхронный порт. При программировании на C буферы можно обозначить массивами. Непонятно только, как передаются именно 42 бита. Посылки по 7 бит идут?

Spaider
Junior Member

Сообщений: 5
Откуда: Махачкала
Регистрация: Июль 2003

написано 24 Июля 2003 08:35ИнфоПравкаОтветитьIP

Данные идут не по 7 бит,формат кодограммы дать не могу,даные идут без стоповых и паритетных битов с наличием битов четности так как это синхронный стык.

misyachniy
Member

Сообщений: 50
Откуда: Kyiv
Регистрация: Февраль 2002

написано 24 Июля 2003 11:19ИнфоПравкаОтветитьIP

мое личное мнение.
Для приема нужно организовать два буфера и два флага о заполнености.

Для передачи также два буфера и флага.
Если поток входной информации гарантированно не превышает приблизительно половины скорости выходного,
то возможно достаточно одного выходного буфера.

Прием информации, должно обслуживать прерывание от USART.

Прередавать в синхронном режиме Atmega128 не умеет.

По этому передачу нужно организовать программно с помощью таймера.

Получается 3 задачи.

1) По прерыванию от приемного USART происходит прием и предварительная обработка пакета. Проверка паритета, целостности и пр.
После заполнения буфера, выставить флаг заполнености и продолжать прием в другой.

2)Основная программа следит за флагом заполнености буфера. При взведенном флаге, производит перекодировку
и заполняет выходной(буфер). После этого взводит флаг заполнености выходного буфера и сбрасывает флаг заполнености входного.

3) Прерывание по таймеру 2400 раз в секунду опрашивает
состояние флага заполнености выходного буфера и формирует выходной сигнал передатчика при заполненом буфере.
После передачи пакета, сбрасывает флаг заполнености выходного буфера.

Осталось только не напутать с флажками :-)

Spaider
Junior Member

Сообщений: 6
Откуда: Махачкала
Регистрация: Июль 2003

написано 24 Июля 2003 13:44ИнфоПравкаОтветитьIP

Насчет что передача в синхроном режиме не происходит я не согласен в даташите описано что он работает в режиме синхроном и асинхроном.Синхронный или асинхроный режим выберается при установке бита UMSEL(0-асинхроный и 1-синхроный).Передача происходит приналичие XCK и установленом бите UCPOL (0-по началу фронта и 1-по спаду фронта )тактовых импульсов.

misyachniy
Member

Сообщений: 51
Откуда: Kyiv
Регистрация: Февраль 2002

написано 24 Июля 2003 14:22ИнфоПравкаОтветитьIP

У меня нет под руками документацию на Atmega128.
По этому мое мнение будет возможно ошибочным
Тогда задача 3 будет только переключать XCK(это ножка тактирования USART ?) при взведенном флаге заполнености выходного буфера.
И появится задача №4-прерывание которое должно заталкивать данные в буфер USART при его опустошении и
и снимать флаг занятости выходного буфера.

Spaider
Junior Member

Сообщений: 7
Откуда: Махачкала
Регистрация: Июль 2003

написано 24 Июля 2003 15:17ИнфоПравкаОтветитьIP

Переключать XCK нет необходимости так как это тактовые импульсы на ней синхронизируют работу предающего и принимающего (т.е. в моем случае там импульсы идут с скорость 2 400 тактов в секунду,один так - один бит).
А как реализовать 4 буфера, для каждого буфера- начало и конца буфера описать нужное количество регистров в взависимости от количество принимаемых и передаваемых данных?
Не могли привести пример и сказать где можно его взять?

misyachniy
Member

Сообщений: 52
Откуда: Kyiv
Регистрация: Февраль 2002

написано 24 Июля 2003 17:35ИнфоПравкаОтветитьIP


dseg
iBuffer1 : .byte 4 ; приемный буфер
iBuffer2 : .byte 4 ; приемный буфер 2

oBuffer1 : .byte 5 ; выходной буфер
oBuffer2 : .byte 5 ; выходной буфер 2

Начало буфера описывать не надо его значение можно загрузить в пару регистров так:
ldi R27, high(iBuffer1)
ldi R26, low(iBuffer1)

а число принятых байтов хранить в отдельном регистре или ячейке памяти.

Буфера размещать в регистрах слишком расточительно.

В принципе я не профессионал и даже не любитель AVR
По этом рекомендую сходить на
ссылка

Много пустой болтовни и грязи на указанном форуме.
Но отвечают быстро.

Напишите мне письмо вышлю, проект программы работающей
с COM портом PC и имеющей 2 приемных буфера.

Spaider
Junior Member

Сообщений: 8
Откуда: Махачкала
Регистрация: Июль 2003

написано 25 Июля 2003 08:27ИнфоПравкаОтветитьIP

misyachniy мой ящик cotnikov@bk.ru

Ваш ответ:

Коды форума
Смайлики


Ник:    Пароль       
Отключить смайлики

Все время MSK

Склеить | Разбить | Закрыть | Переместить | Удалить

Новая тема | Написать ответ
Последние сообщения         
Перейти к:

Свяжитесь с нами | skunksworks.net

Copyright © skunksworks.net, 2000-2018

Разработка и техническая поддержка: skunksworks.net


Рейтинг@Mail.ru Яндекс.Метрика