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

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

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

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


Вы здесь » Программирование ATMEL в BASCOM. » Связь проводная и бесп-ная, интерфейсы, протоколы » RS232, динамическая индикация и периодический сбой


RS232, динамическая индикация и периодический сбой

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

1

Программа с компьютера через СОМ порт передаёт на видеоматрицу 16х64 светодиодов заранее подготовленную информацию. В главном цикле контроллера происходит приём данных. По таймеру идёт обработка динамической развёртки. Есть проблема - Информация периодически сбивается, ломается изображение или вообще исчезает. Потом всё восстанавливается. Передача данных односторонняя, поэтому есть предположение что информация передаётся с ошибками. Причём, на 9600 вылетает реже, чем на 115 К. Задержки между передаваемыми данными не помогли. Ниже привожу код на VB со стороны компьютера и на BASCOM со стороны контроллера. Может кто-то сталкивался с подобным? Или как организовать проверку передаваемых данных?

Код:
'+++VB6+++

Public Sub OutCom() 'По таймеру 20 мс

MSComm1.Output = "W"                     ' Start Mark
For c = 1 To 128
MSComm1.Output = Chr(buf_COM(c))
Next c

End Sub
Код:
'+++BASCOM 1.11.9.3+++
$regfile = "m16def.dat"                                     'определяем контроллер
$crystal = 11059200                                         
$baud = 9600

Config Timer2 = Timer , Prescale = 64
On Timer2 Timer0isr                                      ' Timer0 Auto Reload Timer Mode
Enable Timer2                                               ' Enable Timer0
Enable Interrupts                                           ' Enable All Interrupt
Start Timer2

Config Portb = Output
Config Porta = Output

Dim Kolzo As Byte
Dim Yyy As Byte
Dim Zzz As Byte
Dim Z1 As Byte
Dim Z2 As Byte
Dim Picsel(128) As Byte
Dim Temp As Byte
'Dim Comdata As Byte
Dim Base As Byte
Dim Index As Byte

'%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
'Начало главного цикла - приём данных

Do
Base = Inkey()
If Base = "W" Then
         For Index = 1 To 128
         Temp = Waitkey()
         Picsel(index) = Temp
         Next Index
End If
Loop

'%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

' Действие при срабатывании таймера 0
Timer0isr:
' Устраняем засветку - деактивируем дешифратор колец
Porta.3 = 1

' Выводим данные из соответствующих 8 байтов кольца
Select Case Kolzo
Case 0 : Z1 = 1                                             ': Z2 = 8
Case 1 : Z1 = 9                                             ': Z2 = 16
Case 2 : Z1 = 17                                            ': Z2 = 24
Case 3 : Z1 = 25                                            ': Z2 = 32
Case 4 : Z1 = 33                                            ': Z2 = 40
Case 5 : Z1 = 41                                            ': Z2 = 48
Case 6 : Z1 = 49                                            ': Z2 = 56
Case 7 : Z1 = 57                                            ': Z2 = 64
Case 8 : Z1 = 65                                            ': Z2 = 72
Case 9 : Z1 = 73                                            ': Z2 = 80
Case 10 : Z1 = 81                                           ': Z2 = 88
Case 11 : Z1 = 89                                           ': Z2 = 96
Case 12 : Z1 = 97                                           ': Z2 = 104
Case 13 : Z1 = 105                                          ': Z2 = 112
Case 14 : Z1 = 113                                          ': Z2 = 120
Case 15 : Z1 = 121                                          ': Z2 = 128
End Select

Z2 = Z1 + 7

For Zzz = Z1 To Z2
' выводим побитово данные в регистры сдвига из очередного байта
    For Yyy = 0 To 7
    Porta.2 = 0
    Porta.1 = 0
    Porta.0 = Picsel(zzz).yyy                               'DATA
    Porta.1 = 1
    Porta.2 = 1
    Next
Next

' Включаем очередное кольцо
Portb = 15 - Kolzo
' Активируем дешифратор колец
Porta.3 = 0
' Наращиваем счётчик колец
Incr Kolzo
' Если все кольца прошли, то возрат к первому
If Kolzo = 16 Then Kolzo = 0

