Опубликовано 2010-01-24 11:11:02 автором MRS З чого почати програмувати мікроконтролери AVR. Урок AVR 1 У цьому навчальному курсі з avr я постарався описати все саме основне для початківців програмувати мікроконтролери. avr . Всі приклади побудовані на мікроконтролері atmega8. Це означає, що для повторення всіх уроків вам знадобиться всього один МК. В якості емулятора електронних схем використовується Proteus - на мій погляд, - найкращий варіант для початківців. Програми у всіх прикладах написані на компіляторі C для avr CodeVision AVR. Чому не на якому-небудь асемблері? Тому що початківець і так завантажений інформацією, а програма, яка примножує два числа, на асемблері займає близько ста рядків, та й у складних великих проектах використовують С. Компілятор CodeVision AVR заточений під мікроконтролери atmel, має зручний генератор коду, непоганий інтерфейс і прямо з нього можна прошити мікроконтролер.
У цьому навчальному курсі буде розказано і показано на простих прикладах як:
- Почати програмувати мікроконтролери, з чого почати, що для цього потрібно.
- Які програми використовувати для написання прошивки для avr, для симуляції та налагодження коду на ПК,
- Які периферійні пристрої знаходяться всередині МК, як ними керувати за допомогою вашої програми
- Як записати готову прошивку в мікроконтролер і як її відлагодити
- Як зробити друковану плату для вашого пристрою
Для того, щоб зробити перші кроки на шляху програмування МК, вам будуть потрібні всього дві програми:
- Proteus - програма - емулятор (у ній можна розробити схему, не вдаючись до реальної пайку і потім на цій схемі протестувати нашу програму). Ми всі проекти спочатку будемо запускати в Протеус а потім вже можна і паяти реальний пристрій. Скачати можна тут
- CodeVisionAVR - компілятор мови програмування С для AVR. У ньому ми будемо розробляти програми для мікроконтролера, і прямо з нього ж можна буде прошити реальний МК. Скачати можна тут
ul >
Після установки Proteus, запускаємо його
Він нам пропонує подивитися проекти які йдуть з ним, ми чемно відмовляємося. Тепер давайте створимо в ній найпростішу схему. Для цього клацнем на значок візуально нічого не відбувається. Теперь потрібно натиснути на маленьку літеру Р (вибрати з бібліотеки) в панелі списку компонентів, відкриється вікно вибору компонентів в полі маска вводимо назву компонента, який ми хочемо знайти в бібліотеці. Наприклад, нам потрібно додати мікроконтролер mega8 у списку результатів тикаємо на mega8 і натискаємо кнопку ОК. у нас в списку компонентів з'являється мікроконтролер mega8
Таким чином додаємо в список компонентів ще резистор, ввівши в поле маска слово res і світлодіод led
Щоб розмістити деталі на схемі, натискаємо на деталь, далі натискаємо по полю схеми, вибираємо місце розташування компонента і ще раз клікаємо. Для додавання землі або загального мінуса на схему ліворуч кликаем "Термінал" і вибираємо Ground. Такім чином, додавши всі компоненти і з'єднавши їх, отримуємо ось таку простеньку схемку
Все, тепер наша перша схема готова! Але ви, напевно, запитаєте, а що вона може робити? А нічого. Нічого, тому що для того, щоб мікроконтролер заробив, для нього потрібно написати програму. Програма - це список команд, які виконуватиме мікроконтролер. Нам потрібно, щоб мікроконтролер встановлював на ніжці PC0 логічний 0 (0 вольт) і логічну 1 (5 вольт) .
Написання програми для мікроконтролера
Програму ми будемо писати на мові С в компіляторі CodeVisionAVR. Після запуску CV, він запитує нас, що ми хочемо створити: Source або Project
Ми вибираємо останнє і натискаємо кнопку ОК. Далі нам буде запропоновано запустити майстер CVAVR CodeWizard (це безцінний інструмент для початківця, тому як в ньому можна генерувати основний скелет програми) < img src = 'files/1/38/StartCV.JPG' class = 'center' alt = 'запуск майстра коду CVAVR CodeWizard'> вибираємо Yes
Майстер запускається з активною вкладкою Chip, тут ми можемо вибрати модель нашого МК - це mega8, і частоту, на якій буде працювати МК (за замовчуванням mega8 виставлена на частоту 1 мегагерц ), тому виставляємо все, як показано на скріншоті вище.
Переходимо у вкладку Ports
У мікроконтролера atmega8 3 порти: Port C, Port D, Port B. У кожного порту 8 ніжок. Ніжки портів можуть знаходитися в двох станах: За допомогою регістра DDRx.y ми можемо встановлювати ніжку входом або виходом. Якщо в - DDRx.y = 0 - висновок працює як ВХІД
- DDRx.y = 1 висновок працює на ВИХІД
Коли ніжка налаштована як вихід, ми можемо виставляти на ній лог 1 ( +5 вольт ) і логічний 0 (0 вольт) . Це робиться записом в регістр PORTx.y . Далі буде детально розказано про порти введення -виведення . А зараз виставляємо всі , як показано на скріншоті, та натискаємо File - > Generate, Save and Exit. Далі CodeWizard запропонує нам зберегти проект, ми його зберігаємо і дивимося на код:
#include <mega8.h> // бібліотека для роботи з мікро mega8
#include <delay.h> // бібліотека для створення тимчасових затримок
void main ( void )
{
PORTB = 0x00;
DDRB = 0x00;
PORTC = 0x00;
DDRC = 0x01; // робимо ніжку PC0 виходом
PORTD = 0x00;
DDRD = 0x00;
// Timer / Counter 0 initialization
TCCR0 = 0x00;
TCNT0 = 0x00;
// Timer / Counter 1 initialization
TCCR1A = 0x00;
TCCR1B = 0x00;
TCNT1H = 0x00;
TCNT1L = 0x00;
ICR1H = 0x00;
ICR1L = 0x00;
OCR1AH = 0x00;
OCR1AL = 0x00;
OCR1BH = 0x00;
OCR1BL = 0x00;
// Timer / Counter 2 initialization
ASSR = 0x00;
TCCR2 = 0x00;
TCNT2 = 0x00;
OCR2 = 0x00;
// External Interrupt ( s ) initialization
MCUCR = 0x00;
// Timer ( s ) / Counter ( s ) Interrupt ( s ) initialization
TIMSK = 0x00;
// Analog Comparator initialization
ACSR = 0x80 ;
SFIOR = 0x00;
while ( 1)
{
} ;
}
Тут вам може здатися все страшним і незнайомим, але насправді все не так. Код можна спростити, викинувши ініціалізацію невикористовуваних нами периферійних пристроїв МК. Після спрощення він виглядає так:
#include <mega8.h> // бібліотека для роботи з мікро mega8
#include <delay.h> // бібліотека для створення тимчасових затримок
void main ( void )
{
DDRC = 0x01; /* робимо ніжку PC0 виходом запис 0x01 може здатися вам незнайомій, а це всього лише число 1 в шістнадцятковій формі,
цей рядок буде еквівалентна 0b00000001 у двійковій, далі я буду писати саме так. */
while ( 1)
{
} ;
}
Все добре. Але для того, щоб світлодіод замигав, нам потрібно міняти логічний рівень на ніжці PC0. Для цього в головний цикл потрібно додати кілька рядків:
#include <mega8.h> // бібліотека для роботи з мікро mega8
#include <delay.h> // бібліотека для створення тимчасових затримок
void main ( void )
{
DDRC = 0x01; /* робимо ніжку PC0 виходом запис 0x01 може здатися вам незнайомій, а це всього лише число 1 в шістнадцятковій формі,
цей рядок буде еквівалентна 0b00000001 у двійковій, далі я буду писати саме так. */
while (1) // головний цикл програми
{// Відкривається операторна дужка головного циклу програми
PORTC.0 = 1; // виставляємо на ніжку 0 порту З 1
delay_ms ( 500 ) ; // робимо затримку в 500 мілісекунд
PORTC.0 = 0 ; // виставляємо на ніжку 0 порту С 0
delay_ms ( 500 ) ; // робимо затримку в 500 мілісекунд
} ;// Закривається операторна дужка головного циклу програми
}
Все, тепер код готовий. Клацнем на піктограму Build all Project files, щоб скомпілювати (перевести в інструкції процесора МК ) нашу програму. У папці Exe, яка знаходиться в нашому проекті, повинен з'явитися файл з розширенням hex, це і є наш файл прошивки для МК. Для того, щоб нашу прошивку згодувати віртуальному микроконтроллеру в Proteus, потрібно два рази клікнути на зображенні мікроконтролера в Протеус. З'явиться ось таке віконце
натискаємо на піктограму папки в полі Program File, вибераем hex - файл нашої прошивки і натискаємо кнопку ОК.
Тепер можна запустити симуляцію нашої схеми. Для цього натискаємо кнопку "Відтворити" у нижньому лівому кутку вікна Протеус.
Комментарии - (6) yu говорит: Здравствуйте! Вот прочитал Вашу статью и решил проверить, но разочаровался…. Сделал все как написано, но ничего не заработало. При этом никаких ошибок обе программы не выдали. В чем может быть проблема? Возможно, такое, что Вы допустили ошибку? Прошу проверьте, пожалуйста, код или еще лучше залейте файлы работоспособного проекта. Спасибо за внимание! Admin говорит: Здравствуйте. У меня все правильно проверил. Андрей говорит: Здравствуйте сделал все как у Вас после запуска программы сигнал доходит до резистора а дальше не поступает на светодиод. Объясните почему? Admin говорит: Здравствуйте. На ножке микроконтроллера 5в устанавливается? Филипп говорит: У меня тоже не мигает.
Ошибка в том, что сопротивление резистора устанавливается как 10к по умолчанию.
На вашем примере просто 10.
Когда я у себя убрал букву "К" то диод замигал :) Admin говорит: Все правильно, от 10к ему не хватает тока чтобы засветится, у меня стоит просто 10, это 10 ом
Добавить комментарийДля отправки комментария вы должны авторизоваться.
|