как уменьшить скетч

inobot
Offline
Зарегистрирован: 11.04.2016

Здравствуйте,великие,прошу помощи сам не справлюсь

задача на примере светодиода,необходимо вкл.светодиод от двух кнопок(понимаю что есть разные темы,я наверное все прочитал и написал это см.ниже) при нажатии на первую светодиод светит 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;
     }
 }
 
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Во-первых, опубликуйте скетч по правилам форума.

Во вторых, а что, не влазит?

Сколько памяти занимает скетч?

inobot
Offline
Зарегистрирован: 11.04.2016

 

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 байт

извените

 

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

Ну, ладно, с размером разберёмся, а где у Вас pinMode?

Оно ж так не будет работать.

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

И кстати, где Вы нарыли у ATtiny13 13-ый пин? У неё их там всего пять. Можете объяснить, что тут вообще проихсодит?

inobot
Offline
Зарегистрирован: 11.04.2016

так я где то начитался и по совету в одной из тем заменил на //define ))) ну и на столе вроде работает и память немного уменьшил

inobot
Offline
Зарегистрирован: 11.04.2016

да я потом все переделывать буду,пины заменю я на uno пока делаю 

 

inobot
Offline
Зарегистрирован: 11.04.2016

inobot пишет:

да я потом все переделывать буду,пины заменю я на uno пока делаю 

 

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

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

Нет уж, давайте сразу заменим.

Я только собрался показать Вам как избавиться от digitalWrite/digitalWrite/pinMode, а Вы мне свой 13 пин пихаете. И что мне с ним делать?

давайте так.

Добавьте pinMode т.к. она всё равно необходима. Приведите пины в соответсвие (у Вас есть только 0-4 и никаких других!)

Тогда я Вам покажу как можно избавиться от digitalWrite/digitalWrite/pinMode и сильно уменьшить код.

inobot
Offline
Зарегистрирован: 11.04.2016

ЕвгенийП пишет:

Нет уж, давайте сразу заменим.

Я только собрался показать Вам как избавиться от digitalWrite/digitalWrite/pinMode, а Вы мне свой 13 пин пихаете. И что мне с ним делать?

давайте так.

Добавьте pinMode т.к. она всё равно необходима. Приведите пины в соответсвие (у Вас есть только 0-4 и никаких других!)

Тогда я Вам покажу как можно избавиться от digitalWrite/digitalWrite/pinMode и сильно уменьшить код.

5 мин. все сделаю

inobot
Offline
Зарегистрирован: 11.04.2016
byte flag=0;
unsigned long currentTime; //Переменная для pause
 void setup()  
 { 
    pinMode(0, OUTPUT); 
    pinMode(1, INPUT);
    pinMode(2, INPUT);
    digitalWrite(1, HIGH);
    digitalWrite(2, HIGH);
 }
 void loop()
 {  
     if(digitalRead(1)==HIGH&&flag==0)
     {
       flag=1;
     }
      if(digitalRead(1)==LOW&&flag==1)
     {
         digitalWrite(0,HIGH);
    currentTime = millis();

        flag=0;
     }
    if (digitalRead(0) == HIGH && millis()-currentTime>=15000)
    {
      digitalWrite(0,LOW);
    }
     if(digitalRead(2)==HIGH&&flag==1)
     {
       flag=1;
     }
     if(digitalRead(2)==LOW&&flag==1)
     {
           digitalWrite(0,!digitalRead(0));
       flag=0;
     }
 }

 

anatoliyrnd
Offline
Зарегистрирован: 17.03.2016

Код который ничего не делает будет занимать разный объем , в зависимости от камня, т.к. нужно место для инициализации кристала.  Но и Ардуино в плане оптимизации кода не самая лучшая IDE.

inobot
Offline
Зарегистрирован: 11.04.2016

anatoliyrnd пишет:

Код который ничего не делает будет занимать разный объем , в зависимости от камня, т.к. нужно место для инициализации кристала.  Но и Ардуино в плане оптимизации кода не самая лучшая IDE.

я не спорю,но учитывая что опыта 0 а ардуино кажется на первый взгляд такой несложной.

inobot
Offline
Зарегистрирован: 11.04.2016

inobot пишет:

anatoliyrnd пишет:

Код который ничего не делает будет занимать разный объем , в зависимости от камня, т.к. нужно место для инициализации кристала.  Но и Ардуино в плане оптимизации кода не самая лучшая IDE.

я не спорю,но учитывая что опыта 0 а ардуино кажется на первый взгляд такой несложной.

