Есть примеры. Курю . Но встал вопрос о тестировании. Хотя бы примерчик запустить и посмареть что да как. Я наугад выбрал (мне еще изернет и CAN понять надо). Думал юсб самое простое из всего. Я то ни с чем не работал из перечисленного (( Может вы посоветуете с чего начать? Счас склоняюсь в изернету. А как тестировать? Через командную строку пингом? нужно же что бы мое устройство приняло пакет и ответила компу, на что он выдаст что нуль пакетов испорченно. Или есть еще какой софт для теста устройств по изернету ? не хочется распыляться. надо уже сосредоточиться на одной задаче. А на какой - выбрать не могу Хочется для начала что по легче
Bigcrash, ну а так вы сами посмотрите, что у вас в программе происходит: 1) Управление передаётся на 0-й адрес. Там rjmp перекидывает на start 2) на start-е происходит разрешение глобальных прерываний, настройка всяких регистров, инициализация стека (это, кстати, лучше делать с самого начала), ещё настройка портов. 3) Потом идёт выполнение func: здесь находится бесконечный цикл, в котором постоянной происходит установка вывода 0 и сброс вывода 1 порта C. На этом основная программа заканчивается. Единственное внешнее проявление - это включение вывода 0. Всё. Теперь, допустим, вы нажали кнопку и сработало внешнее прерывание. Что происходит: 1) Передаётся управление на адрес 0x001 ( 0x002): ext_int0. В стек кладётся адрес возврата на прерванную команду. Глобальные прерывания отключаются. 2) Производится попытка записи в регистр PIND - эта операция ничего не даст, т.к. PIND не может устанавливать своё состояние со стороны процессора. Он только показывает состояние выводов (есть или нет напряжения лог. единицы) порта D. 3) Происходит переход на main 4) В main начинает исполняться бесконечный цикл: постоянная установка вывода 1 и сброс вывода 0 порта C. Всё. Внешнее проявление: Переключение установленного вывода с 0-го на 1-й. На этом месте процессор впадает в тупик: он зациклен на выполнении бессмысленного бесконечного цикла. Прервать его ничто не может: прерывания глобально отключены. Ни на какие действия он больше реагировать не будет, кроме как аппаратного сброса или сторожевого таймера.
IfoR писал(а):Bigcrash, ну а так вы сами посмотрите, что у вас в программе происходит:
Еще раз напомню для Bigcrash, все это можно наглядно увидеть, благо есть симулятор в студии и у вас есть протеус. Запускайте симуляцию и щелкайте кнопкой пошагового выполнения. Вы сами увидите где затык и какие значения у регистров и портов.
IfoR писал(а):2) Производится попытка записи в регистр PIND - эта операция ничего не даст, т.к. PIND не может устанавливать своё состояние со стороны процессора. Он только показывает состояние выводов (есть или нет напряжения лог. единицы) порта D.
Не забываем модели контроллеров, которые при записи "1" в PINx переключают состояние PORTx...
А обязательно писать программы для микроконтроллеров на Си либо асемблере? Или можно писать на других языках программирования например visual basic.net или C#...
Изготовление печатных плат + материалы для изготовления плат
Лучше на ассемблере, для 8-разрядных МК. А вообще, на любом языке, для которого есть компилятор в ассемблер для данного МК. Вроде даже на Бейсике можно. Только будет проигрыш в быстродействии и размере кода.
В Atmega8 есть две GND и одна VCC. Соответственно обе земли подрубил на общую землю, а питание на +5В. Напряжение между между каждой из земель (7-8 и 7-22 ноги) должно быть одинаковым? Думаю дело в макетке... напряжения гуляют на земле и питании...то 1.3В разность на 7-8, а на 7-22 3.8, то еще как...коротит где то кажется. Может быть такое, что между общей землей и одной из ног-земель контроллера (при том, что она с общей землей соединена напрямую, напряжение 3.3В? Если кому не сложно померьте на живом контроллере.
AVCC - Напряжение питания аналого-цифрового преобразователя. Вывод подсоединяется к внешнему VCC через низкочастотный фильтр. AREF - Вход аналогового напряжения сравнения для аналого-цифрового преобразователя. На этот вывод, для обеспечения работы аналого-цифрового преобразователя, подается напряжение в диапазоне между AGND и AVCC. AGND - Этот вывод должен быть подсоединен к отдельной аналоговой земле, если плата оснащена ею. В ином случае вывод подсоединяется к общей земле.
3DRaven писал(а):обе земли подрубил на общую землю, а питание на +5В.
керамику, прямо на ноги МК попробуйте припаять, на те ноги, по которым питание.
Быстро, Качественно, Недорого.
Выбрать можно только 2 варианта.
Такой мелкий вопрос. Есть у меня источник питания на 24В, а нужно обычную mega8 питать. Есть стабилизатор на 5В. Так вот вопрос, как лучше сделать, через резистивный делитель или поставить промежуточный стабилизатор. Вроде как на делителе как бы лучше (сделать 16В на верхнем плече падает и оставшиеся 8В на нижнем как раз получается 2 к 1 по номиналам), но тут встал такой вопрос, какой ток должен обеспечиваться на входе питания МК и следовательно какие номиналы брать. Где-то писали что до 200ма, но документации я не нашел, также не нашел и каково сопротивление на входе VCC, AVCC. В ДШ есть такая интересная штука
Power Consumption at 4MHz, 3V, 25C - Active: 3.6mA
Но я так понял это потребление самого МК без учета периферии. Вообщем сколько ему на ногу надо, как это все рассчитать/где поглядеть/как лучше сделать?
Bigcrash Современные МК довольно экономичные. Собственное потребление зависит, в основном, от тактовой частоты и напряжения питания. Есть эти графики в даташите. Но в любом случае лучше запитать через стабилизатор, 7805 или 78L05.
Конечно, если на выходы подключены какие-то низкоомные нагрузки, то ток потребления возрастет, и может превысить сотню мА. Тогда запитать через 7805 на радиаторе будет в самый раз.
Через резистивный делитель, в принципе можно, но не нужно. Напряжение не должно превысить максимально допустимое (5,5 В), и ток делителя должен быть на порядок больше, чем ток потребления МК (тут полезно понизить тактовую частоту для снижения потребляемого тока). Но и тогда уж лучше не делитель, а стабилизатор на стабилитроне КС147+резистор.
Ну может я не понял. У 7805 входное напряжение (зависит от производителя) может быть и 35 В, так что нет проблем. Только надо обеспечить нужный теплоотвод, в зависимости от рассеиваемой мощности, а она зависит от потребляемого тока.
В советские времена встречал, что понижали, например, напряжение с 35 до, скажем, 25В, на входе КРЕНки с напряжением стабилизации на 15В. Включали во входную цепь мощный стабилитрон Д815 (или КС815, как их там). Дешево и сердито.
Такой вопрос. По 8 битным АВР. например, есть код int varA = 0x00001001; int varB = 0x00001010; varA -= varB; т.е. отнимаю большее от меньшего. Так вот, что в итоге будет? завис/незвис, флаг какой-нить установит, что запишет в varA. Макетка в разборе, а писать код надо!
Ага, спасибо. С флагами ясно, а с результатом... всегда будет писать единички, независимо от чисел? Т.е. энтропия информации в переменной стаёт нулевой? И еще, в случае переполнения. 0х10000000 + 0х10001111 = чему? Снова единички?
VannO))) писал(а):всегда будет писать единички, независимо от чисел? Т.е. энтропия информации в переменной стаёт нулевой? И еще, в случае переполнения. 0х10000000 + 0х10001111 = чему? Снова единички?
Единички получились исходя из чисел что вы дали. Другие числа дадут другой результат. Прочитайте про дополнительный код. 0х10000000 + 0х10001111=0x0001111+флаг переполнения, арифметика везде действует одинаково.
Последний раз редактировалось Engineer_Keen Пт фев 17, 2012 23:35:26, всего редактировалось 3 раза.
Ну использовать резистивный делитель напряжения для питания - это как-то стрёмно. Если использовать чисто один линейный стабилизатор, то взяв, что контроллер потребляет максимум 0.1 А, выделяемая на стабилизаторе мощность будет (24-5)*0,1 ~= 2 Ватта. Здесь достаточно к стабилизатору просто прикрутить к стабилизатору какую нибудь пластинку в качестве радиатора.
А если брать ещё резистивный делитель, то тут такая штука получается. С учётом, что нам нужен ток для контроллера 0,1 А, то прикинуть сопротивления можно так. I = I_R1 = I_R2 + I_K = I_R2 + 0.1 I_R2 = 8 / R_2 I_R1 = 16 / R_1
Зафиксируем здесь значение R2, тогда W = 256 / (16 / (8 / R_2 + 0.1)) + 64 / R2 + 0.3 = 192 / R2 + 1,9
Отсюда следует, что минимальная выделяемая мощность, которую можно получить меняя значение R2: всё те же 2 Ватта. Но если мы полностью уберём R2, то напряжение на стабилизаторе может сильно меняться в зависимости от тока микроконтроллера. Что бы его более менее зафиксировать, нужно выполнить условие: 8 / R_2 >> 0.1 => R_2 << 80 Ом
Если, допустим, возьмём R2 10 Ом, то выделяемая мощность будет 21,1 Ватт! И оно после этого надо?
Нашел причину! Дело было, как я и писал ранее, в говенной макетной плате с механическими контактами. Закоротило один и вот результат МК шился но не стартовал. Всем спасибо за советы! Зато теперь я знаю как правильно подрубать МК, как уменьшить помехи на АЦП и еще кучу прочих как