Как вставить подпрограмму

xkp
Offline
Зарегистрирован: 17.01.2015

Здравствуйте. ни где не могу найти как вставить подпрограмму

пример на ассемблере

main:
; текст основной программы
rcall name
; текст основной программы
rjmp main

name:
;текст подпрограммы
reti
bwn
Offline
Зарегистрирован: 25.08.2014

В ардуино нет подпрограмм, есть функции.

http://arduino.ru/Reference/FunctionDeclaration

xkp
Offline
Зарегистрирован: 17.01.2015

Спасибо. получилось как то так

void setup()
{
//установка времени и даты
//         час,мин,сек, год,мес,чис,день
  set_time( 18, 47, 01,  15, 01, 22, 04);
//........
}
void loop() 
{
//.......
XYZ_read_ind();
RTC_read_ind();
  delay(100);
}

и в отдельных вкладках расположены

void set_time(int set_hr, int set_min, int set_sec,   int set_yr, int set_mth, int set_date, int set_dow)
{
  RTC.stop();
  RTC.set(DS1307_SEC,set_sec); //Установить секунды
  RTC.set(DS1307_MIN,set_min); //Установить минуты
  RTC.set(DS1307_HR,set_hr); //Установить часы
  RTC.set(DS1307_DOW,set_dow); //Установить день недели
  RTC.set(DS1307_DATE,set_date); //Установить дату
  RTC.set(DS1307_MTH,set_mth); //Установить месяц
  RTC.set(DS1307_YR,set_yr); //Установить год
  RTC.start();
}
void RTC_read_ind()
{...}
void XYZ_read_ind()
{...}

 

 

bwn
Offline
Зарегистрирован: 25.08.2014

А зачем int-ы, ну за исключением года? У вас больше 59 минут бывает?

xkp
Offline
Зарегистрирован: 17.01.2015

число года 0,,,99 наверно тож не над.

bwn
Offline
Зарегистрирован: 25.08.2014

xkp пишет:

число года 0,,,99 наверно тож не над.

Эт, точна)))

xkp
Offline
Зарегистрирован: 17.01.2015

без INT-ов не работает. ошибка ссылается ардуино её знает куда.

bwn
Offline
Зарегистрирован: 25.08.2014

Так вместо int-ов, я надеюсь вы ставите byte?

xkp
Offline
Зарегистрирован: 17.01.2015

щас поставим ))

PS работает

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

мне тоже нравится так структурировать код :) , ещё можно эти "подпрограммы" прописать-определить в отдельном файле... вааще красота - перед глазами меньше текста :)

bwn, может подпрограмм нет в cpp, а не в ардуине ? моя тоже думал что есть функции, процедуры ( функция невозвращающая данные ) и подпрограмма ( ( функция без параметров и невозвращающая данные )... поправте, что не так :) , спасибо

bwn
Offline
Зарегистрирован: 25.08.2014

SU-27-16 пишет:

мне тоже нравится так структурировать код :) , ещё можно эти "подпрограммы" прописать-определить в отдельном файле... вааще красота - перед глазами меньше текста :)

bwn, может подпрограмм нет в cpp, а не в ардуине ? моя тоже думал что есть функции, процедуры ( функция невозвращающая данные ) и подпрограмма ( ( функция без параметров и невозвращающая данные )... поправте, что не так :) , спасибо

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

xkp
Offline
Зарегистрирован: 17.01.2015

SU-27-16 пишет:

мне тоже нравится так структурировать код :) , ещё можно эти "подпрограммы" прописать-определить в отдельном файле... вааще красота - перед глазами меньше текста :)

,,,

так у меня так и есть. писал же

xkp пишет:

...

и в отдельных вкладках расположены

...

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

xkp, тут всё строго вкладка=файл, подпрограмма=функция, .....порэбрик, булошная :) - я понял, просто инклудов не увидел

bwn, я просто уточнил :) , опыта нет , а в прошлой жизни паскаль, delphi..... алгол, фортран и др. - не считается :)

xkp
Offline
Зарегистрирован: 17.01.2015

так оно и без инклудов работает))

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

