Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: VirtualTerminal + Atmega16
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
Ruffian
Всем привет.
Помогите разобраться с терминалом. Посмотрел урок по 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() единицу не возвращает. Почему - непонятно.
defunct
Цитата(Ruffian @ Mar 8 2011, 01:15) *
UART1_Data_Ready() единицу не возвращает. Почему - непонятно.

А мне непонятно, что такое UART1_Data_Ready().
Веселые вы исходники выложили. Чем такое собирается? один .c файл, в нем одна функция, нет ни одного #include.. странно.
Что тут сказать - берите даташит на МК, читайте главу про USART и пробуйте, там все должно быть внятно написано.
SysRq
Схему в Proteus'е покажите в виде картинки. Может Rx\Tx всего-то перевернуть надо...

--

Цитата(defunct @ Mar 8 2011, 04:20) *
Чем такое собирается?
Судя по логам и *.lst, этим: http://www.mikroe.com/eng/products/view/22...oc-pro-for-avr/
Ruffian
Схема есть в архиве. Называется terminal.dsn

Да, да, да !!!
Точно, поставил Rx и Tx перехлестом - заработало! Ввод с терминала теперь отображается на LCD.
Спасибо! Я почему-то подумал, что одноименные выводы соединить надо.
Пойду смотреть как в обратную сторону из МК на терминал работает.
Ещё раз спасибо!
SysRq
Цитата(Ruffian @ Mar 8 2011, 17:34) *
Схема есть в архиве. Называется terminal.dsn
Не у всех есть Proteus (к тому же, нужной версии), и совсем уж не каждый станет его ставить ради просмотра схемы.
_Pasha
Цитата(Ruffian @ Mar 8 2011, 17:34) *
Схема есть в архиве. Называется terminal.dsn

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

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


Что за диагностика? Можно чуть подробнее? Debug оказался в моем случае бессилен biggrin.gif
Ruffian
В общем при передаче в терминал обнаружилась ошибка. Делаю так:

Цитата
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 перед передачей.
Почему так, в чем проблема?

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


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

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


Если закомментировать все UDR=0 то ошибка начнет появляться.
SysRq
Там такое:
Код
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+), далее некоторые чудеса со стеками, и лишь потом вывод.
Ruffian
что-то я не найду в проекте свойства "размер стека". Есть только выбор девайса и частоты генератора.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.