Поиск по этому блогу

Показаны сообщения с ярлыком Программатор для AVR. Показать все сообщения
Показаны сообщения с ярлыком Программатор для AVR. Показать все сообщения

20 янв. 2014 г.

О практическом использовании микроконтроллеров AVR

В настоящее время при построении систем управления различным технологическим оборудованием все чаще стали использовать микроконтроллеры. Причем наиболее распространенными из них являются микроконтроллеры фирмы ATMEL. В работе рассматривается один из подходов практического использования микроконтроллера ATmega8 для решения трех практических задач:
1.Определение температуры с использованием датчика DS18B20 и в зависимости от ее значения моделирование управлением оборудованием.
2.Измерение постоянного напряжения в диапазоне от 0 до 15 вольт.
3. Измерение времени (цифровые часы).
         Принципиальная схема устройства для решения перечисленных задач представлена на рис.1.
Рис.1
         Для отображения информации о времени, измеряемом напряжении, температуре, используется жидкокристаллический индикатор с числом столбцов и строк  16х2 соответственно (LCD 16x20), который поддерживает систему команд, совместимую с контроллером HD44780 (фирма Hitachi) и его аналогами, например, KS0066 (фирма Samsung), SED1278 (фирма Epson), ST7066 (фирма Sitronix). В качестве микроконтроллера выбран ATmega8-16 илиATmega8L-8. Последняя модель отличается меньшей тактовой частотой (8МГц) и меньшим энергопотреблением. Для измерения температуры используется цифровой датчик DS18B20 температуры с точностью до 0,0625 C (при разрешающей способности температурного преобразователя 12 бит) и диапазоном от -55 до +125 С. Датчик с микроконтроллером сопрягается по протоколу 1wire. Иначе 1wire – это однопроводной интерфейс, позволяющий подключить к одной линии данных практически неограниченное количество периферии. Каждое устройство имеет уникальный 64-х битный идентификационный номер.
         При включении устройство на индикаторе отображает в течение 5 секунд свое назначение и далее в бесконечном цикле отображает время, постоянное напряжение любого подключенного источника питания в пределах от 0 до 15 вольт и температуру. Если температура превысит 32 градуса C (по представленной программе), загорается  светодиод (моделирование управлением оборудования). Если температура опускается ниже 32 градусов, светодиод гаснет (оборудование отключается).
         После изготовления устройства по схеме на рис.1. в микроконтроллер должна быть загружена программа с помощью программатора. В качестве программатора  был использован простой, но надежно работающий адаптер для COM порта (рис.2) и программа PonyProg ( http://www.lancos.com/prog.html )
 
Рис.2
         Программирование устройства (рис.1) выполнялось на языке Си. И если учесть, что в архитектуру AVR изначально были заложены принципы оптимизации Си-процедур, то альтернативы этому алгоритмическому языку нет.
         Для программирования микроконтроллера ATMega8 воспользуемся компилятором языка Си CodeVision AVR фирмы  HP InfoTech, Румыния (http://www.hpinfotech.ro/html/cvavr.htm).  Он популярен тем, что включает в себя
- Кросс-компилятор Си, обеспечивающий выполнение почти всех элементов языка Си, разрешенных архитектурой AVR;
- Интегрированную среду разработки, в состав которой входит программатор чипов AVR для автоматической пересылки кодов после компиляции в микроконтроллерный чип через адаптер, а также набор библиотек Си для работы с LCD модулями, температурными датчиками,  часами реального времени и т.д.;
- Автоматический генератор программ CodeWizardAVR, позволяющий написать за несколько минут весь код необходимый для выполнения таких функций, как инициализация таймеров/счетчиков, инициализация LCD, инициализация АЦП и др.
         Рассмотрим последовательно этапы программирования микроконтроллера для решения представленной выше задачи. Предположим, что пакет CodeVision AVR установлен на компьютере. В работе в качестве примера используется CodeVision AVR Version  1.25.8 Professional. Перед запуском программы CodeVision AVR создаем каталог, где будут храниться файлы.
1. Запускаем CodeVision AVR и выбераем пункт CodeWizardAVR:
2.Выбираем тип микроконтроллера и частоту:

3.Выбираем LCD и подключаем его к порту D:

Видно, что автоматически устанавливается соответствие между подключаемыми битами микроконтроллера и выводами LCD модуля.
4.Инициализируем шину 1Wire и температурный датчик DS1820, хотя по заданию используется датчик DS18B20. Это делается для подсказки вызова необходимых библиотек. Впоследствии в программе будут произведены необходимые замены. Датчик устанавливаем на 3-й бит порта C:

5.Заходим во вкладку Timers. Выбираем для ATMega8 Timer 1:

В качестве источника тактовой частоты (Clock Source) выбираем System Clock, т.е. таймер будет тактироваться с частотой, на которой работает микроконтроллер (8MHz). Выберем тактовую частоту для таймера-счетчика (ClockValue) равную 7,813kHz. Она получается делением частоты работы микроконтроллера на коэффициент деления(1024). Включаем прерывание (Interrupt on), которое должно произойти, если в регистре A  появиться  значение, указанное в поле Comp.A. Поле Value  определяет начальное значение таймера-счетчика. Таким образом, наш таймер должен «тикнуть» 7813 раз, чтобы прошла ровно 1 секунда, если кварцевый резонатор идеально настроен на частоту 8 MHz. Однако при делении 8 MHz на делитель частоты 1024 получается 7.8125kHz. Поэтому в поле Comp.A необходимо поставить или 7812 или 7813 тактов (1e84 или 1e85 для шестнадцатеричной системы исчисления). Однако, как показал опыт с практически используемым кварцевым резонатором на 8 MHz, значение 7811 тактов оказалось наилучшим, что привело к опережению времени только на 1 секунду в сутки. Эта величина и установлена в программе после практической корректировки. Для получения наибольшей точности часов можно программно через каждые 24 часа от полученного времени отнимать 1 секунду.
6.Заходим последовательно в вкладки File -> Generate, Save and Exit:
Даем имена проекту и исходному файлу. В результате появится окно с текстом программы на языке Си:

7. Корректируем программу в окне текстом программы, который представлен ниже:
#include
#include
#include
#include
// Вставка ассемблерного кода (1 wire)
#asm
   .equ __w1_port=0x15 ;PORTC
   .equ __w1_bit=3
#endasm
#include <1wire .h="">
// Вставка ассемблерного кода (LCD)
#asm
   .equ __lcd_port=0x12 ;PORTD
#endasm
#include
#include // подключаем библиотеку задержки
#define VREF 5000 // Определяем опорное напряжение в миливольтах
unsigned int s; // переменная сек.
unsigned int m; // пересенная мин.
unsigned int h; // переменная часов
// Вызов функции обработки прерывания Timer 1 output compare A interrupt service routine
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
// Увеличиваем секунду на 1 в случае появления в регистре A числа 7813(изм. на 7811)
 TCNT1H=0;
 TCNT1L=0;
  s++;
}
void main(void)
{
// Declare your local variables here
int temp,temp3;       
float temp1,temp2,volt1;
unsigned long volt;
char lcd_volt[8],znak[2],lcd_buffer[16];
// Input/Output Ports initialization
// Port B initialization
// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
// State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0
PORTB=0xFF;
DDRB=0xFF;
// Port C initialization
// Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x03;
DDRC=0x00;
// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x00;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
TCCR0=0x00;
TCNT0=0x00;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 7,813 kHz
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: On
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x05;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x1E; //  Частота работы таймера
OCR1AL=0x84; // Скорректирована на 7812 (1E84)
OCR1BH=0x00;
OCR1BL=0x00;
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
MCUCR=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x10;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
// LCD module initialization
lcd_init(16);    // Инициализация LCD
// Глобальное разрешение прерываний
#asm("sei")  
w1_init(); // Инициализация линии 1 wire    
lcd_gotoxy(0,0);   // Позиционируем вывод на начало 1-й строки
lcd_putsf(" Time  Voltmetr"); // Выполняем вывод
lcd_gotoxy(0,1); // Позиционируем на начало 2-й строки   
lcd_putsf(" Termoregulator");  // Выполняем вывод
 DDRB.0=1;      // Переводим в режим вывода 0-й бит порта B
 PORTB.0=1;     // Устанавливаем на выходе 0 порта B логическую единицу
 delay_ms(5000); // Удерживаем вывод в течении 5 секунд
 lcd_clear();   // Очищаем экран LCD
  m=0;  // Обнуляем минуты
  h=0;  // и часы
  // Устанавливаем режим работы АЦП
  ADMUX &= 0xDF &  0x7F & 0xF2; ADMUX |= 0x40 | 0x02; // Разрядность 10бит, опорное напряжение AVCC Вольт,
  // внутренний источник опорного напряжения, линия PC2
  // ADCSRA &= 0xFE;
  ADCSRA |= 0x80 | 0x40 | 0x20 | 0x07; // Включить АЦП, запуск нового замера, постоянное измерение,
  //частота АЦП=8.0МГц/128
while (1) // Запуск бесконечного цикла измерений
  {    
           if (PINC.0==0) // если нажата первая кнопка (порт C бит 0)
           {
               m++; // к значению минуты добавляем единицу
           }
           if (PINC.1==0) // если нажата вторая кнопка  (порт C бит 1)
          {
              h++; // к значению часов добавляем единицу
           }
  // Условия часов.
            if(s==60) // если сек = 60
           {
              m++; // добавляем 1 к переменной "минута"
              s=0; // зануляем переменную "секунда"
           }
            if(m==60) // если мин = 60
            {
               h++; // добавляем 1 к переменной "час"
               m=0; // зануляем переменную "минута"
             }
      if (h==24) // так как у нас часы имеют 24 часовый формат
       { // при достыжении 24 часов, зануляем все переменные.
         h=0;
         m=0;
         s=0;
        }
  // Выводим переменные (время)
  lcd_gotoxy(0,0);
  lcd_putchar(h/10+0x30);
  lcd_putchar(h%10+0x30);
  lcd_putchar(':');
  lcd_putchar(m/10+0x30);
  lcd_putchar(m%10+0x30);
  lcd_putchar(':');
  lcd_putchar(s/10+0x30);
  lcd_putchar(s%10+0x30);
 // Определяем напряжение     
  volt=ADCL;
  volt += ((int)ADCH << 8);
  volt=volt*VREF/1024;
  volt1=volt/1000.0;
  volt1=3.224*volt1; // Вычисляем напряжение в соответсвии с выбранным делителем напряжения
  // Выводим напряжение
    sprintf(lcd_volt," U=%5.2f",volt1);
          lcd_puts(lcd_volt);              
 // Определяем и выводим температуру               
        temp1=ds18b20_temperature(0);  // Функция определения температуры для одног датчика 
         sprintf(znak,"+");
         if (temp1 < 0.0 ){ // Определяем знаки температуры
         temp1=-temp1;      
         sprintf(znak,"-");
         }
    // Формируем дробное значение температура при работе с целыми числами (это полезно
    // в целях экономии памяти)   
          temp=temp1;       
          temp2=temp1-temp; 
          temp3=100*temp2;       
          if (temp>=32){ // Если температура больше или равна 32 град.
            PORTB.0=0;   // Выставит ноль на нулевом выходе порта B (включится светодиод)
            } 
         if (temp<32 32="" nbsp="" o:p="">
         PORTB.0=1; // Выставит единицу на нулевом выходе порта B (выключится светодиод)
            }
        // Вывод температуры            
         lcd_gotoxy(0,1);
         sprintf(lcd_buffer," temp = %s%i.%i",znak,temp,temp3);                        
         lcd_gotoxy(0,1);
         lcd_puts(lcd_buffer);               
  }; // Закрыть бесконечный цикл     
}  // Закрыть программу main()
8. Выбираем закладку Project->Configure->C Compile и устанавливаем в поле (s)printf Features значения float,width,precision

9.Компилируем проект (команда Compile):
10. Собираем проект командой Make:
В каталоге, где расположена программы на Си, появится файл с расширением .hex, который необходимо будет переслать в микроконтроллер с помощью адаптера и программатора. Для этой цели воспользуемся программой-программатором PonyProg, которая должна быть предварительно установлена на компьютере со свободным COM портом. После установки PonyProg должна быть выполнена процедура ее калибровки. Для этого необходимо зайти в закладки Setup->Calibration  и нажать на Yes.
Рассмотрим следующие этапы использования программы PonyProg.
1.Запускаем программу и настраиваем интерфейс связи между компьютером и  микроконтроллером:
Указываем использование адаптера для связи с COM портом:
2.Открываем файл с расширением .hex
3.После загрузки файла заходим в закладку Command->Security and Configuration Bits и устанавливаем  фьюз-биты (биты конфигурации). Ниже на рисунке представлена заводская конфигурация фьюз-битов для ATMega8. Для нашей конфигурации необходимо снять все галочки и нажать на Write.
4.Выполняем передачу файла микроконтроллеру по команде Ctrl-P. Или можно зайти во вкладку Command и курсором мышки выбрать Program.  В случае успешной передачи программы в микроконтроллер должно появиться окно с надписью Program succesful. При программировании необходимо не забыть на устройство подать напряжение (10…15В). После ввода программы устройство должно сразу же заработать.
Выводы.
1.Показан на простом примере возможный способ управления с помощью  распространенных и недорогих микроконтроллеров технологическим оборудованием на основе таймера, температуры, напряжения.
2.На основании используемого пакета  CodeVision AVR показано, как просто и прозрачно на языке Си создается программное обеспечение для функционирования микроконтроллера фирмы Atmel.
3.Приведена схема простейшего надежно работающего адаптера и последовательность работы с программатором для пересылки откомпилированной программы в микроконтроллер.
Литература.
1. Рюмик С.М. Микроконтроллеры AVR. Ступень 1. http://forum.radiospec.ru/index.php?showtopic=5612 - 2007

9 янв. 2014 г.

Делаем LPT программатор для AVR микроконтроллеров.

Одним из самых простых программаторов AVR является программатор для LPT порта. Это обусловлено тем, что уровни сигналов LPT порта совместимы с уровнями сигналов необходимыми для программирования АВР. Поэтому сигналы с LPT порта можно напрямую подать на микроконтроллер (резисторы нужны лиш для защиты порта от случайных замыканий). Такой программатор можно собрать из подручных материалов буквально за 5 минут!

Как Вы видите схема LPT программатора для AVR предельно проста:
Схема LPT программатора для AVR
Для изготовления LPT программатора нам понадобится:
детали для LPT программатора
Резисторы можно использовать любые, какие найдете в пределах от 100 до 150 Ом. Можно программатор собрать вообще без резисторов, но тогда спалить порт станет еще легче. В качестве шлейфа можно заюзать IDE шлейф. При подключении шлейфа, для более устойчивой работы программатора, каждый «сигнальный» провод должен чередоваться с «земляным» проводом. Это позволит уменьшить уровень помех наводимых в линиях и за счет этого увеличить длину программирующего провода. Длина шлейфа должна быть в пределах 50 см. Еще нужен разъем для подключения к программируемому устройству. 
Для внутрисхемного программирования Atmel рекомендует стандартные разъемы:

Если Вы планируете серьезно заняться микроконтроллерами, сделайте разъемы стандартными. Для разового программирования устройства я рекомендую использовать разъемы BLS «мамы» на программаторе (такими разъемами к материнской плате подключаются кнопки и светодиоды корпуса компьютера) и штырьки PLS «папы» на плате. Это позволяет максимально упростить разводку платы устройства, так как штырьки для программатора устанавливаются в непосредственной близости возле ножек микроконтроллера. Ножки MOSI, MISO, SCK у микроконтроллеров AVR всегда расположены вместе, поэтому для них можно применить строенный разъем. Отдельно делаем подключение для «земли»-GND и «сброса»-Reset.

Сборка LPT программатора за 5 шагов:
Как сделать LPT программатор для AVR
Перемычки между ножками разъема 2-12 и 3-11 нужны для того, чтобы наш программатор был виден для программ как программатор STK200/300 (STK200/300 своего рода стандарт и поэтому наш программатор станет виден для многих программами).
Для того чтобы наш LPT программатор заработал нужна программа для программирования через LPT порт, плата устройства к которой мы подключим программатор и тестовая прошивкадля микроконтроллера.
Общие рекомендации:- LPT порт довольно нежен – его очень легко «пальнуть», поэтому при работе с портом будьте аккуратны.
– Отдельное подключение для «земли» я бы рекомендовал делать во всех программаторах. Это нужно для того, чтобы «землю» можно было подключить первой и уравнять потенциалы «земли» программируемого устройства и компьютера. (Для тех кто не знает – если у Вас компьютер включен в обычную розетку без заземляющего контакта, то в виду особенности фильтра блока питания компьютера, на корпусе компьютера всегда присутствует потенциал в 110В. При «удачном» подключении программатора этого вполне достаточно для того чтобы сжечь микроконтроллер или LPT порт компьютера.
Заключение:-Если Вы надумали собрать свой первый программатор и у Вашего компьютера есть LPT порт, то программатор «5 проводков» лучший вариант! Он предельно прост и его повторить не составит труда. Кроме того, программатор совместим с классическими программаторами STK200/300, а значит, он будет поддерживаться многими программами для программирования AVR.
-Если Вы планируете программировать довольно часто, с целью обезопасить LPT порт, рекомендую собрать LPT программатор с буферными элементами (неплохой вариант LPT программатора можно посмотреть на изиэлектроникс) или собрать такой же простой COM программатор (COM порт гораздо выносливей и сжечь его трудней).

8 янв. 2014 г.

Делаем COM программатор для AVR микроконтроллеров.

ще одним несложным, в плане изготовления, является COM программатор. При условии использования альтернативного режима COM порта Bitbang, отпадает необходимость в преобразовании интерфейса RS232 COM порта в SPI, необходимый для программирования. Остается только привести уровни сигналов COM порта (-12В, +12В) к необходимым (0, +5В). Это и делает 
схема COM программатора для AVR микроконтроллеров:
Схема COM программатора для AVR
Данная схема программатора достаточно распространена и известна как программатор Громова. Название пошло от автора программы Algorithm Builder Геннадия Громова, который и предложил такую схему.
Чтобы собрать программатор Громова нам нужно следующее:
Детали для COM программатора для AVR
Диоды КД522, КД510, 1N4148 или им подобные. Резисторы можно использовать любые, какие найдете. В качестве шлейфа можно использовать IDE шлейф. При подключении шлейфа, для более устойчивой работы программатора, каждый «сигнальный» провод должен чередоваться с «земляным» проводом. Это позволит уменьшить уровень помех наводимых в линиях и за счет этого увеличить длину программирующего провода. Длина шлейфа должна быть в пределах 50 см. Еще нужен разъем для подключения к программируемому устройству. 
Для внутрисхемного программирования Atmel рекомендует стандартные разъемы:

Если Вы планируете серьезно заняться микроконтроллерами, сделайте разъемы стандартными. Для разового программирования устройства я рекомендую использовать разъемы BLS «мамы» на программаторе (такими разъемами к материнской плате подключаются кнопки и светодиоды корпуса компа – именно их я и взял) и штырьки PLS «папы» на плате. Это позволяет максимально упростить разводку платы устройства, так как штырьки для программатора устанавливаются в непосредственной близости возле ножек микроконтроллера. Ножки MOSI, MISO, SCK у микроконтроллеров AVR всегда расположены вместе, поэтому для них можно применить строенный разъем. Отдельно делаем подключение для «земли»-GND и «сброса»-Reset.
Собрать COM программатор не составит труда:
Собираем COM программатор для AVR
Я сознательно не даю печатной платы под этот программатор, так как схема проста и возня с разводкой и травлением платы просто себя не оправдывает.
Для того чтобы наш COM программатор заработал нужна программа для программирования через COM порт, плата устройства к которой мы подключим программатор и тестовая прошивкадля микроконтроллера.
Общие рекомендации:
- Так как режим Bitbang нестандартный для COM порта компьютера, то возможны сбои в работе (хотя у меня такого не было). Особенно это касается ноутбуков. Как вариант решения этой проблемы можно рекомендовать «поиграться» настройками COM порта (скорость, биты данных, варианты управления потоком, величины буфера …).
– Отдельный разъем для «земли» желательно подключить первым, чтобы уравнять потенциалы «земли» программируемого устройства и компьютера. Для тех, кто не знает, если у Вас компьютер включен в обычную розетку, без заземляющего контакта, то в виду особенности фильтра блока питания компьютера, на корпусе компьютера всегда присутствует потенциал в 110В.
Заключение:
- COM программатор Громова простой и надежный. Я не перестал пользоваться им даже собрав USB программатор (если какой либо микроконтроллер перестает программироваться USB программатором я обязательно перепроверю его на программаторе Громова).
– Так как программатор Громова собран на пассивных элементах он не требует для себя питания. Мало того, из-за паразитного питания, микроконтроллер можно запрограммировать вообще не подключая к нему источника питания! Хотя так программировать я не рекомендую, но сам факт интересен.
– Для пользователей Algorithm Builder есть приятный бонус! Этот программатор можно использовать для внутрисхемной отладки кристалла (программный JTAG).

5 янв. 2014 г.

Чем и как "прошить" МК AVR ? Как загрузить программу в микроконтроллер. Как запрограммировать микроконтроллер AVR.

Напоминаю: Об основах и тонкостях электроники и схемотехники читайте в настольной книге электронщика:  П.Хоровиц, У.Хилл. Искусство схемотехники на РУССКОМ языке.   
Я советую прошивать микроконтроллер прямо из программатора встроенного в компилятор CodeVisionAVR через простейший адаптер - буквально "пять проводков" соединяющих принтерный порт ПК с прошиваемым микроконтроллером AVR.
ПОДРОБНО: Результат написания и компиляции программы - файл-прошивку с расширением .hex (и возможно файл с содержимым для 
EEPROM 
МК) нужно записать ("зашить") в МК . МК AVR многократно программируются прямо в устройстве в котором будут работать - такое программирование называют - "ин систем программинн" или ISP.

Для этого установите на плате вашего устройства 6 контактов,  а лучше 6-ти штырьковый разъем для ISP
вид сверху платы на штырьки.
выводы подсоединить к МК в соответствии с указанными названиями.
Подробней по ISP разъемам посмотрите Апликейшн Ноут AVR910. 

Вывод 2 нужно подключить к 
+ питания МК если вы собираетесь использовать программатор питающийся от вашего же устройства - например фирменный ISP AVR.

Для "5 проводов" этот вывод не подключается. Для программирования достаточно 5 контактов. Соответственно и разъем который вы будете использовать может быть любым удобным для размещения на плате и имеющий минимум 5 контактов. Все контакты ISP разъема подсоединяются к  ножкам  МК в соответствии с названиями.
   
 
ВНИМАНИЕ !  в ATmega64 и ATmega128 выводы MOSI и MISO не применяют для ISP  Внимательно смотрите ДатаШит !     Например для ATmega128 сигналы MISOподключают к ножке PE1,  MOSI подключают к ножке PE0
 
   

Я советую вам пользоваться  интерфейсом программирования встроенным в компилятор CodeVisionAVR и конечно же в нем разрабатывать программу для МК.  Дело в том, что вам вряд ли удастся сразу написать программу без ошибок, даже после прогона в софт эмуляторе - симуляторе ваше устройство может делать не то,  что вы от него ожидаете - значит в программу нужно будет вносить изменения и снова зашивать в МК , и так раз 20 и более.  
Вы можете в компиляторе CodeVisionAVR открыть меню "Проджект -> Конфига -> Афта Мэйк"  и отметить чек бокс  "Program the chip" затем ОК. Еще нужно в меню "Сеттинс  -> Программер" выбрать ваш адаптер (подробней ниже) для программирования. Теперь после безошибочной компиляции программы вам будет доступна кнопка "Program" - нажмите на нее и произойдет программирование МК - т.е. файл .hex будет загружен в память программ МК. Затем МК будет "сброшен" (на ножку RESET будет подан лог. 0 а затем опять "1") и начнет выполнять только что прошитую (загруженную в него) программу. Вам даже не нужно будет отсоединять адаптер программирования от вашего устройства  если вы не используете в устройстве последовательный интерфейс SPI.  ... и так до окончательной отладки устройства.
   
 
В А Ж Н О !  В диалоге настройки программирования не трогайте галочки установки фьюзов МК если не разобрались четко что они делают! Иначе вы можете отключить режим ISP или внутренний RC-генератор и для следующего программирования вам понадобится ставить кварц с конденсаторами или даже искать Параллельный программатор для AVR. Но популярному ATtiny2313 даже параллельный программатор не поможет!  
 
   
в ATmegaXXX с завода включен внутренний RC генератор на  частоте 1 МГц   ( уточните это по ДШ  и его возможные частоты ) Если вам нужна другая частота или нужно включить внешний кварцевый или керамический резонатор - вам нужно запрограммировать некоторые фьюзы по таблицам из ДШ или по таблице фьюзов на стр. 2
З а п о м н и т е : 
  • НЕ запрограммированный  фьюз        1
  • ЗАпрограммированный   фьюз             0
Пример: Чтобы включить в ATmega16 внешний кварцевый резонатор с частотой от 3 до 8 МГц с конденсаторами (по схеме рис. 12 ДШ) найдите в ДШ раздел "System Clock".
В таблице 2 указаны комбинации фьюзов для разных источников тактового сигнала. Далее написано что с завода МК поставляется с такой комбинацией фьюзов
SKSEL   0001     SUT  10       CKOPT   1

По таблице 4  находим :
Для кварца с частотой от 3 до 8 МГц  нужны конденсаторы от 12 до 22 пФ и  вот  такая  комбинация  фьюзов :
SKSEL   1111     SUT  10       CKOPT   1
Установка фьюзов в программаторе компилятора  CVAVR

Для прошивания МК нажмите кнопку "Program All"
Для использования ATmega16 (и других мег) с внешним кварцевым или керамическим резонатором на частотах выше 8 МГц вам нужно установить фьюзы как в примере выше но запрограммировать CKOPT  - значит сделать его "0". Т.е. вам нужна такая комбинация:
SKSEL   1111     SUT  10       CKOPT   0
CKOPT   0  - нужен и тогда когда вы хотите подключить к XTAL2 другой микроконтроллер или тактируемый прибор.
Фьюзы  SUT   - определяют запуск генератора тактового сигнала, в большинстве случаев их установку можно оставить "как с завода"  -   SUT  10   -  более детально это описано в даташите в таблицах до 12.
  Для соединения компьютера с ISP разъемом устройства на AVR Советую сделать адаптер от STK200  - это "правильные 5 проводков" с микросхемой буфером снижающим вероятность случайного повреждения порта ПК. В установках компилятора CodeVisionAVR интерфейс "5-проводков" называется  "Канда системз STK200+/300"


Программа узнаёт адаптер STK200 по перемычкам на разъеме параллельного порта к которому он подключается - должны быть соединены двумя перемычками пары выводы: 2 и 12,  3  и 11. 

   
 
Внимание!   Для программирования к МК должно быть подключено питание. Например +4...+5 вольт ко всем выводам МК в названии которых есть VCC  и 0 вольт ко всем выводам GND (это "общий" провод).     Пример тут
 
   

Попробуйте поискать полезную инормацию в Гугле - ее там море !  Учитесь искать!
 
Если в МК нет внутреннего генератора тактового сигнала (например старые AVR серии AT90sXXXX или мега побывавшая в чьих то шаловливых руках изменивших фьюзы до того как попасть к вам) то нужно подключить кварц  на 1 - 8 МГц и два конденсатора от 15 до 33 пФ. Либо подать тактовый сигнал 1-1.5 МГц от внешнего источника - например генератора на микросхеме 74hc14 или на таймере LM555.

Программатор  AVReAl  может программировать МК без кварца и без конденсаторов. Он выводит тактовый сигнал на выв. 5 LPT его нужно подать на ножку XTAL1 МК и добавить в командной строке AVReAL специальный ключ  "-o0".  Программатор  AVReAl  позволяет назначать какие ножки LPT порта использовать - это будет полезно когда часть ножек LPT вы уже спалите   :-)
(Тактовый сигнал генерирует и программатор на USB по ссылке внизу этой страницы.)
 Еще очень советую поставить подтягивающий резистор 10 кОм от ножки Reset МК на питание VCC и конденсатор 0.01-0.33 мкФ (в апноутах AVR040 и AVR042 рекомендуют 0.01 мкФ) отReset на GND  -  как в схеме к задаче 7 курса.

   
 
Я использую самый простой вариант адаптера STK200 - "для самых ленивых"   - пять поводков соединяющих линии параллельного (LPT) порта ПК и AVR так же как на схеме STK200 выше, но без микросхемы буфера. Лучше все же токоограничительные резисторы от 150 до 270 ом впаять Проводки не более 15 см длиной !
 
   



Адаптер "5-проводков" прекрасно работает с компилятором CodeVision

   
 
Советую для изготовления адаптера взять " принтерный" шнур - он длинный и экранированный, а не экранированные проводки не стоит делать более 10-15 см.
 
   
 
Для питания устройства при программировании и отладке можно кроме сетевого адаптера использовать: 
  • - батарейку на 6 вольт с 2 диодами последовательно для понижения напряжения...
  • - можно три батарейки по 1,5 вольт последовательно соединить 
  • ... а можно +5 вольт взять с вывода 1 гейм порта компьютера или осторожно из гнезда USB.
Желательно питать устройство от ПК!  В этом случае "земля" вашего устройства будет соединена с корпусом ПК и можно будет безопасно подключать и отключать разъем программирующего адаптера.
   
 
ВНИМАНИЕ!  Всегда старайтесь первыми соединить "земли" устройств, а затем питание и потом уже сигнальные линии.
 
   

Не поленитесь:  спаяйте адаптер STK200 на микросхеме буфере по рисункам внизу страницы  - так как LPT порт компьютера более нежен чем COM - соответственно его спалить проще...   

   
 
Если вы хотите использовать ножки МК SCK, MOSI, MISO в вашем устройстве то подключайте другие компоненты к ним через резисторы 4.7 КОм - чтобы не мешать программированию. Так рекомендовано в апноуте AVR042 Для Мега64, -128, -256 вместо MOSI и MISO используются другие ножки для ISP программирования !
 
   
Если у вас нет LPT порта сделайте Аналог  "5 проводков" для COM-порта
Или соберите простой, дешевый USB программатор для AVR
Или соберите похожий программатор USB  программатор AVR и AT89s
Вот топик об успешной сборке этого интерфейса для программирования на ATmega8. Это новый вариант платы для него. Архив с разводкой платы Внимание !  Этот программатор выдает тактовый сигнал 1 МГц и меньше для прошивки МК без кварца и с выключенным внутренним генератором. тактовый сигнал выводится на контакт "LED". Его нужно подвести к ножкеXTAL1.
   
 
Существуют специальные программы "бутлодеры" которые записываются в микроконтроллер способами перечисленными выше и после этого микроконтроллер может сам, при включении, закачивать в себя программу (например из ПК через адаптер UART rs232 COM port - схема в задаче 4 курса) и запускать ее выполнение. Есть много бесплатных загрузчиков
 
   

Программатор AVR микроконтроллеров. LPT программатор.
Кликни чтобы увеличить
 
Принципиальная схема программатора на LPT порт показана на рисунке. В качестве шинного формирователя используется микросхема 74HC244 (К1564АП5), 74LS244 (К555АП5) либо 74ALS244 (К1533АП5), хотя может использоваться любой другой неинвертирующий шинный формирователь с тремя состояниями (в этом случае может потребоваться соответствующее изменение схемы).Светодиод VD1 индицирует режим записи микроконтроллера,
светодиод VD2 - чтения,
светодиод VD3 - наличие питания схемы.

Напряжение, необходимое для питания схема берёт с разъёма ISP, т.е. от программируемого устройства. Эта схема является переработанной схемой программатора STK200/300 (добавлены светодиоды для удобства работы), поэтому она совместима со всеми программами программаторов на PC, работающих со схемой STK200/300. Для работы с этим программатором используйте программу CVAVR

Программатор можно выполнить на печатной плате и поместить её в корпус разъёма LPT, как показано на рисунках:

Для работы с программатором удобно использовать удлинитель LPT порта, который несложно изготовить самому (к примеру, из кабеля Centronix для принтера), главное "не жалеть" проводников для земли (18-25 ноги разъёма) или купить. Кабель между программатором и программируемой микросхемой не должен превышать 20-30 см.

AVR miniICE -  

Это профессиональное средство для программирования и  отладки программы МК ATmega фирмы Atmel в реальном устройстве. Он полностью совместимый с оригинальным AVR JTAG ICE.
Автор данного устройства Milan Kostomlatsky kosta@mcu.cz
Оригинальное описание находится здесь
Пример реализации: на макетке