Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Краткое резюме по поводу обвязки МК при SPI-прог-ии?
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
MakFatum
Всем Доброго Времени!...
я в курсе что это уже спрашивали, но это все разбросано кусками по всему форуму...
читал-читал и в голове одна каша...

можно ли подвести краткое резюме всему написанному ранее?...

Собрал простой SPI программатор по схеме :

Отдельно от него отладочная плата с панелькой.
Вопрос первый: какой длины я могу использовать провод между LPT (саму схему я поместил в разъеме LPT) и отладочной платой? Читал что 20-30 см?(придется сидеть тогда с платой и программатором глубоко под столом biggrin.gif ). Можно ли использовать удлинитель в виде шнура от матричного принтера???? (было бы для меня удобно, но не будут ли помехи наводиться???(хотя шнур от матричного принтера экранированный ведь?))
Вопрос второй, по отладочной плате. Ниже приведена обвязка, насобирал сведения отовсюду....Вопрос -такая схема с этими номиналамии будет работать?

Я помню обсуждалось, что AREF можно оставлять пустым?
В какой-то pdf-ке прочитал "Connect ICP to Vcc if not used" (20 вывод PD6)....Зачем??
и еще интересует RESET. Правильно ли будет ТАК, как на схеме?....

Заранее благодарен...
ivan2006
Цитата(MakFatum @ Feb 15 2006, 13:37) *
Вопрос первый: какой длины я могу использовать провод между LPT (саму схему я поместил в разъеме LPT) и отладочной платой? Читал что 20-30 см?(придется сидеть тогда с платой и программатором глубоко под столом :biggrin: ). Можно ли использовать удлинитель в виде шнура от матричного принтера???? (было бы для меня удобно, но не будут ли помехи наводиться???(хотя шнур от матричного принтера экранированный ведь?))

Вопрос второй, по отладочной плате. Ниже приведена обвязка, насобирал сведения отовсюду....Вопрос -такая схема с этими номиналамии будет работать?
Я помню обсуждалось, что AREF можно оставлять пустым?
В какой-то pdf-ке прочитал "Connect ICP to Vcc if not used" (20 вывод PD6)....Зачем??
и еще интересует RESET. Правильно ли будет ТАК, как на схеме?....

1. Удлиннитель для принтера в большинстве случаев использовать можно!
2. Если в Atmel AVR встроенный тактовый генератор то работать будет.
Распиновка ЛПТ зависит от используемого софта.
Подумайте, есть ли смысл запараллеливать В1, В2, В3?
3. Ресет на программаторах делают часто с пом. транзистора с откр. коллектором, но так тоже будет работать. Главное поставить конденсатор reset-gnd >=10nF
ICP - на ваше усмотрение.
$ilent
зачем всё так усложнять? тык
BVU
Цитата($ilent @ Feb 15 2006, 14:13) *
зачем всё так усложнять? тык

А если необходимо внутрисхемное программирование (корпус контроллера не в DIP)? В этом случае одним PonyProg не обойдешся...
Для нормальной работы все же надо иметь несколько устройств поддержки программирования и отладки (последовательный/внутрисхемный программатор, параллельный программатор и отладчик JTAG).
Георгий
...или тык
Причем прошиваю внутрисхемно.
$ilent
Цитата(BVU @ Feb 15 2006, 14:27) *
А если необходимо внутрисхемное программирование (корпус контроллера не в DIP)? В этом случае одним PonyProg не обойдешся...

В каком смысле? ковырять уже собранное устройство? ни каких проблем, просто позуеш только основной модуль пони, разъём только перепаять по своему усмотрению... А вот на счёт параллельного, это действительно нужная весч...
MakFatum
"Подумайте, есть ли смысл запараллеливать В1, В2, В3?"
дык нету смысла запараллеливать, я это понял, когда, развел, вытравил, спаял, и засунул в LPT..
ну думую, не сильно страшно....можно бы, конечно, было светодиоды туды засунуть...., но обойдусь без них уж...
"ICP - на ваше усмотрение."
ну что ж, хорошо, на мое усмотрение, чем меньше, тем лучше...

