Перейти к содержанию
    

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

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

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

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

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

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

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Изменено пользователем Oymyacon

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

2 hours ago, Oymyacon said:

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, Herz сказал:

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

18 hours ago, Herz said:

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

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

17 hours ago, Tanya said:

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

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

Изменено пользователем Oymyacon

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

16 hours ago, Oymyacon said:

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

 

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

22 часа назад, Tanya сказал:

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 hours ago, Herz said:

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Гость
Эта тема закрыта для публикации ответов.
×
×
  • Создать...