Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Вопрос по регистру PINx, I/O...
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
MakFatum
Здравствуйте!...

Столкнулся с небольшой проблемой:
Две частоты (НЧ И ВЧ) у меня умножаются, на выходе получаются пачки импульсов...
Отдельно НЧ выходит с 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 происходит тоже самое
То есть в АВРстудио тоже работает......

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

Спасибо...
defunct
Вам действительно нужны обе частоты отдельно?
Ведь можно прямо внутри чипа без всяких OC получить результирующий (умноженный) сигнал.
beer_warrior
Я приблизительно помню схему поэтому посоветую следующее:
1. Смешивать не биты ножек, а два флажка в ОЗУ (можно в регистрах).
2.Если выходы посажены на транзисторы(а по-моему - так и есть) напряжения на входе действительно не будет - ток будет качаться через базу, а падение будет 0.7В. Тут можно использовать полевик или увеличивать базовый резистор.
muravei
Я не слишком вник в тему, но замечу что сигнал на выходе порта может быть считан через такт после вывода
MakFatum
Цитата(defunct @ Apr 10 2006, 16:12) *
Вам действительно нужны обе частоты отдельно?
Ведь можно прямо внутри чипа без всяких OC получить результирующий (умноженный) сигнал.

Для контроля НЧ и ВЧ надо бы мне выводить наружу....
Расскажите пожалуйста, каким методом это делается (умножается) внутри чипа?

Цитата
1. Смешивать не биты ножек, а два флажка в ОЗУ (можно в регистрах).

..........Немного не понял, чуть поподробнее можно, или где почитать?.........
Цитата
2.Если выходы посажены на транзисторы(а по-моему - так и есть) напряжения на входе действительно не будет - ток будет качаться через базу, а падение будет 0.7В. Тут можно использовать полевик или увеличивать базовый резистор.

Да нет, у меня кроме МК его обвязки, ключей для выбора частот больше ничего нет. а с ОС просто проводами на другие пины.... Понимаю, что некрасиво, но иначе еще не придумал...
Цитата
Я не слишком вник в тему, но замечу что сигнал на выходе порта может быть считан через такт после вывода

Так в том-то и дело, что PINx железе получается не изменяется при выводе, а в эмуляторах и отладчиках как с добрым утром дергается...из 0 в 1, и обратно

Спасибо...
defunct
Цитата(MakFatum @ Apr 10 2006, 13:40) *
Для контроля НЧ и ВЧ надо бы мне выводит наружу....
Расскажите пожалуйста, каким методом это делается (умножается) внутри чипа?

Например таким:
Используем два таймера, один (T1) для генерации НЧ, другой напр. (T0) для генерации ВЧ.
В обработчике прерывания T1 инвертироуем флажек.
В обработчике прерывания T0 если флажек T1 установлен, то инвертируем и выводим сигнал.

Пример:

Код
static char c = 0;

Signal T1 // Обработчик прерывания T1
{
    c ~= 0xFF;
}


Signal T0 // Обработчик прерывания T0
{
   if ( c )
      PC5 ~= PC5;
}
Laksus
_____________
Никак не могу понять в ДВУХ эмуляторах VMlab и Proteus этот код работает,
а в РЕАЛЬНОМ устройстве нет...
ПОЧЕМУ?...
_____________
Набросал програмку(Нажмите для просмотра прикрепленного файла),
собрал макетку.
Только на 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
vet
Цитата(Laksus @ Apr 11 2006, 18:54) *
Когда я гонял програмку в AVRStudio, то видно что период
прерывания всегда больше вычисленного (сохраняется куча регистров перед переустановкой таймера)

Вполне логично. Просто для точной установки периода у таймера есть режим CTC.
Ну, а что сохраняется куча регистров, хотя в данном случае суть не в этом, - если не вызывать в прерывании подпрограмм, то компилятор сохраняет необходимый минимум регистров (в отдельных случаях - вплоть до нуля).
MakFatum
Спасибо большое за столь подробные объяснения....!!!
есть пробелы в знаниях, буду исправлять...

проблему решил в лоб: после недельного ожидания приехала новая Мега16, поставил ее, прошил и заработало.......! ура!..а то я уже не знал, что думать!!
....хомуты были.............и не только в железе, как оказалось.....
blush.gif
Еще раз спасибо!.............
Всем благодарен...
Laksus
Извините, что продолжаю, уже исчерпаную тему,
но хочу поблагодарить vet.

Да, CTC для генерации частоты конечно лучше чем режим переполнения,
который я применил.
Спасибо за замечание, я на это как-то не обращал внимания.
_____________
Александр
2006 04 12
MakFatum
касательно точности...
VmLab показывал 419,5 вместо 420
781,4 вместо 780,..
в железе все также....
.....это при использовании режима СТС

Спасибо
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.