может быть мы про разные вещи говорим ?

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012
/*
 * LCD -VCC pin 1 to GND
 * LCD +VCC pin 2 to +5 V
 * LCD V0 pin 3 to 10K resistor:   * ends to +5V and ground   * wiper to LCD
 * LCD A0/RS pin 4 to digital pin 8
 * LCD R/W pin 5 to GND
 * LCD Enable pin 6 to digital pin 9
 * LCD D0 pin 7
 * LCD D1 pin 8
 * LCD D2 pin 9
 * LCD D3 pin 10
 * LCD D4 pin 11 to digital pin 10
 * LCD D5 pin 12 to digital pin 11
 * LCD D6 pin 13 to digital pin 12
 * LCD D7 pin 14 to digital pin 13
 * LCD Brigtness pin 15 to +5 V
 * LCD Brigtness pin 16 to GND
 * LiquidCrystal( A0/RS , RW_x , Enable , D0_x , D1_x , D2_x ,  D3_x , D4 , D5 , D6 , D7 )
 *
 * Connect VCC of the BMP085 sensor to 3.3V (NOT 5.0V!)
 * Connect GND to Ground
 * Connect SCL to i2c clock - on '168/'328 Arduino Uno/Duemilanove/etc thats Analog 5
 * Connect SDA to i2c data - on '168/'328 Arduino Uno/Duemilanove/etc thats Analog 4
 * EOC is not used, it signifies an end of conversion
 * XCLR is a reset pin, also not used here
 */
 
#include "File_Func.h"
#include <Wire.h>

#include <Adafruit_BMP085.h>
Adafruit_BMP085 BMP;

#include <LiquidCrystal.h>
LiquidCrystal LCD( 8, 9, 10, 11, 12, 13 );
byte DeltaChar[8] ={ B00000 , B00100 , B01010 , B01010 ,
                     B10001 , B10001 , B11111 , B00000 };
                     
const float kPaToMmHg = 0.0075006375541921;

float pressureQFE;
float pressureQNH;

const byte count = 25;
float temperatureArray[ count ];
float pressureArray[ count ];
float altitudeArray[ count ];

float temperature;
float pressure;
float altitude;

unsigned long timeBMPlive;
byte timeBMPdelta = 30;

byte i = 0;
//========================================================================================================
void setup()
{
  LCD.begin( 20 , 4 );
  LCD.createChar( 0 , DeltaChar );   //  LCD.print( '\0' );
  if ( ! BMP.begin( BMP085_ULTRAHIGHRES ) )
  {
    Out_to_LCD_ERROR_BMP085();
  }
  pressureQNH = 101325;
  timeBMPlive = millis();
}
//========================================================================================================
void loop()
{
  if ( ( millis() - timeBMPlive ) > timeBMPdelta )
  {
    temperatureArray[ i ] = BMP.readTemperature();
    pressureArray[ i ] = BMP.readPressure();
    altitudeArray[ i ] = BMP.readAltitude( pressureQNH ); 
    i++;
    if ( i > count - 1 )
    {
      i = 0;
    }
    temperature = AverageArray( temperatureArray , count );
    pressure = AverageArray( pressureArray , count );
    altitude = AverageArray( altitudeArray , count );
    timeBMPlive = millis();
  }
  Out_to_LCD_t_T_QFE_QNH_AMSL();
}
//========================================================================================================
void Out_to_LCD_ERROR_BMP085()
{
  LCD.setCursor( 0 , 0 );
  LCD.write( "Could not find a" );
  LCD.setCursor( 0 , 1 );
  LCD.write( "valid BMP085 sensor," );
  LCD.setCursor( 0 , 2 );
  LCD.write( "check wiring ! " );
  while ( 1 ) {}
}
//========================================================================================================
void Out_to_LCD_t_T_QFE_QNH_AMSL()
{
// очистка экрана                  
  LCD.clear();
// вывод температуры в градусах
  LCD.setCursor( 1 , 0 );
  LCD.print( temperature , 1 );
  LCD.print( " \x99""C" );
// вывод времени
  LCD.print( "  00:00:00" );
// вывод QFE в паскалях
  LCD.setCursor( 0 , 1 );
  LCD.print( "QFE " ); 
  pressureQFE = pressure;
// вывод стрелки
  LCD.print( pressureQFE , 0 );
  LCD.print( " -> " ); 
// вывод QFE в мм.рт.ст.
  LCD.print( pressureQFE * kPaToMmHg , 1 );
  LCD.setCursor( 0 , 2 );
// вывод QNH в паскалях
  LCD.print( "QNH " ); 
  LCD.print( pressureQNH , 0 );
// вывод стрелки
  LCD.print( " -> " );
// вывод QNH в мм.рт.ст.
  LCD.print( pressureQNH * kPaToMmHg , 1 );
// вывод AMSL в метрах
  LCD.setCursor( 0 , 3 );
  LCD.print( "AMSL " );
  LCD.print( altitude , 1 );
  LCD.print( " \xBC" );
}
//========================================================================================================

