В каждом языке программирования есть такое понятие «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: Добавлен тест, в котором вы можете проверить на сколько хорошо вы усвоили материал урока
Евгений, как минимум в if(chislo= 100 ) либо ошибка, либо это весьма странный код. Может быть, Вы имели ввиду if(chislo==100)? В Си знак «=» обозначает не сравнение, а присваивание.Сравнение — «==».
И, к тому же, в начале три пустых #include, вряд ли существуют функции cli() и sei() (быть может, #asm(«cli») и #asm(«sei»)), также настораживает массив char digits[B]. Сначала исправьте ошибки, а потом и проблема может отпасть.
Можете посоветовать? Задача в следующем, запускать по очереди 3 канала, но при этом нужен watchdog и желательно на минимальной, для таких операций частоте.
Есть набросок
#include
#include
void main(void)
{
DDRB=(1<<DDB3) | (1<<DDB2) | (1<<DDB1) | (1<<DDB0);
PORTB=(0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0);
WDTCR=(0<<WDTIF) | (0<<WDTIE) | (0<<WDP3) | (1<<WDCE) | (1<<WDE) | (0<<WDP2) | (0<<WDP1) | (0<<WDP0);
WDTCR=(0<<WDTIF) | (0<<WDTIE) | (0<<WDP3) | (0<<WDCE) | (1<<WDE) | (0<<WDP2) | (0<<WDP1) | (0<<WDP0);
while (1)
{
PORTB.0=1;
delay_ms(200);
PORTB.0=0;
PORTB.1=1;
delay_ms (200);
PORTB.1=0 ;
PORTB.2=1;
delay_ms (200);
PORTB.2=0 ;
}
Подскажите что можно добавить, либо убавить? Что можно в CodeWizard изменить для этих целей?
У watchdogа единственная настройка это предделитель, ставьте максимальный, будет самая низкая частота
Т.е. галочку на OSC\1024k?
если для 8 меги то OSC/2048
Понравился вопрос в флеш тесте насчет резистора и светодиода. Я считал что резистор нужен чтобы НЕ СПАЛИТЬ ПОРТ КОНТРОЛЛЕРА, улыбнуло.
в вопросе нигде нет написано, что светодиод подключен к порту
Что должно получиться если от переменной signed int x=0; отнять 1.
Не понятно как должен я увидеть что число с минусом?
У меня получается 65535.
значит что то не так делаете
PORTD = 0b11111111; //Зажигаем все светодиоды
for (i=0;i>= 1; //Сдвигаем биты вправо
}
как можно сделарь чтоб работал этот код
PORTD = 0b00000000; //гасим все светодиоды
for (i=0;i>= 1; //Сдвигаем биты вправо
}
PORTD = 0b00000000; //гасим все светодиоды
for (i=0;i<7;i++) //Сдвигаем биты вправо
{
PORTD = (1 << i); }
как можно выполнить эту операцию delay?
PORTD.0=1;delay_ms(300);PORTD.0=0;delay_ms(300);
PORTD.1=1;delay_ms(300);PORTD.1=0;delay_ms(300);
PORTD.2=1;delay_ms(300);PORTD.2=0;delay_ms(300);
PORTD.3=1;delay_ms(300);PORTD.3=0;delay_ms(300);
PORTD.4=1;delay_ms(300);PORTD.4=0;delay_ms(300);
Спасибо огромное разобрался
У важаемый Админ у меня такая ситуациыя PORTD.4=1 через 3часа надо обнулить и через 2 секунды включить PORTC.3 как обойтись без deleya
осваивайте таймер, это 5 урок
Админ, а скажите пожалуйста сложно ли реализовать, что-бы светодиод мигал под музыку? Если можно небольшой пример.
все зависит от того как он должен мигать.
Например такой алгоритм подается сигнал с частотой от 0 до 3000гц загорается 1-й светодиод , подается сигнал с частотой 3000-5000Гц загорается второй,
Если вы говорите о музыке, то там смесь сигналов, вполне реально что от начала до конца будет от 0 до 5000Гц что то играть непрерывно, тогда оба светодиода будут весь трек просто гореть.
Да вы правы, не могу подобрать правильный алгоритм, попробую изучить преобразование фурье и прикрутить к atmega, спасибо вам за ваши уроки!!!
Почему at90s1200 отказывается работать с библиотекой Delay.h ?
его даже в списке поддерживаемых чипов нет, где вы откопали такой мк?
Возможно вопрос не по теме. Почему у меня не получается объявить переменных типа bit больше 16 шт. (остальные не проверял). Компилятор сообщает об ошибке. И как это можно обойти. Заранее спасибо.
настраивается в свойствах проекта. кто то уже писал что bit переменные все равно занимают 8бит, так что можно не париться и использовать char
Спасибо нашел.
Здравствуйте!
У меня в proteus 7 нет компонента ATmega8-PU
Подскажите как можно добавить в библиотеку ATmega8-PU?
Пожалуйста помогите!!
там должна быть атмега8, другие индексы не важны
Доброго времени суток.
То ли руки настолько кривые, то ли не все установлено, но при {PORTB.B0=~PORTB.B0;} или {PORTB.0=~PORTB.0;} или даже {PORTB.PB0=~PORTB.PB0;} при эмуляции получаю: «error: request for member ‘B0’ in something not a structure or union».
(Proteus 8 Pro 8.1 SP1, компилятор WinAVR).
Не могу продвинуться ни на шаг, поскольку не могу понять почему обращение к конкретной ноге МК не получается, хотя {PORTB=~PORTB;} отрабатывает, но это же целый порт…
Имею реальную схему на Атмега162 для реализации БК в авто. Рабочий исходник не хочу брать, поскольку там другой МК и интерпретация полученной посылки от компа авто требует правок. Пробовал с нуля создавать пример из урока на Атмега8. Результат тот же. При чем как на домашнем ноуте с WinXP так и на рабочем с Win10.
Пробовал читать io.h, portpins.h, iom162.h — там вроде как обращение через (по аналогии с примером) PORTB0 или PB0. Короче сам уже пару дней ищу разные примеры, но разобраться не могу. Помогите…
Статьи написаны для Codevision, хотя по сути разницы нет, пишите сразу число в порт
Реализовать мигание светодиода (моделирование в Proteus) получилось только через команду PORTB ^= 0x01. Но чувствую, что при глубжем изучении, а тем более, при попытке принять посылку из 50 байт на вход Rx (у меня это PORTB.1) — у меня шансов нет. Останется только вариант с нуля изучать C или Asm. Проект затягивается на неопределенное время…
Да что же такое? в интернете нет ни одного нормального урока именно для НАЧИНАЮЩИХ. Думал этот подойдет, купил все по списку, а потом оказалось, что в этот пункт «2.1. программатор AVR микроконтроллеров» было тяжело дописать, что только не USBASP так как теряется вся суть урока, если codevision не работает. Снимите нормальное видео, или хотя бы сфотографируйте с фокусом собранную схему, так как картинка в уроке с протеуса не совпадает с ножками, в статье «как прошить МК». Ужас.
Так и не понял, что у вас по картинкам не совпадает, вроде все ок. С usbasp тоже не понял, находишь hex — заливаешь, через khazama, проблемы то нет. Программаторов для авр большое количество, вы предлагаете каждый из них проверять?
Где можно почитать о всех встроенных библиотеках Codevision?
codevision user manual
Жаль на английском, а на русском совсем нечего нет?
учите инглиш
да, енглиш учить надо полюбом 🙁 . Админ, снова я 🙁 . Хочел спросить, вы не знакомы с микроконтроллеры PIC ? просто смотрю много их в серёзных проэктах ставят, читал что по питанию выносливые, к помехам лутше чем авр. Что думаете по этому поводу?
давно делал проект на pic16, принципиальной разницы с атмегами не заметил
скажите пожалуйста пытаюсь прошить атмега 8 с usbasp. программа khazama выдает ошибку. помогите решить проблему
program enable Target doesn’t answer 1
initialization failed, rc=-1
AVR device initialization and ready to accept instructions
Devise signature=0x000000
yikes! invalid device signature.
expected signature for Atmega8 is 1e 93 07