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

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

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

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


Вы здесь » Программирование ATMEL в BASCOM. » Исходники » Народ, помогите! Уже замучался гуглить... ничего не помогает!


Народ, помогите! Уже замучался гуглить... ничего не помогает!

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

1

В общем, надо мне подружить два МК по UART между собой. Накидал кода под оба камня, отладил их через терминал с компа, всё отлично. Подключаю МК друг к другу - всё, тупка! Ну, думаю, может в коде где-то ошибка, решил пойти путём от простого к сложному: один МК посылает то один, то другой символ, второй - зажигает-гасит светодиод. Ну и тут беда - в терминале вижу посылки от первого МК. Посылаю терминалом символы на второй - светик моргает. Соединяю МК между собой - фэйл! Второй МК принимает первый символ, захигает светодиод и виснет в этом состоянии. Подскажите в чем беда? Два дня гуглю, ничего не могу найти по этой теме. Сильно не пинайте, если уже где-то поднималась тема или некорректно задал вопрос либо не в той ветке, новичек на форумах. Заранее спасибо! Вот коды для первого и второго МК:

МК1

$regfile = "m328pdef.dat"
$crystal = 8000000
$baud = 9600

Do
Wait 3
Print "s"
Waitms 500
Print "l"
Waitms 500
loop

МК2

$regfile = "m328pdef.dat"
$crystal = 8000000
$baud = 9600

Enable Interrupts
Enable Urxc
On Urxc Getchar

Config Portd.7 = Output
Config Portb.0 = Output
Dim S As String * 3

Do
Portd.7 = 0
Waitms 500
Portd.7 = 1
Waitms 500
Loop

Getchar:
Input S
Select Case S
   Case "s":
      Portb.0 = 1
   Case "l":
      Portb.0 = 0
End Select
Return

0

2

Железо как подключено?

0

3

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

Железо как подключено?

Ну как обычно: питание общее у обоих МК, Tx-Rx крест накрест. Тактирование от внутренней RC-цепочки.

0

4

Почитай про конфиг инпута: https://avrhelp.mcselec.com/index.html?configinput.htm
И чтобы инпут не вис, то ещё про это: https://avrhelp.mcselec.com/index.html?_timeout.htm
Ещё невидно настроек: $hwstack, $swstack, $framesize.

+1

5

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

Tx-Rx крест накрест

Нужно, хотя бы, через транзисторные ключи...
http://s7.uploads.ru/t/ow6dC.jpg

0

6

pavel1969, зачем?

0

7

RDW
В  Декаде  подсмотрел...  :) Понятно, что это нужно для согласования уровней при работе с компьютером.
Но для чистоты эксперимента... :)
Если линия связи достаточно длинная, я стараюсь воткнуть транзисторный повторитель.

0

8

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

Почитай про конфиг инпута: https://avrhelp.mcselec.com/index.html?configinput.htm
И чтобы инпут не вис, то ещё про это: https://avrhelp.mcselec.com/index.html?_timeout.htm

Спасибо! Сейчас прочитаю и попробую.

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

Ещё невидно настроек: $hwstack, $swstack, $framesize.

За 2 года использования bascom понял, что лучше не прописывать их в коде вообще - компилятор сам высчитает необходимые размеры. Уже бывали грабли не пойми откуда... выяснялось, что стек сваливается. Достаточно тупо убрать настройки стеков и компилятор сделает всю работу за нас. )))

0

9

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

Нужно, хотя бы, через транзисторные ключи...

При длине линий в 30 см, думаю, это более чем не нужно! ))) При длинных линиях, я бы использовал скорее какие-нибудь max3232 на каждой стороне, они бы уровни автоматом выравняли. Да и потом, при длине линии в 1,5 метра с компом-то всё норм дружит... явно ведь, что трабл здесь не в длине лини и не в согласовании уровней.

0

10

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

компилятор сам высчитает необходимые размеры

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

0

11

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

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

Возможно и так. Но на личном опыте пока что видел неоднократно как раз обратное. Когда наступлю на грабли иного характера, где поможет прописывание размеров стеков вручную, намотаю это на ус. Пока что прописывание вручную вызывает лишь периодические глюки (раз в 6-7 проектов). Особенно с тини13 частенько такой трабл. ДА и честно говоря, каких-то конкретных формул для расчета я так и не нагуглил на русском. На англицком есть, но чё-то весьма мудрёно для меня. А тыкаться как слепой котёнок, пытаясь подобрать нужные цифры, не люблю - ведь проще вообще убрать эти настройки и поймать профит! )))