ну и для чего же еще нужен мк,можно было бы наваять схему на логике и спаять целую плату чем запрграмировать мк на такую пустячную задачу с минимум элементов

anatoliyrnd
Offline
Зарегистрирован: 17.03.2016

CodevisionAVR есть генератор начального кода, для правильной инициализации кристала, но вот библиотек не очень много. 

А разве ардуино компилирует для 13 тиньки?

Atreidos
Offline
Зарегистрирован: 18.03.2016

anatoliyrnd пишет:

CodevisionAVR есть генератор начального кода, для правильной инициализации кристала, но вот библиотек не очень много. 

А разве ардуино компилирует для 13 тиньки?

Изначально нет, но его можно заставить :).

inobot
Offline
Зарегистрирован: 11.04.2016

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

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

Держите.

Я не знаю, правильно у Вас было или нет, но я написал просто почти полностью эквивалентный код. То, что написано здесь, занимает 522 байта. На UNO работать не будет, там по другому маппируются порты.

После моей строки идут строки, которые она заменяет до первой пустой строки. Также несколько строк в начале я просто вставил.

#define	pin0	bit(0)
#define	pin1	bit(1)
#define	pin2	bit(2)
#define	pin3	bit(3)
#define	pin4	bit(4)

#define __pinHigh(mask) PORTB |= (mask)
#define __pinLow(mask) PORTB &= ~(mask)
#define __pinLow(mask) PORTB &= ~(mask)
#define __pinModeOutput(mask) PORTB |= (mask)
#define __pinModeInput(mask)  PORTB &= ~(mask)
#define __digitalRead(pin)	((PINB & pin) ? HIGH : LOW)


byte flag=0;
unsigned long currentTime; //Переменная для pause
 void setup()  
 { 
 	__pinModeOutput(0);
   // pinMode(pin0, OUTPUT); 

   __pinModeInput(pin1 | pin2);
    //pinMode(1, INPUT);
    //pinMode(2, INPUT);

    __pinHigh(pin1 | pin2);
    //digitalWrite(1, HIGH);
    //digitalWrite(2, HIGH);
 }
 void loop()
 {  
	if (__digitalRead(pin1)) flag = 1;
  //if(digitalRead(1)==HIGH&&flag==0)
  //{
  //  flag=1;
  //}

	if ((!__digitalRead(pin1)) && flag) {
		__pinHigh(pin0);
		currentTime = millis();
		flag=0;
	}
	//if(digitalRead(1)==LOW&&flag==1)
	//{
	//	digitalWrite(0,HIGH);
	//	currentTime = millis();
	//	flag=0;
	//}

	if (__digitalRead(pin0) && (millis()-currentTime>=15000)) __pinLow(pin0);
	//if (digitalRead(0) == HIGH && millis()-currentTime>=15000)
	//{
	//	digitalWrite(0,LOW);
	//}

	
	// строки ниже не имеют никакого смсла. Их можно выбросить
	//if(digitalRead(2)==HIGH&&flag==1)
	//{
	//	flag=1;
	//}
	
	if ((!__digitalRead(pin2)) && flag) {
		(__digitalRead(pin0)) ? __pinLow(pin0) : __pinHigh(pin0);
		flag = 0;
	}
	//if(digitalRead(2)==LOW&&flag==1)
	//{
	//	digitalWrite(0,!digitalRead(0));
	//	flag=0;
	//}
 }

 

hadamar
Offline
Зарегистрирован: 11.04.2016
(millis()-currentTime>=15000)

в этом коде точно не нужен, можно обойтись бональным делай

 

inobot
Offline
Зарегистрирован: 11.04.2016

Евгений спасибо за помощ,теперь полезу разбираться дальше,может и получится с плавным затуханием сделать )

Спасибо всем кто откликнулся и как то отреагировал на сообщение!!!

James
Offline
Зарегистрирован: 26.02.2016
int led_1 = 1; // вывод 1
int led_2 = 2; // вывод 2
int brightness = 0;    // минимальный цвет
int fadeAmount = 5;    // величина прироста

void setup()  { 
  pinMode(led_9, OUTPUT);
  pinMode(led_3, OUTPUT);
} 

void loop()  { 
   analogWrite(led_9, brightness); 
  analogWrite(led_3, 255 - brightness);  
  brightness = brightness + fadeAmount;
 if (brightness == 0 || brightness == 255) {
    fadeAmount = -fadeAmount ; 
  }     
  
  delay(30);                            
} 

Вот тебе абстрактное затухание

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

ЕвгенийП, забавный код .. что-то напомнило. :)