это основная

xkp
Offline
Зарегистрирован: 17.01.2015

нет. у меня функции RTC_read_ind и XYZ_read_ind лежат в отдельных двух файлах RTC и XYZ в каталоге с основной программой. работает без инклуда.

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012
#include "Arduino.h"
//=================================================================
float AverageArray( float *Array , byte dimension )
{
  const float kStdnt = 2.33;
  float total , mo , disp , delta , lowLimit , highLimit;
  byte m , n;
  total = 0;
  for( n = 0; n < dimension; n++ )
    {
      total = total + Array[ n ];
    }
  mo = total / dimension; 
  total = 0;
  for ( n = 0; n < dimension; n++ )
    {
      total = total + pow( ( mo - Array[ n ] ), 2 );
    }
  disp = sqrt( total / dimension );
  delta = disp * kStdnt;
  lowLimit = mo - delta;
  highLimit = mo + delta;
  m = 0;
  total = 0;
  for ( n = 0; n < dimension; n++ )
    {
      if ( Array[ n ] >= lowLimit && Array[ n ] <= highLimit )
        {
          total = total + Array[ n ];
          m++;
        }
    }
  return total / m;
}
//=================================================================

это внешняя функция

xkp
Offline
Зарегистрирован: 17.01.2015

одна из них проинклудирована в программе но закоментирована а вторую вообще не прописовал инклуд

#include <Wire.h> 
#include <lib_BlockLCD0802_IC.h>
#include <DS1307.h>
//#include <RTC.ino>

lib_BlockLCD0802_IC lcd(0x27,20,4);
....

 

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

#include "File_Func.h" - без этого в основном коде не будет работать же, при первом же вызове функции начнёт ругацца ?

а вы как сделали ?

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

а где хранится void set_time(int set_hr, int set_min, int set_sec,   int set_yr, int set_mth, int set_date, intset_dow) ?

xkp
Offline
Зарегистрирован: 17.01.2015

в отдельном файле RTC.ino который лежит в папке где лежит основной фаил.

 

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

при вызове в сетапе void set_time( ................. ) - как она у вас находится компоновщиком !!!!!!??????

xkp
Offline
Зарегистрирован: 17.01.2015

не знаю но работает))

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

пардон ! вы про библиотеки - моя про собой написанные-определённые функции :)

xkp
Offline
Зарегистрирован: 17.01.2015

я не про библиотеки а про собой написанные

xkp
Offline
Зарегистрирован: 17.01.2015

добавлял (создавал) эти файлы через треугольничек вверху справа в окне набора программного текста в ардуино иде

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

не пользовался.. ручками прописывал всё... треугольничек, видимо сам всё прописывает, она же IDE :)

посмотрите инклуды, должны быть.....

kkirill72
Offline
Зарегистрирован: 26.11.2014

Здравствуйте все подскажете как закольцевать программу 5 раз и вывести среднее 

int val = 0;
void setup(){
   pinMode(8,INPUT);пин D8 только цифровой сигнал
Serial.begin(9600);
}
void loop(){
  val = pulseIn(8,HIGH) + pulseIn(8,LOW);
  Serial.print(1000000/val);//так мы получаем частоту т.к 1/(val/1000000) = 1000000/val
  Serial.println(" HZ ");
  delay (1000);
}
Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013
#define MEASUREMENT_PIN 8 // пин D8 только цифровой сигнал
byte x = 5;               // количество измерений (не более 254)
int val = 0;

void setup()
{
   pinMode(MEASUREMENT_PIN,INPUT);
   Serial.begin(9600);
}

