Форум программистов, компьютерный форум, киберфорум
Наши страницы
Электроника для начинающих
Войти
Регистрация
Восстановить пароль
 
PRS
0 / 0 / 0
Регистрация: 12.07.2011
Сообщений: 3
#1

MicroC - тупой компилятор? - Электроника

20.09.2010, 01:29. Просмотров 11585. Ответов 18
Метки нет (Все метки)

Погнавшись, в очередной раз, за халявным сыром или точнее библиотеками, решил использовать широко разрекламированный микроС. Библиотеки действительно есть, даже работают. Что для нормальной работы библиотеки HD44780 потребовался вывод строки перед его использованием в прерывании - это ладно. Но почему этот код не работает, если если он вызывается в прерывании, и нормально работает при обычных вызовах я не понимаю.
Код
void Lamp_Status(void)
{
int stort_time,end_time,time;
stort_time=Start_Hour*60 + Start_Minute;
end_time=End_Hour*60 + End_Minute;
time=Hour*60 + Minute;
if(time<stort_time || time>end_time )
{
LCD_Chr(1, 1,  );
PORTB=0;
}
else
{
LCD_Chr(1, 1, 1);
PORTB=0x80;
}
}
Изначально stort_time и end_time вычислялись заранее и берутся из глобальных переменных.
Кратко суть программы - есть mega88, к ней на аппаратный TWI привязан DS1307, так же к ней приделан индикатор на HD44780. Все девайсы подключены с помощью включенных библиотек. Прерывание на INT0 вызывается раз в секунду по фронту с DS. В прерывании, через функцию Lamp_Status проверяется пора выключать или нет лампу. В результате если вызов функции есть в прерывании, то она или циклится или работает херово, т.е. неправильно. Если вызов из прерывания убрать, то работает все правильно. Динные из DS перед использованием переводятся из BCD в нормальный вид с помощью Bcd2Dec16.
Теперь главный вопрос - кто балбес? Я или компилятор.
http://www.cyberforum.ru/electronics-beginners/thread2103825.html


[40.41 Кб]
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.09.2010, 01:29
Я подобрал для вас темы с готовыми решениями и ответами на вопрос MicroC - тупой компилятор? (Электроника):

Дико тупой вопрос)))
Наверняка мне счас натыкают носом в мое же))) Но тем не менее)) У меня RGB...

Тупой вопрос про сварочный полуавтомат
Извиняюсь заранее за глупый вопрос.. Если в полуавтомате катушка с проволокой...

Ребята простите за тупой вопрос начинающего )
Я так и не смог найти куда написать свой вопрос. Отзовитесь кто знает. Спасибо....

Тупой вопрос про преобразователь напряжения и конденсатор.
Объясните такую вещь. Стандартная схема DC -DC Источник напряжения 5В может...

Тупой вопрос про перевод числа в строку
Собственно вот натолкнулся на грабли есть u32 val = 0x 00 FF FF FF Нужно...

18
DY HOTT
0 / 0 / 0
Регистрация: 22.01.2010
Сообщений: 4,000
20.09.2010, 02:25 #2
Может потому что задержки на прерываниях решает?
0
PRS
0 / 0 / 0
Регистрация: 12.07.2011
Сообщений: 3
20.09.2010, 10:26 #3
Нет. Вызываю ее из main для проверки. Если вызов функции есть в прерывании, то она не работает. Стоит вызов убрать, так сразу все начинает работать. Пробовал перенести ее в прерывание - не помогает.
0
Brykodyr
0 / 0 / 0
Регистрация: 16.08.2010
Сообщений: 1,326
20.09.2010, 12:32 #4
Цитата Сообщение от PRS
Нет. Вызываю ее из main для проверки. Если вызов функции есть в прерывании, то она не работает. Стоит вызов убрать, так сразу все начинает работать. Пробовал перенести ее в прерывание - не помогает.
Попробуй запрещать прерывания при входе в функцию и разрешать при выходе
0
PRS
0 / 0 / 0
Регистрация: 12.07.2011
Сообщений: 3
20.09.2010, 12:36 #5
Цитата Сообщение от Brykodyr
Цитата Сообщение от PRS
Нет. Вызываю ее из main для проверки. Если вызов функции есть в прерывании, то она не работает. Стоит вызов убрать, так сразу все начинает работать. Пробовал перенести ее в прерывание - не помогает.
Попробуй запрещать прерывания при входе в функцию и разрешать при выходе
Она в отладчике не работает. Похоже клинит компилятор. Все работает правильно пока ее вызова нет в прерывании. Стоит закоментировать вызов и все работает.
Код
void Int0_ISR() org IVT_ADDR_INT0
{
unsykned char date,month,year;
// Тут идет чтение из DS времени и даты
// Перевод из BCD
Hour=Bcd2Dec16(Hour);
Minute=Bcd2Dec16(Minute);

Batt_Status();
Lamp_Status();
}
Вот обрезок прерывания. Если Lamp_Status(); убрать, то все работает.
0
Brykodyr
0 / 0 / 0
Регистрация: 16.08.2010
Сообщений: 1,326
20.09.2010, 14:00 #6
А вот это зачем:
PORTB=0;
PORTB=0х80?
0
vsim_spot
0 / 0 / 0
Регистрация: 17.09.2010
Сообщений: 22
20.09.2010, 14:01 #7
В прерывании лучше флагами рулить и не засиживаться.

