MakFatum 0 10 апреля, 2006 Опубликовано 10 апреля, 2006 · Жалоба Здравствуйте!... Столкнулся с небольшой проблемой: Две частоты (НЧ И ВЧ) у меня умножаются, на выходе получаются пачки импульсов... Отдельно НЧ выходит с 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 0 10 апреля, 2006 Опубликовано 10 апреля, 2006 · Жалоба Вам действительно нужны обе частоты отдельно? Ведь можно прямо внутри чипа без всяких OC получить результирующий (умноженный) сигнал. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
beer_warrior 0 10 апреля, 2006 Опубликовано 10 апреля, 2006 · Жалоба Я приблизительно помню схему поэтому посоветую следующее: 1. Смешивать не биты ножек, а два флажка в ОЗУ (можно в регистрах). 2.Если выходы посажены на транзисторы(а по-моему - так и есть) напряжения на входе действительно не будет - ток будет качаться через базу, а падение будет 0.7В. Тут можно использовать полевик или увеличивать базовый резистор. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
muravei 3 10 апреля, 2006 Опубликовано 10 апреля, 2006 · Жалоба Я не слишком вник в тему, но замечу что сигнал на выходе порта может быть считан через такт после вывода Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MakFatum 0 10 апреля, 2006 Опубликовано 10 апреля, 2006 (изменено) · Жалоба Вам действительно нужны обе частоты отдельно? Ведь можно прямо внутри чипа без всяких OC получить результирующий (умноженный) сигнал. Для контроля НЧ и ВЧ надо бы мне выводить наружу.... Расскажите пожалуйста, каким методом это делается (умножается) внутри чипа? 1. Смешивать не биты ножек, а два флажка в ОЗУ (можно в регистрах). ..........Немного не понял, чуть поподробнее можно, или где почитать?......... 2.Если выходы посажены на транзисторы(а по-моему - так и есть) напряжения на входе действительно не будет - ток будет качаться через базу, а падение будет 0.7В. Тут можно использовать полевик или увеличивать базовый резистор. Да нет, у меня кроме МК его обвязки, ключей для выбора частот больше ничего нет. а с ОС просто проводами на другие пины.... Понимаю, что некрасиво, но иначе еще не придумал... Я не слишком вник в тему, но замечу что сигнал на выходе порта может быть считан через такт после вывода Так в том-то и дело, что PINx железе получается не изменяется при выводе, а в эмуляторах и отладчиках как с добрым утром дергается...из 0 в 1, и обратно Спасибо... Изменено 10 апреля, 2006 пользователем MakFatum Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
defunct 0 10 апреля, 2006 Опубликовано 10 апреля, 2006 · Жалоба Для контроля НЧ и ВЧ надо бы мне выводит наружу.... Расскажите пожалуйста, каким методом это делается (умножается) внутри чипа? Например таким: Используем два таймера, один (T1) для генерации НЧ, другой напр. (T0) для генерации ВЧ. В обработчике прерывания T1 инвертироуем флажек. В обработчике прерывания T0 если флажек T1 установлен, то инвертируем и выводим сигнал. Пример: static char c = 0; Signal T1 // Обработчик прерывания T1 { c ~= 0xFF; } Signal T0 // Обработчик прерывания T0 { if ( c ) PC5 ~= PC5; } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Laksus 0 11 апреля, 2006 Опубликовано 11 апреля, 2006 · Жалоба _____________ Никак не могу понять в ДВУХ эмуляторах 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vet 0 11 апреля, 2006 Опубликовано 11 апреля, 2006 · Жалоба Когда я гонял програмку в AVRStudio, то видно что период прерывания всегда больше вычисленного (сохраняется куча регистров перед переустановкой таймера) Вполне логично. Просто для точной установки периода у таймера есть режим CTC. Ну, а что сохраняется куча регистров, хотя в данном случае суть не в этом, - если не вызывать в прерывании подпрограмм, то компилятор сохраняет необходимый минимум регистров (в отдельных случаях - вплоть до нуля). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MakFatum 0 11 апреля, 2006 Опубликовано 11 апреля, 2006 · Жалоба Спасибо большое за столь подробные объяснения....!!! есть пробелы в знаниях, буду исправлять... проблему решил в лоб: после недельного ожидания приехала новая Мега16, поставил ее, прошил и заработало.......! ура!..а то я уже не знал, что думать!! ....хомуты были.............и не только в железе, как оказалось..... Еще раз спасибо!............. Всем благодарен... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Laksus 0 11 апреля, 2006 Опубликовано 11 апреля, 2006 · Жалоба Извините, что продолжаю, уже исчерпаную тему, но хочу поблагодарить vet. Да, CTC для генерации частоты конечно лучше чем режим переполнения, который я применил. Спасибо за замечание, я на это как-то не обращал внимания. _____________ Александр 2006 04 12 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MakFatum 0 12 апреля, 2006 Опубликовано 12 апреля, 2006 · Жалоба касательно точности... VmLab показывал 419,5 вместо 420 781,4 вместо 780,.. в железе все также.... .....это при использовании режима СТС Спасибо Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться