Как загрузить в плату ардуино код на си?

VeD
Offline
Зарегистрирован: 21.02.2016

Подскажите. как в плату ардуино загрузить код на си? Желательно через Com порт, как через Arduino IDE Использую Atmel Studio 7

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

http://arduino.ru/forum/apparatnye-voprosy/vstroennyi-programmator#comment-271889

P.S. Открою страшный секрет - в Arduino IDE код тоже на Си...

VeD
Offline
Зарегистрирован: 21.02.2016

пробовал я писать через Arduino IDE простую программу

#include <avr/io.h>

#include <util/delay.h>

#include <avr/portpins.h>

#define F_CPU 16000000L

int main ()

{

DDRB |=(1<<PB5);

PORTB &=~(1<<PB6);

while(1)

{

PORTB |=(1<<PB5);

_delay_ms(1000);

PORTB &=~(1<<PB5);

_delay_ms(1000);

}

}

Загружается, но плата не реагирует на код

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

VeD пишет:

DDRB |=(1<<PB5);

1<<DDB5

VeD
Offline
Зарегистрирован: 21.02.2016

там C++

Он мне не нравится. Сильно объемный.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

VeD пишет:

там C++

Он мне не нравится. Сильно объемный.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

VeD пишет:

там C++

Он мне не нравится. Сильно объемный.

Ну я удивляюсь, почему вы пишете на русском, пишите в бинарном там проще 0000 0001.

И надо так 

/**/
//----------------------------------------
#include <avr/io.h>
#include <util/delay.h>
#include <avr/portpins.h>
#define F_CPU 16000000L
//-----Компоновка-----------------------------
//----main() -------------------------------
int main() {
  init();// <--- вы это потеряли
  //setup()
  DDRB |= (1 << 5);
  PORTB &= ~(1 << 5);
  while (1) {
    //loop()
    PORTB |= (1 << 5);
    _delay_ms(1000);
    PORTB &= ~(1 << 5);
    _delay_ms(1000);
  }
  return 0;//<-- а это для просто так
}
/*Скетч использует 476 байт (1%) памяти устройства. Всего доступно 32256 байт.
  Глобальные переменные используют 9 байт (0%) динамической памяти, оставляя 2039 байт для локальных переменных. Максимум: 2048 байт.
*/

ПС: здесь на форуме тест для новичков может он выкладывать код здесь или тупой как бревно. http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukommentarii

strarbit
Offline
Зарегистрирован: 12.06.2016

qwone, это тоже не будет работать. Не внимательно читаете ответы

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

strarbit пишет:

qwone, это тоже не будет работать. Не внимательно читаете ответы

Ну у меня работает. Но да если нужна помощь в написании нерабочего скетча то я пас. Обычно нерабочий скетч случайно пишется.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Jeka_M пишет:

P.S. Открою страшный секрет - в Arduino IDE код тоже на Си...

Да, но ТС хочет загрузить код на Си не в ИДЕ, а именно в плату.

VeD
Offline
Зарегистрирован: 21.02.2016

Ага. Я учу си и пробую все в протеусе. Хотелось бы на реальных устройствах попробовать, а из реальных только UNO китай. Вот пишу я код на си, он загружается в плату, но не работает. Может ардуино не поддерживает файлы с, только сpp? Нашел статью на хабре https://habrahabr.ru/post/247663/, там нужно написать makefile, даже листинг его дан. А вот куда его сохранить, не написано. Как то, как новичку. с бубном плясать не хочется. Интерес пропадает, к сожалению.

VeD
Offline
Зарегистрирован: 21.02.2016

Все, вроде понял как. Через Atmel Studio создаю файл Arduino Sketch, формат ino. Стераю все с этого файла. Там setup() и loop() 

Пишу код на си и все загружается. Походу ардуино не поддерживает формат файлов си

Формат файла cpp тоже загружается и работает

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

VeD не существует "чистого  Си". Это как учебник "Чисто Руского Язика". Компилятор он один. Но народ просто не пытается разбираться, просто генерирует бредни.

VeD
Offline
Зарегистрирован: 21.02.2016

для меня. 

#include <stdio.h>

int main()

{

}

это чистый си. 

А все, остальное, вроде

sutup()

loop()

модификации высокого уровня

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

VeD пишет:

для меня. 

модификации высокого уровня

C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino\main.cpp

/*
  main.cpp - Main loop for Arduino sketches
  Copyright (c) 2005-2013 Arduino Team.  All right reserved.

  This library is free software; you can redistribute it and/or
  modify it under the terms of the GNU Lesser General Public
  License as published by the Free Software Foundation; either
  version 2.1 of the License, or (at your option) any later version.

  This library is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  Lesser General Public License for more details.

  You should have received a copy of the GNU Lesser General Public
  License along with this library; if not, write to the Free Software
  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
*/

#include <Arduino.h>

// Declared weak in Arduino.h to allow user redefinitions.
int atexit(void (* /*func*/ )()) { return 0; }

// Weak empty variant initialization function.
// May be redefined by variant files.
void initVariant() __attribute__((weak));
void initVariant() { }

void setupUSB() __attribute__((weak));
void setupUSB() { }

int main(void)
{
	init();

	initVariant();

#if defined(USBCON)
	USBDevice.attach();
#endif
	
	setup();
    
	for (;;) {
		loop();
		if (serialEventRun) serialEventRun();
	}
        
	return 0;
}

И где вы видите высокий уровень.  Просто setuo и loop это функции. Или для вас написание функций это писец как высокий уровень. В файле объявляют что есть такие функции, а ардуино файле вы их прописываете.

VeD
Offline
Зарегистрирован: 21.02.2016

Да. Верно. Для меня функции. это высокий уровень, так как не нужно залезать в дебри, бери и используй. Все готово. Как в Java

negavoid
Offline
Зарегистрирован: 09.07.2016

Лукавите, _delay_ms из вашего примера ведь тоже функция, да уверен, что используете и кучу других из stdlib.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

VeD пишет:

А все, остальное, вроде

sutup()

loop()

модификации высокого уровня

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

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

ПС: Это для тех кто хочет еще быть ближе к железу и даташиту.

/**/
//----------------------------------------
//-----Компоновка-----------------------------
//----main() -------------------------------
const byte bit = 5;
int main() {
  //setup()
  *((uint8_t*)0x24) |= (1 << bit); //DDRB
  *((uint8_t*)0x25) |= (1 << bit); //PORTB
  while (1) {
    //loop()
    *((uint8_t*)0x25) &= ~(1 << bit); //PORTB
    _delay_ms(1000);
    *((uint8_t*)0x25) |= (1 << bit); //PORTB
    _delay_ms(1000);
  }
  return 0;
}
/*Скетч использует 178 байт (0%) памяти устройства. Всего доступно 30720 байт.
  Глобальные переменные используют 0 байт (0%) динамической памяти, оставляя 2048 байт для локальных переменных. Максимум: 2048 байт.
*/

Ну или так

/**/
#define cbi(byt, bit) (*((uint8_t*)(byt)) &= ~(1<<bit))
#define sbi(byt, bit) (*((uint8_t*)(byt)) |= (1<<bit))
//----------------------------------------
//-----Компоновка-----------------------------
//----main() -------------------------------
const byte bit = 5;
int main() {
  //setup()
  sbi(0x24, bit);
  cbi(0x25, bit);
  while (1) {
    //loop()
    sbi(0x25, bit);
    _delay_ms(1000);
    cbi(0x25, bit);
    _delay_ms(1000);
  }
  return 0;
}
/*Скетч использует 178 байт (0%) памяти устройства. Всего доступно 30720 байт.
  Глобальные переменные используют 0 байт (0%) динамической памяти, оставляя 2048 байт для локальных переменных. Максимум: 2048 байт.
*/

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Что за функция вызывается в строке 9? Где она определена?

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

