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

 
 
> Вопрос по регистру PINx, I/O..., не могу понять почему так, а не иначе..
MakFatum
сообщение Apr 10 2006, 09:49
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 54
Регистрация: 7-12-05
Пользователь №: 11 912



Здравствуйте!...

Столкнулся с небольшой проблемой:
Две частоты (НЧ И ВЧ) у меня умножаются, на выходе получаются пачки импульсов...
Отдельно НЧ выходит с OC1А
ВЧ: OC2

В Atmege 16 это порты PD7, PD5 соответственно!
Ну и перемножаю я:

if((PIND.5)&&(PIND.7)) {
PORTC.5 = 1;
}
else
PORTC.5 = 0;

опрашивая PD7, PD5 и выводя это в PORTC.5

Никак не могу понять в ДВУХ эмуляторах VMlab и Proteus этот код работает,
а в РЕАЛЬНОМ устройстве нет...
ПОЧЕМУ?...
Мне раньше в этом форуме ответили:

"У тебя-же эти выходы натроены на выход,соответственно чтение пинов некорректно.Самый простой выход - если есть незадействованные порты,настрой их на чтение и заведи свои выходы в парралеь и на них."
...
Я полагал раньше, если DDRx установлен на выход и программно изменяются состояния этого выхода с "0" на "1" и обратно, ТО и PINx должен изменять свое состояние?..
Неужели не так?...
В Vmlab во вкладке I/O Ports и в Proteus с регистром PINx так и происходит!!!!!!!!!!!!

В реальном устройстве действительно пришлось OC2 и OC1A завести на неиспользуемые пины, настроить на чтение, опрашивать их и только тогда заработало....

как позже потом написали на конференции "точки опоры":
при эмуляции в AVR studio происходит тоже самое
То есть в АВРстудио тоже работает......

В чем может быть дело?

Спасибо...
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Laksus
сообщение Apr 11 2006, 14:54
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 146
Регистрация: 16-05-05
Пользователь №: 5 069



_____________
Никак не могу понять в ДВУХ эмуляторах VMlab и Proteus этот код работает,
а в РЕАЛЬНОМ устройстве нет...
ПОЧЕМУ?...
_____________
Набросал програмку(Прикрепленный файл  20060410.zip ( 2.94 килобайт ) Кол-во скачиваний: 126
),
собрал макетку.
Только на AT90S2313, выход сделал на светодиоды,
пробовал с одной несщей и одной модулирующей,
пробовал и на AVRStudio.

1
if((PINx.x)&&(PINx.x)){...
if((PORTx.x)&&(PORTx.x)){...
оба варианта нормально работают, проверил на макетке.

2
Возможные причины неработы, мое мнение:
- хомут в остальной части программы,
- хомут в железе (короткое, испорченый чип)

3
В предыдущей своей теме "Генератор, меандры..."
Вы написали:
_____________
"...Вопрос 2. Дискретность установки частоты у 8-разрядного таймера оставляет желать лучшего даже при 1/8 кдел., т.е. получается допустим 420+-2Гц (иногда и больше) (многовато, нужно хотя бы +- 1Гц). "
_____________

Я очень сомневаюсь, что используя CodeVisionAVR Вы получите
такую точность.

Поясню:
(1/420)-(1/421)=0.000 005 655 сек, то есть 5 мксек
Когда я гонял програмку в AVRStudio, то видно что период
прерывания всегда больше вычисленного (сохраняется куча регистров
перед переустановкой таймера),
и, что хуже каждый раз другой, прыгает в пределах более 20 мксек
(при кварце 4 МГц).
Может как и можно это устранить, но я не знаю.

По моему, это можно сделать только в ассемблере.
Или повысить частоту кварца.
Или подумать нужна ли такая точность.

____________________
Александр
2006 04 11
Go to the top of the page
 
+Quote Post



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

 


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


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