Страница 1 из 1

2 Проекта порознь работают, вместе никак. Всю голову сломал

Добавлено: Пн июл 21, 2008 21:55:25
megasvintus
В архиве 2 проекта в CVAVR,

1) В папке "Digit_display" функция для отображения любого числа на 7 сегментном индикаторе динамическим способом.
Число вносится в переменную "indication" и прекрасно отображается.

2) В папке "RC5_only code" функция- декодер сигнала с пульта-
тоже отлично работает (отдельное спасибо Aheir -у)

в оставшейся папке попытка их объединить.
Сначала пробовал в декодер RC5 внести функции заполнения массива числами и отрисовки дисплее в виде отдельных функций.
Все что записано в обработчике прерываний-прекрасно исполняется, а дисплей просто пустой....
Если в тела функций заполнения массива числами и отображения вписать нечто простейшее, вроде зажечь 1 сегмент индикатора, или -другой--работает.
Вставляешь рабочий код обратно вместо только что работавшего простейшего --опять пустой дисплей :o

Пробовал в рабочую функцию декодирования и отображения чисел на дисплее (папка Digit_display) впихивать код декодера RC5, ессно инициализацию делал соответственно, ---тут уже дисплей работает, все отображает, а декодер RС5-нет. Даже в прерывание не заходит.

Полтергейст какой-то :shock: :shock: :shock:

Структура программы:
1) объявления переменных, массивов, вложения хидеров
2) обработчик прерываний INT0. куда подключен TSOP
3) обработчик прерывания по переполнению таймера
4) функция декодирования чисел-если число, пусть-28, то она
в 0-ой элемент массива пишет 8, в первый-2, во второй минус
5)так же отд. функция вывода этих элементов массива на индикатор


void main(void) {
инициализация МК
разрешение прерываний

while(1){
функция 4 ();
функция 5 ();
};
}

Так вот, если ничего другого не трогать вообще, а всего лишо в while(1) в тела функций 4 и 5, выше по тексту вписать нечто простейшее, то все работает как надо... А стоит вписать куски кода, работавшие в отд. проекте---глухо как в танке





Если кому не лень- укажите чайнику, что же происходит? С дебаггером сложно. Не знаю асм.

Добавлено: Пн июл 21, 2008 22:48:38
Krik99
Ну для начала можеш попробывать написать такой код который при 1 - зажигает светодиод1, при 2 - зажигает светодиод 2, и т.д... Если всё будет работать нормально, то значить код не совместимый, так как чудес в Си не бывает. :))

Добавлено: Пн июл 21, 2008 22:51:49
megasvintus
Так я же уже сказал в предисловии что вместо неработающих в данном случае кусков вставлял подобное-все работает.

:cry:

Добавлено: Пн июл 21, 2008 22:57:43
Krik99
Ну дак чего ты вципился именно за тот кусок индикации?! что самому написать или у когото подсмотреть код индикации никак? Да вот попробуй с таймером. Вот например http://avru.cwx.ru/viewtopic.php?t=16 (не подумайте что реклама)... :)

Добавлено: Пн июл 21, 2008 23:02:21
megasvintus
Да елки зелёные.... Код индикации я написал сам. интересно почему ОН , ИМЕННО ОН не работает и только ЗДЕСЬ...

Добавлено: Вт июл 22, 2008 01:22:31
Пухич
Поясни, зачем в функции risuem стоит условие для переменной aaa? И ее кстати, надо бы проинициализировать перед использованием.

И еще - есть ли уверенность в корректном применении всеми функциями программы одной и той же цикловой переменной i? Я вот думаю, что если прерывание прервет выполнение цикла в функции декодера например, то i после выхода из прерывания не восстановит своего "допрерывного" значения. Или я неправ?

Добавлено: Вт июл 22, 2008 06:39:22
megasvintus
1)Я тоже об этом думал. Делал переменные для всех, до единой, функций свои.
2)запрещал прерывание по переполнению таймера, оно срабатывает почти стазу при старте программы
3) не жал кнопку пульта секунд 30 сначала(не вызывая тем самым второе прерывание INT0)
4) перед всеми переменными перед объявление писал volatile

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

Выяснилось только одно- программа не исполняет ни одну функций для работы с индикотором. Ни декодер, ни функцию отображения

Добавлено: Вт июл 22, 2008 14:42:50
megasvintus
Получилось! Счастье есть :)))

Добавлено: Вт июл 22, 2008 17:34:36
Пухич
И в чем было дело?

Добавлено: Вт июл 22, 2008 23:03:39
megasvintus
Снял галку в свойствах проекта, где все переменные типа char принудительно делались unsigned, это раз. (я обычно снимаю ее, и всё объявляю вручную, а тут чего-то забыл)


Объявил все переменные и массивы в самом верху, ДО каких-либо функций и обработчиков прерываний. это два.
(Послушал вас)

И все заработало как надо. Кстати глобальные и внутрение переменные i не конфликтуют.

Доработал код: вы, Пухич, совершенно правильно подметили, что в функции risuem, if вообще не в тему.

Но мне кажется что такие перлы-нормально, ведь я всего месяц как с полного нуля изучаю МК и СИ, хотя уже все больше понимаю что написано в чужих исходниках. 8)

Когда я до начала плотного изучения всего этого заглянул в исходник функции-декодера RC5 от Аheirа, это было зимой, то подумал: во мрак... нииииичё не понятно. А сейчас кажется что это несложно. 8)

Добавлено: Ср июл 23, 2008 17:46:47
Aheir
Лиха беда - начало :) Вы еще сами потом удивитесь, что дальше будете творить...