A A A A Автор Тема: Расчет гражданский сумерек  (Прочитано 13282 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн IOPA4Автор темы

  • Новичок
  • *
  • Сообщений: 42
  • Благодарностей: 0
    • Сообщения от IOPA4
    • Личная страничка Ю.Градова
Re: Расчет гражданский сумерек
« Ответ #20 : 18 Мая 2009 [11:20:21] »
Вторые сутки бьюсь над последним Вами высланным кодом - выдает ошибки. Раза три редактировал, удалял, добавлял и опять возвращался к началу. Может какая-то мелочь, но время сумерек (проверяю по 1 точке в каждом месяце для своей широты) не соответствует. Восход/заход не проверял, т.к. он меня не интересует(только программу ;D). Зависимость времени сумерек от месяца очень незначительная: 18/05 - 07:53 и 18:46, 18/02 - 05:54 и 18:40. (Это с кодом, который Вы выслали - без редактирования), только добавил функцию записи в буфер HH[] MM[] для вывода на индикатор. Пробовал выводить и BeginSum_h, BeginSum_m, EndSum_h, EndSum_m.
Глаза боятся - руки делают

Tau

  • Гость
Re: Расчет гражданский сумерек
« Ответ #21 : 18 Мая 2009 [13:31:19] »
Это уже какая-то мистика.
Вы можете вывести на печать промежуточные значения и показать их мне?
Меня интересуют переменные
в процедуре main : JulDat, SideralTime,  RaSun[0], DecSun[0],  RaSun[1], DecSun[1]
в процедуре SunRise : var1,  var2 перед началом цикла и ra,dec,var5,var4, Hh, Hhrefr для i = 0 и i=1
А заодно выведите на печать Longitude, Latitude, Year, Mon, Day, Hour, TimeM.
Для 18 февраля, например.

Оффлайн IOPA4Автор темы

  • Новичок
  • *
  • Сообщений: 42
  • Благодарностей: 0
    • Сообщения от IOPA4
    • Личная страничка Ю.Градова
Re: Расчет гражданский сумерек
« Ответ #22 : 18 Мая 2009 [14:16:10] »
Вся беда в том, что я пишу в CodeVisionAVR - он не имеет дебуггера. Проект проверяю в Proteus - там debugger ущербный. Переменные кладет в регистр микроконтроллера в HEX-формате. В общем трудно отладить программу, можно только просмотреть конечный результат. Хотя в нете я встречал всевозможные ухищрения, но их нужно опять найти и изучить. Я так понял программа на С у Вас работает на все 100 - буду искать, почему CodeVisionAVR глотает или обрезает переменные. Возможно из-за обилия переменных они затирают друг друга?
Глаза боятся - руки делают

Tau

  • Гость
Re: Расчет гражданский сумерек
« Ответ #23 : 18 Мая 2009 [14:23:49] »
Да, у меня все работает.
Кстати, меня насторожило, что у вас не была подключена математическая библиотека. Я после отладки ее
#include <cmath>
закомментировала, но уверены в том, что у вас математические функции определены?

Оффлайн IOPA4Автор темы

  • Новичок
  • *
  • Сообщений: 42
  • Благодарностей: 0
    • Сообщения от IOPA4
    • Личная страничка Ю.Градова
Re: Расчет гражданский сумерек
« Ответ #24 : 18 Мая 2009 [19:41:34] »
Да, конечно, иначе бы даже не компилировалось:
#include <math.h>

Вот здесь:
  VarB1 = 4; // шаг цикла
  n = 23 * VarB1 + VarB1 + 1;
  for (i = 0; i < n; i++)

действительно правильный цикл, т.е 97 шагов?
Глаза боятся - руки делают

Tau

  • Гость
Re: Расчет гражданский сумерек
« Ответ #25 : 18 Мая 2009 [21:30:26] »
Цитата
действительно правильный цикл, т.е 97 шагов?
Да, правильный.

Оффлайн IOPA4Автор темы

  • Новичок
  • *
  • Сообщений: 42
  • Благодарностей: 0
    • Сообщения от IOPA4
    • Личная страничка Ю.Градова
Re: Расчет гражданский сумерек
« Ответ #26 : 19 Мая 2009 [15:36:14] »
Добрый день!
Странное дело: ???
В январе - определяет "Полярная ночь".
В феврале уже показывает самый продолжительный день,
а затем продолжительность дня снижается.
Не может быть ошибки в определении юлианской даты?
  if (mon1 <= 2)
  {
    mon1 = mon1 + 12;
    Year1 = Year1 - 1;
  }
и далее...
Если один раз определилась полярная ночь, то уже это сообщение не сбрасывается :'(
« Последнее редактирование: 19 Мая 2009 [15:38:25] от IOPA4 »
Глаза боятся - руки делают

Tau

  • Гость
Re: Расчет гражданский сумерек
« Ответ #27 : 19 Мая 2009 [18:01:56] »
В процедуру MJData аргументы передаются по значению, процедура не возвращает измененные аргументы, они остаются прежними. Ошибки в определении юлианской даты нет.
Цитата
то уже это сообщение не сбрасывается

Инициализируйте в начале процедуры main начальные значения:
TimeRise=0;
TimeSet=0;
BeginSum=0;
EndSum=0;

Tau

  • Гость
Re: Расчет гражданский сумерек
« Ответ #28 : 19 Мая 2009 [18:40:37] »
Прицепила сишный exe, который циклично работает в консольном режиме (вводите год, месяц, день, выдается время сумерек). Так как я Си не знаю, то нормальный выход сделать не смогла, надоест играться - убьете программу клавишами Ctrl+C.
В каком месте оно не работает?

Оффлайн IOPA4Автор темы

  • Новичок
  • *
  • Сообщений: 42
  • Благодарностей: 0
    • Сообщения от IOPA4
    • Личная страничка Ю.Градова
Re: Расчет гражданский сумерек
« Ответ #29 : 19 Мая 2009 [20:04:07] »
Я Вам писал - работает с точностью наоборот - сейчас Ваш сишный, добавлено только обнуление:
TimeRise=0;
TimeSet=0;
BeginSum=0;
EndSum=0;
и инициализацию для проверки:
Latitude =69;
Longitude=33;
Year=2009;
Watch=2;
Mon=4;
Day=1;
Hour=12;
Mins=0;
DecretTime=1;
Выдает:
1 января 2009 - полярная ночь
1 февраля 2009 - 03:34 и 21:59
1 марта 2009 -     05:39 и 19:37
1 апреля 2009 -   08:35 и 18:27
1 мая 2009 -        10:24 и 16:45
1 июня 2009 -      11:24 и 16:13
и так далее
Глаза боятся - руки делают

Tau

  • Гость
Re: Расчет гражданский сумерек
« Ответ #30 : 19 Мая 2009 [20:13:34] »
Наоборот работает тот exe, который был скомпилирован мной и прицеплен в предыдущем сообщении? Или наоборот работает результат вашей компиляции для микроконтроллера?

Оффлайн IOPA4Автор темы

  • Новичок
  • *
  • Сообщений: 42
  • Благодарностей: 0
    • Сообщения от IOPA4
    • Личная страничка Ю.Градова
Re: Расчет гражданский сумерек
« Ответ #31 : 19 Мая 2009 [20:38:30] »
Ваш СИ, но после компиляции в CodeVisionAVR и еще, подскажите пожалуйста, что
это значит:
  if (BeginSum_h != -1) 
  {
        cout << "BeginSum_h=" << BeginSum_h << endl;
        cout << "BeginSum_m=" << BeginSum_m << endl;
        cout << "EndSum_h=" << EndSum_h << endl;
        cout << "EndSum_m=" << EndSum_m << endl;

  } else cout << "Sumerki vsy noch" <<  endl;
}
В смысле выражение: cout << "Sumerki vsy noch" <<  endl
Глаза боятся - руки делают

