Программатор FTDI с Ali-express, также описан в другом посте
Основано на видео-туториале: https://youtu.be/iKqLbbyPydI с адаптацией под мой программатор FTDI
Подготовка
Установить VCP драйвера: https://ftdichip.com/drivers/vcp-drivers/
Выполнить команды:
brew tap osx-cross/avr
brew install avr-gcc
brew install avrdude
Создать файл ~/.avrduderc и прописать туда:
programmer
id = "ftdi";
desc = "SparkFun FTDI Basic Breakout";
type = "ftdi_syncbb";
connection_type = usb;
miso = 1; # RXD
sck = 3; # CTS
mosi = 0; # TXD
reset = 4; # DTR
;
/usr/local/Cellar/avrdude/6.3_2/etc/avrdude.conf - там, в частности есть описание программаторов с id=ft232r и id=arduino-ft232r --- но ни один из них мне не подходит, потому что они предполагают использование ноги DSR или RTS которые на моем программаторе не выведены. Поэтому и приходится писать свой конфиг в файл ~/.avrduderc – мне это было проще, чем припаять провод к ноге RTS, например, и использовать стандартное описание c id=ft232r.
Подсоединить выходы RXD, CTS, TXD, DTR к ногам atmega328p соответственно: miso, sck, mosi, reset и ещё два провода: GND, VCC соответственно в GND и VCC микроконтроллера.
Код и makefile
Объяснение написанного ниже Часть, приведенная далее, отлично описана в указанном выше видео – очень рекомендую.
Пример простого файла blink.c, мигающего светодиодом, подсоединенным к 14-ой ноге:
#define F_CPU 16000000UL
#define LED_PIN 0
#include <avr/io.h>
#include <util/delay.h>
void main(void)
{
DDRB |= (1 << LED_PIN); // set pin as output
while (1)
{
PORTB ^= (1 << LED_PIN); // toggles pin
_delay_ms(50); // busy wait, 50ms
}
}
Объяснение назначения и пользы от написания makefile хорошо сделано в указанном туториале https://youtu.be/iKqLbbyPydI – очень рекомендую. Расположив makefile в той же директории, что и blink.c и выполнив команду make из консоли, можно скомпилировать blink.c в пригодный для заливки на микроконтроллер формат .hex и сразу залить его на atmega328p – всего одной командой. Содержимое makefile:
FILENAME = blink
PORT = ft0
DEVICE = atmega328p
PROGRAMMER = ftdi
BAUD = 2400
COMPILE = avr-gcc -Wall -Os -mmcu=${DEVICE}
default: compile upload clean
compile:
${COMPILE} -c ${FILENAME}.c -o ${FILENAME}.o
${COMPILE} -o ${FILENAME}.elf ${FILENAME}.o
avr-objcopy -j .text -j .data -O ihex ${FILENAME}.elf ${FILENAME}.hex
avr-size --format=avr --mcu=${DEVICE} ${FILENAME}.elf
upload:
avrdude -v -p ${DEVICE} -c ${PROGRAMMER} -P ${PORT} -b ${BAUD} -U flash:w:${FILENAME}.hex:i
clean:
rm ${FILENAME}.o
rm ${FILENAME}.elf
rm ${FILENAME}.hex
Файл с этим содержимым надо назвать "makefile" (без расширения) и положить туда же, где лежит и файл blink.c; из консоли сделать cd в эту папку и выполнить там команду make.
Замечания
Значение порта PORT = ft0 у меня не зависит от того, к какому USB подключен программатор: пробовал втыкать в разные, прошивает микроконтроллер одинаково успешно. А когда, как рекомендовано в видео, указывал настоящий порт, то получал ошибку:
avrdude: invalid portname '/dev/cu.usbserial-A50285BI': use 'ft[0-9]+'
Значение BAUD важно, я использую BAUD=2400, потому что при BAUD=115200, как рекомендовано в видео получал следующую ошибку при выполнении make:
avrdude: Device is not responding to program enable. Check connection.
avrdude: initialization failed, rc=-1
Double check connections and try again, or use -F to override
this check.
avrdude: verifying ...
avrdude: verification error, first mismatch at byte 0x0000
0xff != 0x0c
avrdude: verification error; content mismatch
Дисклеймер: фото привожу на всякий случай, потому что времени делать нормальную диаграмму нету.
Комментариев нет:
Отправить комментарий