Страница 1 из 2
ATmega2561: Строка в UART!
Добавлено: Ср ноя 17, 2010 12:50:49
Slavast
У меня такой вопрос. Я на UART хочу вывести слово "Привет Комсомолу" на Терминал компьютера (Использую программу Win Term). Использую алгоритм вывода массива строки. Но выводит всё, кроме первых 2-х букв. Вместо них какие-то квадраты. В чем загвоздка? В цикле вывода массива? И как правильно проверять конец строки (Я проверяю по точке)?
Заранее, спасибо"!
Re: ATmega2561: Строка в UART!
Добавлено: Ср ноя 17, 2010 13:41:37
Vov123
К строчке,после качек добавь запятую и нолик.Попробуй.
Re: ATmega2561: Строка в UART!
Добавлено: Ср ноя 17, 2010 13:48:08
Engineer_Keen
Попробуйте вместо первых буков в символьном виде использовать HEX коды.
Если вместо буквы квадраты, значит символ не соответствует букве. Или компилятор неверно перевел данные в строке '.db' или при передаче что-то испортилось...
В конце строк можно ставить непечатаемые символы (тот же 0). Или можно ставить символы возврат каретки (0x0D) и перевод строки (0x0A)
Re: ATmega2561: Строка в UART!
Добавлено: Ср ноя 17, 2010 14:04:33
Slavast
Т.е. так прямо и писать
MyArray:
.db "Привет Комсомолу!!! 0x0A, 0x0D"
или
.db "Привет Комсомолу!!!", 0x0A, 0x0D
или
.db "Привет Комсомолу!!!", "0"
Re: ATmega2561: Строка в UART!
Добавлено: Ср ноя 17, 2010 14:34:08
Vov123
я советовал третью строчку,но нолик должен без кавычек (...,0)
Re: ATmega2561: Строка в UART!
Добавлено: Ср ноя 17, 2010 14:47:11
Slavast
Все еще выводит:
[]ривет Комсомолу
Что с этим делать?
Re: ATmega2561: Строка в UART!
Добавлено: Ср ноя 17, 2010 15:59:56
Engineer_Keen
Так он ломает первые 2 буквы или одну?
А если написать
?
Re: ATmega2561: Строка в UART!
Добавлено: Ср ноя 17, 2010 16:18:33
Slavast
Попробовал!
Поменял скорость UART на более меньшую! заработало!
Спасибо.
Re: ATmega2561: Строка в UART!
Добавлено: Ср ноя 17, 2010 16:25:11
Foks
Код: Выделить всё
ReadArray:
ldi ZH,High(MyArray*2) ;çàãðóçêà àäðåñà 0-ãî
ldi ZL,Low(MyArray*2) ;ýëåìåíòà â ðåã. ïàðó Z
ldi Temp1,0
add ZL,Temp ;ïðèáàâëåíèå
adc ZH,Temp1 ;âíóòð. àäðåñà
lpm ;çàãðóçêà èç ÏÇÓ
mov Temp1,R0 ;êîïèðîâàíèå
rcall uart_snt
cpi temp1, '.'
breq finito
inc Temp ;óâåëè÷. âíóòð. àäðåñà
rjmp ReadArray ;â íà÷àëî öèêëà
Чето все слишком сложно. Во-первых, мы добавили в конце строки нуль, так что выход должен теперь происходить по сравнению с нулем. Кроме того, к ZH:ZL прибавляется единица мега-сложным путем. Я бы переписал весь кусок кода вот так:
Код: Выделить всё
ReadArray:
ldi ZH,High(MyArray<<1)
ldi ZL,Low(MyArray<<1)
lpm Temp1, Z+
cpi temp1, 0
breq finito
rcall uart_snt
rjmp ReadArray
Позвольте узнать, от чего тактируется Ваша схема?
Для работы UART
всегда используют кварцевый резонатор! Внутренний генератор имеет ОЧЕНЬ плохую точность и когда у Вас температура в комнате на 5 градусов поменяется, Вы можете уже и остальных букв не увидеть.
Re: ATmega2561: Строка в UART!
Добавлено: Ср ноя 17, 2010 16:28:58
Engineer_Keen
Slavast писал(а):Попробовал!
Поменял скорость UART на более меньшую! заработало!
Спасибо.
Что именно сработало? 0xFC вместо буквы "П" или скорость поменять?
Re: ATmega2561: Строка в UART!
Добавлено: Ср ноя 17, 2010 16:35:01
Slavast
Engineer_Keen писал(а):Slavast писал(а):Попробовал!
Поменял скорость UART на более меньшую! заработало!
Спасибо.
Что именно сработало? 0xFC вместо буквы "П" или скорость поменять?
Когда поменял 0xFC вместо буквы "П" - в начале тоже выводились какие-то непонятные символы.
Подумал что что-то с синхронизацией, т.к. потом фраза выводится вся четко.
Поменял скорость с 115200 до 34800.
Заработало и 0xFC вместо буквы "П", и целиком обычное слово "Привет"
Re: ATmega2561: Строка в UART!
Добавлено: Ср ноя 17, 2010 16:37:23
Slavast
Foks писал(а):Код: Выделить всё
ReadArray:
ldi ZH,High(MyArray*2) ;çàãðóçêà àäðåñà 0-ãî
ldi ZL,Low(MyArray*2) ;ýëåìåíòà â ðåã. ïàðó Z
ldi Temp1,0
add ZL,Temp ;ïðèáàâëåíèå
adc ZH,Temp1 ;âíóòð. àäðåñà
lpm ;çàãðóçêà èç ÏÇÓ
mov Temp1,R0 ;êîïèðîâàíèå
rcall uart_snt
cpi temp1, '.'
breq finito
inc Temp ;óâåëè÷. âíóòð. àäðåñà
rjmp ReadArray ;â íà÷àëî öèêëà
Чето все слишком сложно. Во-первых, мы добавили в конце строки нуль, так что выход должен теперь происходить по сравнению с нулем. Кроме того, к ZH:ZL прибавляется единица мега-сложным путем. Я бы переписал весь кусок кода вот так:
Код: Выделить всё
ReadArray:
ldi ZH,High(MyArray<<1)
ldi ZL,Low(MyArray<<1)
lpm Temp1, Z+
cpi temp1, 0
breq finito
rcall uart_snt
rjmp ReadArray
Позвольте узнать, от чего тактируется Ваша схема?
Для работы UART
всегда используют кварцевый резонатор! Внутренний генератор имеет ОЧЕНЬ плохую точность и когда у Вас температура в комнате на 5 градусов поменяется, Вы можете уже и остальных букв не увидеть.
А что означает: MyArray<<1 ?
И почему так сравнивается с 0: cpi temp1, 0 ?
Re: ATmega2561: Строка в UART!
Добавлено: Ср ноя 17, 2010 16:42:27
Slavast
Тактируюсь спомощью предделителя UARTA. A на самом микроконтроллере навешен кварц 16 МГц!
Re: ATmega2561: Строка в UART!
Добавлено: Ср ноя 17, 2010 16:49:19
Engineer_Keen
Slavast писал(а):А что означает: MyArray<<1 ?
Сдвиг MyArray влево на 1 бит, это тоже самое что и умножение на 2
Slavast писал(а):И почему так сравнивается с 0: cpi temp1, 0 ?
А как? Если сравнивается с числом 0, то cpi temp1,0, если с символом "0", то либо cpi temp1,'0', либо cpi temp1,0x30 (0x30=48=ASCII код символа "0")
Похоже в данном случае дело было просто в ошибках синхронизации на скорости 115200
Re: ATmega2561: Строка в UART!
Добавлено: Ср ноя 17, 2010 16:55:34
Slavast
Slavast писал(а):Похоже в данном случае дело было просто в ошибках синхронизации на скорости 115200
Да, наверное была виновата скорость.
Ваш код не работает - выводит только бесконечно букву П, первую букву слова Привет.
Зато старый код работает безупречно.
Re: ATmega2561: Строка в UART!
Добавлено: Ср ноя 17, 2010 17:08:34
Engineer_Keen
Slavast писал(а):Ваш код не работает - выводит только бесконечно букву П, первую букву слова Привет.
В коде
Foksа есть ошибочка. RJMP нужно делать не на строку
а на строку
иначе в Z всегда загружается адрес 1-го символа...
Re: ATmega2561: Строка в UART!
Добавлено: Чт ноя 18, 2010 11:40:14
Slavast
Engineer_Keen писал(а):Slavast писал(а):Ваш код не работает - выводит только бесконечно букву П, первую букву слова Привет.
Всем спасибо!
Работает безупречно!
Re: ATmega2561: Строка в UART!
Добавлено: Пт ноя 19, 2010 20:27:22
Kavka
Slavast писал(а):Тактируюсь спомощью предделителя UARTA. A на самом микроконтроллере навешен кварц 16 МГц!
Для 16МГц-ового кварца, для 115200 на UART-е, надо ставить UART в режим двойной скорости - тогда расхождение частоты получается меньше. Абсолютное значение ошибки - 2.1% против 3.5%. А вообще рекомендуют не более 1.5-2.0% расхождение. В общем, за подробностями,как обычно, в даташит...

Re: ATmega2561: Строка в UART!
Добавлено: Пн ноя 22, 2010 14:51:25
Slavast
Kavka писал(а): Для 16МГц-ового кварца, для 115200 на UART-е, надо ставить UART в режим двойной скорости - тогда расхождение частоты получается меньше. Абсолютное значение ошибки - 2.1% против 3.5%. А вообще рекомендуют не более 1.5-2.0% расхождение. В общем, за подробностями,как обычно, в даташит...

Понял! Спасибо)
Re: ATmega2561: Строка в UART!
Добавлено: Сб мар 05, 2011 21:44:16
Belerafon
каким образом можно сравнить 2 массива? только перебором по байту или можно как то еще, например есть 2 массива, вводим данные через юарт они сохраняются в массив по нажатию на интер введенный массив надо сравнить по порядку с одним потом с другим, это можно делать тока перебором?