"Для нормальной работы все же надо иметь несколько устройств поддержки программирования и отладки (последовательный/внутрисхемный программатор, параллельный программатор и отладчик JTAG)."
Вот где бы про это еще почитать (JTAG, параллельное программирование, последовательное), чтобы доступно, понятно, с расшифровкой аббревиатур.......
BVU
Цитата(MakFatum @ Feb 15 2006, 14:38) *
Вот где бы про это еще почитать (JTAG, параллельное программирование, последовательное), чтобы доступно, понятно, с расшифровкой аббревиатур.......

На форуме лежит очень много тем которые обсуждались по данным вопросам, что Вас интересуют. Сделайте поиск. А принципы программирования - последовательные/параллельные можно узнать из фирменных описаний на атмеловский AVR контроллер. Про JTAG отладку - множество информации в инете... вот хотябы: "JTAG. Это стандартный тестовый интерфейс, применяемый для тестирования электронных компонентов и устройств. Устанавливаеться методом навески без применения пайки.
В 1985 сформировалась специальная группа ведущих производителей электроники - JTAG (Joint Test Action Group). Для решения проблем тестирования JTAG выдвинула как промышленный стандарт спецификацию IEEE Std 1149.1-1990 (IEEE Standard Test Access Port and Boundary-Scan Architecture). "
MakFatum
ну вот, пришел я к окончательному варианту...
всем спасибо!...
defunct
Цитата(MakFatum @ Feb 15 2006, 19:08) *
ну вот, пришел я к окончательному варианту...


1. Схему сброса можно сделать на одном конденсаторе 1uf между пином Reset и Gnd (без причуд с диодом).
2. Дроссель - либо выбросить, либо применить по назначению в цепи AVCC.
3. Кварц бы желательно добавить между XTAL1 XTAL2 (отладочная плата все же, не сидеть же все время на внутреннем RC генераторе).
4. Резисторы 470ом (MISO, MOSI, SCK) не нужны.
MakFatum
дело в том, что эти данные насобирал из разных источников, как то: AVR beginner, AVR hardware design consideration....
Есть ли какой-нибудь документ, где есть кумулятивный апдейт знаний и сведений про эти все подсоединения и нюансы (например дроссель и назначение в цепи AVCC)...
я так понял он стоит как фильтр по питанию...
кварц я воткну, мне пока бы просто с RC запустить...
а почему резисторы не нужны?.объясните, пожалуйста?...
1 uf - это 1 мкФ?....просто я в схемах видел, что между пинами Reset и GND 0,1 мкФ включают, или это не принципиально?
defunct
Цитата(MakFatum @ Feb 16 2006, 04:29) *
Есть ли какой-нибудь документ, где есть кумулятивный апдейт знаний и сведений про эти все подсоединения и нюансы (например дроссель и назначение в цепи AVCC)...

да - dataheet на ваш МК. (насчет дросселя - стр. 211)

Цитата
а почему резисторы не нужны?.объясните, пожалуйста?...

А какое их назначение? При программировании все равно вначале формируется сигнал сброс, а потом подключаются соответствующие выводы (на вашем программаторе), если их где и требуется размещать, так лучше в программаторе, хотя и там не обязательно.

Цитата
1 uf - это 1 мкФ?....просто я в схемах видел, что между пинами Reset и GND 0,1 мкФ включают, или это не принципиально?

