Страница 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 буквы или одну?
А если написать

Код: Выделить всё

.db 0xCF,"ривет Комсомолу!!!",0x00
?

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 нужно делать не на строку

Код: Выделить всё

ldi ZH,High(MyArray<<1)
а на строку

Код: Выделить всё

lpm Temp1, Z+
иначе в 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 массива, вводим данные через юарт они сохраняются в массив по нажатию на интер введенный массив надо сравнить по порядку с одним потом с другим, это можно делать тока перебором?