Прерывание должно быть коротким как ТОСТ !
0
tyx
0 / 0 / 0
Регистрация: 18.10.2006
Сообщений: 547
20.09.2010, 14:04 #8
Цитата Сообщение от Brykodyr
А вот это зачем:
PORTB=0;
PORTB=0х80?
очевидно же. включение/выключение лампы.
0
Brykodyr
0 / 0 / 0
Регистрация: 16.08.2010
Сообщений: 1,326
20.09.2010, 14:10 #9
Цитата Сообщение от tyx
очевидно же. включение/выключение лампы.
Не ну я просто смотрю в код, а там:
Код
// LCD module connections
sbit LCD_RS at PORTB0_bit;
sbit LCD_EN at PORTB1_bit;
sbit LCD_D4 at PORTC0_bit;
sbit LCD_D5 at PORTC1_bit;
sbit LCD_D6 at PORTC2_bit;
sbit LCD_D7 at PORTC3_bit;
sbit LCD_RS_Dyristion at DDB0_bit;
sbit LCD_EM_Dyristion at DDB1_bit;
sbit LCD_D4_Dyristion at DDC0_bit;
sbit LCD_D5_Dyristion at DDC1_bit;
sbit LCD_D6_Dyristion at DDC2_bit;
sbit LCD_D7_Dyristion at DDC3_bit;
0
PRS
0 / 0 / 0
Регистрация: 12.07.2011
Сообщений: 3
20.09.2010, 14:10 #10
Цитата Сообщение от Brykodyr
А вот это зачем:
PORTB=0;
PORTB=0х80?
Это так, временно было. Посмотреть дергаются ножки или нет.

Цитата Сообщение от vsim_spot
В прерывании лучше флагами рулить и не засиживаться.
Прерывание должно быть коротким как ТОСТ !
У меня вся работа идет в прерывании, вызывающиеся раз в секунду. Основной цикл выглядит у меня так:
Код
while(1)
{
asm{sleep};
}
В итоге помогло вынести вычисление time=Hour*60 + Minute; за пределы подпрограммы. Вычисление stort_timе и end_timе и так будет считаться заранее. Полный идиотизм.
0
Brykodyr
0 / 0 / 0
Регистрация: 16.08.2010
Сообщений: 1,326
20.09.2010, 14:13 #11
У меня вся работа идет в прерывании, вызывающиеся раз в секунду.
А что мешает прочитать ДС-ку в прерывании, а в главном цикле вычислять и на дисплей отправлять?
0
PRS
0 / 0 / 0
Регистрация: 12.07.2011
Сообщений: 3
20.09.2010, 14:24 #12
Цитата Сообщение от Brykodyr
У меня вся работа идет в прерывании, вызывающиеся раз в секунду.
А что мешает прочитать ДС-ку в прерывании, а в главном цикле вычислять и на дисплей отправлять?
Ничего:)
В принципе в прерывании можно вообще ничего не делать, а в тупую пробуждать контролер по нему. Пока так оставлю.
0
vsim_spot
0 / 0 / 0
Регистрация: 17.09.2010
Сообщений: 22
20.09.2010, 14:28 #13
Цитата Сообщение от PRS
У меня вся работа идет в прерывании, вызывающиеся раз в секунду. Основной цикл выглядит у меня так:
Код:
while(1)
{
asm{sleep};
}

можно так попробовать

