реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> VirtualTerminal + Atmega16, Не читает из терминала
Ruffian
сообщение Mar 7 2011, 23:15
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 19
Регистрация: 4-03-11
Пользователь №: 63 397



Всем привет.
Помогите разобраться с терминалом. Посмотрел урок по UART, решил повторить. Но что-то не работает.
Код
  UART1_Init(9600);
  UART1_Write('A');
  while (1){
       if ( UART1_Data_Ready()==1 ) {
            readBuffer[i] = UART1_Read();
            i++;
            if ( i==40 ){
                 i=0;
                 Lcd_Cmd(_LCD_RETURN_HOME);
                 for (pos=0;pos<40;pos++){
                     Lcd_Chr_Cp(readBuffer[pos]);
                     if (pos==19){
                          Lcd_Cmd(_LCD_SECOND_ROW);
                     }
                 }
                 UART1_Write('Y');
            }
       }
       else{

       }
  }


В протеусе подключен VirtualTerminal. Набираю в нем текст - никакой реакции. И в терминал не выводит тоже.
UART1_Data_Ready() единицу не возвращает. Почему - непонятно.

Прикрепленные файлы
Прикрепленный файл  terminal.zip ( 63.55 килобайт ) Кол-во скачиваний: 16
 
Go to the top of the page
 
+Quote Post
defunct
сообщение Mar 8 2011, 01:20
Сообщение #2


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(Ruffian @ Mar 8 2011, 01:15) *
UART1_Data_Ready() единицу не возвращает. Почему - непонятно.

А мне непонятно, что такое UART1_Data_Ready().
Веселые вы исходники выложили. Чем такое собирается? один .c файл, в нем одна функция, нет ни одного #include.. странно.
Что тут сказать - берите даташит на МК, читайте главу про USART и пробуйте, там все должно быть внятно написано.
Go to the top of the page
 
+Quote Post
SysRq
сообщение Mar 8 2011, 11:46
Сообщение #3


Чайник, 1 литр
****

Группа: Свой
Сообщений: 655
Регистрация: 17-05-06
Из: Moscow
Пользователь №: 17 168



Схему в Proteus'е покажите в виде картинки. Может Rx\Tx всего-то перевернуть надо...

--

Цитата(defunct @ Mar 8 2011, 04:20) *
Чем такое собирается?
Судя по логам и *.lst, этим: http://www.mikroe.com/eng/products/view/22...oc-pro-for-avr/
Go to the top of the page
 
+Quote Post
Ruffian
сообщение Mar 8 2011, 14:34
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 19
Регистрация: 4-03-11
Пользователь №: 63 397



Схема есть в архиве. Называется terminal.dsn

Да, да, да !!!
Точно, поставил Rx и Tx перехлестом - заработало! Ввод с терминала теперь отображается на LCD.
Спасибо! Я почему-то подумал, что одноименные выводы соединить надо.
Пойду смотреть как в обратную сторону из МК на терминал работает.
Ещё раз спасибо!
Go to the top of the page
 
+Quote Post
SysRq
сообщение Mar 8 2011, 14:59
Сообщение #5


Чайник, 1 литр
****

Группа: Свой
Сообщений: 655
Регистрация: 17-05-06
Из: Moscow
Пользователь №: 17 168



Цитата(Ruffian @ Mar 8 2011, 17:34) *
Схема есть в архиве. Называется terminal.dsn
Не у всех есть Proteus (к тому же, нужной версии), и совсем уж не каждый станет его ставить ради просмотра схемы.
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Mar 8 2011, 15:49
Сообщение #6


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(Ruffian @ Mar 8 2011, 17:34) *
Схема есть в архиве. Называется terminal.dsn

Да, да, да !!!
Точно, поставил Rx и Tx перехлестом - заработало! Ввод с терминала теперь отображается на LCD.
Спасибо! Я почему-то подумал, что одноименные выводы соединить надо.
Пойду смотреть как в обратную сторону из МК на терминал работает.
Ещё раз спасибо!

Там можно диагностику включать и смотреть, пришло ли, ушло ли, куда и с какой целью ушло sm.gif итд
Go to the top of the page
 
+Quote Post
Ruffian
сообщение Mar 8 2011, 18:03
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 19
Регистрация: 4-03-11
Пользователь №: 63 397



Цитата(_Pasha @ Mar 8 2011, 18:49) *
Там можно диагностику включать и смотреть, пришло ли, ушло ли, куда и с какой целью ушло sm.gif итд


