как уменьшить скетч
- Войдите на сайт для отправки комментариев
Пнд, 11/04/2016 - 18:48
Здравствуйте,великие,прошу помощи сам не справлюсь
задача на примере светодиода,необходимо вкл.светодиод от двух кнопок(понимаю что есть разные темы,я наверное все прочитал и написал это см.ниже) при нажатии на первую светодиод светит 15 сек. при нажатии на вторую светит пока не откл. необходимо сделать меньше размер что бы вместить в attiny13.
конечно же я новичек,поэтому и обращаюсь за помощью + просидел 3 дня читая форумы прежде чем отчаятся
текст скетча:
byte flag=0;
unsigned long currentTime; //Переменная для pause
void setup()
{
//define(13, OUTPUT);
//define(2, INPUT);
//define(4, INPUT);
digitalWrite(2, HIGH);
digitalWrite(4, HIGH);
}
void loop()
{
if(digitalRead(2)==HIGH&&flag==0)
{
flag=1;
}
if(digitalRead(2)==LOW&&flag==1)
{
digitalWrite(13,HIGH);
currentTime = millis();
flag=0;
}
if (digitalRead(13) == HIGH && millis()-currentTime>=15000)
{
digitalWrite(13,LOW);
}
if(digitalRead(4)==HIGH&&flag==1)
{
flag=1;
}
if(digitalRead(4)==LOW&&flag==1)
{
digitalWrite(13,!digitalRead(13));
flag=0;
}
}
Во-первых, опубликуйте скетч по правилам форума.
Во вторых, а что, не влазит?
Сколько памяти занимает скетч?
Размер скетча в двоичном коде: 1 112 байт
извените
Ну, ладно, с размером разберёмся, а где у Вас pinMode?
Оно ж так не будет работать.
И кстати, где Вы нарыли у ATtiny13 13-ый пин? У неё их там всего пять. Можете объяснить, что тут вообще проихсодит?
так я где то начитался и по совету в одной из тем заменил на //define ))) ну и на столе вроде работает и память немного уменьшил
да я потом все переделывать буду,пины заменю я на uno пока делаю
да я потом все переделывать буду,пины заменю я на uno пока делаю
все просто прежде чем собрать устройство и за неимением 13 тюньки я пока напишу на uno,когда программа заработает и сможет залезть в 13 тогда и пины заменю,просто решил сразу на железе в протеусе не стал т.к. сначала была задумка еще и светодиод плавно гасить а он не гасит плавно,но с плавным гашением точно не влезет
Нет уж, давайте сразу заменим.
Я только собрался показать Вам как избавиться от digitalWrite/digitalWrite/pinMode, а Вы мне свой 13 пин пихаете. И что мне с ним делать?
давайте так.
Добавьте pinMode т.к. она всё равно необходима. Приведите пины в соответсвие (у Вас есть только 0-4 и никаких других!)
Тогда я Вам покажу как можно избавиться от digitalWrite/digitalWrite/pinMode и сильно уменьшить код.
Нет уж, давайте сразу заменим.
Я только собрался показать Вам как избавиться от digitalWrite/digitalWrite/pinMode, а Вы мне свой 13 пин пихаете. И что мне с ним делать?
давайте так.
Добавьте pinMode т.к. она всё равно необходима. Приведите пины в соответсвие (у Вас есть только 0-4 и никаких других!)
Тогда я Вам покажу как можно избавиться от digitalWrite/digitalWrite/pinMode и сильно уменьшить код.
5 мин. все сделаю
Код который ничего не делает будет занимать разный объем , в зависимости от камня, т.к. нужно место для инициализации кристала. Но и Ардуино в плане оптимизации кода не самая лучшая IDE.
Код который ничего не делает будет занимать разный объем , в зависимости от камня, т.к. нужно место для инициализации кристала. Но и Ардуино в плане оптимизации кода не самая лучшая IDE.
я не спорю,но учитывая что опыта 0 а ардуино кажется на первый взгляд такой несложной.
Код который ничего не делает будет занимать разный объем , в зависимости от камня, т.к. нужно место для инициализации кристала. Но и Ардуино в плане оптимизации кода не самая лучшая IDE.
я не спорю,но учитывая что опыта 0 а ардуино кажется на первый взгляд такой несложной.
ну и для чего же еще нужен мк,можно было бы наваять схему на логике и спаять целую плату чем запрграмировать мк на такую пустячную задачу с минимум элементов
CodevisionAVR есть генератор начального кода, для правильной инициализации кристала, но вот библиотек не очень много.
А разве ардуино компилирует для 13 тиньки?
CodevisionAVR есть генератор начального кода, для правильной инициализации кристала, но вот библиотек не очень много.
А разве ардуино компилирует для 13 тиньки?
Изначально нет, но его можно заставить :).
да,надо установить доп.для платы тиньки и можно шить,я пробывал, только на протеусе эмулировал что то работает что то нет я так думаю это уже из за возможностей самого протеуса,что бы реально попробывать нужна тинька а у меня ее пока нет,просто можно было не заморачиваться и записать куда вместится но даже я считаю что это уже слишком для такой маленькой задачки тем более мне габариты важны чем меньше тем лучше
Держите.
Я не знаю, правильно у Вас было или нет, но я написал просто почти полностью эквивалентный код. То, что написано здесь, занимает 522 байта. На UNO работать не будет, там по другому маппируются порты.
После моей строки идут строки, которые она заменяет до первой пустой строки. Также несколько строк в начале я просто вставил.
в этом коде точно не нужен, можно обойтись бональным делай
Евгений спасибо за помощ,теперь полезу разбираться дальше,может и получится с плавным затуханием сделать )
Спасибо всем кто откликнулся и как то отреагировал на сообщение!!!
Вот тебе абстрактное затухание
ЕвгенийП, забавный код .. что-то напомнило. :)
А не хотите написать файлик распиновки для arhat.h под тиньку или какие ещё популярные процы, чего там нету? :)
ЕвгенийП, забавный код .. что-то напомнило. :)
А не хотите написать файлик распиновки для arhat.h под тиньку или какие ещё популярные процы, чего там нету? :)
Не хочу :))))
Евгений а этот код(который вы написали) AVRstudio скомпилирует для тиньки или его менять нужно?
Ну, там нет никаких loop'ов и setup'ов
Как уже сказал ЕвгенийП, там нет setup(), loop(), millis(). Это чисто ардуиновское.
Вместо setup() и loop() сделай так:
или так:
И millis() надо чем-то заменить.
вот чего я не могу понять в C(чистом) так это : вот например там все выводы портаВ назначаются на вход или на вывод а у меня допустим как написанно выше один выход и два входа,и в примерах самоучителей которые я смотрел на примере 2313 дам портыB и D,так там они по разному и назначаются,пока не понимаю как назначить выводы по разному как написано в этом скетче.
возможно и глупы все мои непонятки ,но учитывайте что я окунулся в С всего как 2 дня,когда понял что ардуино не совсем то что мне нужно.
вот например там все выводы портаВ назначаются на вход или на вывод а у меня допустим как написанно выше один выход и два входа,и в примерах самоучителей которые я смотрел на примере 2313 дам портыB и D,так там они по разному и назначаются,пока не понимаю как назначить выводы по разному как написано в этом скетче.
Я может чего-то не понял, но как бы, там всё элементарно. Нужно на вывод, пишете 1, нужно на ввод - 0. Ну, например:
Может где опечатался (проверить сейчас не могу), но идея такая.
Евгений спасибо за пример,я немного тормозить начинаю,слишком много информации за два дня,понимаю что запутался в конец надо опять с начала,я сейчас даже не могу вопрос сформулировать правильно. сейчас пауза (поработать надо) и с самого начала.Вопрос, когда я напишу,могу я расчитывать на вашу помощь в рамках этой темы?
Вопрос, когда я напишу,могу я расчитывать на вашу помощь в рамках этой темы?
Если будете делать как сейчас, то нет. Вы не с того конца начинаете.
На тиньке Вы немедленно останетесь без сериала, и вообще без каких бы ни было средств отладки и дистанционно я ничем Вам не помогу.
Вам надо сейчас на UNO когда всё под рукой, всю программу написать и отладить, добившись, чтобы она работала точно так как надо.
И только потом заморачиваться вопросами "влезания в тиньку" и т.п.
Если Вы сразу перейдёте на тиньку, помочь себе сможете только сами, т.к. дистанционно это крайне трудно.
Насколько помниться. Я хотел как-то уменьшить объем кода на восьмерочке. Уменьшил но не намного. Про конкретное установление портов как вход или выход написано здесь же в документации. Делается это строкой DDRB = DDRB | b00111110; к примеру где в строке буква "B" это регистр порта к которому подключены пины. 1-5 или 1-7 в зависимости от кристалла (например в atmega168v где она работает только на 8 мГц пины предназначавшиесь для кварца свободны для использования) Далее после буквы "b" цифры. 0 - вход 1 - выход.
ЕвгенийП, Просвятите немного насчет понимания настройки портов. Я видел пример B11110000 а у вас здесь 0х03. Это как понимается?
B11110000 - двоичная система счисления
0х03 - шестнадцатеричная система счисления
P.S. Одно и то же число может быть представлено в разных системах счисления. Например, число 200 в привычной нам десятиричной (DEC) системе, можно записать 0b11001000 в двоичной (BIN) или 0xC8 в шестнадцатиричной (HEX). В двоичной более наглядно видно биты. Но шестнадцатиричная позволяет более краткую запись, чтобы не писать кучу нулей и единиц. Особенно в 32-битных микроконтроллерах. Например запись 0b11001000111010111110011001010101 можно сократить до 0xC8EBE655.
Делается это строкой DDRB = DDRB | b00111110; ... Далее после буквы "b" цифры. 0 - вход 1 - выход.
Это не так. При таком подходе единицы пропишутся куда Вы хотите, а нули - нет. В тех местах, где Вы написали нули, просто останется то, что было до Вас. Если Вы хотите гарантированно прописать нули, то это надо сделать явно. Например, то, что Вы хотели с гарантированно записанными нулями и единицами делается так:
Ну или так:
Я видел пример B11110000 а у вас здесь 0х03. Это как понимается?
Запись B10101010 - не является корректной записью константы на языке С/С++.
Чтобы Вы имели возможность так писать, разработчики среды arduino создали специальный файл binary.h в котором все возможные комбинации битов прописаны через define, например,
Вы можете полюбоваться на это файл, он у Вас лежит по адресу
<место установки среды ардуино>\hardware\arduino\avr\cores\arduino\binary.h
Записи 0x03 и 0B00000011 идентичны, но первая будет работать везде, а вторая только там, где есть этот binary.h с кучей define
Ну или так:
Ох, Женя, оно, конечно, можно, но как говорил А. Галич "ох, не надо бы вслух, ох не надо бы". Новички ж они такие - они везде это пихать будут. А потом вопросы: "а чё у меня в сериале грязь (или, ещё лучше, СН340 сдохла), кто-нибудь сталкивался?" :))))))
Парни, прямое присваивание порту целиком допустимо ТОЛЬКО если Вы действительно хотите назначить ВСЕ биты. А последнее (назначение сразу всех битов порта) допустимо только если Вы понимаете, что делаете. Например, если Вы зафигачите что-нибудь в порты D0/D1 в неподходящий момент, Вы помешаете работать UART'у, а если совсем не повезёт, то запросто отправите CH340 в страну вечно стабильного напряжения.
Мда, предупредить об опасности я как-то не подумал... Наверно действительно зря написал.
P.S. Кстати, у одного товарища загадочным образом вышла из строя CH340. Правда не написал, успел ли он загрузить какой-то скетч.
Поэтому то в туториале так и написали что безопаснее всего использовать
Теперь я понял что он просто обновлятет только то где есть единица.
А можно ссылочку на ваши истоки светлых знаний (книжка там к примеру) Спасибо
У меня была как раз хрень с rx/tx. Так-то я их не трогаю - только "по назначению", а тут скетч был для голой 328 и там я их спокойно пользовал, т.к. UART не был нужен. А тут зашился с отладкой и совершенно забыв, что пользую эти порты, залил скетч в нанку и попробовал в сериал печать вывести. Скетч залился и даже заработал, только больше в эту нанку ничего не заливается :( Пока не выбросил, жду, скоро должен прийти параллельный программатор (я заказал оригинальный STK500 c AtmelStore) попробую её реанимировать.
А можно ссылочку на ваши истоки светлых знаний
Мммм, я профессиональный программист и стаж работы у меня с 1980 года. Так что истоки знаний сильно разбросаны во времени и пространстве, ну и опять же "опыт - сын ошибок трудных". В последнее время, правда больше руковожу и меньше программирую сам, но всё равно программирую достаточно много, чтобы навыки не терять.
Вопрос есть, показалось, что по теме (не хочется заводить тему из-за одного вопроса).
Написал скетч для UNO, занял объём памяти 14%. Потом нашёл ошибку (= вместо ==). Поменял = на ==, объём памяти вырос на 11%, стал 25%. Из-за одного оператора! Это нормально?
Нормально.
Вопрос есть, показалось, что по теме
Нормально.
Как-то это можно оптимизировать или смириться?
Не касаясь вопроса, просто интересно: ты сумасшедший? Ты видел дату предыдущего поста в теме?
А в чём проблема? Вот нормальный человек увидел и ответил. А твой пост к чему?
Вы таки что-то имеете против прав некрофилов и прочих сексуальных меньшинств?
Правильно было бы создать новую тему?
Просто на некоторых форумах не приветствуется создание новых тем по каждому маленькому вопросу, типа объём базы растёт. Если тут принято по-другому, скажите пожалуйста. Я тут новичок, всего не знаю.
Как-то это можно оптимизировать или смириться?
Вот с этого места и я присоединяюсь к вопросу графа
ты сумасшедший?
Вы сами-то осознаёте, что спрашиваете? "Мужики, я тут в ХЗ каком месте ХЗ какого скетча поменял ... как это можно оптимизировать?".
Ответ может быть только один - ХЗ!
Хотите что-то оптимизировать, приводите скетч и ставьте нормальную задачу, типа "сейчас занимает ХХХ, нужно сократить до YYY", а то у Вас конь в вакууме.
Да я не против! Чисто как энтомолог-любитель! ;))))
----------------------
И да, я тоже решил быть хорошим! Пятничная постирушка кармы и все эти вещи!
Внимание ответ: Да, совершенно нормально! в коде с ошибкой оптимизатор просто выкинул половину бреда, после исправления - оставил.
Но в целом некропостинг - это нарушение сетевой этики. Ответ на пост 2016 года - прямое оскорбление участников форума. Ну так вот принято в сети, даже если тебе кажется иначе.
Нормально.
Как-то это можно оптимизировать или смириться?
Вообще-то это уже результат оптимизации. Так что проще всего - смириться. Но, если Вас это не устраивает, - отключить оптимизацию в компиляторе.
Это в смысле типа вот этого?