А не хотите написать файлик распиновки для arhat.h под тиньку или какие ещё популярные процы, чего там нету? :)

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

Arhat109-2 пишет:

ЕвгенийП, забавный код .. что-то напомнило. :)

А не хотите написать файлик распиновки для arhat.h под тиньку или какие ещё популярные процы, чего там нету? :)

Не хочу :))))

inobot
Offline
Зарегистрирован: 11.04.2016

Евгений а этот код(который вы написали)  AVRstudio скомпилирует для тиньки или его менять нужно?

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

Ну, там нет никаких loop'ов и setup'ов

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

Как уже сказал ЕвгенийП, там нет setup(), loop(), millis(). Это чисто ардуиновское.

Вместо setup() и loop() сделай так:

int main(void) 
{
  // тут пишем то, что в setup
  while(1) 
  {
  // тут пишем то, что в loop
  }
}

или так:

void setup(void) 
{
  // тут пишем то, что в setup
}

int main(void) 
{
  setup();
  while(1) 
  {
  // тут пишем то, что в loop
  }
}

И millis() надо чем-то заменить.

inobot
Offline
Зарегистрирован: 11.04.2016

вот чего я не могу понять в C(чистом) так это : вот например там все выводы портаВ назначаются на вход или на вывод а у меня допустим как написанно выше один выход и два входа,и в примерах самоучителей которые я смотрел на примере 2313 дам портыB и D,так там они по разному и назначаются,пока не понимаю как назначить выводы по разному как написано в этом скетче.

возможно и глупы все мои непонятки ,но учитывайте что я окунулся в С всего как 2 дня,когда понял что ардуино не совсем то что мне нужно.

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

inobot пишет:

вот например там все выводы портаВ назначаются на вход или на вывод а у меня допустим как написанно выше один выход и два входа,и в примерах самоучителей которые я смотрел на примере 2313 дам портыB и D,так там они по разному и назначаются,пока не понимаю как назначить выводы по разному как написано в этом скетче.

Я может чего-то не понял, но как бы, там всё элементарно. Нужно на вывод, пишете 1, нужно на ввод - 0. Ну, например:

// пример 1
// Все на ввод, только PB0 и PB1 на вывод
DDRB = 0x03;

// Тоже самое, но более цивилизовано
DDRB = bit(0) | bit(1);

// пример 2
//  PB0 и PB2 - OUTPUT
//  PB4  INPUT
// все остальные не трогаем, оставляем как были
DDRB &= ~bit(4); // очистили PB4 в 0 (INPUT) 
DDRB |= (bit(0) | bit(2)); // установили   PB0 и PB2 в 1 (OUTPUT)

Может где опечатался (проверить сейчас не могу), но идея такая.

inobot
Offline
Зарегистрирован: 11.04.2016

Евгений спасибо за пример,я немного тормозить начинаю,слишком много информации за два дня,понимаю что запутался в конец надо опять с начала,я сейчас даже не могу вопрос сформулировать правильно. сейчас пауза (поработать надо) и с самого начала.Вопрос, когда я напишу,могу я расчитывать на вашу помощь в рамках этой темы?

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

inobot пишет:

Вопрос, когда я напишу,могу я расчитывать на вашу помощь в рамках этой темы?

Если будете делать как сейчас, то нет. Вы не с того конца начинаете.

На тиньке Вы немедленно останетесь без сериала, и вообще без каких бы ни было средств отладки и дистанционно я ничем Вам не помогу.

Вам надо сейчас на UNO когда всё под рукой, всю программу написать и отладить, добившись, чтобы она работала точно так как надо.

И только потом заморачиваться вопросами "влезания в тиньку" и т.п.

Если Вы сразу перейдёте на тиньку, помочь себе сможете только сами, т.к. дистанционно это крайне трудно.

UserDead
UserDead аватар
Offline
Зарегистрирован: 29.11.2015

Насколько помниться. Я хотел как-то уменьшить объем кода на восьмерочке. Уменьшил но не намного. Про конкретное установление портов как вход или выход написано здесь же в документации. Делается это строкой DDRB = DDRB | b00111110;  к примеру где в строке буква "B" это регистр порта к которому подключены пины. 1-5 или 1-7 в зависимости от кристалла (например в atmega168v где она работает только на 8 мГц пины предназначавшиесь для кварца свободны для использования) Далее  после буквы "b" цифры. 0 - вход 1 - выход.

UserDead
UserDead аватар
Offline
Зарегистрирован: 29.11.2015

