Программирование atmega16 через JTAG в Linux

Материал из Xgu.ru

Перейти к: навигация, поиск

Содержание

[править] Подключение

JTAG — интерфейс, созданный для отладки и перепрограммирования. Существуют контроллеры JTAGICE mkII, но для ATmega128, ATmega16, ATmega162, ATmega165, ATmega169, ATmega16A, ATmega32, ATmega323, ATmega32A, ATmega64, ATmega64A достаточно JTAG ICE [1].

Имеем: "AVR JTAG USB (полный аналог AVR JTAG ICE от ATMEL с возможностью работы от USB)", микроконтроллер Atmega16. На компьютере установлен Ubuntu linux 8.10. На других дистрибутивах Linux/BSD должно работать аналогично.

При подключении "AVR JTAG ICE" (кстати, на нём тоже установлен Atmega16) он определяется как переходник на com-порт:

usb 2-1: new full speed USB device using uhci_hcd and address 3
usb 2-1: configuration #1 chosen from 1 choice
usbcore: registered new interface driver usbserial
usbserial: USB Serial support registered for generic
usbcore: registered new interface driver usbserial_generic
usbserial: USB Serial Driver core
usbserial: USB Serial support registered for FTDI USB Serial Device
ftdi_sio 2-1:1.0: FTDI USB Serial Device converter detected
ftdi_sio: Detected FT232RL
usb 2-1: FTDI USB Serial Device converter now attached to ttyUSB0
usbcore: registered new interface driver ftdi_sio
ftdi_sio: v1.4.3:USB FTDI Serial Converters Driver

Из текста видно, что устройство теперь видно как ttyUSB0, это мы будем использовать при прошивке.

Подключаем стандартно:

Подключение микроконтроллера к "AVR JTAG ICE"
Номер разъёма программатораПорт микроконтроллера ATmega16, корпус PDIP
1 -
2 (GND) GND (общий, земля)
3 -
4 (MOSI) 27 (TDI)
5 (Reset) 9 (Reset)
6 (MISO) 26 (TDO)
7 -
8 (PB1) 25 (TMS)
9 -
10 (SCK) 24 (TCK)

[править] Тестовая программа

Писать будем на чистом C. Оригинал взят с AVR GCC :: УПРАВЛЕНИЕ ПОРТАМИ МИКРОКОНТРОЛЛЕРА и немного переделан.

Программа будет в бесконечном цикле выдавать 0/1 на порты PB и PD5. Паузы делать с помощью цикла нехорошо, надо бы с помощью специальных задержек, но у меня они почему-то действуют как-то неравномерно, и я сделал циклами.

#define F_CPU 8000000UL  // указываем частоту в герцах, для кварца 8 MHz
#include <avr/io.h>
//#include <util/delay.h>

int main(void) {        // начало основной программы
unsigned int i;
DDRB = 0xff;            // все выводы порта B сконфигурировать как выходы
DDRD = 0xff;            // все выводы порта D сконфигурировать как выходы

while(1) {              // бесконечный цикл
        PORTD |= _BV(PD1);      // установить "1" (высокий уровень) на выводе PD1, зажечь светодиод
        PORTB = 0xff;           // установить "1" на всех выводах порта PB

//      _delay_ms(250);    // ждем 0.25 сек.
        for (i = 0; i < 20000; i++);    // Делаем паузу

        PORTD &= ~_BV(PD1);     // установить "0" (низкий уровень) на выводе PD1, погасить светодиод
        PORTB = 0x00;           // установить "0" на всех выводах порта PB

//      _delay_ms(250);    // ждем 0.25 сек.
        for (i = 0; i < 20000; i++);    // Делаем паузу
};

}                       // закрывающая скобка основной программы

Сохраняем её как test_atmega16.c.

[править] Компиляция

Нам понадобятся: компилятор avr-gcc и библиотеки (avr-libc). Установим их:

sudo apt-get install avr-libc gcc-avr

Скомпилируем нашу программу:

avr-gcc -mmcu=atmega16 -o test_atmega16.o test_atmega16.c

Получим исполняемый файл test_atmega16.o, который можно прописать в микроконтроллер.

P.S. Если хочется посмотреть результат в виде ассемблерного кода, запускаем
avr-gcc -mmcu=atmega16 -S test_atmega16.c
Будет сгенерирован файл test_atmega16.s

[править] Тестовая программа на ассемблере

[править] Прошивка

Установим avarice для прошивки через JTAG:

sudo apt-get install avarice

В начале стираем содержимое микроконтроллера, потом записываем нашу программу:

avarice -j /dev/ttyUSB0 -B 125KHz --erase
avarice -j /dev/ttyUSB0 -B 125KHz --file test_atmega16.o --program

Сразу после окончания записи программа должна сама запуститься на микроконтроллере.

[править] Ссылки

[править] См. также

[править] Лицензия на текст

Текст доступен на условиях лицензии Creative Commons Attribution/Share-Alike Cc-by-sa.png версии 3.0 или более новой.