Tau

  • Гость
Re: Расчет гражданский сумерек
« Ответ #32 : 19 Мая 2009 [21:13:38] »
Это выражение выводится на консоль при работе Си-шного экзешника в случае, когда сумерки всю ночь, то есть когда BeginSum=-1. В ином случае печатается время сумерек. Так как вы закомментировали строковые переменные mesg (сообщение о полярной ночи, полярном дне и сумерках всю ночь), то я не стала использовать эти переменные, но так как ситуацию с непрерывными сумерками нужно как-то обработать (а признаком этой ситуации является BeginSum=-1), то появилась эта строка - фраза "Сумерки всю ночь", напечатанная латинскими буквами, потому что консоль русские буквы печатает в какой-то кодировке, с которой у меня нет никакого желания разбираться.
По моему глубокому убеждению, мы топчемся на месте. Очевидно, что проблема не в алгоритме (иначе бы мой си-шный экзешник не работал), а в вашем компилляторе или в невозможности зашить этот алгоритм в микроконтроллер.

Оффлайн елVIс

  • *****
  • Сообщений: 1 360
  • Благодарностей: 15
  • Мне нравится этот форум!
    • Сообщения от елVIс
Re: Расчет гражданский сумерек
« Ответ #33 : 19 Мая 2009 [21:22:42] »
Проблема скорее всего в представлении данных.
Проверьте каков размер данных int
Подозреваю, что два байта

