Поклонники продукции Microchip Technology Inc тусуются тут.
Вт окт 20, 2020 13:31:58
NStorm, спасибо. Дизасму включил. Камень pic10f322, это я реализовал контроллер управления питанием от Li-ion, который включает/выключает нагрузку от нажатия кнопки на 15 минут (с автоотключением), или без автоотключения в зависимости от положения перемычки. Так же идет предупреждение звуковым сигналом, если напряжение на АКБ меньше 3,2В, или отключение при напряжении на АКБ менее 3В.
По поводу:
1. Так как это контроллер управления питанием, то он всегда подключен к банке АКБ, поэтому единоразовая проверка(во время инициализации регистров) не подходит поэтому проверка в коде программы, и режимы работы легко меняются в активном состоянии. Хотя раньше я делал в ассемблере, как Вы советуете.
2. А как кнопка может тормознуть программу? Опрос кнопки идет на определенном участке программы, а прерывания отключены в основном цикле программы, и вкл только на период сна
3. Так с конца программы после звукового сигнала отключения итак идет переход на начало (после Power_Off) на while (1) и контроллер уходит в спячку.
Насчет безGOTOвых переходов еще потренируюсь писать программы, чтобы обойтись без них.
Вт окт 20, 2020 13:56:01
2. Ну вас в коде одна проверка: "if (!TK) // если кнопка нажата - подаем короткий звуковой сигнал" внутри сразу уже в любом случае происходит сигнал, после которого ожидание 999мс. Вот тут и тормозится.
3. return в c - выход из функции. Из main() значит завершение программы. Не уверен, как код генерит xc8, но в avr-gcc насколько я помню в этом случае проиходит переход ко встроенной функции exit(), где просто крутится бесконечный цикл. Надо будет глянуть что xc8 выдает при return'e из main().
Вт окт 20, 2020 14:10:12
3. Глянул в дизасм, там нормальный переход GOTO 0x12B на начало программы, после чего сон)
- Код:
143: PWM1EN = 0; // выкл ШИМ
01F6 1396 BCF PWM1CON, 0x7
144: LED = 0; // отключаем питание
01F7 1105 BCF PORTA, 0x2
01F8 292B GOTO 0x12B
145: }
146: return;
147:
148: }
2. Точно, 2 проверки состояния кнопки. Короткое нажатие просто сбрасывает таймер ожидания и подает звуковой сигнал (чтобы устройство не отключилось). Длинное нажатие более 1 сек подает сначала короткий звуковой сигнал, а потом двухтональный сигнал отключения и спячка
Вт окт 20, 2020 14:12:26
Глянул выхлоп xc8 - понятно, он инициализацию пихает в конец, а return из main() реально возвращается в конец инициализации этой, на последней адрес во флэш памяти. Тем самым прокручивая PC обратно до 0. Но как-то это неправильно с точки зрения Си. Это не на while(1) прыжок обратно, а всей программы сначала. Все переменные будут переинициализированы.
Кстати полный дизасм еще генерится в каталоге с проектом в подкаталоге dist/default/TARGET/PROJECT.lst
Вт окт 20, 2020 14:15:38
Да нет, именно на while(1) прыгает.
- Код:
47: while (1)
48: {
49: PWM1CON = 0b00000000; // отключаем ШИМ1
012B 0196 CLRF PWM1CON
50: FVRCON = 0b00000000; // отключаем ИОН, отключаем температурный индикатор
012C 019D CLRF FVRCON
Вт окт 20, 2020 14:19:19
3. В общем всё-равно на МК в общем принципе для портабельности лучше избегать return из main().
2. Ну если вам тут не важно, что нажатие кнопки даже короткое по сути откладывает измерение АЦП на секунду, то можно и так конечно оставить.
Да нет, именно на while(1) прыгает.
Это видимо оптимизатор постарался. Вообще в целом return из main() в embedded зависит от компилятора.
Вт окт 20, 2020 14:37:12
Вообщем СИ и МПЛАБ Х вещь, раньше сидел на Асме, и не знаю сколько бы у меня ушло времени на написание аналогичной программы, где куча программных таймеров связанных между собой. А вышеуказанную программу написал менее чем за день с учетом того, что раньше не имел опыта написания программ на СИ (мигание светодиода не в счет).
Еще конфигурируемые логические ячейки довольно забавная вещь.
https://habr.com/ru/post/372509/ Я проверил - работает, но правда ног у 10f322 очень мало. Закажу МК, где ног побольше для экспериментов. Можно будет например аппаратные подавители дребезга контактов кнопки/энкодера делать...
Вт окт 20, 2020 15:24:40
4uvak, всё-таки это не программные таймеры, а просто задержки. Но в остальном вы правы, на Си куда проще многие штуки делаются. Но надо учиться абстрагироваться от асма, тут так в лоб не надо. Я даже не о сложных абстракциях, которые можно делать в Си, а просто хотя бы к базовым вещами привакать - не надо "переходить", надо вызывать функции. А потом еще привыкаем к тому, что у функций бывают аргументы и возвращаемое значение.
Вт окт 20, 2020 16:14:15
у функций бывают аргументы и возвращаемое значение.
Прямого отношения к Си это не имеет. На АСМе совершенно так же делаются вызовы, в подпрограмму передаются значения и подпрограмма возвращает значение.
Тут дело не в языке, а в мышлении. В способности генерировать абстракции вообще, а не потому, что так требует язык.
Кстати, код написанный на АСМе в стиле языка высокого уровня не намного более объёмен нежели в ЯВУ.
Вт окт 20, 2020 18:29:58
Прямого отношения к Си это не имеет. На АСМе совершенно так же делаются вызовы, в подпрограмму передаются значения и подпрограмма возвращает значение.
Тут дело не в языке, а в мышлении. В способности генерировать абстракции вообще, а не потому, что так требует язык.
Без сомнения. Но обычно на асме более прямолинейно всегда пишут. ЯВУ всё-таки более располагает к большему уровню абстракции
Кстати, код написанный на АСМе в стиле языка высокого уровня не намного более объёмен нежели в ЯВУ.
Смотря какой уровень сложности программы и владения ЯВУ. Структуры в Си, например, очень сильно могу сократить объем и наглядность кода. Да и портабельность с ЯВУ проще - перейти с одной архитектуры на другую с ЯВУ попроще - не надо набор инструкций на низком уровне изучать и "привыкать" к ним. Но я не хочу разводить холивар на этом месте. Везде свои преимущества. Оптимизация под архитектуру на асме ес-но возможна такая, которой ни один оптимизатор ЯВУ не сможет.
Ср окт 21, 2020 15:05:46
Подскажите как начать цикл заново не используя команду перехода по меткам GOTO? Компилятор XC8
Ср окт 21, 2020 15:10:06
Подскажите как
Вы лучше сформулируйте задачу.
Вместо goto нужно оформить цикл while с условием или без него - бесконечный цикл:
- Код:
while(1) {
// тут содержимое цикла
}
Ср окт 21, 2020 15:20:18
Это начало основного цикла while (1), по условиям ложного срабатывания (контроллер чувствителен к помехам по цепям питания) и он ложно может выйти из сна через прерывание. Поэтому я добавил строку с проверкой срабатывания кнопки после сна. Если кнопка не нажата нужно повторно отправиться спать. Я организовал команду перехода через goto qwe. Есть другой способ начать цикл заново?
- Код:
while (1)
{
qwe:
PWM1CON = 0b00000000; // отключаем ШИМ1
FVRCON = 0b00000000; // отключаем ИОН, отключаем температурный индикатор
ADCON = 0b00000000; // отключаем модуль АЦП
PORTA = 0; // все выходы порта переводим в низкое состояние
__delay_ms(500);
IOCIE = 1; // разрешаем прерывание по изменению уровня PORTA
IOCAF = 0; // сбрасываем флаг IOCAF (свидетельствующий о прерывании RA3)
SWDTEN = 0; // отключаем сторожевой таймер на период сна
SLEEP(); // здоровый крепкий сон до пробуждения нажатием кнопки)
IOCIE = 0; // запрет прерывания по изменению уровня PORTA
SWDTEN = 1; // включаем сторожевой таймер
__delay_ms(50);
if (TK) // если кнопка отжата - было ложное страбатывание прерывания (из-за помех по цепям питания), отправляемся повторно спать
{
goto qwe;
}
CLRWDT();
LED = 1; // включаем питание
Ср окт 21, 2020 15:29:12
Тогда так:
- Код:
while(1){
// тут какой то код перед началом ожидания кнопки
while(условие не нажатой кнопки){
// тут код пока кнопка не нажата
}
// тут код после нажатой кнопки
}
Ср окт 21, 2020 16:01:05
4uvak, я вам дал на прошлой странице пример с функциями. Просто вынесите выключение и сон в отдельную функцию и вызывайте её в данном случае. А после неё можно как у вас сделать return (уже из main()), чтобы "перезапуститься".
Еще лучше - начинать переходить к конечному автомату. Если писать сразу так, то все эти переходы между состояниями легче расширяются и обрабатываются.
Вот простенький относительно пример:
https://github.com/N-Storm/flashlight/b ... ashlight.cЭто я делал для фонарика прошивку на замен штатному китайскому МК на базе PIC10F200 - самый простой и примитивный МК пожалуй в мире из ныне выпускающихся. У него нет прерываний. Поэтому с некоторыми вещами пришлось "извращаться" и очень мало памяти, чтобы сделать красивее. Но оно работает. ) Вот выключение сделано в функции enter_sleep(), которая всё выключает и отправляет МК в сон, как вам нужно.
С нажатием кнопки тоже посмотрите как сделано. Точно также лучше просто в основном цикле если нажата кнопка - увеличиваем некую переменную счетчик. А если отжата - проверяем значение счетчика и тут понятно что у нас было - короткое нажатие, длинное или просто дребезг.
Но если хотите "простыней", то что мешает вместо if (TK) goto qwe; написать:
- Код:
IOCIE = 0; // запрет прерывания по изменению уровня PORTA
SWDTEN = 1; // включаем сторожевой таймер
__delay_ms(50);
if (!TK) // если кнопка нажата
{
CLRWDT();
LED = 1; // включаем питание
...
}
// qwe:
...
Чт окт 22, 2020 07:52:20
оператор continue немедленно осуществляет переход к проверке условия продолжения цикла (внутри которого находится этот оператор) - это 100% то самое, что вам нужно для замены goto
Вт ноя 10, 2020 16:35:08
Всем добрый день, я в программировании не понимаю, нужна прошивка для pic12f675 или pic12f629 для датчика скорости одометра вектра б, в мплаб пробовал компилировать исходники и постоянно выбрасывает ошибки, прошу вашей помощи.
- Вложения
-
- main.c
- (3.96 KiB) Скачиваний: 285
Вт ноя 10, 2020 16:43:23
igorua27, какой у вас компилятор, какая версия mplab?
Добавлено after 1 minute 2 seconds:
Вангую, что у вас стоит XC8. А прошивка написана под HI-TECH PICC.
Вт ноя 10, 2020 16:57:06
mplab x ide v5.45 компилятор XC8. А как переписать под XC8? Что нужно изменить?
Вт ноя 10, 2020 17:10:16
igorua27, а под XC8 она не соберется, т.к. в бесплатной версии плохая оптимизация и по месту из-за float операций не влезет. Если найдете PRO версию, то вот так переделать:
Вам частоту импульсов нужно умножить на некий коэф? Какой будет коэф у вас ?
Powered by phpBB © phpBB Group.
phpBB Mobile / SEO by Artodia.