|
|
  |
VirtualTerminal + Atmega16, Не читает из терминала |
|
|
|
Mar 7 2011, 23:15
|
Участник

Группа: Участник
Сообщений: 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() единицу не возвращает. Почему - непонятно.
|
|
|
|
|
Mar 8 2011, 11:46
|

Чайник, 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/
|
|
|
|
|
Mar 8 2011, 14:34
|
Участник

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

|
Схема есть в архиве. Называется terminal.dsn
Да, да, да !!! Точно, поставил Rx и Tx перехлестом - заработало! Ввод с терминала теперь отображается на LCD. Спасибо! Я почему-то подумал, что одноименные выводы соединить надо. Пойду смотреть как в обратную сторону из МК на терминал работает. Ещё раз спасибо!
|
|
|
|
|
Mar 8 2011, 18:03
|
Участник

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

|
Цитата(_Pasha @ Mar 8 2011, 18:49)  Там можно диагностику включать и смотреть, пришло ли, ушло ли, куда и с какой целью ушло  итд Что за диагностика? Можно чуть подробнее? Debug оказался в моем случае бессилен
|
|
|
|
|
Mar 9 2011, 11:37
|
Участник

Группа: Участник
Сообщений: 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 перед передачей. Почему так, в чем проблема?
|
|
|
|
|
Mar 9 2011, 12:48
|
Участник

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

|
Цитата(SysRq @ Mar 9 2011, 15:28)  Дайте *.lss от скомпилированного проекта, где использована UART1_Write_Text(), тогда быть может скажем чего. .lss в папке проекта не обнаружил. Есть .lst - там ассемблерный листинг. В общем всю папку проекта прицепил. И протеусовскую схему, и простой рисунок схемы в формате png. Если закомментировать все UDR=0 то ошибка начнет появляться.
|
|
|
|
|
Mar 9 2011, 15:28
|

Чайник, 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, я не представляю как вся эта хрень работать будет Посмотрите размеры стеков в опциях проекта. Быть может, увеличить надо, ибо отправка строки состоит из кусков: взять адрес в z, перебросить из flash (lpm, z+) в ram (st x+), далее некоторые чудеса со стеками, и лишь потом вывод.
|
|
|
|
|
Mar 9 2011, 17:17
|
Участник

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

|
что-то я не найду в проекте свойства "размер стека". Есть только выбор девайса и частоты генератора.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|