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

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

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

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



Аппаратный UART

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

1

Здравствуйте, столкнулся с такой проблемой. При использовании программного UART всё хорошо уходит и приходит. Попробовал сделать на аппаратном, что-то не получилось.
т.е. замена :

Open "comd.0:9600,8,n,1" For Input As #2
.
.
.

Inputbin #2 , Adcin1 , Adcin2 , Adcin3

на :
.
$baud = 9600
.

Inputbin  , Adcin1 , Adcin2 , Adcin3

привела к тому, что принимается первое число, а второе и третье получается произвольным.

В чём дело?

Отредактировано marss70 (2013-06-16 21:58:05)

0

2

Перефразирую вопрос. Как с помощью аппаратного UART передать несколько переменных? Одну переменную передаёт без проблем.

0

3

Для начала нужно сконфигурировать порт. Например 1-й.
$regfile = "Ваш МК.dat"                                    ' specify the used micro
$crystal = 4000000                                          ' used crystal frequency
$baud = 9600                                                ' use baud rate
$hwstack = 32                                               ' default use 32 for the hardware stack
$swstack = 10                                               ' default use 10 for the SW stack
$framesize = 40                                             ' default use 40 for the frame space
Config Com1 = Dummy , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
Потом оператором PRINT, или его разновидностями PRINT BIN, PRINT HEX (зависит от задачи) передаем все, что нужно.
Например PRINT A; D; C

0

4

marss70 написал(а):

Inputbin  , Adcin1 , Adcin2 , Adcin3

Кстати, вы спрашиваете как передать, а тут идет попытка приема???

0

5

Спасибо за ответ. "Передать"- это общая задача. Printbin всё передаёт нормально, на приёмнике проблемы. Но сейчас попробую доконфигурировать по Вашему совету и передатчик.

0

6

Для наглядности приведу код. Передатчик:

Код:
$regfile = "m8def.dat"
$crystal = 9600000
$baud = 9600
$hwstack = 40
$swstack = 16
$framesize = 32

Dim A As Byte
Dim B As Byte
Dim C As Byte

'Open "comd.1:9600,8,n,1" For Output As #1
Do
A = 111
B = 222
C = 233

Printbin A ; B ; C
'Printbin #1 , A ; B ; C

Waitms 50


Loop
End

Приёмник:

Код:
$regfile = "attiny2313.dat"
$crystal = 9600000
$baud = 9600
$hwstack=40
$swstack=16
$framesize=32

Dim A As Byte
Dim B As Byte
Dim C As Byte

'Open "comd.0:9600,8,n,1" For Input As #2

Config Lcdpin = Pin , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7 , E = Portb.1 , Rs = Portb.0
Config Lcd = 16 * 2
Cursor Off


Do
   'Inputbin #2 , A , B , C
   Inputbin , A , B , C
   Waitms 50
   Cls
   Lcd A ; "  " ; B ; "  " ; C
   Waitms 50
Loop

End

При такой конфигурации приёмника получаю правильно только значение "А". Если делаю программно, то всё получается нормально.

0

7

Можете попробовать ещё такой вариант:

Код:
Inputbin ar(1) , 4 ' will fill 4 bytes starting at index 1.

Кстати аппаратный порты в МК толком конфигурировать не нужно, по умолчанию обычно прописано "стандартный обмен", максимум можно для уверенности указать "$baud = 9600" и частоту МК ($crystal = 8000000), остальное "input" и "print" будут работать с первым/единственным портом по умолчанию.

0

8

А можно поконкретнее для моего случая.

0

9

Ок, попробую, приёмник:

Код:
$regfile = "attiny2313.dat"
$crystal = 9600000
$baud = 9600
$hwstack=40
$swstack=16
$framesize=32

Dim Dat(3) As Byte

Config Lcdpin = Pin , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7 , E = Portb.1 , Rs = Portb.0
Config Lcd = 16 * 2
Cursor Off


Do
   Inputbin Dat(1) , 3
   Cls
   Lcd Dat(1) ; " " ; Dat(2) ; " " ; Dat(3)
Loop

End

Только учтите, что после того, как в приёмник отправляете свои 3 байта, то после нужна задержка какая-то, чтобы приёмник успел вывести данные на индикатор, т.е. просто передавать бесконечный поток нельзя.
Потом, кварц у вас в МК внешний точно на 9600000 стоит?

0

10

Частота осталась при разработке от другого МК(Attny13). По поводу UART ничего не изменилось по сравнению с   Inputbin A , B , C. Я так думаю, не такая уж большая экономия памяти этот аппаратный UART. Ещё, конечно, попробую всякие уловки, просто ради спортивного интереса.

0

11

Частота осталась при разработке от другого МК(Attny13)

Что это значит? Если внешний кварц или осциллятор не стоит на эту частоту, то по умолчанию должно стоять 8МГц, скорее по этому у вас глюк с передачей.

0

12

Была программа для Тиньки13. А у неё нет внешнего кварца, а внутренняя 9600000. Я пока в проте "железный" уарт делаю, т.к. на макетке пока не могу сделать(я сечас в отпуске). Успел только софтвертный испытать- он работает. А у вас есть полностью рабочий код по передаче нескольких переменных на аппаратном уарте?

0

13

Кажется дело сдвинулось. Спасибо sva-don .На самом деле надо было и в передатчике(хотя и без неё работает, но пусть будет...) и в приёмнике прописывать строчку

Код:
Config Com1 = Dummy , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0

Но теперь вылезла другая бойда... Правильно передаются переменные типа Byte, а если пихаем типа Word, то уже не получается правильно принять. Бум дальше колдовать. Или же есть у вас какие мысли на этот счёт?

Отредактировано marss70 (2013-06-23 00:06:27)

0

14

читать документацию

0

15

Ну тыкните носом, что почитать? Кроме как извращения ничего хорошего не получается. Разбить Word на Byte, передать, а потом это всё склеивать. Или же преобразовать в "в строку" при этом занять до 5 байтов на каждую переменную...

0