Программа с компьютера через СОМ порт передаёт на видеоматрицу 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