да.. (u - мк)
На Reset - не принципиально. у вас в схеме и стоит 1uf, только еще куча лишнего - резистор и диод, которые можно не ставить.
era
1. В части резистора и диода на Reset
Этот вход не имеет встроенного защитного диода, таким образом, после снятии питания со схемы некоторое время на нем будет присутствовать напряжение с заряженного конденсатора, что не есть хорошо. Так, что жадничать, наверное, не стоит.
2. При наличии конденсатора на входе Reset при подаче питания на схему на нем некоторое время (зависит от номинала R или встроенного R) будет удерживаться состояние лог"0". При отсутствии подтяжки к питанию на входе SCK, можно поймать неприятные глюки типа порчи flash-а. Короче, полезно подтянуть, т.к. до старта программы вход "висит в воздухе".
IgorKossak
Цитата(era @ Feb 16 2006, 23:22) *
1. В части резистора и диода на Reset
Этот вход не имеет встроенного защитного диода, таким образом, после снятии питания со схемы некоторое время на нем будет присутствовать напряжение с заряженного конденсатора, что не есть хорошо. Так, что жадничать, наверное, не стоит.
2. При наличии конденсатора на входе Reset при подаче питания на схему на нем некоторое время (зависит от номинала R или встроенного R) будет удерживаться состояние лог"0". При отсутствии подтяжки к питанию на входе SCK, можно поймать неприятные глюки типа порчи flash-а. Короче, полезно подтянуть, т.к. до старта программы вход "висит в воздухе".

Обо всём этом говорилось в апнотах и даташитах от Atmel, так что пренебрегать этим не стОит, тем более, что это и не так накладно.
MakFatum
Ну вот ниже окончательная схема, со второго разу заработало!...(С первого не считается, в программаторе к 20-й ноге микросхемы забыл "-" подключить)..
Кондер и дроссель последовательно который стояли убрал..


Еще вот один вопрос....

я понимаю, что сразу после него захочется меня отправить в школу, ....ну помогите только с этим, а потом уж и сам сяду за учебники....Хочу светодиодом помигать просто....
Но чего-то не получается...
С помощью CodeVision AVR и его Wizarda создал проект и программу мигания светодиодом, подключенного к порту А.
привожу ниже кусочек (а то wizard еще много чего там на генерил)
Цитата
#include <mega16.h>
#include <delay.h>
// Declare your global variables here

void main(void)
{
// Declare your local variables here

// Input/Output Ports initialization
// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTA=0x00;
DDRA=0xff;

while (1)
{
PORTA.1=0;
delay_ms(1000);
PORTA.1=1;
delay_ms(1000);

};
}


ну вообщем, я понимаю, что проще некуда...Ну не моргает!...
Вопрос по самому процессу программирования!

CVAVR МК видит, все считывает, все программирует, все стирает....

Вот глупый сейчас вопрос задам..
Программу заливать в EEPROM же надо?

Нажимаю я пипку Run Chip Programmer, далее выбираю "файл- Load-EEprom"...
Программирует, но ничего не работает...

а если нажимаю "Programm All", он что-то начинает программировать, доходит до 3% и виснет, ...приходится всключать и выключать питание...а потом стирать...
А еще после прогр-ия и после "read-EEprom", а потом" EDIT".....в табличке, правее 16-ричных чисел, какие-то кракозябры и русские буквы ...что это....?
.....
defunct
Цитата(MakFatum @ Feb 19 2006, 19:20) *
Вот глупый сейчас вопрос задам..
Программу заливать в EEPROM же надо?


EEPROMу - епромово, флешу - флешево..
программа должна загружаться во флеш, данные .eseg (если использовался eseg) - в EEPROM..

Цитата
а если нажимаю "Programm All", он что-то начинает программировать, доходит до 3% и виснет, ...приходится всключать и выключать питание...а потом стирать...

что-то не так.. понижайте скорость или попробуйте другую программу-программатор.
ALexx
Цитата(MakFatum @ Feb 19 2006, 20:20) *
Нажимаю я пипку Run Chip Programmer,
.....



Program-> Erase chip

После стирания можно заливать программу, но не в ЕЕПРОМ!, а во ФЛЕШ:

Program-> FLASH


