[uquote="4uvak",url="/forum/viewtopic.php?p=3909568#p3909568"]А как в MPLAB X посмотреть дизасм? Компилятор XC8. Версии MPLAB X и компилятора последние.[/uquote]
Включить отладку (можно через симулятор), потом Window->Debugging->Disassembly
Добавлено after 25 minutes 22 seconds:
4uvak, напишите модель МК для кода, так проверить удобнее будет собрав исходник.
Добавлено after 2 minutes 56 seconds:
Вообще конечно видно, что переход был с асма ) Стилистика осталась в асм стиле. Вместо меток лучше в виде функций оформить. Да и вообще в Си метки почти никогда не нужны.
Добавлено after 23 minutes 7 seconds:
Чисто в плане избавления от ненужных меток:
Спойлер
Код: Выделить всё
void init() {
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; // включаем сторожевой таймер
}
void power_on() {
LED = 1; // включаем питание
PWM1CON = 0b11000000; // вкл ШИМ для двухтонального сигнала включения
TMR2 = 0; // сброс TMR2 для исключения пауз между тонами
PR2 = 10; // первый тон сигнала включения ~ 700 Гц
PWM1DCH = 5; // -//-
__delay_ms(111);
TMR2 = 0; // сброс TMR2 для исключения пауз между тонами
PR2 = 6; // второй тон сигнала включения ~ 1,1 кГц
PWM1DCH = 3; // -//-
__delay_ms(111);
PWM1CON = 0b01000000; // выкл ШИМ
FVRCON = 0b10000001; // включаем ИОН 1,024V, отключаем температурный индикатор
ADCON = 0b00011101; // включаем модуль АЦП, FVR вход (фиксированное опорное напряжение), FOSC/2
}
void power_off() {
PWM1EN = 1; // вкл ШИМ для двухтонального сигнала выключения
TMR2 = 0; // сброс TMR2 для исключения пауз между тонами
PR2 = 6; // первый тон ~ 1,1 кГц
PWM1DCH = 3; // -//-
__delay_ms(111);
TMR2 = 0; // сброс TMR2 для исключения пауз между тонами
PR2 = 10; // второй тон ~ 700 Гц
PWM1DCH = 5; // -//-
__delay_ms(111);
PWM1EN = 0; // выкл ШИМ
LED = 0; // отключаем питание
}
void main(void) {
init();
power_on();
CLRWDT();
while (1) {
for (n = 0; n <= 15000; n++) // время работы основного цикла программы, где 1000n соответствует ~ 1 минуте работы (максимальный n=65535, ТЕ 65мин)
{
if (!TK1) // если перемычка на 0, то бесконечный режим работы (без таймера))
{
n = 0;
}
CLRWDT();
__delay_ms(52);
if (!TK) // если кнопка нажата - подаем короткий звуковой сигнал
{
PWM1EN = 1; // вкл ШИМ звукового сигнала нажатия кнопки
__delay_ms(55);
PWM1EN = 0;
__delay_ms(999);
if (!TK) // если кнопка нажата более 1 сек - отключаем питание
{
power_off();
return;
} else // если кнопка нажата менее 1 сек - обнуляем таймер ожидания
{
break;
}
}
GO_nDONE = 1; //начать преобразование АЦП
while (GO_nDONE); //ожидание окончания преобразования АЦП
if (ADRES > 86) //если U ниже 3.0В выключаем питание
{
power_off();
return;
} else {
if (ADRES > 80) //если U ниже 3.3В включим двойной предупредительный звуковой сигнал о низком заряде АКБ, который повторяется каждые 15с
{
if (i < 2) {
PWM1EN = 1; // вкл ШИМ для предупредительного звукового сигнала
__delay_ms(55);
PWM1EN = 0; // выкл ШИМ
__delay_ms(33);
}
i++;
}
}
if (n == 14000) // вкл предупредительный 4-хкратный звуковой сигнал, предупреждающий о отключении питания, где 1000n соответствует ~ 1 минуте работы (максимальный n=65535, ТЕ 65мин)
{
for (m = 0; m <= 3; m++) {
PWM1EN = 1; // вкл ШИМ для предупредительного звукового сигнала
__delay_ms(155);
PWM1EN = 0; // выкл ШИМ
__delay_ms(77);
}
}
}
return;
}
}
Что еще я бы улучшил, но уже безотносительно перехода с асма:
1. Мне не нравится сброс n каждый раз в случае перемычки. Обычно перемычку на работающем ус-ве не меняют. Поэтому обычно значение перемычки считается только один раз. А дальше я бы просто сделал бы бесконечный цикл, где n приращивалось бы или нет.
2. Нажатие кнопки проверяется разово. При этом ожидание и замеры АЦП останавливаются. Дребезгом или дрочением кнопки можно тормознуть выполнение другого участка кода.
3. Вместо перехода на конец программы, где просто будет бесконечный цикл ничего не делания крутится, я бы в конце power_off() в спящий режим бы уходил бы постоянный.