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

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

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

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



Ретранслятор RS232

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

1

Собственно задача.
Давно разрабатывался проект светодиодной матрицы на 1024 светодиода. Управляющая программа на ПК формировала монохромное изображение и со скоростью 25 пакетов в секунду на $baud = 38400  передавала в контроллер Мега8. Он только принимал пакеты и в динамике запихивал в регистры, также управлял столбцами со скважностью 1/16. Появилась потребность в автономном устройстве. Вроде бы дело пошло - взял 32 мегу, на ней формирую изображение и передаю на мегу 8, по RS232. Но хочется оставить возможность работать и от ПК.
Пробовал после приёма 128 пакетов сразу же передавать их (используется один и тот же RS232 и на приём, и на передачу). Контроллер виснет... Даже если пакеты идут со скоростью 1 раз в секунду. Может есть более элегантное решение, чем подводить м Меге 8 данные от ПК и от Меги 32 через логические ключи, которыми управляем Мега 32? Например, есть пакеты от ПК, они идут в М32 и на ключ - к М8. М32 увидела пакеты, открыла ключ к М8. Перестала посылать свои пакеты. Перестал идти сигнал с ПК - закрыла ключ, стала посылать свои пакеты. Вообщем, пока только тупик... Может кто-то с подобным сталкивался, есть идеи?

Код:
$crystal = 18432000                                         'кварцевый генератор 18,432 MHz
$regfile = "m32.def.dat"                                     'декларируем контроллер
$hwstack = 256                                              'Размер аппаратного стека
$swstack = 256                                              'Размер программного стека
$framesize = 256                                            'Размер области импользуемой для преобразования
                                                             'и временного храненияя данных
                                                         
'==========Настройка портов==========
Ddra = &B11111110                                           'направление линий порта A: 1 - на вывод
Porta = &B00000000                                          'исходное состояние линий A: 00000000
Ddrb = &B11110011                                           'направление линий порта B: 1 - на вывод
Portb = &B00000000                                          'исходное состояние линий B: 00000000
Ddrc = &B11111111                                           'направление линий порта C: 1 - на вывод
Portc = &B00000000                                          'исходное состояние линий C: 00000000
Ddrd = &B11111110                                           'направление линий порта D: 1 - на вывод
Portd = &B00000000                                          'исходное состояние линий D: 00000000


'==========Настройка RS232==========
$baud = 38400                                              
Enable Urxc                                                 'разрешить прерывание приемника UART
On Urxc Rs232_isr 

'==========Объявление переменных==========
Dim Flgrs232 As Bit : Flgrs232 = 0                         'Флаг прихода данных Rs232
Dim Picsel(129) As Byte                                        'Видеоданные
Dim Index As Byte                                                'Счётчик принятых байт от мастера

Do                                                          'Главный цикл
If Flgrs232 = 1 Then
'Disable Urxc
   Flgrs232 = 0
      If Inkey() = "$" Then                                 'Маркер начала пакета
               For Index = 1 To 129
               Picsel(index) = Waitkey()                  'Принимаем видеоданные и яркость
               Next Index
      End If
Printbin Marker ; Picsel(1)
'Enable Urxc
End If
Loop

' Действие при срабатывании UART
Rs232_isr:
Flgrs232 = 1                                             'Пришёл пакет данных от мастера
Return                                                      'выход из обработчика прерывания

+1

2

А буферы типа 74hc4052d и подобные? Как раз применяют, когда устройство общается с МК и ПК одновременно.

+1

3

Может использовать разные входы?

0

4

1 разрешенное прерывание приемника и функция waitkey() несовместимы. происходит
прерывание и аппаратно сбрасывает бит, указывающий наполненность приемника и которого ждет
эта функция (и inkey() тоже). так, что программа должна "висеть"!
2 раз используешь прерывание, то и принимай там же все. времени на прием байта - 2.5 мкс
должно хватить на любую обработку
3 протокол. он должен позволять однозначно определять начало и конец пакетов.
С двоичными данными без значительного временного интервала между пакетами их сложно разделить.
4 аппаратно переключать направление потоков без специальной команды от компьютера (на выбор канала)
можно только в конце стоп-бита или, в крайнем случае, в момент появления бита прерывания приемника
(после окончания стоп-бита), но это ненадежный вариант, так как на принятие решения программе
на скорости 38кб остается 5-10 мкс!

0