А теперь насчет зависания. Такое наблюдалось, если, к примеру, в процессоре фузами выставлена частота внутреннего генератора 2 МГц, а в окне программирования (под типом проца) указана частота отличная от первой.
MakFatum
Моргать-то заморгало...
Ну вот никак не могу понять почему по нижеприведенной программе
он 5 секунд ГОРИТ и 1 сек НЕ горит???
Везде пишут, что PORTA.0=0 - это установка лог.0 и наоборот, а моргает все иначе...
это вопрос №1

DDRA=0xff;

while (1)
{
PORTA.0=0;
delay_ms(5000);
PORTA.0=1;
delay_ms(1000);

};
}

Вопрос №2 может иметь место на СИ такая конструкция(?):
if (PINB.5=1) { сделать что-то };
else goto mesto;

(Меня интересует, можно ли опрашивать PINB.5=1 или PINB.5=0? И можно ли перескакивать, если выражение ложь??? )
defunct
Цитата(MakFatum @ Feb 20 2006, 18:11) *
Моргать-то заморгало...
Ну вот никак не могу понять почему по нижеприведенной программе
он 5 секунд ГОРИТ и 1 сек НЕ горит???
Везде пишут, что PORTA.0=0 - это установка лог.0 и наоборот, а моргает все иначе...
..


попробую домыслить.. вы, вероятно, светодиод запаяли между PA0 и Vcc.
Хотите чтобы было без инверсии - запаивайте между PA0 и Gnd..

Цитата
if (PINB.5=1) { сделать что-то };
else goto mesto;


а такая конструкция чем плоха?

Код
if (PINB.5)
  { сделать то-то;}
else
  {сделать сё-то;}


goto mesto можно заменить вызовом функции..
MakFatum
Спасибо Большое! Действительно к Vcc припаял....
У меня домыслить не получается в результате чего инверсия.....?

Я вот немножко не понимаю

if (PINB.5)
{ сделать то-то;}

если PINB.5 ЧТО, чтобы сделать что-то? (Просто если PINB.5 и всё?)
То есть мне нужно проверить наличие gnd на PINB.5 (То бишь PINB.5=0 )
а иначе (если этого GND нет) перескочить на другое if, где тоже что-то будет проверяться...
поэтому и спросил еще про goto mesto:

в си, да и не только в си у меня только первые шаги....как Вы догадались
defunct
Цитата(MakFatum @ Feb 20 2006, 19:16) *
в результате чего инверсия.....?

все очень просто.
когда вы на PA0 выставляете логическую еденицу на выходе порта формируется уровень 5V = Vcc.
а теперь зададим себе вопрос будет ли течь ток в цепи где U = Vcc - Vcc ;>

Цитата
если PINB.5 ЧТО, чтобы сделать что-то? (Просто если PINB.5 и всё?)

в C логическая проверка идет на "не 0" (ИСТИНА) и "0" (ЛОЖЬ), поэтому дополнительно сравнивать булеву переменную с ненулевым значением не обязательно...

Цитата
То есть мне нужно проверить наличие gnd на PINB.5 (То бишь PINB.5=0 )
а иначе (если этого GND нет) перескочить на другое if, где тоже что-то будет проверяться...
поэтому и спросил еще про goto mesto:

программа будет смотреться аккуратнее если не делать безусловных прыжков.
Код
if (PINB.5) // если не 0
  { что то сделать }
else // иначе если PINB.5 = 0
if (проверить что-то еще)
  { сделать что-то еще }


есть еще оператор switch - case может быть он вам нужен.
я в одной из веток приводил ссылку на описание ansi-c на русском.. почитайте на досуге
http://www.opennet.ru/docs/RUS/ansi-c/


PS: "=" - это присвоение, проверка на равенство "=="
гигипотамм
Ответ №1:
А светодиод к порту чем подключен?
А к плюсу питания?
А в каком из вариантов через него ток пойдет: когда порт в нуле, или когда порт в еденице?