ЕвгенийП, Просвятите немного насчет понимания настройки портов. Я видел пример B11110000 а у вас здесь 0х03. Это как понимается?

 

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

B11110000 - двоичная система счисления

0х03 - шестнадцатеричная система счисления

P.S. Одно и то же число может быть представлено в разных системах счисления. Например, число 200 в привычной нам десятиричной (DEC) системе, можно записать 0b11001000 в двоичной (BIN) или 0xC8 в шестнадцатиричной (HEX). В двоичной более наглядно видно биты. Но шестнадцатиричная позволяет более краткую запись, чтобы не писать кучу нулей и единиц. Особенно в 32-битных микроконтроллерах. Например запись 0b11001000111010111110011001010101 можно сократить до 0xC8EBE655.

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

UserDead пишет:

Делается это строкой DDRB = DDRB | b00111110;  ... Далее  после буквы "b" цифры. 0 - вход 1 - выход.

Это не так. При таком подходе единицы пропишутся куда Вы хотите, а нули - нет. В тех местах, где Вы написали нули, просто останется то, что было до Вас. Если Вы хотите гарантированно прописать нули, то это надо сделать явно. Например, то, что Вы хотели с гарантированно записанными нулями и единицами делается так:

DDRB = DDRB & ~b00111110; // прописываем нули
DDRB = DDRB | b00111110; // прописываем единицы

 

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

Ну или так:

DDRB = b00111110; // прописываем нули и единицы

 

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

UserDead пишет:

Я видел пример B11110000 а у вас здесь 0х03. Это как понимается?

Запись B10101010 - не является корректной записью константы на языке С/С++.

Чтобы Вы имели возможность так писать, разработчики среды arduino создали специальный файл binary.h в котором все возможные комбинации битов прописаны через define, например,

...
#define B10001010 138
#define B10001011 139
#define B10001100 140
...

Вы можете полюбоваться на это файл, он у Вас лежит по адресу 

<место установки среды ардуино>\hardware\arduino\avr\cores\arduino\binary.h

Записи 0x03 и 0B00000011 идентичны, но первая будет работать везде, а вторая только там, где есть этот binary.h с кучей define

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

Jeka_M пишет:

Ну или так:

DDRB = b00111110; // прописываем нули и единицы

Ох, Женя, оно, конечно, можно, но как говорил А. Галич "ох, не надо бы вслух, ох не надо бы". Новички ж они такие - они везде это пихать будут. А потом вопросы: "а чё у меня в сериале грязь (или, ещё лучше, СН340 сдохла), кто-нибудь сталкивался?" :))))))

Парни, прямое присваивание порту целиком допустимо ТОЛЬКО если Вы действительно хотите назначить ВСЕ биты. А последнее (назначение сразу всех битов порта) допустимо только если Вы понимаете, что делаете. Например, если Вы зафигачите что-нибудь в порты D0/D1 в неподходящий момент, Вы помешаете работать UART'у, а если совсем не повезёт, то запросто отправите CH340 в страну вечно стабильного напряжения.

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

Мда, предупредить об опасности я как-то не подумал... Наверно действительно зря написал. 

P.S. Кстати, у одного товарища загадочным образом вышла из строя CH340. Правда не написал, успел ли он загрузить какой-то скетч.

UserDead
UserDead аватар
Offline
Зарегистрирован: 29.11.2015

Поэтому то в туториале так и написали что безопаснее всего использовать 

DDRB = DDRB | b00111110;

Теперь я понял что он просто обновлятет только то где есть единица.

А можно ссылочку на ваши истоки светлых знаний (книжка там к примеру) Спасибо

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

У меня была как раз хрень с rx/tx. Так-то я их не трогаю - только "по назначению", а тут скетч был для голой 328 и там я их спокойно пользовал, т.к. UART не был нужен. А тут зашился с отладкой и совершенно забыв, что пользую эти порты, залил скетч в нанку и попробовал в сериал печать вывести. Скетч залился и даже заработал, только больше в эту нанку ничего не заливается :( Пока не выбросил, жду, скоро должен прийти параллельный программатор (я заказал оригинальный STK500 c AtmelStore) попробую её реанимировать.

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

UserDead пишет:

А можно ссылочку на ваши истоки светлых знаний 

Мммм, я профессиональный программист и стаж работы у меня с 1980 года. Так что истоки знаний сильно разбросаны во времени и пространстве, ну и опять же "опыт - сын ошибок трудных". В последнее время, правда больше руковожу и меньше программирую сам, но всё равно программирую достаточно много, чтобы навыки не терять.