ATmega2561: Строка в UART!

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Открыл глаза
Сообщения: 66
Зарегистрирован: Чт окт 21, 2010 10:05:27

Сообщение Slavast »

У меня такой вопрос. Я на UART хочу вывести слово "Привет Комсомолу" на Терминал компьютера (Использую программу Win Term). Использую алгоритм вывода массива строки. Но выводит всё, кроме первых 2-х букв. Вместо них какие-то квадраты. В чем загвоздка? В цикле вывода массива? И как правильно проверять конец строки (Я проверяю по точке)?
Заранее, спасибо"!
Вложения
UART5.RAR
(8.03 КБ) 189 скачиваний
Контактная информация:
Реклама
Опытный кот
Сообщения: 804
Зарегистрирован: Чт мар 12, 2009 16:31:05

Сообщение Vov123 »

К строчке,после качек добавь запятую и нолик.Попробуй.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

Попробуйте вместо первых буков в символьном виде использовать HEX коды.

Если вместо буквы квадраты, значит символ не соответствует букве. Или компилятор неверно перевел данные в строке '.db' или при передаче что-то испортилось...

В конце строк можно ставить непечатаемые символы (тот же 0). Или можно ставить символы возврат каретки (0x0D) и перевод строки (0x0A)
Открыл глаза
Сообщения: 66
Зарегистрирован: Чт окт 21, 2010 10:05:27

Сообщение Slavast »

Т.е. так прямо и писать

MyArray:
.db "Привет Комсомолу!!! 0x0A, 0x0D"

или

.db "Привет Комсомолу!!!", 0x0A, 0x0D

или

.db "Привет Комсомолу!!!", "0"
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Опытный кот
Сообщения: 804
Зарегистрирован: Чт мар 12, 2009 16:31:05

Сообщение Vov123 »

я советовал третью строчку,но нолик должен без кавычек (...,0)
Реклама
Открыл глаза
Сообщения: 66
Зарегистрирован: Чт окт 21, 2010 10:05:27

Сообщение Slavast »

Все еще выводит:

[]ривет Комсомолу

Что с этим делать?
Контактная информация:
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

Так он ломает первые 2 буквы или одну?
А если написать

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

.db 0xCF,"ривет Комсомолу!!!",0x00
?
Открыл глаза
Сообщения: 66
Зарегистрирован: Чт окт 21, 2010 10:05:27

Сообщение Slavast »

Попробовал!
Поменял скорость UART на более меньшую! заработало!
Спасибо.
Контактная информация:
Поставщик валерьянки для Кота
Сообщения: 2108
Зарегистрирован: Пт авг 29, 2008 16:28:19
Откуда: Киев

Сообщение 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 градусов поменяется, Вы можете уже и остальных букв не увидеть.
Последний раз редактировалось Foks Ср ноя 17, 2010 16:30:58, всего редактировалось 2 раза.
Giggity giggity goo!
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

Slavast писал(а):Попробовал!
Поменял скорость UART на более меньшую! заработало!
Спасибо.
Что именно сработало? 0xFC вместо буквы "П" или скорость поменять?
Открыл глаза
Сообщения: 66
Зарегистрирован: Чт окт 21, 2010 10:05:27

Сообщение Slavast »

Engineer_Keen писал(а):
Slavast писал(а):Попробовал!
Поменял скорость UART на более меньшую! заработало!
Спасибо.
Что именно сработало? 0xFC вместо буквы "П" или скорость поменять?

Когда поменял 0xFC вместо буквы "П" - в начале тоже выводились какие-то непонятные символы.
Подумал что что-то с синхронизацией, т.к. потом фраза выводится вся четко.
Поменял скорость с 115200 до 34800.
Заработало и 0xFC вместо буквы "П", и целиком обычное слово "Привет"
Контактная информация:
Открыл глаза
Сообщения: 66
Зарегистрирован: Чт окт 21, 2010 10:05:27

Сообщение 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 ?
Контактная информация:
Открыл глаза
Сообщения: 66
Зарегистрирован: Чт окт 21, 2010 10:05:27

Сообщение Slavast »

Тактируюсь спомощью предделителя UARTA. A на самом микроконтроллере навешен кварц 16 МГц!
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение 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
Открыл глаза
Сообщения: 66
Зарегистрирован: Чт окт 21, 2010 10:05:27

Сообщение Slavast »

Slavast писал(а):Похоже в данном случае дело было просто в ошибках синхронизации на скорости 115200

Да, наверное была виновата скорость.
Ваш код не работает - выводит только бесконечно букву П, первую букву слова Привет.
Зато старый код работает безупречно.
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

Slavast писал(а):Ваш код не работает - выводит только бесконечно букву П, первую букву слова Привет.
В коде Foksа есть ошибочка. RJMP нужно делать не на строку

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

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

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

lpm Temp1, Z+
иначе в Z всегда загружается адрес 1-го символа...
Открыл глаза
Сообщения: 66
Зарегистрирован: Чт окт 21, 2010 10:05:27

Сообщение Slavast »

Engineer_Keen писал(а):
Slavast писал(а):Ваш код не работает - выводит только бесконечно букву П, первую букву слова Привет.
Всем спасибо!
Работает безупречно!
Контактная информация:
Мудрый кот
Аватара пользователя
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Сообщение Kavka »

Slavast писал(а):Тактируюсь спомощью предделителя UARTA. A на самом микроконтроллере навешен кварц 16 МГц!
Для 16МГц-ового кварца, для 115200 на UART-е, надо ставить UART в режим двойной скорости - тогда расхождение частоты получается меньше. Абсолютное значение ошибки - 2.1% против 3.5%. А вообще рекомендуют не более 1.5-2.0% расхождение. В общем, за подробностями,как обычно, в даташит... :)
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Открыл глаза
Сообщения: 66
Зарегистрирован: Чт окт 21, 2010 10:05:27

Сообщение Slavast »

Kavka писал(а): Для 16МГц-ового кварца, для 115200 на UART-е, надо ставить UART в режим двойной скорости - тогда расхождение частоты получается меньше. Абсолютное значение ошибки - 2.1% против 3.5%. А вообще рекомендуют не более 1.5-2.0% расхождение. В общем, за подробностями,как обычно, в даташит... :)
Понял! Спасибо)
Контактная информация:
Встал на лапы
Сообщения: 110
Зарегистрирован: Вс май 10, 2009 18:23:45

Сообщение Belerafon »

каким образом можно сравнить 2 массива? только перебором по байту или можно как то еще, например есть 2 массива, вводим данные через юарт они сохраняются в массив по нажатию на интер введенный массив надо сравнить по порядку с одним потом с другим, это можно делать тока перебором?
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»