Ответ №2:
Символ "=" в С - оператор присваивания.
Надо "==" - это оператор проверки условия.
Тут Вы лучше так:
//
if (PINB.5==1) { сделать что-то }
else goto mesto;
//
И кстати - точку с запятой после {сделать то-то} не нуна...
А спрашивать в условии можно как про "0" так и про "1".
Old1
Цитата(MakFatum @ Feb 20 2006, 20:11) *
Вопрос №2 может иметь место на СИ такая конструкция(?):
if (PINB.5=1) { сделать что-то };
else goto mesto;

В принципе может. Только
Код
{ сделать что-то }

будет выполняться в любом случае, потому что в выражении в скобках использован оператор присваивания = (а не оператор сравнения двух операндов на равенство ==) и PINB.5 всегда будет равен единице и условие всегда будет выполняться.
Кстати использование оператора goto на С не рекомендуется.
MakFatum
Нужна помощь, не могу разобраться с алгоритмом и просто путем дальнейших действий!...
Вообщем была схемка генератора АМ на двух дубнинских микросхемах несерийного пр-ва...Они стоят очень дорого (для тех функций, которые выполняют), поэтому появилась необходимость перехода на МК..
Ниже приведена часть схемы этого у-ва на МК ATmega8 и диаграммы выходных сигналов


Осциллограммы на выходах портов PC3, PC4, PC5


В кратце, что генератор должен делать: При наличии минуса на одном из выводов PD1, PD2,PD3,PD0,PD6 (перемычки 12-23,12-21,12-22,...13,11) выдавать на PC5 соответствующие частоты...420...500Гц... и т.д (все в пределах 1000 Гц)..это всё несущие.
При наличии минуса на одном из выводов PB5, PB4 выдавать на PC3 частоты 8 или 12 Гц - это будет модулирующая.
Ну и потом внутри это умножается (я не ошибся, именно умножается?) и на PC4 (третья осциллограмма) как видно из схемы...
Все частоты - меандры!...что, наверное, облегчает жизнь...

Так вот...
Как это рациональней всего реализовать?..
на СИ или не на СИ?
Подпрограммы задержки отпадают! Остается таймерами? Куча констант и по переполнению уходить в прерывание?так?...
8 разрядного должно хватить на 1024*2^8/10^6=0,262 c (при 1МГц такт, и 1024 Коэф.)
При том что самый длинный импульс при 8 Гц - 1/2*8=0,0625 c. - Значит 8 разрядный...

Настраиваем порты, таймеры
Опрашиваем порты, при наличии минуса на одном из них заносим константу соответствующую частоте в таймер, он считает, переполняется, далее прерывание, подпрограмма положительного импульса,...циклим, опять считает , переполняется, далее прерывание, подпрограмма отрицательного импульса,..
В целом так, или не так?...
..еще один вопрос: Вот таймер там работает, подпрограмма прерывания тоже, а если я возьму и минус подам на другой вывод, соответствующий другой частоте? программа-то не среагирует!...значит надо организовать периодический опрос портов в программе?
а как же это сделать?
еще вопрос: таймеры друг другу не будут мешаться своими прерываниями? Ведь всё делается параллельно: выдается несущая, выдается манипулирующее, умножается где-то и итоговое на выход?...Рабочая точка-то ведь у программы одна...?

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

Понравился протеус, подойдет для отладки без паяния? (паять-то буду, но не сразу...)

А что насчет ШИМА?...в Атмеге их целых 3, ими можно ведь аппартно реализовать меандры?...

Заранее благодарен всем откликнувшимся на мои вопросы...
Очень нужно и очень хочу....
beer_warrior
ШИМ не поможет - это ШИРОТНО-ИМПУЛЬСНАЯ МОДУЛЯЦИЯ, т.е. изменение скважности.
Делать по идее надо таймерами, желательно в режиме самоперезагрузки.
И вот тут встает главный вопрос? Какой нужен шаг по частоте и могут ли существующие таймеры его обеспечить.
Остальное не проблема, и думаю в деталях народ поможет.