ТАЛ-150ПМ, Coronado PST, Алькор, Pentax IstD с ЗМ-5СА и МТО-1000

Оффлайн IOPA4Автор темы

  • Новичок
  • *
  • Сообщений: 42
  • Благодарностей: 0
    • Сообщения от IOPA4
    • Личная страничка Ю.Градова
Re: Расчет гражданский сумерек
« Ответ #34 : 19 Мая 2009 [21:31:48] »
int - 16 бит
-32768 - 32768
можно применить unsigned int от 0 до 65535
или long 32 бита
Глаза боятся - руки делают

Оффлайн IOPA4Автор темы

  • Новичок
  • *
  • Сообщений: 42
  • Благодарностей: 0
    • Сообщения от IOPA4
    • Личная страничка Ю.Градова
Re: Расчет гражданский сумерек
« Ответ #35 : 19 Мая 2009 [21:37:29] »
В этом компиляторе и float и double размер:
+/- 1.175е-38 - 3.402е38
Возможно, что здесь может быть проблемма?
Глаза боятся - руки делают

Оффлайн IOPA4Автор темы

  • Новичок
  • *
  • Сообщений: 42
  • Благодарностей: 0
    • Сообщения от IOPA4
    • Личная страничка Ю.Градова
Re: Расчет гражданский сумерек
« Ответ #36 : 19 Мая 2009 [21:46:50] »
Ура!!! :D
Практически заработало - перевел все int и char в long int
Нужно проверять, вроде не определяет Полярную ночь.
Видно нужно где-то применить signed long int
Уважаемые господа - последите, пожалуйста, еще за этой темой - хочется (нужно)
добить до конца.
Глаза боятся - руки делают

Оффлайн елVIс

  • *****
  • Сообщений: 1 360
  • Благодарностей: 15
  • Мне нравится этот форум!
    • Сообщения от елVIс
Re: Расчет гражданский сумерек
« Ответ #37 : 19 Мая 2009 [21:48:20] »
Посмотрел код программы.
К сожалению, местами он непереносим и обязательно приведет к проблемам.

Цитата
В этом компиляторе и float и double размер:
+/- 1.175е-38 - 3.402е38
Возможно, что здесь может быть проблемма?

Абсолютно точно - это и есть проблема.
float и double можете выкинуть сразу - они Вам бесполезны.
Каков размер у вас long int?

ТАЛ-150ПМ, Coronado PST, Алькор, Pentax IstD с ЗМ-5СА и МТО-1000

Оффлайн елVIс

  • *****
  • Сообщений: 1 360
  • Благодарностей: 15
  • Мне нравится этот форум!
    • Сообщения от елVIс
Re: Расчет гражданский сумерек
« Ответ #38 : 19 Мая 2009 [21:51:14] »
Ура!!! :D
Практически заработало - перевел все int и char в long int
Нужно проверять, вроде не определяет Полярную ночь.
Видно нужно где-то применить signed long int
Уважаемые господа - последите, пожалуйста, еще за этой темой - хочется (нужно)
добить до конца.

Вам нужно избавляться от float.
char переводить в long int не нужно - достаточно int
ТАЛ-150ПМ, Coronado PST, Алькор, Pentax IstD с ЗМ-5СА и МТО-1000

Оффлайн IOPA4Автор темы

  • Новичок
  • *
  • Сообщений: 42
  • Благодарностей: 0
    • Сообщения от IOPA4
    • Личная страничка Ю.Градова
Re: Расчет гражданский сумерек
« Ответ #39 : 19 Мая 2009 [22:03:45] »
В это месте:
float MJdata(int Year1, char Mon1, char Day1, float UT)
{
  if (Mon1 <= 2)
  {
    Mon1 = Mon1 + 12;
    Year1 = Year1 - 1;
  }       
  VarD2 = Year1/400 - Year1/100 + Year1/4;
  VarD1 = 365. * Year1 - 679004.;
  return VarD1 + VarD2 + 306001 * (Mon1 + 1)/10000 + Day1 + UT / 24 ;
}

 компилятор пишет: Warning: D:\Radio\Labcenter Electronics\Proteus 7 Professional\SAMPLES\VSM for AVR\Auto_Light_ATM8_PCF8583\sunrise.c(80), included from: ast_ds_004.c: overflow is possible in 16 bit addition, casting to 'long' may be required
и
Warning: D:\Radio\Labcenter Electronics\Proteus 7 Professional\SAMPLES\VSM for AVR\Auto_Light_ATM8_PCF8583\sunrise.c(82), included from: ast_ds_004.c: overflow is possible in 8 bit addition, casting to 'int' may be required
Глаза боятся - руки делают