Встроенный программатор?

Famouspilot
Famouspilot аватар
Offline
Зарегистрирован: 19.01.2016

Доброго вроемени суток. Не знаю, в какую рубрику поместить свой вопрос, но, по всей видимости, в эту.

Так вот, хочу поиграться с Ассемблером и "чистым" Си кодом, для этих целей скачал Atmel Studio 7, и в перспективе скачаю winAVR. Но из микроконтроллеров на дайнный момент у меня только платки ардуино, и даже нет программатора. Но, насколько я знаю, в ардуино (скажем, Mega, хотя и в других вроде тоже) присутствует ATMega 8, которая "пропускает через себя" данные с USART1 и вроде как даже занимается программированием основного контроллера.

Так вот: могу ли я, находясь в одной из вышеперечисленных программ, прошить контроллер Ардуины без особых заморочек по поводу программатора, или нужно скачивать отдельные программы, создавать бинарные файлы и прошивать через них? Либо пользоваться теми же программаторами? Заранее спасибо.

P.s. в окне "программирование" в студии не отображается ни один из способов программирования, только "симуляция", в то время как в окне "Arduino IDE" этих программаторов/способов программирования - целая куча.

Okmor
Okmor аватар
Offline
Зарегистрирован: 16.10.2015

Famouspilot пишет:

Так вот, хочу поиграться с Ассемблером и "чистым" Си кодом...

А что вам мешает делать это из Arduino IDE.

Если вы не будете использовать стандартных библиотек, то в компилятор попадет ваш чистый код на С. Компилятор стандартный AVR GCC.  И Асемблер там тоже есть. В Arduino IDE нет своего языка програмирования. - Это всего-навсего надстройка над обычным компилятором упрощает инициализацию проэкта и упрощает работу с портами и регистрами. Тут можно и напрямую работать  железом. Например так можно написать для инициации аналоговых портов:

  ADCSRA = (1 << ADEN) | (1 << ADSC) | (1 << ADATE) | (0 << ADIF) | (1 << ADIE) | (0 << ADPS2) | (1 << ADPS1) | (0 << ADPS0);
  ADMUX =  (0 << REFS1) | (1 << REFS0) | (1 << ADLAR)  | (0 << MUX3) | (0 << MUX2)  | (0 << MUX1)  | (0 << MUX0) ;

Или сделать обработку прерывания

void setup()   {
//Енкодер включити переривання
  PCICR = 1 << PCIE1; //разрешить пренрывание
  PCMSK1 = B00111000 ; //(1<<PCINT12)|(1<<PCINT11); //выбрать входы
}

ISR (PCINT1_vect) {
  //static boolean n=0;  if (n=!n){return;} // снять ремарку для энкодеров с двойным щелчком
  TimeClickB = millis();
  static byte old_n = PINC & B00011000; // маска B00011000 что б читать только нужные 2 бита
  byte new_n = PINC & B00011000;
  if (old_n == 8 && new_n == 24 || old_n == 16 && new_n == 0) {
    if ((PINC&(1<<5))==0){NumberMenu = constrain(NumberMenu-1,0,4) ;} else {--EncoderGo /*-= 1*/;}
  }
  if (old_n == 16 && new_n == 24 || old_n == 8 && new_n == 0) {
    if ((PINC&(1<<5))==0){NumberMenu = constrain(NumberMenu+1,0,4) ;} else {++EncoderGo /*+= 1*/;}
  }
  old_n = new_n;
}

Тут 100% сомместимость.

Также открою вам секрет. Если из временной папки выдрать HEX фал, то его можно смело прошивать в голую ардуинку.

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

или так:

 asm("cli"); // Проба ассемблерной вставки

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

В студии есть возможность вызова внешней тулзы для прошивки. Прикручиваете avrdude и можно пользоваться любым программатором, который поддерживает дудка.

Есть два варианта:
 
1) Через "External Tools" в меню студии (картинко). После компиляции проекта нужно выбрать пункт в меню Tools и контроллер прошьется, или кнопку на панель инструментов добавить. 
UPD: В консольной команде для avrdude вместо жёсткого указания МК можно написать -p$(avrdevce) и студия сама подставит нужный МК из настроек проекта.
 
2) Через "Post build event" в настройках проекта (картинко). Прошивает автоматически после компиляции.