Если же не получаеться - есть микросхемы низкочастотных ГУН с аналоговым входом. Генерить на них, управлять Мегой.
AVR
Извините за глупый вопрос:
http://avr.nikolaew.org/progr.htm
Чем этот программатор плох, какие у него недостатки и ограничения по сравнению с программаторами для которых требуется изготавливать схему?
alekseykoj
Нельзя Reset вешать вместе с питанием. Посмотри User Manual по режиму программирования AVR
А вообще есть программатор PonyProg бесплатный и схемы на него есть и описание....
MakFatum
bb-offtopic.gif ну причем же тут программатор?...
Хочется именно на МК...
про ШИМ отпало.

Что за режим самоперезагрузки?....не слышал что-то...
Шаг по частоте имеется виду что?...
Да думаю могут они его обеспечить...иначе никак...
никаких других микросхем не приемлю, хочу на МК...

..жду еще советов...
defunct
Цитата(MakFatum @ Mar 17 2006, 19:43) *
Что за режим самоперезагрузки?....не слышал что-то...
Шаг по частоте имеется виду что?...

Полагаю beer_warrior имел в виду режим таймера Output Compare со сбросом таймера.
Пример генерации заданной частоты через пин PBX
(сразу оговорка в примере просто приводится алгоритм, а не рабочий код на C!)

Fosc = 4000000; гц.
Ftarget = 520; гц

TimerOCValue = (Fosc / Ftarget) / 2; // делить на 2 нужно т.к. фактически задается длительность полупериодов.


OCR1A = TimerOCValue;
TCCR1B = (1 << CTC1) | ( 1 ); Запустить таймер в режиме сброса счета по достижению OCR1A
TIMSK = (1 << OCIE1A); // Разрешить прерывание OCR1A таймера
SEI; // разрешить прерывания

ну а в обработчике прерывания OC1A:
PBX = not PBX;
beer_warrior
Цитата
выдавать на PC5 соответствующие частоты...420...500Гц... и т.д (все в пределах 1000 Гц)..это всё несущие.
При наличии минуса на одном из выводов PB5, PB4 выдавать на PC3 частоты 8 или 12 Гц - это будет модулирующая.


Собственно и имееться в виду, что перечисленные частоты должны иметь наименьшее общее кратное в виде тактовой частоты.
При этом желательно, чтобы таймеры имели потребный коэффициент деления.
С каким шагом должна изменяться несущая в диапазоне 420-500 ?
MakFatum
420, 480, 580, 720, 780 Гц
и модулируется 8 или 12 Герцами
beer_warrior
Цитата
420, 480, 580, 720, 780 Гц
и модулируется 8 или 12 Герцами

Ну и вперед, открывай главу по таймерам и просчитывай, как делить тактовую для получения искомых частот.
MakFatum
вот-вот, про это и хотел спросить...
а где про это хорошо так, понятненько написано, а?
beer_warrior
Цитата
вот-вот, про это и хотел спросить...
а где про это хорошо так, понятненько написано, а?

Описания таймеров - в даташите на камень.
Нахождение наименьшего общего кратного - учебник математики 5 класс.

Могу еще посоветовать аппликэйшн ноты, относящиеся к DTMF - там частоты такого же порядка и есть примеры.
MakFatum
Хорошо, буду разбираться....

НОК вроде помню...

неотвеченные вопросы..:

3 осциллограмма = 1осциллограмма умножить на 2 осц., или + ???
......просто чтобы быть уверенным, мне кажется умножить...
в маткаде что ли попробовать....

Как лучше организовать опрос портов на наличие минуса...
Код
if(!PIND.2)     {/* Если на ножке PB2 низкий логический уровень -
                        то выполнить определенный код */
                            };
ELSE { выполнить другой код}


.....А если без ELSE, ведь это не обязательный параметр,..?