void loop()
{
  Serial.print("\nCurrent values: ");
  for(byte i = 0; i < x; i++) // X измерений подряд, без паузы
  {
   static int oldVal = val;
   val = pulseIn(MEASUREMENT_PIN,HIGH) + pulseIn(MEASUREMENT_PIN,LOW);  	
   Serial.print(i);	
   Serial.print(":");
   Serial.print(1000000L/val);	
   Serial.print(", ");
   // <новое среднее> = (<старое среднее>* (X-1) + <текущее значение>) / X; 
   // где X - число измерений
   val = (oldVal * (x - 1) + val) / x;
  }
  Serial.print("\nAveraged value: ");
  Serial.print(1000000L/val);	
  Serial.println(" Hz ");
  delay (1000); // либо перенести внутрь цикла for, если нужно 
                // замерять с интервалом 1 с между измерениями
}

 

arduinec
Offline
Зарегистрирован: 01.09.2015

xkp пишет:

так оно и без инклудов работает

Arduino IDE компилирует вместе все файлы, находящиеся в папке скетча. Инклуды для них не нужны.

kkirill72
Offline
Зарегистрирован: 26.11.2014

Tomasina огромное спасибо

 

Maverik
Offline
Зарегистрирован: 12.09.2012

arduinec пишет:

xkp пишет:

так оно и без инклудов работает

Arduino IDE компилирует вместе все файлы, находящиеся в папке скетча. Инклуды для них не нужны.

 

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

вообще в идеале нужно бы делать библиотеки и располагать их в отдельной папке.  библиотечные функции (методы) удобнее, чем обычные функции.

подпрограмм в С и С++ нет.

 

kkirill72
Offline
Зарегистрирован: 26.11.2014
#define MEASUREMENT_PIN 8 // пин D8 только цифровой сигнал
byte x = 5;               // количество измерений (не более 254)
int val = 0;
 
void setup()
{
   pinMode(MEASUREMENT_PIN,INPUT);
   Serial.begin(9600);
}
 
void loop()
{
  Serial.print("\nCurrent values: ");
  for(byte i = 0; i < x; i++) // X измерений подряд, без паузы
  {
   static int oldVal = val;
   val = pulseIn(MEASUREMENT_PIN,HIGH) + pulseIn(MEASUREMENT_PIN,LOW);  
   Serial.print(i);
   Serial.print(":");
   Serial.print(1000000L/val);
   Serial.print(", ");
   // <новое среднее> = (<старое среднее>* (X-1) + <текущее значение>) / X; 
   // где X - число измерений
   val = (oldVal * (x - 1) + val) / x;
  }
  Serial.print("\nAveraged value: ");
  Serial.print(1000000L/val);
  Serial.println(" Hz ");
  delay (1000); // либо перенести внутрь цикла for, если нужно 
                // замерять с интервалом 1 с между измерениями
}
 
      Здесь прога речатает четыре измеренных значения ,а средеарифметического нет
 
Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013
#define MEASUREMENT_PIN 8 // пин D8 только цифровой сигнал
byte x = 5;               // количество измерений (не более 254)
unsigned long val;
unsigned long oldVal;

void setup()
{
  pinMode(MEASUREMENT_PIN,INPUT);
  Serial.begin(9600);
}

void loop()
{
  Serial.print("\nCurrent values: ");
  for(byte i = 0; i < x; i++) // X измерений подряд, без паузы
  {
    oldVal = val;
    val = pulseIn(MEASUREMENT_PIN,HIGH) + pulseIn(MEASUREMENT_PIN,LOW);  
    Serial.print(1000000L/val);	
    Serial.print(", ");
    // <новое среднее> = (<старое среднее>* (X-1) + <текущее значение>) / X; 
    // где X - число измерений
    val = (oldVal * (x - 1) + val) / x;
  }
  Serial.print("\nAveraged value: ");
  Serial.print(val, 4);	
  Serial.println(" Hz ");
  delay (1000); // либо перенести внутрь цикла for, если нужно 
  // замерять с интервалом 1 с между измерениями
}

 

Vivan755
Offline
Зарегистрирован: 28.07.2019

Подскажите, вот я задал внутри функции delay, этот delay будет действовать только внутри функции или завесит весь скетч?

SLKH
Offline
Зарегистрирован: 17.08.2015

Vivan755 пишет:

Подскажите, вот я задал внутри функции delay, этот delay будет действовать только внутри функции или завесит весь скетч?

он будет действовать внутри функции и на время своего действия завесит функцию и весь скетч.