Содержание
Урок 1. Первый проект
Урок 2. Управление кнопками
Урок 3. Подключение LCD
Урок 4. Использование ШИМ
Урок 5. Таймеры
Урок 6.1. Статическая индикация
Урок 6.2. Динамическая индикация
Урок 7.1. Генерация звука
Урок 7.2. Генерация звука. Продолжение
Урок 8.1. Передача данных через UART
Урок 8.2. Передача данных через UART. Продолжение»
Урок 9. Передача данных через SPI
Урок 10. Изучение АЦП. Простой вольтметр
Урок 11. Получение синуса при помощи ШИМ
Урок 12. Измерение температуры
Урок 13. Внешние прерывания.
Урок 14. Использование отладчика
Урок 15.1. Управление инкрементальным энкодером
Урок 15.2. Управление громкостью, при помощи энкодера
Урок 16. Управление RGB светодиодом
Урок 17. Использование ИК
Урок 18.1. Знакомство с графическим дисплеем
Урок 18.2 Вывод изображения на графический дисплей
Урок 18.3 Вывод русскоязычного текста
Урок 19. Формирование сигнала, при помощи ЦАП (R2R)
Урок 20. Опрос матричной клавиатуры
Урок 21. Сторожевой таймер
Урок 22.1 Воспроизведение wav. Введение.
Урок 22.2 Воспроизведение wav. Продолжение.
Урок 23.1 Работа с внешней памятью
Урок 23.2 Работа с файловой системой Fat

В каждом языке программирования есть такое понятие «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: Добавлен тест, в котором вы можете проверить на сколько хорошо вы усвоили материал урока

This movie requires Flash Player 9

112 комментариев: Урок 1. Первый проект на AVR

  • булат, к сожалению у меня нет 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 выводов портов недостаточно! Заранее Спасибо!

  • Ув. автор, КАКОЙ вы применяли «программатор 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 уже смотреть схему, плату.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Последние комментарии
  • Загрузка...
Счетчик
Яндекс.Метрика