ТОгда программа если не истина просто пойдет дальше?а если истина сделает код в скобках и тоже потом побежит дальше? я правильно понял?

или лучше будет поступить так: (все совместить....)

Код
if(!PIND.2)     {  // если НЛУ то делать код пока не измениться состояние

while((PIND>>2)&0)
{/* код выполняется пока на PIND.2 - НЛУ  */
                                              }
};


...и вот еще один вопрос, не совсем понимаю...
когда на PIND.2 ничего не будет (он просто будет в воздухе), как воспримет его вышеуказанный цикл?...Ведь на нем 0, а низкий лог.уровень - больше 1 В...
beer_warrior
Цитата
......просто чтобы быть уверенным, мне кажется умножить...

Логичски умножить т.е. логическое И
Цитата
ТОгда программа если не истина просто пойдет дальше?а если истина сделает код в скобках и тоже потом побежит дальше? я правильно понял?

Именно так.
Цитата
или лучше будет поступить так: (все совместить....)

Я бы опрашивал весь порт сразуи использовал бы оператор switch.
Цитата
когда на PIND.2 ничего не будет (он просто будет в воздухе), как воспримет его вышеуказанный цикл?...Ведь на нем 0, а низкий лог.уровень - больше 1 В...

Если нога просто в воздухе уровень будет зависеть от фазы Луны.
Надо либо включить внутренние пулл-ап резисторы или поставить внешние.
Кстати об этих входах там, как я понял висит ЭСЛ-ТТЛ преобразователи?
MakFatum
нет, это простые оптопары, по-моему 4N35
Uп=+-20В
Uп1=8,2В
MakFatum
Вот у меня несколько вопросов:
привожу кусочек:

Код
// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
// Place your code here

}

// Timer 2 overflow interrupt service routine
interrupt [TIM2_OVF] void timer2_ovf_isr(void)
{
// Place your code here

}

// Declare your global variables here

