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

 
 
> Прошу помощи
Maks448
сообщение Feb 13 2007, 13:23
Сообщение #1





Группа: Новичок
Сообщений: 2
Регистрация: 13-02-07
Пользователь №: 25 298



Уважаемые форумчане, объясните, пожалуйста, "чайнику" в чем прикол (или прокол?). Программка простая, как два пальца, по идее должна вывести в порт RS232 удвоенное количество байтов от числа, находящегося в счетчике (регистр Z). Реально же выводится 4608, т.е. четвертая часть. Где я допустил ошибку? Пробовал также на Mega8 - результат тот же.

.include "2333def.inc"
.def Tmp =r16
.cseg
.org 0
reset:
clr Tmp
out UBRRH,Tmp
ldi Tmp,$19
out UBRRL,Tmp ;Настройка скорости СОМ-порта

clr Tmp
out UCSRA,Tmp
ldi Tmp,$18
out UCSRB,Tmp ;Настройка UART

in Tmp,WDTCR
ori Tmp,$18
out WDTCR,Tmp
clr Tmp
out WDTCR,Tmp ;Отключение WDT

ldi Tmp,$20
out DDRC,Tmp ;Определение линии порта С как выход
cbi PortC,5 ;Включить светодиод
ldi ZL,Low(9216)
ldi ZH,high(9216) ;Загрузка счетчика байтов
Loop:
subi ZL,1
sbci ZH,0 ;Декремент счетчика
Wait1:
sbis UCSRA,UDRE ;Ожидание готовности UART
rjmp Wait1
out UDR,ZH ;Вывод старшего байта счетчика
Wait2:
sbis UCSRA,UDRE ;Ожидание готовности UART
rjmp Wait2
out UDR,ZL ;Вывод младшего байта
cpi ZL,0
ldi Tmp,0
cpc ZH,Tmp ;Проверка счетчика на 0
brne Loop ;Не 0 - возврат
sbi PortC,5 ;Иначе - выключить светодиод и
Cycle:
rjmp Cycle ;зациклить программу
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
rx3apf
сообщение Feb 13 2007, 14:26
Сообщение #2


Гуру
******

Группа: Участник
Сообщений: 3 834
Регистрация: 14-06-06
Из: Moscow, Russia
Пользователь №: 18 047



Цитата(Maks448 @ Feb 13 2007, 13:23) *
Уважаемые форумчане, объясните, пожалуйста, "чайнику" в чем прикол (или прокол?). Программка простая, как два пальца, по идее должна вывести в порт RS232 удвоенное количество байтов от числа, находящегося в счетчике (регистр Z). Реально же выводится 4608, т.е. четвертая часть. Где я допустил ошибку? Пробовал также на Mega8 - результат тот же.

Безотносительно проблемы - декремент 16-битного счетчика красивее делать командой sbiw, а проверку на 0 - "mov temp,ZH or temp,ZL" или парой sbiw+adiw, или subi ZL,0 + sbci ZH,0
А что до логики - на первый взгляд все правильно. Надо бы глянуть терминалкой (с хексом) - а что же, собственно, реально ушло ?

Цитата(Leen @ Feb 13 2007, 14:16) *
Во-первых: а как это 9216/4=4608? Калькулятор и уроки математики говорят другое.. Во-вторых, а чем Вы смотрите, сколько приходит из выхода АВР? И еще: похоже, теряется ноль.. Вы не могли скорости портор приемника и передатчика разными сделать?


Четвертая часть от ожидаемого. А ожидается удвоенное от счетчика, так что математика не возражает. И с учетом кратности, вариант с разной скоростью портов представляется малоправдоподобным - что-то уж очень подозрительно кратные (если и в самом деле так).
Цитата(Leen @ Feb 13 2007, 14:16) *
Еще могу посоветовать сделать эхо: поллим приемник, затем когда приняли, тут же кидаем обратно.

И еще в таких случаях помогает вывод куда-нибудь какого-нибудь строб-сигнала, чтобы посмотреть скопом. Сразу видно и периоды, и общую длительность посылки. Если, конечно, есть скоп...

Сообщение отредактировал rx3apf - Feb 13 2007, 14:32
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 04:00
Рейтинг@Mail.ru


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