0

2

1. какое питание у меги?
2. почему не используешь буфера уарта?

0

3

У Меги питание 5 вольт.
Примерчик с буфером есть?

0

4

прошу прощения.
я имел ввиду не буфер, а стек

Код:
$hwstack = 128
$swstack = 128
$framesize = 128

$regfile = "m32def.Dat"
$crystal = 7372000
$baud = 115200

0

5

Боюсь что не поможет.
Просто в приведённом мной коде этих строчек нет, а в жизни есть.
Может передавать эти 128 байт в виде строки фиксированной длины, а в Баскоме преобразовывать её в массив?

Всё равно раньше вечера не попробую, на работе принимаю поздравления с днём варенья от коллег.
:dontknow:

0

6

у нас раньше тоже были глюки с уартом при интенсивном обмене...

0

7

И как победили?

0

8

все намного проще. Идет помеха в проводах.Считай чексум передавай после пакета, а слэйвом проверяй.

0

9

Я понимаю так, если сумма не совпала, пропускаем пакет и отображаем тот, что был в видеобуфере раньше. Если совпала, переписываем пакет в видеобуфер. Или надо давать команду на обновление пакета?
Ещё вопрос - как уменьшить помехи в проводах?

0

10

правильно понимаешь. уменьшить помехи - расключи витой парой, как tcp ip, только ком передавай, должно помочь

0

11

Вчера убил вечер на железо. МАХ232, преобразователь USB-COM, простейший преобразователь на КТ315, минимум - длина проводов. Самый стабильный результат получается на преобразователе USB-COM. Хотя тоже периодически рвёт синхронизацию. Или вообще изображение на несколько секунд пропадает. Пробовал отправлять обновление пакетов один раз в секунду на скорости 9600. Всё равно реже, но проблема остаётся. Такое ощущение, что глюк в программе. Я инициализирую старт пакета символом "W". Возможно, что в коде встречаются такие же данные, и старт иногда начинается с них. Может есть более красивый способ синхронизации пакетов? И как организовать алгоритм подсчёта контрольной суммы со стороны компа и чипа?

0

12

Попробовал считать контрольную сумму так - складываю между собой передаваемые данные в пакете по XOR. Последним в пакете передаю контрольную сумму. На стороне приёма делаю тоже самое. Если контрольная сумма совпадает, переписываю пакет в видеобуфер, если нет, пропускаю пакет, т.е. видеобуфер не обновляю. Не помогло.... На форуме Баскома подсказали, чтобы на время приёма отключал таймер. Данные перестали искажаться, зато экран периодически тухнет в момент отключения таймера (читай - динамической индикации).
Экран стал мерцать, что не есть хорошо. Какой то замкнутый круг получается. Если бы матрица работала в статике, не было бы проблем, а с динамикой полная лажа. Неужели нет изящного решения данной проблемы?

0

13

первая проблема - работает прерывание во время приема
вторая проблема - ставь преамбулу начала пакета вот такое ( Возможно, что в коде встречаются такие же данные, и старт иногда начинается с них.) никто не делает
скорее всего мешает прерывание

0

14

Ведущийспециалист написал(а):

вторая проблема - ставь преамбулу начала пакета вот такое ( Возможно, что в коде встречаются такие же данные, и старт иногда начинается с них.) никто не делает
скорее всего мешает прерывание

Непонял, что нужно ставить для идентификации начала пакета? Может быть есть кусочек кода, а то неделю уже по вечерам испытываю свои нервы .....

0

15

поищи , где то в нете валяется код под басик для радиомодулей rfm433
там есть начало пакета и преамбула.правда на SPI но никто не мешает переделать на UART

0

16

А не пробовал усложнить ключ для синхронизации? Вместо одной "W" использовать скажем три. Я у себя нечто подобное наблюдал, что помеха легко может забить один байт информации, два - тяжелее, но три - четко держит.

зы: правда в моём случае ещё хуже было, схема перегружалась из-за помех внешних...)

0


Вы здесь » Программирование ATMEL в BASCOM. » Связь проводная и бесп-ная, интерфейсы, протоколы » RS232, динамическая индикация и периодический сбой