реклама на сайте
подробности

 
 
> Злополучная функция what_day(), Вычисление дня недели
alux
сообщение Jun 6 2008, 07:11
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447



Для инициализации Real Time Clock возникла необходимость вычисления дня недели по дате. Функция достаточно простая:
Код
//----------------------------------------------------------------------------
// Вычисления дня недели по дате
// Все деления целочисленные (остаток отбрасывается).
// Результат: 0 — воскресенье, 1 — понедельник и т. д.
//----------------------------------------------------------------------------
unsigned char what_day(unsigned int year, unsigned char month, unsigned char date)  
{
  unsigned char a = (14 - month) / 12;
  unsigned int y = year - a;        
  unsigned char m = month + 12*a - 2;
  
  return (7000 + (date + y + y/4 - y/100 + y/400 + (31*m)/12 ))% 7;  
}


Но по какой-то непонятной причине вызов ее приводит к глюкам программы. В частности, при входе в пункт меню невозможно из него выйти, при этом программа реагирует не так как задумано. Должен сказать, что проект использует ОС (scmRTOS) и ОЗУ использовано на 90%. Контроллер Mega324P (2кБ ОЗУ). Отладочными средствами (JTAG) пользоваться не представляется возможным. Это похоже на переполнение стека. Но. Почему это происходит, если вызов достаточно простой функции вставить в начале функции main (до запуска ОС):
Код
int main()
{
  what_day(2008, 6, 6);
.....................

Больше нигде в процессах она не используется. Пробовал менять размеры CSTACK (100...200) и RSTACK (32...64). Не помогло. Думаю менять контроллер на AT90USB1287. Но сделаю это в последнюю очередь. Может быть есть другой способ вычисления дня недели? Какие будут предложения?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
GetSmart
сообщение Jun 12 2008, 11:10
Сообщение #2


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(alux)
Не понял на счет глюка, я же прерывания настроил именно на эти выводы, к которым подключена клавиатура:

Вне зависимости от того, на что настроены прерывания, в процедуре переполнения таймера 0 формируется 6-битный скан-код. И если на портах C и D помимо клавиатуры что-то подключено (хоть на вход, хоть на выход) скан-коды будут "левые". Особенно, если для клавиатуры на одном порте используется старшая половина полубайта:
Код
    /* Init ports */
    KEYMATRIX_ROW_DDR &= 0x0f;    // Set row lines to input  
    KEYMATRIX_ROW_PORT |= 0xf0;    // Pull row lines high
Как я понял, здесь на битах 4..7 висит клавиатура, а на младших что-то ещё. Прерывание по таймеру сканирует биты от младшего к старшему и найдя еденичный бит в младших битах перестанет дальше сканировать. Даже когда для клавиатуры используются две младших половинки в двух разных портах, то может произойти прерывание по отжатию кнопки, при этом на старших битах порта столбцов будет посторонний нулевой сигнал, то он засчитается за нажатую клавишу. Чтобы всех этих проблем не происходило нужно подправить в файле keymatrix.c процедуру сканирования портов клавиатуры timer0OVFISR().


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- alux   Злополучная функция what_day()   Jun 6 2008, 07:11
- - MrYuran   интересно, а куда она возвращает результат? Кодint...   Jun 6 2008, 08:08
|- - alux   Цитата(MrYuran @ Jun 6 2008, 11:08) интер...   Jun 6 2008, 08:41
- - GetSmart   Листинг кода посмотрите, в MAP-файле должен указыв...   Jun 6 2008, 08:52
|- - alux   Цитата(GetSmart @ Jun 6 2008, 11:52) Лист...   Jun 6 2008, 09:47
- - GetSmart   В листинге нет процедуры ??what_day. Дайте листинг...   Jun 6 2008, 10:02
|- - alux   Цитата(GetSmart @ Jun 6 2008, 13:02) Я не...   Jun 6 2008, 10:23
- - GetSmart   Прерывания запретите перед вызовом этой процедуры....   Jun 6 2008, 10:33
|- - alux   Вызов идет в начале main(). Естественно, прерывани...   Jun 6 2008, 10:45
- - MrYuran   Насколько я понимаю, 0х8f это не совсем 100, верне...   Jun 6 2008, 10:53
|- - alux   Цитата(MrYuran @ Jun 6 2008, 13:53) 0х8f ...   Jun 6 2008, 11:16
- - IgorKossak   ЦитатаОтладочными средствами (JTAG) пользоваться н...   Jun 6 2008, 11:38
- - vet   Коллеги, какая нехватка ОЗУ? три параметра, три пе...   Jun 6 2008, 11:41
|- - alux   Цитата(vet @ Jun 6 2008, 14:41) Чип помен...   Jun 6 2008, 12:08
|- - rezident   Цитата(alux @ Jun 6 2008, 18:08) Изначаль...   Jun 6 2008, 12:20
- - rezident   Совет из области паранойи, но все же попробуйте пр...   Jun 6 2008, 11:47
- - alux   Если это хоть как-то наведет на мысли... Глюк проя...   Jun 6 2008, 12:41
- - alux   Это выходит за всякие рамки понимания и попахивает...   Jun 6 2008, 15:52
- - sKWO   Цитата(alux @ Jun 6 2008, 11:11) Но по ка...   Jun 6 2008, 19:21
|- - alux   Цитата(sKWO @ Jun 6 2008, 22:21) Не помог...   Jun 6 2008, 21:19
|- - sKWO   Цитата(alux @ Jun 7 2008, 01:19) Не понял...   Jun 7 2008, 06:02
- - Flasher   Недавно в яре натолкнулся под авр использовал функ...   Jun 6 2008, 19:38
|- - Andreas1   Цитата(Flasher @ Jun 6 2008, 23:38) Недав...   Jun 7 2008, 13:40
- - vet   Посмотрите, какие регистры использует подпрограмма...   Jun 7 2008, 04:51
- - AlexG   Если у вас scmRTOS, то размеры каких стеков вы кру...   Jun 7 2008, 13:24
- - GetSmart   Цитата(alux)Проблема решилась частично: если вызва...   Jun 7 2008, 14:00
|- - alux   Цитата(GetSmart @ Jun 7 2008, 17:00) Нуже...   Jun 7 2008, 15:55
- - GetSmart   Вызов функции деления до сих пор присутствует. Ещ...   Jun 7 2008, 17:55
|- - alux   Цитата(GetSmart @ Jun 7 2008, 20:55) Вызо...   Jun 7 2008, 21:09
- - GetSmart   Тогда выкладывайте HEX-файл. Функция деления - она...   Jun 7 2008, 21:48
|- - alux   Цитата(GetSmart @ Jun 8 2008, 00:48) Тогд...   Jun 7 2008, 23:21
|- - sKWO   Цитата(alux @ Jun 8 2008, 03:21) Выкладыв...   Jun 8 2008, 19:36
|- - alux   Цитата(sKWO @ Jun 8 2008, 22:36) Если я е...   Jun 9 2008, 08:18
- - GetSmart   Так и не понял косяк. Со стеком не может быть проб...   Jun 8 2008, 09:49
|- - alux   Цитата(GetSmart @ Jun 8 2008, 12:49) Каже...   Jun 8 2008, 19:29
- - GetSmart   Ещё как вариант, нужно сравнить два листинга с про...   Jun 8 2008, 21:53
- - alux   Этот глюк выпил достаточно моей крови... Решил д...   Jun 11 2008, 15:03
- - GetSmart   Цитата(alux)Так как в отдельный момент времени в п...   Jun 11 2008, 23:15
|- - alux   Цитата(GetSmart @ Jun 12 2008, 02:15) Кла...   Jun 12 2008, 06:30
|- - alux   Цитата(GetSmart @ Jun 12 2008, 14:10) Что...   Jun 12 2008, 11:31
- - alux   ...И вновь продолжается бой. Ребята, извините, п...   Jun 13 2008, 08:04
|- - sKWO   Цитата(alux @ Jun 13 2008, 12:04) Код els...   Jun 13 2008, 08:57
|- - GetSmart   Цитата(alux @ Jun 13 2008, 14:04) Код#ifd...   Jun 13 2008, 17:42
|- - alux   Цитата(GetSmart @ Jun 13 2008, 20:42) Ран...   Jun 13 2008, 18:45
- - alux   Код// Alternation key code #define ALTKEY 26 /...   Jun 13 2008, 09:39
- - defunct   зато теперь у вас 1. целая коллекция рабочих и н...   Jul 5 2008, 23:42
|- - alux   Вот еще один пример до кучи. Вариация на тему ...   Jul 10 2008, 16:22
- - sensor_ua   Тогда ещё один вариант Код //Regra de Zeller unsig...   Jul 12 2008, 04:56
- - GetSmart   Цитата(sensor_ua)Кодreturn( nWDay < 0 ? ...   Jul 12 2008, 10:32
- - sensor_ua   ЦитатаМожно я упрощу? это к автору - Regra de Zell...   Jul 12 2008, 10:45


Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 01:27
Рейтинг@Mail.ru


Страница сгенерированна за 0.01347 секунд с 7
ELECTRONIX ©2004-2016