Как вставить подпрограмму
- Войдите на сайт для отправки комментариев
Ср, 21/01/2015 - 22:16
Здравствуйте. ни где не могу найти как вставить подпрограмму
пример на ассемблере
main: ; текст основной программы rcall name ; текст основной программы rjmp main name: ;текст подпрограммы reti
В ардуино нет подпрограмм, есть функции.
http://arduino.ru/Reference/FunctionDeclaration
Спасибо. получилось как то так
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() {...}А зачем int-ы, ну за исключением года? У вас больше 59 минут бывает?
число года 0,,,99 наверно тож не над.
число года 0,,,99 наверно тож не над.
Эт, точна)))
без INT-ов не работает. ошибка ссылается ардуино её знает куда.
Так вместо int-ов, я надеюсь вы ставите byte?
щас поставим ))
PS работает
мне тоже нравится так структурировать код :) , ещё можно эти "подпрограммы" прописать-определить в отдельном файле... вааще красота - перед глазами меньше текста :)
bwn, может подпрограмм нет в cpp, а не в ардуине ? моя тоже думал что есть функции, процедуры ( функция невозвращающая данные ) и подпрограмма ( ( функция без параметров и невозвращающая данные )... поправте, что не так :) , спасибо
мне тоже нравится так структурировать код :) , ещё можно эти "подпрограммы" прописать-определить в отдельном файле... вааще красота - перед глазами меньше текста :)
bwn, может подпрограмм нет в cpp, а не в ардуине ? моя тоже думал что есть функции, процедуры ( функция невозвращающая данные ) и подпрограмма ( ( функция без параметров и невозвращающая данные )... поправте, что не так :) , спасибо
Поправлять людей, у которых опыта явно больше моего, не возьмусь. Иногда могу высказать свое мнение. Думаю Ваше определение более верное.
мне тоже нравится так структурировать код :) , ещё можно эти "подпрограммы" прописать-определить в отдельном файле... вааще красота - перед глазами меньше текста :)
,,,
так у меня так и есть. писал же
...
и в отдельных вкладках расположены
...
xkp, тут всё строго вкладка=файл, подпрограмма=функция, .....порэбрик, булошная :) - я понял, просто инклудов не увидел
bwn, я просто уточнил :) , опыта нет , а в прошлой жизни паскаль, delphi..... алгол, фортран и др. - не считается :)
так оно и без инклудов работает))
может быть мы про разные вещи говорим ?
/* * 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" ); } //========================================================================================================это основная
нет. у меня функции RTC_read_ind и XYZ_read_ind лежат в отдельных двух файлах RTC и XYZ в каталоге с основной программой. работает без инклуда.
#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; } //=================================================================это внешняя функция
одна из них проинклудирована в программе но закоментирована а вторую вообще не прописовал инклуд
#include "File_Func.h" - без этого в основном коде не будет работать же, при первом же вызове функции начнёт ругацца ?
а вы как сделали ?
а где хранится
voidset_time(intset_hr,intset_min,intset_sec,intset_yr,intset_mth,intset_date,intset_dow) ?в отдельном файле RTC.ino который лежит в папке где лежит основной фаил.
при вызове в сетапе
voidset_time( ................. ) - как она у вас находится компоновщиком !!!!!!??????не знаю но работает))
пардон ! вы про библиотеки - моя про собой написанные-определённые функции :)
я не про библиотеки а про собой написанные
добавлял (создавал) эти файлы через треугольничек вверху справа в окне набора программного текста в ардуино иде
не пользовался.. ручками прописывал всё... треугольничек, видимо сам всё прописывает, она же IDE :)
посмотрите инклуды, должны быть.....
Здравствуйте все подскажете как закольцевать программу 5 раз и вывести среднее
#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 с между измерениями }так оно и без инклудов работает
Arduino IDE компилирует вместе все файлы, находящиеся в папке скетча. Инклуды для них не нужны.
Tomasina огромное спасибо
так оно и без инклудов работает
Arduino IDE компилирует вместе все файлы, находящиеся в папке скетча. Инклуды для них не нужны.
проблема в том, в каком порядке она их компилирует. там есть нюансы.
вообще в идеале нужно бы делать библиотеки и располагать их в отдельной папке. библиотечные функции (методы) удобнее, чем обычные функции.
подпрограмм в С и С++ нет.
#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 с между измерениями }Подскажите, вот я задал внутри функции delay, этот delay будет действовать только внутри функции или завесит весь скетч?
Подскажите, вот я задал внутри функции delay, этот delay будет действовать только внутри функции или завесит весь скетч?