В каждом языке программирования есть такое понятие «Hello World». Это первая программа, дающая общие понятия о структуре программы. Для микроконтроллеров первая программа мигание светодиода. Это самое простое и наглядное.
Сначала нужно написать программу, используя CodeVision (C avr). Далее есть 2 варианта:
1. Прошить виртуальный микроконтроллер (используя программы симуляторы).
2. Прошить реальный микроконтроллер.
1. Схема собирается в симуляторе Proteus. Чтобы прошить виртуальный микроконтроллер, нужно указать где у вас на жестком диске хранится файл прошивки.
Плюсы: бесплатно, быстро, просто, достаточно наглядно, не требующий навыков сборки схемы. Минусы: результат не подкреплен практикой, значит есть шанс что все быстро забудется.
2. Тут множество вариантов, но как минимум нужен:
2.1. программатор AVR микроконтроллеров,
2.2. ATmega8-16PU (PDIP28 в дип корпусе),
2.3. резистор 1к,
2.4. светодиод,
2.5. проводки,
2.6. 5В стабилизированный источник (блок питания на 5В, питание usb компьютера),
2.7. много свободного времени и желания.
По желанию:
2.8. макетная плата (можно попробовать навесным монтажом),
2.9. паяльник (можно извратиться и без него),
2.10. разъем (можно извратиться и без него),
Минус только один — денежные вложения, которые я считаю в дальнейшем отобьются. Остальное все плюсы. Самое дорогое это программатор. Как решать задачу ваше дело, я покажу оба варианта.
Схема нашего устройства.
Ищем, качаем свежий Proteus. В пакете протеуса нас интересует только ISIS 7. Если вы решили собирать все руками, идем на ближайший радиорынок или магазин электроники и покупаем все, что нужно. Купили, скачали, поставили. Как создать проект в CAVR можно узнать тут
1. Запускаем CodeVisionAVR
2. В окне мастера настроек, переходим на вкладку Ports и устанавливаем значение Bit 0 = Out. Создаем, сохраняем проект.
3. Вычищаем код:
#include <mega8.h> void main(void) { PORTB=0x00; DDRB=0x01; while (1) { }; } |
4. Теперь можно писать наш код.
#include <delay.h> | позволяет использовать временные задержки, например делать паузы между зажиганием светодиода |
delay_ms(100); delay_us(100); |
позволяет сделать задержку в программе 100мс, позволяет сделать задержку в программе 100мкс |
PORTB.0=1; PORTB.0=0; |
включает ножку 0 порта В (напряжение +5В), включает ножку 0 порта В (напряжение 0В) |
5. Добавляем в наш бесконечный цикл программы мигания светодиодом
#include <mega8.h> #include <delay.h> void main(void) { PORTB=0x00; DDRB=0x01; while (1) { PORTB.0=1; //включаем 0 ножку порта В delay_ms(100); // ждем 100 мс PORTB.0=0; //выключаем 0 ножку delay_ms(100); //ждем 100 мс }; }; |
6. Компилируем, прошиваем (как прошить можно почитать тут). Фьюзы для данного урока должны быть выставлены так:
Данная конфигурация фьюзов позволяет запустить микроконтроллер от внутреннего генератора на 2МГц. После прошивки светодиод будет мигать.
Запилил видео, чтобы был более понятен сам процесс, удачи в ваших начинаниях.
Update: Добавлен тест, в котором вы можете проверить на сколько хорошо вы усвоили материал урока
булат, к сожалению у меня нет usbasp. судя по описанию камень не отвечает, проверяйте физическое подключение.
булат- Вы победили данную ошибку на программаторе?
Уважаемый автор подскажите можно ли используя данный пример (delay_ms) включить и выключить порт МК несколько раз с разными временными задержками без цикла (while (1))
можно
Как правильно реализовать такое условие и как закончить выполнение программы без (while (1))
так :
{
PORTB.0=1; //включаем 0 ножку порта В
delay_ms(100,500); // ждем
PORTB.0=0; //выключаем 0 ножку
delay_ms(100,200); //ждем
};
или так :
{
PORTB.0=1; //включаем 0 ножку порта В
delay_ms(100); // ждем 100 мс
PORTB.0=0; //выключаем 0 ножку
delay_ms(100); //ждем 100 мс
PORTB.0=1; //включаем 0 ножку порта В
delay_ms(500); // ждем 500 мс
PORTB.0=0; //выключаем 0 ножку
delay_ms(200); //ждем 200 мс
};
и какое максимальное значение может иметь delay_ms()
П.С.из самоучителей так понял что while () такой-же неотъемлемый атрибут программы как и #include
delay может быть 65535, while это просто цикл, обычно чтобы программа постоянно что то выполняла, нужно чтобы она крутилась по кругу
Спасибо огромное! А после одноразового передергивания ножками дальше можно включить основной цикл программы? Не получается… а понять почему не могу.
выполняете дрыганье до while, а потом делаете внутри что угодно
Ага! Запустить еще один while () внури этого чтоб он крутился бесконечно и не давал закончить (или начать) основной.У меня последний вопрос в этой теме: где можно посмотреть реализацию такого алгоритма?
установил 2 светодиода на PB0 и PB1 тепер как сделать пример 1 светодиод мигал 3 секунда а 2 ой 1 сек каждий порт сдаелал свое работу?
с помощью таймера, смотри 5 урок
Вопрос к автору: а если предположить, что мне необходимо управлять светодиодом не на 0 выводе порта В, а на 3, или на 7? как тогда будет выглядить код? я пытался написать так не не пошло:
PORTB=3×00;
DDRB=3×01;
while (1)
{
PORTB.3=1;
delay_ms(100);
PORTB.3=0;
delay_ms(10);
Как это реализовать? просто мне надо управлять 20-30 группами светодиодов! и тут одних только 0 выводов портов недостаточно! Заранее Спасибо!
читайте http://avr-start.ru/?p=200
Ув. автор, КАКОЙ вы применяли «программатор AVR микроконтроллеров»?
Дайте ссылку на схему программатора!
Как сделать чобы Code vision увидел этот программатор ?
Я использовал практически с самого начала AVRISPII. Схем программаторов полно, беда их в том, что для того чтобы сделать программатор, нужен другой программатор. Codevision видит только AVRISP, STK500, JTAGICE. По факту, берите USBASP и шейте через khazama, запорете пару мк, зато опыт получите 🙂
Такая проблема: создал визардом проект, прописал программу, при компиляции ошибка
все строки типа DDRB=(0<<DDB7) | (0<<DDB6) | (0<<DDB5) | (0<<DDB4) | (0<<DDB3) | (0<<DDB2) | (0<<DDB1) | (0<<DDB0);
вылетает ошибка Error: C:\Users\ADMIN\Desktop\VAW16x4\VAW16x4.c(49): ';' expected
Получается, что визард недоволен тем, что сам написал.
Если закоментировать эту строку — вылезает следующая. Не видит точку с запятой!!!
CVAVR ver 3.12 system Win 7 32
Здравствуй админ ))
Подскажите какой версией CVAVR вы пользуетесь, вы гдето об этом говорили, но никак не могу найти…
Я пользовался версией 3.12, но там постоянно какие-то глюки, особенно с генераторами кода, и она не поддерживает кирилицу…
подскажите что по вашему мнению удобнее.
1.25
Здравствуйте! Мне понадобилось устройство,реагирующее на определённое количество импульсов с датчика.В зависимости от числа поступивших импульсов оно должно увеличивать длительность подключения нагрузки.С приходом первого импульса запускается 10-ти секундный таймер и в течение этого промежутка идёт подсчёт импульсов,затем таймер обнуляет счётчик и процесс начинается вновь с приходом последующих импульсов.Эмуляция в Протеусе проходит как положено без нареканий,но контроллер после прошивки реагирует на импульсы каким-то странным образом.Сначала я грешил на возможный дребезг, но собрал одновибратор,а затем сделал изменения в исходнике,чтобы убедиться в отсутствии помех извне — никаких проблем с дребезгом нет.Контроллер не ошибается.История начинается после поглощения второго импульса.Никак не могу найти ошибку,а она есть,потому как в Протеусе всё отлично работает.Так как я совсем недавно начал заниматься программированием и опыта мало(осваиваю Codevision),хотел бы Вас попросить проверить программу на ошибки.Как я могу с Вами связаться?Спасибо!
со всем уважением, я не занимаюсь проверкой исходников.
Разъясните пожалуйста как правильно. Есть атмега8. Ставлю резистор на 10К от питания +5В на ресет меги. В настройках порта С6 ничего не меняю. Или нужно еще подтянуть внутренний резистор?
достаточно внешних 10к
Добрый вечер. А как сделать, чтоб светодиод моргнул 2 раза и перестал?
Продублируй включение и выключение, но не в цикле
PORTB.3=1;
delay_ms(100);
PORTB.3=0;
delay_ms(10);
Добрый день.я только пытаюсь разобраться с написанием программ, подскажите пожалуйста, как будет выглядеть программа, если мне нужно при нажатии кнопки, учитывался дребезг этой кнопки и на выходе был прямоугольный импульс частотой 75 Гц амплитудой в районе 5 вольт, до отпускания кнопки, при отпускании импульса, чтобы не было.
Написал такой код
void main(void)
{
PORTD=0x00;
DDRD=0xFF;
while (1)
{
PORTD.0=1; //включаем 0 ножку порта В
PORTD.1=0; //включаем 0 ножку порта В
PORTD.2=1; //включаем 0 ножку порта В
PORTD.3=0; //включаем 0 ножку порта В
PORTD.4=1; //включаем 0 ножку порта В
delay_ms(50); // ждем 100 мс
PORTD.0=0; //включаем 0 ножку порта В
PORTD.1=1; //включаем 0 ножку порта В
PORTD.2=0; //включаем 0 ножку порта В
PORTD.3=1; //включаем 0 ножку порта В
PORTD.4=0; //включаем 0 ножку порта В
delay_ms(50); //ждем 100 мс
};
};
portb0 portb1 portb2 portb3 горят постоянно
portb4 моргает как положено.
В протеусе все моргают
В чем может быть проблема.
Спасибо!!!
вы код пишете для порта Д, а вопрос задаете про порт В.
Извините
portD0 portD1 portD2 portD3 горят постоянно
portD4 моргает как положено.
Проблемы с портом D
Спасибо!!!
сделайте задержку побольше, для начала и посмотрите работает ли
Купил новый микроконтроллер и такая же беда.
portD0 portD1 portD2 portD3 горят постоянно
portD4 моргает как положено.
Может это связано с тем что
portD0 — RXD
portD1 — TXD
portD2 — int0
portD3 — int1
И этими портами нельзя управлять на выход. Или их надо как то особенно конфигурить.У меня проект и в нем задействованы все порты и без этих четырех ни как. Те мне все порты нужны.
Не могли бы вы проверить на своей атмеге8 мой код. Может вы поймете в чем причина.
СПАСИБО.
Евгений, код рабочий, если конечно, у вас там еще чего то нет, кроме него. Первое, что рекомендую, это сделать задержку больше, 50мс глазом можно и не различить. Второе, проверить фьюзы. 3 уже смотреть схему, плату.