Код
while(1)
{
if (flag){ вызов твоей функции }
else {в сон до прерывания}
}
Нафига только сон этот ?
0
PRS
0 / 0 / 0
Регистрация: 12.07.2011
Сообщений: 3
20.09.2010, 14:36 #14
Для снижения потребления электроэнергии в мире:) Хотя можно конечно и число p вычислять.
0
omx
0 / 0 / 0
Регистрация: 11.11.2016
20.09.2010, 14:51 #15
если хотите разобраться в чём дело: дизассемблер в вам в руки, для реверс инжиниринга использования прерываний при работе этой библиотеки.
0
PRS
0 / 0 / 0
Регистрация: 12.07.2011
Сообщений: 3
20.09.2010, 15:17 #16
Цитата Сообщение от omx
если хотите разобраться в чём дело: дизассемблер в вам в руки, для реверс инжиниринга использования прерываний при работе этой библиотеки.
А смысл? В определенных случаях компилятор дает неверный код. Причем зависит это от фазы луны.
И что изменится, если я увижу, как в ассемблерном коде идет переход в никуда?
0
vsim_spot
0 / 0 / 0
Регистрация: 17.09.2010
Сообщений: 22
20.09.2010, 15:38 #17
В MikroC вроде есть режим отображения Си кода совместно с реализацией на АСМ.
0
Ymk
0 / 0 / 0
Регистрация: 18.03.2010
Сообщений: 2,233
20.09.2010, 18:40 #18
Цитата Сообщение от PRS
И что изменится, если я увижу, как в ассемблерном коде идет переход в никуда?
как минимум будете точно знать, что:
1. это ТОЧНО ошибка компилера
2. что в следующий раз ожидать от компилера и где
3. а может это не бага, а фича

ну и народу расскажете. большой косяк в компиляторе я видел только один раз: 32бит long при сдвиге сдвигалось только 16 бит... но это было давно и неправда. мелкие косяки тоже бывают (например, приоритет операций), но не часто. а вот чтобы переход вникуда...
0
swk
0 / 0 / 0
Регистрация: 22.10.2015
20.09.2010, 18:48 #19
Компилятор за человека думать не будет. Он может только обнаружить явные ошибки, и то не все. За логикой работы программы он следить не обязан. Что программист напишет - то и получит. Особенно в C. (Там изначально было больше вольностей, чем в Паскале). Если что-то не так - чем гадать, лучше глянуть листинг после компиляции, там все на голом Асме расписано, с привязкой к исходному тексту.
Возможны, конечно, и глюки компилятора, - обычно лечится обновлением версии. Например, у меня МикроПаскаль Про для PIC версии 2.15 (с краком) некорректно обрабатывал обращения к банкам, если основная фукнкция программы (main) уходила из первого банка в другие. Причем это получалось только при загрузке программы через бутлоадер - переносился переход с адреса 0000 на адрес загрузки из бутлоадера без команды переключения банков. Причем при прошивке через программатор все работало нормально. Заменил версию на 3.20 (была давно, но небыло кряка), поставил кряк - все работает нормально, хоть всю память забей. А в истории версий обнаружил сообщение, что как раз в 2.15 была замечена некорректная работа с банками, в дальнейшем исправленная. Вообще же мне компиляторы для PIC от Микроэлектроники как раз тем и нравятся, что про банки в них думать совершенно не надо. Компилятор все берет на себя. Ну, и многое другое, конечно...

А совать всю обработку в обработчик прерывания - это всегда считалось как бы дурным тоном. Разве что если программка уж совсем простая... Обычно стараются по минимуму. И тем более надо следить, чтобы не затрагивались функции и переменные, используемые в основной программе, или принимать меры для корректной обработки таких ситуаций. Часто профилактика оказывается проще, чем лечение болезней...

Если же считаете компилятор MicroC тупым - никто вам не мешает использовать любой другой. Их имеется достаточно много.
0
20.09.2010, 18:48
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.09.2010, 18:48
Привет! Вот еще темы с решениями:

Как включить светодиоды полевым транзистором (тупой вопрос)
Подскажите мне, как бы идеально-правильно все сделать, а то я что-то туплю: ...

как прикрутить компилятор к гуе
есть code sourcery c поставленным istypsi и голый code sourcery lite, к...

Компилятор MicroC PRO для PIC
Привет всем ! Кто работает в MicroC PRO V5.40 для PIC откликнитесь !...

Вопрос по microC
Начал осваивать компилятор microC. Затруднений особых не было. Прочитав...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru