Как загрузить в плату ардуино код на си?
- Войдите на сайт для отправки комментариев
Сб, 16/09/2017 - 12:58
Подскажите. как в плату ардуино загрузить код на си? Желательно через Com порт, как через Arduino IDE Использую Atmel Studio 7
http://arduino.ru/forum/apparatnye-voprosy/vstroennyi-programmator#comment-271889
P.S. Открою страшный секрет - в Arduino IDE код тоже на Си...
пробовал я писать через 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);
}
}
Загружается, но плата не реагирует на код
DDRB |=(1<<PB5);
1<<DDB5
там C++
Он мне не нравится. Сильно объемный.
там C++
Он мне не нравится. Сильно объемный.
там 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
qwone, это тоже не будет работать. Не внимательно читаете ответы
qwone, это тоже не будет работать. Не внимательно читаете ответы
Ну у меня работает. Но да если нужна помощь в написании нерабочего скетча то я пас. Обычно нерабочий скетч случайно пишется.
P.S. Открою страшный секрет - в Arduino IDE код тоже на Си...
Да, но ТС хочет загрузить код на Си не в ИДЕ, а именно в плату.
Ага. Я учу си и пробую все в протеусе. Хотелось бы на реальных устройствах попробовать, а из реальных только UNO китай. Вот пишу я код на си, он загружается в плату, но не работает. Может ардуино не поддерживает файлы с, только сpp? Нашел статью на хабре https://habrahabr.ru/post/247663/, там нужно написать makefile, даже листинг его дан. А вот куда его сохранить, не написано. Как то, как новичку. с бубном плясать не хочется. Интерес пропадает, к сожалению.
Все, вроде понял как. Через Atmel Studio создаю файл Arduino Sketch, формат ino. Стераю все с этого файла. Там setup() и loop()
Пишу код на си и все загружается. Походу ардуино не поддерживает формат файлов си
Формат файла cpp тоже загружается и работает
VeD не существует "чистого Си". Это как учебник "Чисто Руского Язика". Компилятор он один. Но народ просто не пытается разбираться, просто генерирует бредни.
для меня.
#include <stdio.h>
int main()
{
}
это чистый си.
А все, остальное, вроде
sutup()
loop()
модификации высокого уровня
для меня.
модификации высокого уровня
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 это функции. Или для вас написание функций это писец как высокий уровень. В файле объявляют что есть такие функции, а ардуино файле вы их прописываете.
Да. Верно. Для меня функции. это высокий уровень, так как не нужно залезать в дебри, бери и используй. Все готово. Как в Java
Лукавите, _delay_ms из вашего примера ведь тоже функция, да уверен, что используете и кучу других из stdlib.
А все, остальное, вроде
sutup()
loop()
модификации высокого уровня
Вы бы хоть что-нибудь узнали про языки, прежде. чем высказывать свои высокоучёные суждения. Куры же со смеху передохнут. Почитайте какую-нибудь книжку - прекратите позориться и выставлять себя на посмешище.
ПС: Это для тех кто хочет еще быть ближе к железу и даташиту.
/**/ //---------------------------------------- //-----Компоновка----------------------------- //----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 байт. */Что за функция вызывается в строке 9? Где она определена?
В wiring.c в конце
Ну светодиодом то помигать -init() не нужен. У Т.С. исходный скетч в #2 вполне работоспособный, какого хрена у него PB5 не мигало -не ясно. Небось копипастил код для Uno а запускает на Леонардо, или ещё чего. Чайники народ непредсказуемый..
dimax без init не работает. Светодиод зажигается и все. скорее всего там надо несколько битов поставить на нужную частоту кварца.
qwone, в arduino IDE 100% работает. Что код топикстартера из #2, что ваш из #18 без строчки init();
В железе не мигает. А да компилируется и заливается это точно.
Зажигание гашение отрабатывает. А вот паузы не совсем.
У меня мигает. Посмотрите в тот инит, там настраивается таймер для дуиновских миллис/delay , PWM, и АЦП - ничего из этого не требуется для мигалки.
dimax, Мда. прошелся по всем платам и вернулся к исходной замигало. init не надо.Спасибо.
у меня Uno только, в протеусе то мигает
*((uint8_t*)0x24) |= (1 << bit);
*((uint8_t*)0x24) |= (1 << bit);
Разименование и приведение. Вы же кричали что вы в Си разбираетесь. Вот это оно и есть.
я не видел такое в си.
Там проще. По крайней мере в учебниках.
А что приводит вторая звездочка? Разыменование, это же выдергивание по указателю, значение по адресу?
прочитал я. Приведение 0x24 к 8 байтовами инту? только зачем звездочка?
В процессоре есть регистры . У регистра адрес. Вот надо привести число 0x24 к байтовому указателю на адрес 0x24 . А так как указатель это ардес, а работать надо по значению, то разыменовывают их(получить значении или записать). Обычно это и есть основа Си. Но новички тупо считают основой введение в языки программирования, в частности в Си.
Это DDRB как я понял из коментария. Я думал, что все написано на каком нибудь ассемблере
Я понял, что такое "чистый Си" - это огромная простыня неструктурированного кода, без процедур и функций, вся запихнутая в main().
Буду знать.
"чистый Си" - это огромная простыня
С виднеющимися там и тут следами дефлорации девственного сознания ТС всякими непонятными звёздочками от Квона :)
А вы что не знали что чистоту Си меряют ... зведочками . одна две три а лучше пять звездочек.https://www.youtube.com/watch?v=3HgaE1HfEro
Вы рили тащитесь с этой разыменовальной херни и заумной псевдографики со звездочками? Мне вас жаль.
Афтар, всё просто. Оставляете функции setup(), loop() и пишите там свой эфемерный "чистый си" [(c) поехавший на теме честного си Онкель]. Всё работает.
По поводу сборки, что-то там занимает 472 байта с заголовком Дуины, 184 байта с обычным int main void и бесконечным циклом. На четверть секунды быстрее запустится. Чё вы там сэкономить пытаетесь? Оно каждые пять секунд перезагружается, что важно время загрузки? Чушь. Оно в тини85-2313 записано, что важен каждый байт? Ещё одна чушь. Экономить, ставя тини будет только дегенерат, ибо тини85 стоит 6 юаней, мега8 - 4 юаня. При том что оперативы у меги больше, флеша больше, энергонезависимой больше, выводов больше.
С уважением.