В wiring.c в конце

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Ну светодиодом то помигать -init() не нужен. У Т.С. исходный скетч в #2 вполне работоспособный,  какого хрена у него PB5 не мигало -не ясно. Небось копипастил код для Uno а запускает на Леонардо, или ещё чего. Чайники народ непредсказуемый..

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

dimax без init не работает. Светодиод зажигается и все. скорее всего там надо несколько битов поставить на нужную частоту кварца.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

qwone, в arduino IDE 100%  работает. Что код топикстартера из #2, что ваш из #18 без строчки init();

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

В железе не мигает. А да компилируется и заливается это точно.

Зажигание гашение отрабатывает. А вот паузы не совсем.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

У меня мигает.  Посмотрите в тот инит, там  настраивается таймер для дуиновских миллис/delay , PWM, и АЦП - ничего из этого не требуется для мигалки.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

dimax, Мда. прошелся по всем платам и вернулся к исходной замигало. init не надо.Спасибо.

VeD
Offline
Зарегистрирован: 21.02.2016

у меня Uno только, в протеусе то мигает

VeD
Offline
Зарегистрирован: 21.02.2016

*((uint8_t*)0x24) |= (1 << bit);

Что это за звездочки? указатели или умножить?
qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

VeD пишет:

*((uint8_t*)0x24) |= (1 << bit);

Что это за звездочки? указатели или умножить?

Разименование и приведение. Вы же кричали что вы в Си разбираетесь. Вот это оно и есть.

VeD
Offline
Зарегистрирован: 21.02.2016

я не видел такое в си.

Там проще. По крайней мере в учебниках. 

А что приводит вторая звездочка? Разыменование, это же выдергивание по указателю, значение по адресу?

VeD
Offline
Зарегистрирован: 21.02.2016

прочитал я. Приведение 0x24 к 8 байтовами инту? только зачем звездочка?

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

В процессоре есть регистры . У регистра адрес. Вот надо привести число 0x24 к байтовому указателю на адрес 0x24 . А так как указатель это ардес, а работать надо по значению, то разыменовывают их(получить значении или записать). Обычно это и есть основа Си. Но новички тупо считают основой введение в языки программирования, в частности в Си.

VeD
Offline
Зарегистрирован: 21.02.2016

Это DDRB как я понял из коментария. Я думал, что все написано на каком нибудь ассемблере

 

b707
Offline
Зарегистрирован: 26.05.2017

Я понял, что такое "чистый Си" - это огромная простыня неструктурированного кода, без процедур и функций, вся запихнутая в main().

Буду знать.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

b707 пишет:

"чистый Си" - это огромная простыня

С виднеющимися там и тут следами дефлорации девственного сознания ТС всякими непонятными звёздочками от Квона :)

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

ЕвгенийП пишет:
С виднеющимися там и тут следами дефлорации девственного сознания ТС всякими непонятными звёздочками от Квона :)

А вы что не знали что чистоту Си меряют ... зведочками . одна две три а лучше пять звездочек.https://www.youtube.com/watch?v=3HgaE1HfEro

Voodoo Doll
Voodoo Doll аватар
Offline
Зарегистрирован: 18.09.2016

Вы рили тащитесь с этой разыменовальной херни и заумной псевдографики со звездочками? Мне вас жаль.

Афтар, всё просто. Оставляете функции setup(), loop() и пишите там свой эфемерный "чистый си" [(c) поехавший на теме честного си Онкель]. Всё работает.

По поводу сборки, что-то там занимает 472 байта с заголовком Дуины, 184 байта с обычным int main void и бесконечным циклом. На четверть секунды быстрее запустится. Чё вы там сэкономить пытаетесь? Оно каждые пять секунд перезагружается, что важно время загрузки? Чушь. Оно в тини85-2313 записано, что важен каждый байт? Ещё одна чушь. Экономить, ставя тини будет только дегенерат, ибо тини85 стоит 6 юаней, мега8 - 4 юаня. При том что оперативы у меги больше, флеша больше, энергонезависимой больше, выводов больше.

С уважением.