Перейти к содержанию
    

Вопрос по регистру PINx, I/O...

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

 

Столкнулся с небольшой проблемой:

Две частоты (НЧ И ВЧ) у меня умножаются, на выходе получаются пачки импульсов...

Отдельно НЧ выходит с 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 происходит тоже самое

То есть в АВРстудио тоже работает......

 

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

 

Спасибо...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вам действительно нужны обе частоты отдельно?

Ведь можно прямо внутри чипа без всяких OC получить результирующий (умноженный) сигнал.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я приблизительно помню схему поэтому посоветую следующее:

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я не слишком вник в тему, но замечу что сигнал на выходе порта может быть считан через такт после вывода

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вам действительно нужны обе частоты отдельно?

Ведь можно прямо внутри чипа без всяких OC получить результирующий (умноженный) сигнал.

Для контроля НЧ и ВЧ надо бы мне выводить наружу....

Расскажите пожалуйста, каким методом это делается (умножается) внутри чипа?

 

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

..........Немного не понял, чуть поподробнее можно, или где почитать?.........

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

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

Я не слишком вник в тему, но замечу что сигнал на выходе порта может быть считан через такт после вывода

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

 

Спасибо...

Изменено пользователем MakFatum

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для контроля НЧ и ВЧ надо бы мне выводит наружу....

Расскажите пожалуйста, каким методом это делается (умножается) внутри чипа?

Например таким:

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

В обработчике прерывания T1 инвертироуем флажек.

В обработчике прерывания T0 если флажек T1 установлен, то инвертируем и выводим сигнал.

 

Пример:

 

static char c = 0;

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


Signal T0 // Обработчик прерывания T0
{
   if ( c )
      PC5 ~= PC5;
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

_____________

Никак не могу понять в ДВУХ эмуляторах VMlab и Proteus этот код работает,

а в РЕАЛЬНОМ устройстве нет...

ПОЧЕМУ?...

_____________

Набросал програмку(20060410.zip),

собрал макетку.

Только на 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Когда я гонял програмку в AVRStudio, то видно что период

прерывания всегда больше вычисленного (сохраняется куча регистров перед переустановкой таймера)

Вполне логично. Просто для точной установки периода у таймера есть режим CTC.

Ну, а что сохраняется куча регистров, хотя в данном случае суть не в этом, - если не вызывать в прерывании подпрограмм, то компилятор сохраняет необходимый минимум регистров (в отдельных случаях - вплоть до нуля).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо большое за столь подробные объяснения....!!!

есть пробелы в знаниях, буду исправлять...

 

проблему решил в лоб: после недельного ожидания приехала новая Мега16, поставил ее, прошил и заработало.......! ура!..а то я уже не знал, что думать!!

....хомуты были.............и не только в железе, как оказалось.....

:blush:

Еще раз спасибо!.............

Всем благодарен...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Извините, что продолжаю, уже исчерпаную тему,

но хочу поблагодарить vet.

 

Да, CTC для генерации частоты конечно лучше чем режим переполнения,

который я применил.

Спасибо за замечание, я на это как-то не обращал внимания.

_____________

Александр

2006 04 12

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

касательно точности...

VmLab показывал 419,5 вместо 420

781,4 вместо 780,..

в железе все также....

.....это при использовании режима СТС

 

Спасибо

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...