void main(void)
{

init_mk();

while (1)
      {

opros_D:
switch (PIND)
{
case 0xFD:       // IF PD1 "-", then 420
TCNT0=107;

break;
case 0xFB:       // IF PD2 "-", then 480
TCNT0=126;

break;
case 0xF7:       // IF PD3 "-", then 580
TCNT0=148;

break;           // IF PD0 "-", then 720
case 0xFE:
TCNT0=169;

break;
case 0xBF:       // IF PD6 "-", then 780
TCNT0=176;

break;
};


Вопрос 1. Хочу сначала попробовать выдавить несущие прерыванием по переполнению таймера (кстати почему-то на той схеме так и есть, хотя это, я так понял, не очень рационально..), а потом сбросом при совпадении Внес необходимые десятичные значения в регистр счета T0, соответствующие частотам. Дальше таймер начинает тикать,...переполняется, возникает прерывание - уходит в подпрограмму обработки...Поскольку подпрограмма начинает работу в момент, когда состояние счетчика сбрасывается с 255 в 0, ведь вновь нужно занести в регистр счетчика необходимое начальное значение (допустим соответсвующее 420 Гц)???
Как мне сделать в подпрограмме прерывания, чтобы выбиралась нужная константа из нескольких (в моем случае 5), и в зависимости от этой константы формировались импульсы нужной частоты? Ведь регистр TCNT0 уже обнулился и сравнивать не с чем чтобы выбрать??? Вообщем я не очень представляю струтуры подпрограммы для моего случая....
никак дойти до этого не могу, видимо чего-то не знаю...
Вопрос 2.Вот использую я оператор switch (PIND) - он опрашивает весь порт, а как этим же оператором опрашивать, допустим, только PINB.5, PINB.4 на наличие gnd???

Вопрос 3. Чем явл-ся "-5В" для МК? ведь 0,3Uп<лог.0<0,6 Uпит.???Мне же надо опрашивать на наличие "-5В"...
фундамент пока мисть у меня не прочный...много белых пятен..

P.s....и еще....прошу извинения у админа форума за то, что пихаю в этот топик все подряд....по пути....
не подумал сразу, далее постараюсь придерживаться общепринятых правил...
beer_warrior
1. требует обдумывания
2.что- нибудь типа:
mode = (PINB & 0x30)>> 4; // даст числа от 0 до 4
swich (mode)
{
}
3.Что такое -Uп земля или -5?
Если -5 срочно перерабатывать схему, камень питаеться сейчас от 10В.
MakFatum
и Uп - Земля...
Вроде там все ок, при отсутствии -20 В на входе оптопар - на входе порта лог.1., иначе лог.0., т.е. опрашивать надо на лог.0...
НО...у меня ничего не работает в протеусе...
только WD исправно сброс генерирует и всё...
....видимо косяки....чувствую просто, что косяки....
???
defunct
Цитата(beer_warrior @ Mar 21 2006, 13:18) *
Если -5 срочно перерабатывать схему, камень питаеться сейчас от 10В.

Уже б давно сгорела..

Цитата
Чем явл-ся "-5В" для МК?

ничем - пустым звуком, который садится через защитные диоды на "Землю". Земля (GND) в схемах считается точкой опоры - условный 0 вольт.

Цитата
ведь 0,3Uп<лог.0<0,6 Uпит.???

Uп = 5V, а GND = 0V, так во всяком случае принято считать. (но естественно все относительно).
Конкретно в вашей схеме, и конкретно для MK Uп = +5V, а Земля = 0V.

Цитата
Мне же надо опрашивать на наличие "-5В"...

чтобы МК смог "увидеть" сигнал с уровнем напряжения ниже 0V относительно "Земли" МК, требуется этот сигнал подтянуть до уровня который бы лежал в пределах 0V +5V относительно "GND" MK, с помощью делителя напряжения на паре резисторов и напряжения смещения, которое подается третим резистором с Vcc к выходной точке делителя...
MakFatum
"Для генерации меандра может быть использована функция сравнения, реализованная в микроконтроллере аппаратно на таймере. Достаточно загрузить регистр сравнения нужным значением длительности импульса, настроить выход на изменение состояния по совпадению и разрешить обнуление таймера при совпадении. Генерация будет происходить полностью аппаратно, никаких действий со стороны программы не требуется."

вот написал тут

Код
#include <mega8.h>

// Declare your global variables here

void main(void)
{

PORTB=0x00;
DDRB=0x08;
      
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: 0,977 kHz
// Mode: CTC top=OCR2
// OC2 output: Clear on compare match
ASSR=0x00;
TCCR2=0b00011101;
TCNT2=0x00;
OCR2=0xff;

}


В протеусе работает, НО при значении ff в OCR2 показывает почему-то 15 Гц, может считаю не так?
формула: fOCn=fclk_/2*N(1+OCRn)
fclk=976,5625 при 1/1024
N соотв-но 1024
Может что-то неправильно в формулу подставляю?..
あっ!
Господа, а вот кто подскажет, что происходит с сигналами на неиспользующихся при SPI-программировании выводах? В схеме на SPI повешаны MMC и ещё там одна микросхема - надо обеспечить им во время программирования высокий уровень на CS.
GetSmart
Цитата
Господа, а вот кто подскажет, что происходит с сигналами на неиспользующихся при SPI-программировании выводах?

На большинстве процессоров (и Меге8) выводы отключены (являются входами). А вообще, обычно для портовых регистров пишут их состояния после сбросе (при программировании они такие же). Большинство будут сконфигурированны как входы без подтяжки. Иногда с подтяжкой. Если у вас подключена ММС, то желательно её CS снаружи подтягивать к питанию резистором. И конечно пин CS не должен быть пином, участвующим в программировании.
あっ!
GetSmart
Премного благодарен. Теперь нашёл. Действительно - высокоимпедансное состояние.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.