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

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

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

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



Inkey для второго канала UART.

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

1

Привет всем! Решил использовать два аппаратных UART в Atbanned28A. Проблема в том что условие:

Код:
If Inkey(#2) = 48 Then
Print #2 , "stop"
End If

Срабатывает само по себе через какое-то время, даже если в порт ничего не посылать (хотя оно должно срабатывать, при нажатии на клавиате "0", который по таблицам ASCII в детятичной форме = 48)

При использовании первого аппаратного юарта (ноги RXD0 и TXD0) и, соответственно кода:

Код:
If Inkey() = 48 Then
Print  "stop"
End If

все работает отлично.

Вот настройки UART в коде.

Код:
$baud = 115200 

$baud1 = 19200
Config Com2 = Dummy , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
Open "com2:" For Random As #2

Может я что-то неправильно делаю, до этого всегда использовал один канал UART. Заранее спасибо)

0

2

Может попробовать подтянуть Rx резистором?

0

3

Дело в том что Atbanned28A общается с bluetooth модулем, который питается от 3.3В, а МК от 5В. Для этого в схеме на линии TX от МК до модуля стоит резисторный делитель, а на линии RX (от мк) левел-шифтер на полевике. Однако, вся эта связка прекрасно работает на первом аппаратном юарте, а на втором уже глючит (Поэтому думаю проблема не в железе).  Вообще правильно ли я опрашиваю второй канал - inkey(#2)? Тоесть тупо в скобочках указываю "#2".

0

4

1 'не работает ? Ну и что, "размельчить" на более простые операции

'настроить UART
Config Com1 = 9600 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
Config Com2 = 19200 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
Open "com2:" For Binary As #1           'определить номер канала для UART1
...
    gosub _inkey1      'см. ниже
     if temp = 48 then
        ...
     end if 

'считывание принятого байта или возврат нуля
_inkey1:
     temp = ucr1 
     if temp.7 = 1 then
        temp = udr1
     else
        temp = 0
     end if
return

'или на ассемблере - всего шесть команд!
_inkey1:
$asm
     Lds R24 , Ucr1   'считать регистр управления
     And R24 , 128    'проверить бит флага приемника
     Breq inkey_1     'если не нуль
     Lds R24 , Udr1   'считать
Inkey_1:
     Sts {temp} , R24 'и записать во временный регистр
$End asm
Return                'иначе выход с нулем

0

5

Спасибо dmm)

0