Jump to content

    

Странное поведение компиллятора MicroC PRO for PIC

Странная история... Пришел старый клиент и попросил добавить в устройство на PIC16F887 еще один датчик температуры и влажности типа DHT22 (am2302). Датчик подсоединяется однопроводным интерфейсом.

Пишем модификацию программы (работающей). Добавляем масочный массив (из двух, но на будущее) из единиц в нужном месте для управления ножками и TRIS-регистром. 

Получаем данные только от первого датчика... НО. Программа не зависает и отдает управление...Смотрим осциллографом. Оба датчика исправно инициализируются, но данные идут только с первого. Ищем бесплодно ошибку пару дней с бубнами...

Ну... отбросим ложную красоту лаконичности... Копируем старую подпрограмму, прописывая явно ножки с новым именем.

Опять 25... Вторая не работает. В структуре проекта все функции прописаны, все нормально. Смотрим листинг - там пусто.

Достаем бубны... Переписываем вторую программу в основной файл (с main). Без изменений. Убираем до нуля уровень оптимизации - ничего не меняется... Вот собираюсь реле поставить. Очень смешно. Датчики оба нормальные. Меняем - работает только на одной ножке.

 

Share this post


Link to post
Share on other sites

На таком убогом микроконтроллере нужно ассемблер использовать. Прочитайте залитый код и дизассемблируйте стартовую инициализацииию и проверьте состояние всех регистров, а не только TRIS. Ну и, разумеется, подпрограмму, работающую с датчиками. Можно на симуляторе MPLAB погонять. Не всем компиляторам можно доверять.

 

Edited by Oymyacon

Share this post


Link to post
Share on other sites

То есть, если работать не с функцией, а прямо в теле основной программы прописать два идентичных куска кода, отличающихся только указанием ножки контроллера, то один кусок компилируется, а второй игнорируется? А если поочерёдно перед компиляцией "закомментировать" то один кусок, то другой, что будет?

Я бы в самом деле попробовал другой компилятор. Такие чудеса и мне встречались.

2 hours ago, Oymyacon said:

На таком убогом микроконтроллере нужно ассемблер использовать.

Ну, утрировать не надо. После Кортексов, конечно, разбалованным программистам уже и не контроллер... Но ничего не мешает писать для наго на С. Всякие плюсы и шарпы не будем обсуждать.

Share this post


Link to post
Share on other sites
1 час назад, Herz сказал:

То есть, если работать не с функцией, а прямо в теле основной программы прописать два идентичных куска кода, отличающихся только указанием ножки контроллера, то один кусок компилируется, а второй игнорируется?

Не знаю как на PIC-е, но на ARM я, на месте компилятора, создал бы одну единственную функцию. Но в качестве аргумента добавил бы ей указатель на периферийный регистр управления этой ногой. И вызывал бы её с разными аргументами для двух разных ног.  :wink:

PS: Я даже видел такой способ оптимизации со стороны не помню какого компилятора. Причём такая передача аргумента может быть реализована вообще нестандартно - не как обычно по соглашениям вызова аргументы в функции передаются (если обе функции локальные).

Share this post


Link to post
Share on other sites

Начиналось-то именно так вручную. Но в цикле, меняющем маску, срабатывало только один раз. Вот не пробовала вынести этот цикл наружу, сделав индекс маски аргументом... Бубнов ещё есть у меня, а нервы кончаются.

Другой компилятор - очень затратно. Работу с железом всю придется переделывать, - температура и влажность десятистепенной важности там.

Share this post


Link to post
Share on other sites
18 hours ago, Herz said:

Ну, утрировать не надо. После Кортексов, конечно, разбалованным программистам уже и не контроллер... Но ничего не мешает писать для наго на С.

Как видите - мешает. Уверяю вас, что не только то, что обсуждается. Си и PIC12/16 - две вещи несовместные. Ещё как-то на костылях - PIC18, да и то не для всяких задач.

17 hours ago, Tanya said:

  Другой компилятор - очень затратно. 

А он и не нужен. Всё, что Вам нужно: дизассемблер, MPLAB и научиться работать в вашем компиляторе с ассемблерными вставками. 0 рублей затрат, только время.

Edited by Oymyacon

Share this post


Link to post
Share on other sites

Время тоже кончается ...

Вопрос был в другом...

Share this post


Link to post
Share on other sites

Еще один датчик - это тупо копипаст такого же датчика, но висящего на другой ноге? Старый работает, а новый нет? Ок.

1. Инициализация портов для нового пина выполнена должным образом? После инициализации, другая периферия при настройке не затирает эту самую инициализацию?

2. Нет ли сторонних подпрограмм, работающих с этим же портом, например, какой-нибудь ISR, который может записывать порт целиком?

3. Ножка резистором подтянута к Vcc?

Share this post


Link to post
Share on other sites

У PIC ов куча функций на пинах. Где-то включается периферия, которая захватывает пин и не отдаёт его. Схему тоже давайте.

Share this post


Link to post
Share on other sites

Пауза между опросами датчиков есть (второй датчик не может отличить ответ первого он начала своего запроса)? Вставляем прямо огромную!

Share this post


Link to post
Share on other sites
16 hours ago, Oymyacon said:

Как видите - мешает. Уверяю вас, что не только то, что обсуждается. Си и PIC12/16 - две вещи несовместные. Ещё как-то на костылях - PIC18, да и то не для всяких задач.

 

Да бросьте Вы. Что значит "не для всяких задач"? Для всех задач, с которыми способен справиться мк из этих серий, написанный на С код работает, как и должен. Всё это уже миллион раз обсуждалось и подтверждалось на форумах, имеющих отношение к Микрочипу. Другое дело - глюки конкретного компилятора или криворукость самого программиста.

Или Вы мне покажете ограничения самого языка на работу с PIC12/16?

Share this post


Link to post
Share on other sites
22 часа назад, Tanya сказал:

Смотрим листинг - там пусто.

А компилятор бесплатный с ограничением размера кода?

Share this post


Link to post
Share on other sites
2 hours ago, Herz said:

Или Вы мне покажете ограничения самого языка на работу с PIC12/16?

Наоборот, убогие ассемблер и архитектура PIC12/16 не располагает к оптимальной компиляции Си, поэтому программирование именно этих семейств на ассемблере оптимальнее и корректнее, даёт более сжатый код. А после Си одни переключения банков заметную долю кода занимают. Про умножение и деление вообще молчу. Например, умножение на константу проще сделать в ассемблере.

Share this post


Link to post
Share on other sites
Guest
This topic is now closed to further replies.
Sign in to follow this