0

12

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

Почитай про конфиг инпута: https://avrhelp.mcselec.com/index.html?configinput.htm

Огромнейшее спасибо!!! Помогло! Ну, по крайней мере на простейшем примере со светиком. ))) Буду тестить изначальный код с этой настройкой -  Config Input1 = Crlf , Echo = Crlf. По дефолту там СR...  Я подразумевал что возможно в какой-то такой фигне трабл, но не знал в какую сторону рыть и как настраивать.

Отредактировано int33h (2019-02-26 20:04:12)

0

13

Рано обрадовался... ((( Работает только если один МК посылает, другой принимает. Если оба общаются, то какие-то лаги жуткие получаются... вот так, например, общаются:

МК1"

$regfile = "m328pdef.dat"
$crystal = 8000000
$baud = 9600

Config Input1 = Crlf , Echo = Crlf
Enable Interrupts
Enable Urxc
On Urxc Getchar
Config Portc.3 = Output
Dim S As String * 3

Do
Print "s"
Waitms 500
Print "l"
Waitms 500
Loop

Getchar:
Input S
Select Case S
   Case "a"
      Portc.3 = 0
   Case "q"
      Portc.3 = 1
End Select
Return

МК2

$regfile = "m328pdef.dat"
$crystal = 8000000
$baud = 9600
Config Input1 = Crlf , Echo = Crlf

Enable Interrupts
Enable Urxc
On Urxc Getchar

Config Portd.7 = Output
Config Portb.0 = Output
Dim S As String * 3

Do
Portd.7 = 0
Waitms 500
Portd.7 = 1
Waitms 500
Loop

Getchar:
Input S
Select Case S
   Case "s":
      Portb.0 = 1
      Print "a"
   Case "l":
      Portb.0 = 0
      Print "q"
End Select
Return

Может конфликт в UDR возникает? Может какой бит надо  в UCSR снять?

0

14

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

Нужно, хотя бы, через транзисторные ключи...

Не стоит так усложнять... ;)
Достаточно резисторов в каждую линию 100...300 Ом.

+1

15

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

Рано обрадовался...

Вот это попробуйте Исследование USART
Проверено лично - работает "железно".

Только это - для одностороннего общения.
Если нужно "обратно", то придется использовать одинаковые способы передачи/приема в обоих МК.

0

16

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

Может конфликт в UDR возникает? Может какой бит надо  в UCSR снять?

Конечно возникает... ;)
Мало того, что по прерыванию UART вы отправляетесь в обработчик этого прерывания, так тут еще заставляете МК что-то ждать от UART Input'ом.

0

17

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

Конечно возникает...
Мало того, что по прерыванию UART вы отправляетесь в обработчик этого прерывания, так тут еще заставляете МК что-то ждать от UART Input'ом.

Ну с компом-то работает! И при односторонней передаче работает. В прерывание UART'а я ухожу сразу же, как только во входном регистре что-то появилось, это "что-то" я INPUT'ом и вытягиваю. И МК спокойно это вытягивает, обрабатывает и исполняет что необходимо... ну, это в случае компа или односторонней связи. В чем трабл?

0

18

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

Вот это попробуйте Исследование USART
Проверено лично - работает "железно".

Только это - для одностороннего общения.
Если нужно "обратно", то придется использовать одинаковые способы передачи/приема в обоих МК.


Ссылка, по которой Вы пришли неверная или устаревшая. (((((

0

19

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

Ссылка, по которой Вы пришли неверная или устаревшая. (((((

Фууух... ;)
Опять это зеркало .3bb ;)

Пройдете с Главной страницы по пути "» Программирование ATMEL в BASCOM. » Примеры применения в среде Баском » Исследование USART."
Пост 5.

0

20

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

В прерывание UART'а я ухожу сразу же, как только во входном регистре что-то появилось, это "что-то" я INPUT'ом и вытягиваю.

У вас масло масляное получается.
Если принимаете по прерыванию, то и вытягивайте информацию из буфера приема.
Если работаете INPUT'ом, то на нем и остановитесь.

0

21

Есть такая штука для асинхронной работы: https://avrhelp.mcselec.com/index.html? … rialin.htm
Ну и её близнец: https://avrhelp.mcselec.com/index.html? … ialout.htm
В общем рой хелп, там много интересного.

+1

22

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

Есть такая штука для асинхронной работы: https://avrhelp.mcselec.com/index.html? … rialin.htm
Ну и её близнец: https://avrhelp.mcselec.com/index.html? … ialout.htm
В общем рой хелп, там много интересного.

Спасибо! Как раз там и роюсь сейчас. В случае со светиками и двусторонней передачей, как оказалось, достаточно было эхо отключить и всё заработало как надо. В случае с полным кодом, работает, но с некоторыми тупками.

Отредактировано int33h (2019-02-26 21:44:27)

+1

23

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

У вас масло масляное получается.
Если принимаете по прерыванию, то и вытягивайте информацию из буфера приема.
Если работаете INPUT'ом, то на нем и остановитесь.

А в чем разница? Прерывание всего лишь обозначает сам факт того, что в регистр что-то пришло... А уж как дальше из него вытягивать какая разница: Input S, C = UDR, B = inkey()?! Где здесь масло масляное? Инпут же не требует какого-либо повторного прихода в буфер, если там уже что-либо лежит. Если UDR не пуст, то он и вытянет оттуда. Только в случае со строкой, инпут вытянет всю строку силами компилятора и мне не надо будет побайтно читать UDR и заполнять строку "вручную".

0

24

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

А в чем разница? Прерывание всего лишь обозначает сам факт того, что в регистр что-то пришло... А уж как дальше из него вытягивать какая разница: Input S, C = UDR, B = inkey()?! Где здесь масло масляное? Инпут же не требует какого-либо повторного прихода в буфер, если там уже что-либо лежит. Если UDR не пуст, то он и вытянет оттуда. Только в случае со строкой, инпут вытянет всю строку силами компилятора и мне не надо будет побайтно читать UDR и заполнять строку "вручную".

Вот сами все и расписали, где у вас "масло"... ;)

Не навязываю, но повторяю - способ, описанный Александром (по ссылке ранее) мне понравился больше всех, потому и рекомендую.
Гибкая настройка (при доработке кода), возможность приема строки любой длины...
Это только первые два "жирных плюса".

Отказался только один раз, но там были для этого основания.

0

25

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

А в чем разница? Прерывание всего лишь обозначает сам факт того, что в регистр что-то пришло... А уж как дальше из него вытягивать какая разница

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

Единственный способ, где в прерывании обосновано использование (задержка) программой приёма данных - это когда у МК нет аппаратного UART и приходится программно принимать.

У тебя же 328, нормальный МК, с полным фаршем (а не какой нибудь там аттини).

+1

26

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

А в чем разница? Прерывание всего лишь обозначает сам факт того, что в регистр что-то пришло... А уж как дальше из него вытягивать какая разница.

Разница как гриццо в поговорке: "одна ****** а другая дразнится"  ->> вот вся и разница.
А ошибка у тебя только ОДНА - изначально нужно было придумать некий "свой" протокол или формат передаваемых данных (пакет, фрейм и тд) Например 8-ю светодиодами можно управлять ОДНИМ байтом. Здесь только фантазия и ничего больше.

По поводу приёма по USART - если ты будешь использовать парадигму С ПРЕРЫВАНИЯМИ - придётся все низкоуровневые обработчики писАть самому, что несколько сложно, но имеет кучу плюсов как в скорости работы, так и в надёжности её.

А если писАть средствами баскома... вотт тогда это уже 50/50.

Никак не могу понять тот факт, что если "посылать" через терминал "впустую" несколько байт и НЕ ПРИНЯТЬ их со стороны ардуины - она ПЕРЕЗАГРУЖАЕТСЯ !!!
Проверено на 328Р 128 и 2560 - результат одинаков. Значит баском чёто там не дюжит.
Если написАть "свои" обработчики на передачу и приём - ГЛЮКОВ нет от слова совсем... Так-шо думаем.

0

27

А, блин, забыл добавить.... Если сделать "свои" обработчики имеем проблему - не будет работать загрузчик ни баскома ни ардуины.  Короче здесь всё не так просто. Это ответ тому, кто просил загрузчик БЕЗ кнопки ресет!  Не могу я его здесь выложить ибо он не будет работать должным образом. Если хотеть иметь и "свои" обработчики и загрузчик баскома --- придётся на время работы загрузчика ставить "затычки" а по окончанию работы загрузчика всё опять восстанавливать, что не так просто. Так-шо дюжим...

0

28

А можно я здесь спрошу? Изучаю MP3 плеер DFPlayer_mini. Управление по UART. С управлением разобрался, все работает. Теперь настала очередь разбираться с данными, которые возвращает плеер. Посылка 10-ти байтная, вот такого формата : 7E FE 06 0D 01 00  00 FE F0 EF. Это просто пример.  Накидал программу, в Протеусе все работает. Но, есть просьба. Посмотрите, пожалуйста, все ли там нормально. Чтобы не было камней потом, в железе.

код
Код:
$regfile = "m8adef.dat"
$crystal = 1000000
$baud = 9600

$framesize = 40
$hwstack = 40
$swstack = 32
 Dim Buff_str As String * 4                                 ' переменная для вывода на индикатор
Dim Buff As Byte                                            'буфер
Dim Incom(10) As Byte                                       'переменная для данных из буфера
Dim Number As Byte                                          'перем для счета кол-ва байт
'config Portb.0 = Input : Portb.0 = 1
 Config Portb.4 = Output : D3310dc Alias Portb.4            'индикатор 5110
Config Portb.1 = Output : D3310ce Alias Portb.1
Config Portb.5 = Output : D3310re Alias Portb.5
Config Spi = Soft , Din = Portb.2 , Dout = Portb.2 , Ss = None , Clock = Portb.3
On Urxc Getchar                                             'прерывания UART
Enable Interrupts
Enable Urxc
 Echo Off
 Number = 1
 Spiinit
$include "3310init.bas"
Call D3310reset
Call D3310init
 Call D3310clear
Do

   Buff_str = Str(incom(1))                                 'выводим первый байт
 Call D3310position(0 , 0)
Call D3310print(buff_str)

    Buff_str = Str(incom(2))                                '    второй
 Call D3310position(0 , 1)
Call D3310print(buff_str)

    Buff_str = Str(incom(3))                                '     третий
 Call D3310position(0 , 2)
Call D3310print(buff_str)

   Buff_str = Str(incom(4))
 Call D3310position(0 , 3)
Call D3310print(buff_str)

    Buff_str = Str(incom(5))
 Call D3310position(0 , 4)
Call D3310print(buff_str)

    Buff_str = Str(incom(6))
 Call D3310position(0 , 5)
Call D3310print(buff_str)

   Buff_str = Str(incom(7))
 Call D3310position(7 , 0)
Call D3310print(buff_str)

   Buff_str = Str(incom(8))
 Call D3310position(7 , 1)
Call D3310print(buff_str)

   Buff_str = Str(incom(9))
 Call D3310position(7 , 2)
Call D3310print(buff_str)

    Buff_str = Str(incom(10))                               '      десятый
 Call D3310position(7 , 3)
Call D3310print(buff_str)

  Loop
End

$include "3310end.bas"
Return

Getchar:
 'Inputbin Buff
 Buff = Udr                                                 'принимаем
Incom(number) = Buff                                        'заносим в массив
 Incr Number
If Number = 11 Then Number = 1
 Return

На дисплей внимания не обращайте, это просто посмотреть. В железе эти данные никуда выводится не будут, просто будут обрабатываться.
Сейчас попытался загрузить скриншот на UPLOADS. Пишут, что загрузка новых файлов запрещена.
Фото
Сильно не пинайте, это мое знакомство с UART.

Отредактировано Andrusha (2019-03-03 20:56:37)

0

29

Можно было в цикле for...next всё оформить. Короче бы получилось.

0

30

Дисплей только для того, чтобы посмотреть, что я поймал. Поэтому с кодом не заморачивался. Что первое на ум пришло, то и написал.  Мне сейчас главное понять принцип.

Отредактировано Andrusha (2019-06-21 21:45:26)

0


Вы здесь » Программирование ATMEL в BASCOM. » Исходники » Народ, помогите! Уже замучался гуглить... ничего не помогает!