Что за диагностика? Можно чуть подробнее? Debug оказался в моем случае бессилен biggrin.gif
Go to the top of the page
 
+Quote Post
Ruffian
сообщение Mar 9 2011, 11:37
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 19
Регистрация: 4-03-11
Пользователь №: 63 397



В общем при передаче в терминал обнаружилась ошибка. Делаю так:

Цитата
UART1_Init(9600);
Delay_ms(200);
UART1_Write_Text("Hello From Hell");
UART1_Write_Text("AAA");


В протеусе подключаю к МК два устройства:
1. Элемент VirtualTerminal
2. Элемент компорта COMPIM. Этот COMPIM связываю со встроенным виндовым терминалом.

Запускаю симуляцию и оба терминала отображают мне такие строки:
"ello From Hell"
"lAA"
Первый байт передачи исчез. Последний байт первой строки (l) был передан со второй строкой, а последний байт второй строки остался непереданным.
Если после этого передать например "ВВВ" а затем "ССС", то в терминал придёт "АВВ" и "ВСС"
После ковыряние в дебаггере обнаружил, что регистр данных UDR непосредственно перед передачей содержит последний байт предыдущей передачи. И соответственно пуляет сначала его, а затем байты текущей передачи количеством n-1. Последний байт текущей передачи остается непереданным и сидит в UDR, ожидая своей очереди до следующей передачи.
Дальше сделал так: перед каждым UART1_Write принудительно стал обнулять UDR. И всё встало на свои места. В терминалах корректно отображается всё, что было передано.
Но нигде не видел, чтобы принудительно надо было обнулять UDR перед передачей.
Почему так, в чем проблема?

Go to the top of the page
 
+Quote Post
SysRq
сообщение Mar 9 2011, 12:28
Сообщение #9


Чайник, 1 литр
****

Группа: Свой
Сообщений: 655
Регистрация: 17-05-06
Из: Moscow
Пользователь №: 17 168



Цитата(Ruffian @ Mar 9 2011, 14:37) *
Почему так, в чем проблема?
Дайте *.lss от скомпилированного проекта, где использована UART1_Write_Text(), тогда быть может скажем чего.
Go to the top of the page
 
+Quote Post
Ruffian
сообщение Mar 9 2011, 12:48
Сообщение #10


Участник
*

Группа: Участник
Сообщений: 19
Регистрация: 4-03-11
Пользователь №: 63 397



Цитата(SysRq @ Mar 9 2011, 15:28) *
Дайте *.lss от скомпилированного проекта, где использована UART1_Write_Text(), тогда быть может скажем чего.


.lss в папке проекта не обнаружил. Есть .lst - там ассемблерный листинг.

В общем всю папку проекта прицепил. И протеусовскую схему, и простой рисунок схемы в формате png.


Если закомментировать все UDR=0 то ошибка начнет появляться.

Прикрепленные файлы
Прикрепленный файл  terminal.zip ( 121 килобайт ) Кол-во скачиваний: 14
 
Go to the top of the page
 
+Quote Post
SysRq
сообщение Mar 9 2011, 15:28
Сообщение #11


Чайник, 1 литр
****

Группа: Свой
Сообщений: 655
Регистрация: 17-05-06
Из: Moscow
Пользователь №: 17 168



Там такое:
Код
0x0074    0xB1BB        IN         R27, UDRE0_bit+0
0x007C    0xB1BB        IN         R27, TXC0_bit+0
//...
0x002B       [0]    RXC0_bit
0x002B       [0]    UDRE0_bit

C учётом такового обращения инструкцией IN к адресам, приведённым (+ 0x20) для LD\ST, я не представляю как вся эта хрень работать будет laughing.gif

Посмотрите размеры стеков в опциях проекта. Быть может, увеличить надо, ибо отправка строки состоит из кусков: взять адрес в z, перебросить из flash (lpm, z+) в ram (st x+), далее некоторые чудеса со стеками, и лишь потом вывод.
Go to the top of the page
 
+Quote Post
Ruffian
сообщение Mar 9 2011, 17:17
Сообщение #12


Участник
*

Группа: Участник
Сообщений: 19
Регистрация: 4-03-11
Пользователь №: 63 397



что-то я не найду в проекте свойства "размер стека". Есть только выбор девайса и частоты генератора.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 13:53
Рейтинг@Mail.ru


Страница сгенерированна за 0.01468 секунд с 7
ELECTRONIX ©2004-2016