Самостоятельный чип-тюнинг при помощи ChipLoader + Сканматик 2 (J2534)

Всем привет! Начитавшись на просторах Драйв2 много информации, о том как катализатор убивает наши двигателя. Я решил для начала чипонуть свой мотор, а уже потом удалить кат. Опыт перепрошивки у меня уже был, но корейцев я не шил, только ВАЗы и ЗАЗы, да и загрузчика у меня нормального лицензионного не было, только ломаные версии чиплодиря и комбилодиря.
Как раз на Новый Год, я решил сделать себе подарок и купил официальный ChipLoader (то есть не саму программу? а только лицензионный ключ к ней, программу можно скачать с официального сайта). Плюс ко всему я купил дополнительный модуль Bosch ME 17.9.11/12 к программе для записи серийных прошивок ( им так же можно ЗАПИСАТЬ и тюнингованные прошивки которые «подготовленные» для записи через ОБД2 разьем).
Также для перепрошивки нужен J2534 адаптер. Отдельно я адаптер не покупал, так как у меня есть Сканматик 2 для диагностики, а с последним обновление он может работать как J2534 устройство.
Вообщем для чипа нам нужно:
1) Программа загрузчик — ChipLoader v 2.30 (лицензия)
2) Дополнительный модуль Bosch ME 17.9.11/12 к программе для записи серийных прошивок.
3) J2534 адаптер — в моем случае это Сканматик 2 (можете использовать любой другой OpenPort 2.0 например.)
4) Прошивка «подготовленная для записи» через ОБД2 ( если прошивка будет НЕ подготовленная то когда вы ее запишите автомобиль не заведется, что бы оживить его нужно будет скачать стоковую прошивку (не тюнингованую) и залить ее обратно в эбу через ОБД. Но если у вас есть прошивка но она не предназначена для записи через «розетку» тогда к программе вам нужно купить другой модуль который умеет работать с тюнингованными прошивками, а также пересчитывает контрольную сумму и подделывает цифровую подпись.)
5) Прямые руки.
Когда писал видео не хватило 2 минут в конце, закончилась память на телефоне :(((
Вообщем после перепрошивки делаем сброС ЭБУ, потом выключаем зажигание ждем 30 секунд и заводим автомобиль и едем проверяем. По ощущениям машинка поехала намного резвее и лучше крутится с низов даже с катализатором, думаю когда выбью кат и залью туже прошивку, но только под ЕВРО-2 машинка должна поехать намного лучше.
Всем приятного просмотра
Всем ровных дорог.
Программирование микроконтроллеров: STM8 — как прошить?

Скоро буду выкладывать материал по поделкам на микроконтроллерах STM8S003F3P6, поэтому начинающим нужно знать, как его прошить.
Для прошивки микроконтроллера советую использовать USB свисток ST-LINK V2
Купить его можно в магазинах радиотоваров, к примеру в Чип и Дипе (дорого и быстро) или на Алиэкспресс (дешево и долго).
Для поиска по названию используем фразу » ST-LINK V2 » Выглядит программатор в виде, очень похожем на УСБ флешку. С одной стороны порт УСБ, с другой стороны стандартный 10 контактный разъем пинов.
Назначение контактов есть на корпусе. Только нужно учесть, что шлепают их на фабриках Китая много кто, и порой у разных производителей нумерация контактов отличается.

Между программатором и микросхемой должен быть посредник, ибо напрямую к ножкам микросхемы программатор не подключить. Эта вещь называется отладочная плата, ее можно купить там же, где и сам программатор. Отладочная плата уже содержит сам микроконтроллер, всю обвязку достаточно подключить проводами ее к программатору и можно прошивать. Для поиска на алиэкспресс достаточно ввести название чипа микроконтроллера, например » STM8S003F3P6 » Помимо самих микросхем в поиске будут выпадать и отладочные платы на них.

Если отладочная плата не подходит, потому что есть отдельно купленные чипы микроконтроллеров, и их нужно неоднократно прошить, то используются отладочные платы с панельками микросхем. В такую плату вставляется микроконтроллер и прошивается. Стоимость таких плат достаточно дороже, ищется на Алиэкспресс по фразе » TSSOP20 Burning «

Если печатка делается самостоятельно, то можно вывести отдельные контакты на разъем программатора, так называемое «внутресхемное программирование», тогда отладочная плата не нужна, можно напрямик подсоединить свою плату к программатору и прошить ее после распайки компонентов платы.
Для этого под программатор выводится 4 ноги микроконтроллера, это ножки:
7 ножка чипа VSS к минусу GND программатора
9 ножка чипа VDD к 3.3V или 5.0V программатора
18 ножка чипа PD1 к контакту SWIM программатора
4 ножка чипа NRST к контакту RST программатора
Особенности использования ножек при самостоятельной разработке:
Если линия 4 ножки сброса тянется дорожкой далеко от микроконтроллера к разъему, то подтяните ее резистором к плюсу питания резистором на 10 килоом.
Порт PD1 (18 ножка чипа) можно использовать на свои нужды, помимо вывода на разъем программатора, но в этом случае ее нельзя использовать с емкостной нагрузкой.
В качестве софта для прошивки можно использовать нагугленное для STM, я же покажу, как пользоваться родной софтиной «ST Visual Programmer» которую можно найти на сайте www.st.com, забив в тамошний поиск фразу » STVP-STM8 » Для скачивания на официальном сайте нужна регистрация, но можно воспользоваться моим скачанным оттуда архивом без регистрации umat.ru/files/en.stvp-stm8.zip (версия архива 42.0.0 конца 2018 года)
При установки софта установится все необходимое, драйвера программатора и сама программа. Название приложения «ST Visual Programmer» Запускаем его.
Сначала нужно настроить . В конфигурации вводим тип программатора, режим и название чипа

Теперь можно открыть файл прошивки. File>Open…

Файл прошивки имеет расширение файла .s19/ После загрузки прошивки в программу произойдет следующее:

В области описания (выделено красным) в разделе PROGRAM MEMORY будет указаны сведения файла прошивки. В поле главной вкладки PROGRAM MEMORY (синим) будет массив данных прошивки, в поле лога внизу (зеленым) будет этот самый лог загрузки. Поподробнее о нем: Последняя строка «Файл успешно загружен. Контрольная сумма …». Но перед этим куча ошибок с указанием строки, адреса и «выход за пределы — проигнорировано». Это нормально. Файл прошивки содержит всю область памяти, включая адреса с 0х4000 по 0х407F, этот диапазон является проигнорированной ЕЕПРОМ памятью, который относится а следующей вкладке «DATA MEMORY», на который нужно теперь перейти (нажать, где красным, ниже на картинке)

Загружать данные в «DATA MEMORY» необходимо, если область памяти ЕЕПРОМ содержит эти самые данные. Проверяем, открыв тот же самый файл прошивки. Загрузка будет идти подольше, большая часть файла прошивки будет проигнорирована, но область памяти ЕЕПРОМ будет успешно загружена:

Если в поле массива данных видны какие либо шестнадцатеричные значения, то значит прошивать их нужно. Если там все будет по нулям, то шить их нет необходимости. Я, к примеру, зачастую, если даже в описание поделки описано, что «настройки сохраняются в энергонезависимой памяти», не заполняю область ЕЕПРОМ данными, делая первичную инициализацию ЕЕПРОМ при первом запуске микроконтроллера. То есть микроконтроллер сам прошивает ЕЕПРОМ, поэтому сам файл прошивки не содержит этих данных.
Вкладка «OPTION BYTE» это те же самые фьюзы, как у микроконтроллеров АТтини, но менять их значения, как правило, нет никакой необходимости (фух!) — поэтому описывать их и не буду. После загрузки прошивки в программу можно подключать программатор и сам микроконтроллер или отладочную плату с ним. Для загрузки прошивки в микроконтроллер, необходимо нажать кнопку «загрузить все» (красным)

Если все прошло успешно, то быстро «проскачут» шкалы выполнения (зеленым) и в логе пробегут данные выполнения (синим) Если логи содержат фразы » completed» «successfully» то все успешно прошилось.
Если что то пойдет ни так, и логи закраснеют красными ругачками, то что то пошло не так. Подробнее о ругачках:

» Нет соединения с микроконтроллером…» Проверьте, правильно ли контачат провода программатора и жив ли сам чип.

» Не могу соединится с программатором.» . Неправильно выбран тип программатора, неподключен сам программатор или не установленны драйвера, возможно программатор завис ( нужно его перевоткнуть)

«Чип залочен». Если залочить чип (заблокировать ему возможность записи и чтения прошивки), то нужно сначала снять защиту ( прошивка в памяти контроллера конечно потеряется).
Нужно перейти на вкладку «OPTION BYTE»( синим), убедится, что значение параметра защиты выключено (красным) и нажать на кнопку » записать данные» (зеленым).

Все, защита снята, и можно прошивать.
Вы еще не программируете микроконтроллеры? Тогда мы идем к вам!

Здравствуйте, уважаемые Хабражители!
В этой статье я хочу рассказать о том, как однажды решил начать программировать микроконтроллеры, что для этого понадобилось и что в итоге получилось.
Тема микроконтроллеров меня заинтересовала очень давно, году этак в 2001. Но тогда достать программатор по месту жительства оказалось проблематично, а о покупке через Интернет и речи не было. Пришлось отложить это дело до лучших времен. И вот, в один прекрасный день я обнаружил, что лучшие времена пришли не выходя из дома можно купить все, что мне было нужно. Решил попробовать. Итак, что нам понадобится:
1. Программатор
На рынке предлагается много вариантов — от самых дешевых ISP (In-System Programming) программаторов за несколько долларов, до мощных программаторов-отладчиков за пару сотен. Не имея большого опыта в этом деле, для начала я решил попробовать один из самых простых и дешевых — USBasp. Купил в свое время на eBay за $12, сейчас можно найти даже за $3-4. На самом деле это китайская версия программатора от Thomas Fischl. Что могу сказать про него? Только одно — он работает. К тому же поддерживает достаточно много AVR контроллеров серий ATmega и ATtiny. Под Linux не требует драйвера.

Для прошивки надо соединить выходы программатора VCC, GND, RESET, SCK, MOSI, MISO с соответствующими выходами микроконтроллера. Для простоты я собрал вспомогательную схему прямо на макетной плате:

Слева на плате — тот самый микроконтроллер, который мы собираемся прошивать.
2. Микроконтроллер
С выбором микроконтроллера я особо не заморачивался и взял ATmega8 от Atmel — 23 пина ввода/вывода, два 8-битных таймера, один 16-битный, частота — до 16 Мгц, маленькое потребление (1-3.6 мА), дешевый ($2). В общем, для начала — более чем достаточно.

Под Linux для компиляции и загрузки прошивки на контроллер отлично работает связка avr-gcc + avrdude. Установка тривиальная. Следуя инструкции, можно за несколько минут установить все необходимое ПО. Единственный ньюанс, на который следует обратить внимание — avrdude (ПО для записи на контроллер) может потребовать права супер-пользователя для доступа к программатору. Выход — запустить через sudo (не очень хорошая идея), либо прописать специальные udev права. Синтаксис может отличаться в разных версиях ОС, но в моем случае (Linux Mint 15) сработало добавление следующего правила в файл /etc/udev/rules.d/41-atmega.rules :
# USBasp programmer SUBSYSTEM=="usb", ATTR=="16c0", ATTR=="05dc", GROUP="plugdev", MODE="0666"
После этого, естественно, необходим перезапуск сервиса
service udev restart
Компилировать и прошивать без проблем можно прямо из командной строки (кто бы сомневался), но если проектов много, то удобнее поставить плагин AVR Eclipse и делать все прямо из среды Eclipse.
Под Windows придется поставить драйвер. В остальном проблем нет. Ради научного интереса попробовал связку AVR Studio + eXtreme Burner в Windows. Опять-таки, все работает на ура.
Начинаем программировать
Программировать AVR контроллеры можно как на ассемблере (AVR assembler), так и на Си. Тут, думаю, каждый должен сделать свой выбор сам в зависимости от конкретной задачи и своих предпочтений. Лично я в первую очередь начал ковырять ассемблер. При программировании на ассемблере архитектура устройства становится понятнее и появляется ощущение, что копаешься непосредственно во внутренностях контроллера. К тому же полагаю, что в особенно критических по размеру и производительности программах знание ассемблера может очень пригодиться. После ознакомления с AVR ассемблером я переполз на Си.
После знакомства с архитектурой и основными принципами, решил собрать что-то полезное и интересное. Тут мне помогла дочурка, она занимается шахматами и в один прекрасный вечер заявила, что хочет иметь часы-таймер для партий на время. БАЦ! Вот она — идея первого проекта! Можно было конечно заказать их на том же eBay, но захотелось сделать свои собственные часы, с блэк… эээ… с индикаторами и кнопочками. Сказано — сделано!
В качестве дисплея решено было использовать два 7-сегментных диодных индикатора. Для управления достаточно было 5 кнопок — “Игрок 1” , “Игрок 2” , “Сброс” , “Настройка” и “Пауза” . Ну и не забываем про звуковую индикацию окончания игры. Вроде все. На рисунке ниже представлена общая схема подключения микроконтроллера к индикаторам и кнопкам. Она понадобится нам при разборе исходного кода программы:

Разбор полета
Начнем, как и положено, с точки входа программы — функции main . На самом деле ничего примечательного в ней нет — настройка портов, инициализация данных и бесконечный цикл обработки нажатий кнопок. Ну и вызов sei() — разрешение обработки прерываний, о них немного позже.
int main(void) < init_io(); init_data(); sound_off(); sei(); while(1) < handle_buttons(); >return 0; >
Рассмотрим каждую функцию в отдельности.
void init_io() < // set output DDRB = 0xFF; DDRD = 0xFF; // set input DDRC = 0b11100000; // pull-up resistors PORTC |= 0b00011111; // timer interrupts TIMSK = (1<
Настройка портов ввода/вывода происходит очень просто — в регистр DDRx (где x — буква, обозначающая порт) записивается число, каждый бит которого означает, будет ли соответствующий пин устройством ввода (соответствует 0) либо вывода (соответствует 1). Таким образом, заслав в DDRB и DDRD число 0xFF, мы сделали B и D портами вывода. Соответственно, команда DDRC = 0b11100000; превращает первые 5 пинов порта C во входные пины, а оставшиеся — в выходные. Команда PORTC |= 0b00011111; включает внутренние подтягивающие резисторы на 5 входах контроллера. Согласно схеме, к этим входам подключены кнопки, которые при нажатии замкнут их на землю. Таким образом контроллер понимает, что кнопка нажата.
Далее следует настройка двух таймеров, Timer0 и Timer1. Первый мы используем для обновления индикаторов, а второй — для обратного отсчета времени, предварительно настроив его на срабатывание каждую секунду. Подробное описание всех констант и метода настройки таймера на определенноый интервал можно найти в документации к ATmega8.
Обработка прерываний
ISR (TIMER0_OVF_vect) < display(); if (_buzzer >0) < _buzzer--; if (_buzzer == 0) sound_off(); >> ISR(TIMER1_COMPA_vect) < if (ActiveTimer == 1 && Timer1 >0) < Timer1--; if (Timer1 == 0) process_timeoff(); >if (ActiveTimer == 2 && Timer2 > 0) < Timer2--; if (Timer2 == 0) process_timeoff(); >>
При срабатывании таймера управление передается соответствующему обработчику прерывания. В нашем случае это обработчик TIMER0_OVF_vect, который вызывает процедуру вывода времени на индикаторы, и TIMER1_COMPA_vect, который обрабатывает обратный отсчет.
Вывод на индикаторы
void display() < display_number((Timer1/60)/10, 0b00001000); _delay_ms(0.25); display_number((Timer1/60)%10, 0b00000100); _delay_ms(0.25); display_number((Timer1%60)/10, 0b00000010); _delay_ms(0.25); display_number((Timer1%60)%10, 0b00000001); _delay_ms(0.25); display_number((Timer2/60)/10, 0b10000000); _delay_ms(0.25); display_number((Timer2/60)%10, 0b01000000); _delay_ms(0.25); display_number((Timer2%60)/10, 0b00100000); _delay_ms(0.25); display_number((Timer2%60)%10, 0b00010000); _delay_ms(0.25); PORTD = 0; >void display_number(int number, int mask)
Функция display использует метод динамической индикации. Дело в том, что каждый отдельно взятый индикатор имеет 9 контактов (7 для управления сегментами, 1 для точки и 1 для питания). Для управления 4 цифрами понадобилось бы 36 контактов. Слишком расточительно. Поэтому вывод разрядов на индикатор с несколькими цифрами организован по следующему принципу:
Напряжение поочередно подается на каждый из общих контактов, что позволяет высветить на соответствующем индикаторе нужную цифру при помощи одних и тех же 8 управляющих контактов. При достаточно высокой частоте вывода это выглядит для глаза как статическая картинка. Именно поэтому все 8 питающих контактов обоих индикаторов на схеме подключены к 8 выходам порта D, а 16 управляющих сегментами контактов соединены попарно и подключены к 8 выходам порта B. Таким образом, функция display с задержкой в 0.25 мс попеременно выводит нужную цифру на каждый из индикаторов. Под конец отключаются все выходы, подающие напряжение на индикаторы (команда PORTD = 0; ). Если этого не сделать, то последняя выводимая цифра будет продолжать гореть до следующего вызова функции display, что приведет к ее более яркому свечению по сравнению с остальными.
Обработка нажатий
void handle_buttons() < handle_button(KEY_SETUP); handle_button(KEY_RESET); handle_button(KEY_PAUSE); handle_button(KEY_PLAYER1); handle_button(KEY_PLAYER2); >void handle_button(int key) < int bit; switch (key) < case KEY_SETUP: bit = SETUP_BIT; break; case KEY_RESET: bit = RESET_BIT; break; case KEY_PAUSE: bit = PAUSE_BIT; break; case KEY_PLAYER1: bit = PLAYER1_BIT; break; case KEY_PLAYER2: bit = PLAYER2_BIT; break; default: return; >if (bit_is_clear(BUTTON_PIN, bit)) < if (_pressed == 0) < _delay_ms(DEBOUNCE_TIME); if (bit_is_clear(BUTTON_PIN, bit)) < _pressed |= key; // key action switch (key) < case KEY_SETUP: process_setup(); break; case KEY_RESET: process_reset(); break; case KEY_PAUSE: process_pause(); break; case KEY_PLAYER1: process_player1(); break; case KEY_PLAYER2: process_player2(); break; >sound_on(15); > > > else < _pressed &= ~key; >>
Эта функция по очереди опрашивает все 5 кнопок и обрабатывает нажатие, если таковое случилось. Нажатие регистрируется проверкой bit_is_clear(BUTTON_PIN, bit) , т.е. кнопка нажата в том случае, если соответствующий ей вход соединен с землей, что и произойдет, согласно схеме, при нажатии кнопки. Задержка длительностью DEBOUNCE_TIME и повторная проверка нужна во избежание множественных лишних срабатываний из-за дребезга контактов. Сохранение статуса нажатия в соответствующих битах переменной _pressed используется для исключения повторного срабатывания при длительном нажатии на кнопку.
Функции обработки нажатий достаточно тривиальны и полагаю, что в дополнительных комментариях не нуждаются.
Полный текст программы
#define F_CPU 4000000UL #include #include #include #define DEBOUNCE_TIME 20 #define BUTTON_PIN PINC #define SETUP_BIT PC0 #define RESET_BIT PC1 #define PAUSE_BIT PC2 #define PLAYER1_BIT PC3 #define PLAYER2_BIT PC4 #define KEY_SETUP 0b00000001 #define KEY_RESET 0b00000010 #define KEY_PAUSE 0b00000100 #define KEY_PLAYER1 0b00001000 #define KEY_PLAYER2 0b00010000 volatile int ActiveTimer = 0; volatile int Timer1 = 0; volatile int Timer2 = 0; volatile int _buzzer = 0; volatile int _pressed = 0; // function declarations void init_io(); void init_data(); int number_mask(int num); void handle_buttons(); void handle_button(int key); void process_setup(); void process_reset(); void process_pause(); void process_timeoff(); void process_player1(); void process_player2(); void display(); void display_number(int mask, int number); void sound_on(int interval); void sound_off(); // interrupts ISR (TIMER0_OVF_vect) < display(); if (_buzzer >0) < _buzzer--; if (_buzzer == 0) sound_off(); >> ISR(TIMER1_COMPA_vect) < if (ActiveTimer == 1 && Timer1 >0) < Timer1--; if (Timer1 == 0) process_timeoff(); >if (ActiveTimer == 2 && Timer2 > 0) < Timer2--; if (Timer2 == 0) process_timeoff(); >> int main(void) < init_io(); init_data(); sound_off(); sei(); while(1) < handle_buttons(); >return 0; > void init_io() < // set output DDRB = 0xFF; DDRD = 0xFF; // set input DDRC = 0b11100000; // pull-up resistors PORTC |= 0b00011111; // timer interrupts TIMSK = (1<void init_data() < Timer1 = 0; Timer2 = 0; ActiveTimer = 0; >int number_mask(int num) < switch (num) < case 0 : return 0xC0; case 1 : return 0xF9; case 2 : return 0xA4; case 3 : return 0xB0; case 4 : return 0x99; case 5 : return 0x92; case 6 : return 0x82; case 7 : return 0xF8; case 8 : return 0x80; case 9 : return 0x90; >; return 0; > void process_setup() < Timer1 += 60; Timer2 += 60; // overflow check (5940 seconds == 99 minutes) if (Timer1 >5940 || Timer2 > 5940) < Timer1 = 0; Timer2 = 0; >> void process_reset() < init_data(); >void process_timeoff() < init_data(); sound_on(30); >void process_pause() < ActiveTimer = 0; >void process_player1() < ActiveTimer = 2; >void process_player2() < ActiveTimer = 1; >void handle_button(int key) < int bit; switch (key) < case KEY_SETUP: bit = SETUP_BIT; break; case KEY_RESET: bit = RESET_BIT; break; case KEY_PAUSE: bit = PAUSE_BIT; break; case KEY_PLAYER1: bit = PLAYER1_BIT; break; case KEY_PLAYER2: bit = PLAYER2_BIT; break; default: return; >if (bit_is_clear(BUTTON_PIN, bit)) < if (_pressed == 0) < _delay_ms(DEBOUNCE_TIME); if (bit_is_clear(BUTTON_PIN, bit)) < _pressed |= key; // key action switch (key) < case KEY_SETUP: process_setup(); break; case KEY_RESET: process_reset(); break; case KEY_PAUSE: process_pause(); break; case KEY_PLAYER1: process_player1(); break; case KEY_PLAYER2: process_player2(); break; >sound_on(15); > > > else < _pressed &= ~key; >> void handle_buttons() < handle_button(KEY_SETUP); handle_button(KEY_RESET); handle_button(KEY_PAUSE); handle_button(KEY_PLAYER1); handle_button(KEY_PLAYER2); >void display() < display_number((Timer1/60)/10, 0b00001000); _delay_ms(0.25); display_number((Timer1/60)%10, 0b00000100); _delay_ms(0.25); display_number((Timer1%60)/10, 0b00000010); _delay_ms(0.25); display_number((Timer1%60)%10, 0b00000001); _delay_ms(0.25); display_number((Timer2/60)/10, 0b10000000); _delay_ms(0.25); display_number((Timer2/60)%10, 0b01000000); _delay_ms(0.25); display_number((Timer2%60)/10, 0b00100000); _delay_ms(0.25); display_number((Timer2%60)%10, 0b00010000); _delay_ms(0.25); PORTD = 0; >void display_number(int number, int mask) < PORTB = number_mask(number); PORTD = mask; >void sound_on(int interval) < _buzzer = interval; // put buzzer pin high PORTC |= 0b00100000; >void sound_off() < // put buzzer pin low PORTC &= ~0b00100000; >
Прототип был собран на макетной плате:

После тестирования прототипа пришло время все это добро разместить в корпусе, обеспечить питание и т.д.

Ниже показан окончательный вид устройства. Часы питаются от 9-вольтовой батарейки типа “Крона”. Потребление тока — 55 мА.

Заключение
Потратив $20-25 на оборудование и пару вечеров на начальное ознакомление с архитектурой микроконтроллера и основными принципами работы, можно начать делать интересные DIY проекты. Статья посвящается тем, кто, как и я в свое время, думает, что начать программировать микроконтроллеры — это сложно, долго или дорого. Поверьте, начать намного проще, чем может показаться. Если есть интерес и желание — пробуйте, не пожалете!
Удачного всем программирования!
P.S. Ну и напоследок, небольшая видео-демонстрация прототипа:
Что нужно для программирования микроконтроллеров?
Теперь, когда мы уже ознакомлены с некоторыми возможностями и функциями микроконтроллеров, естественно, возникает логичный вопрос: что нужно для программирования микроконтроллеров? Какие необходимы программы и устройства, где их взять?

Для того чтобы микроконтроллер мог решать задачи и выполнять определенные функции, его нужно запрограммировать, т. е. записать в него программу или же код программы.
Структура и порядок написания программы
Первым делом, прежде чем приступить к написанию любой программы, а точнее кода программы, следует четко представлять, какие функции будет выполнять микроконтроллер. Поэтому сначала нужно определить конечную цель программы. Когда она определена и полностью понятна, тогда составляется алгоритм работы программы. Алгоритм – это последовательность выполнения команд. Применение алгоритмов позволяет более четко структурировать процесс написания кода, а при написании сложных программ часто позволяет сократить время, затрачиваемое на их разработку и отладку.
Следующим этапом после составления алгоритма является непосредственное написание кода программы. Программы для микроконтроллеров пишутся на языке Си или Ассемблере. Только Ассемблер больше относится к набору инструкций, нежели к языку программирования и является языком низкого уровня.

Мы будем писать программы на Си, который относится к языку высокого уровня. Программы на Си пишутся гораздо быстрее по сравнению с аналогичными на Ассемблере. К тому же все сложные программы пишутся преимущественно на Си.
Здесь мы не будем сравнивать преимущества и недостатки написания программ на Ассемблере и Си. Со временем, приобретя некоторый опыт в программировании МК, вы сами для себя сделаете полезные выводы.
Сам код программы можно писать в любом стандартном текстовом редакторе, например в Блокноте. Однако на практике пользуются более удобными редакторами, о которых будет сказано далее.
Компиляция программы
Написанный нами код на Си еще вовсе не понятен микроконтроллеру, поскольку МК понимает команды только в двоичной (или шестнадцатеричной) системе, которая представляет собой набор нулей и единиц. Поэтому Си-шный код нужно преобразовать в нули и единицы. Для этого применяется специальная программа, называемая компилятор, а сам процесс преобразования кода называется компиляция.
Далее откомпилированный готовый код нужно поместить в микроконтроллер, а точнее записать его в память микроконтроллера или, проще говоря, прошить микроконтроллер.
Для прошивки МК применяется устройство, называемое программатор. В зависимости от типа программатора вход его подключается к COM или USB порту, а выход к определенным выводам микроконтроллера.

Существует широкий выбор программаторов и отладочных плат, однако нас вполне устроит самый простой программатор USBASP, который в Китае стоит не более 3 $.

После того, как микроконтроллер прошит, выполняется отладка и тестирование программы на реальном устройстве или, как еще говорят, на «железе».
Теперь давайте подытожим этапы программирования микроконтроллеров.

При написании простых программ можно обойтись без второго пункта, т. е. без составления алгоритма на бумаге, его достаточно держать в голове.
Следует заметить, что отладку и тестирование программы также выполняют до прошивки МК.
Необходимый набор программ
Существует множество полезных и удобных программ для программирования МК. Они бывают как платные, так и бесплатные. Среди них можно выделить три основных:
Все эти программы относятся к IDE – Integrated Development Environment – интегрированная среда разработки. В них можно писать код, компилировать и отлаживать его.
Следует обратить внимание на Code Vision AVR. Эта IDE позволяет упростить и ускорить написание кода. Однако программа платная.
На начальном этапе программирования все программы лучше прописывать вручную, без каких-либо упрощений. Это поможет быстро приобрести необходимые навыки, а в дальнейшем хорошо понимать и редактировать под свои нужды коды, написанные кем-то другим. Поэтому я рекомендую использовать программу Atmel Studio. Во-первых, она абсолютно бесплатна и постоянно обновляется, а во-вторых она разработана компанией, изготавливающей микроконтроллеры на которых мы будем учиться программировать.
Прошивка и отладка программы
Прошивать микроконтроллеры мы будем с помощью дополнительной программы AVRDUDE .
Если микроконтроллера в наличии нет, то его работу можно эмитировать с помощью программы Proteus. Она значительно упрощает процесс отладки программы даже при наличии МК, чтобы его часто не перепрошивать, ведь любой МК имеет конечное число перезаписей, хотя это число и достаточно большое.
При прошивке и отладке МК его удобно располагать на макетной плате, но это вовсе не обязательно. Поэтому для большего удобства пригодится и макетная плата. Существует большой выбор макетных плат, однако я вам рекомендую брать ту, которая имеет по возможности большее число отверстий. Когда мы начнем подключать семисегментные индикаторы, вы оцените преимущества «больших» макетных плат.
Еще один важный элемент, который нам пригодится – это техническая документация на МК, называемая datasheet. В общем, нужно скачать datasheet на микроконтроллер ATmega8.
Итак, полный набор для программирования МК состоит из таких элементов:
2) Datasheet на ATmega8
5) Программатор USB ASP (+ драйвер на него)
6) Макетная плата
7) Микроконтроллер ATmega8
Если микроконтроллера нет в наличии, не стоит откладывать изучение микроконтроллеров на потом, достаточно скачать и установить:
2) Datasheet на ATmega8