понедельник, 22 августа 2016 г.

Учусь шить железо от Atmel.

После нескольких тренировок с ардуино я решил приобщиться к программированию микроконтроллеров Atmel. Прикупил два программатора USBASP (на али экспресс конечно же).
Почему два? Стоит дёшево. К тому же, я видел видео, где обсуждалась проблема старых прошивок и решил подстраховаться.



Я наивно полагал, что смогу прошивать из AVR Studio. Узнал, что не получится на прямую это делать. Думаю, ладно, хотя бы код скомпилировать, прошить как-нибудь смогу другим способом. Скачал 7-ую версию, установил, но она отказалась работать. Вернее, работает, но при попытке создать проект пишет "An error occurred in the AVRGCC Project Wizard. The wizard execution will be cancelled. Could not get the device information for the specified device 'ATmega328P'.". Разбираться с этим пока нет времени.

Пробовал 4-ую версию и тоже ничего путного не вышло.

Я решил прошить микруху в любом случае. Порывшись в интернете я узнал, что среда разработки Arduino использует некую утилиту avrdude, которая умеет работать с USBASP. В той же папке лежит компилятор и другие утилиты.
Собрал простую схему используя документацию по микроконтроллеру. Питание и земля от программатора, затем MISO, MOSI, SCK цепляем по схеме. Ещё RST есть в моём экземпляре. Кварцевый резонатор я ещё подрубил. Правда я не знаю работал кварц или нет, ведь ещё есть фьюзы (конфигурация микроконтроллера) и возможно микруха работала на собственном генераторе.

Сначала проверка связи с МК. Помог этот сайт. Половину можно пропустить и найти строку "Using AVRDUDE via Command Line".
Если коротко, то проверить связь можно выполнив команду: avrdude -c usbasp -p atmega328p

Простая прога, которая мигает светодиодом. Взята из интернета.

#ifndef F_CPU
#define F_CPU 16000000UL // MHz clock speed
#endif

#include <avr/io.h>
#include <util/delay.h>

int main(void)
{
  DDRB = 0xFF; //Nakes PORTB as Output
  while(1) //infinite loop
  {
    PORTB = 0xFF; //Turns ON All LEDs
    _delay_ms(1000); //1 second delay
    PORTB= 0x00; //Turns OFF All LEDs
    _delay_ms(1000); //1 second delay
  }
  
  return 0;
}

Работаем с портом B. Подаём на выходы порта напряжение и отключаем раз в секунду.

Компиляцию встречал разными способами. Для 328-ой делал так:
1) avg-gcc -Os -mmcu=atmega328p -L="путь до библиотек\lib\gcc\avr\avr5" -O blink blink.c
2) avr-objcopy -O ihex blink blink.hex
3) avrdude -c usbasp -p atmega328p -U flash:w:blink.hex

С tiny версией микроконтроллера возникла проблема при прошивке. Подключил всё верно, проверил 100 раз, а связи нет.
Оказалось, что необходимо снизить скорость программатора (SCK). Для этого на нём есть перемычка (может быть кнопка), но на моём её нет, только отверстия. Замкнул отверстия, всё заработало.

UPD.

Комментариев нет:

Отправить комментарий

Определение параметров CHS (Cylinder, Head, Sector) карт CF с помощью утилиты IDEINFO

 Столкнулся с проблемкой подключения карт CF к материнской плате LTC-SL REV-B и WD386SX-LPX. В БИОС этих плат нет автоопределения накопителе...