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

XC8 не компилирует участок программы


Bugrim

Рекомендуемые сообщения

Добрый день. Проектирую часы с 2-я датчиками температуры. Снятие показаний, с записью в EEPROM, происходит каждый час. Питание - батарейки, поэтому стремимся к энергосбережению. Индикатор LCD 16х2. Подцветка запитуется от МК (PIC16F886) и при неактивном состоянии, кнопки на клавиатуре не нажаты, отключается. Кодом предусмотрен  SLEEP (ассемблерная вставка), который упорно не хочет компилироваться как мне хочется. По мне SLEEP должен выполнятся каждый раз если не установлен флаг "F_knopka", а он подписывается в условие  "if((F_power_on)&&(++chetchik_power==5))". Привожу часть кода основной цикл программы main. Может я что то не так записываю, уже запарился. Посмотрите свежим взглядом. За ранее благодарен.

 while (1)
{
     if (F_secunda)                 // F_secunda ustanavlivaetca po perepolneniyu TMR1
     {
         bila_secunda();            // p/p peresheta vremeni
     if (F_obnovlenie)              //obnovlenie dannix 1 raz v chas
         obnovlenie();              // p/p obnovlenie
         if (!F_statistika)         // ecli ne vibran regim prosmotra dannix
            ekran(0);               // p/p vivoda na ekran
     }
     if (F_knopka)                  //esli bila nagata knopka na klaviature
     {
         if(!F_power_on)            //esli podcvetka ne vkluchena
         {
             F_power_on=1;          //bit sostoyaniya podcvetki=1
             vivod_power_on=1;      //pin zapitki podcvetki=1
             //__delay_ms(1);
             //ekran(0);              // p/p vivoda na ekran
             
         }
         klava();                   //p/p obrabotki klaviaturi
     }
     else
     {
         if((F_power_on)&&(++chetchik_power==5)) //zadergka dla podcvetki
         {             
             F_power_on=0;                        //bit sostoyaniya podcvetki
             vivod_power_on=0;                    //pin zapitki podcvetki
             chetchik_power=0;
              
         }
         
        #asm
            sleep   //vixod iz sna po TMR1 1 raz v 4 cecundi
                    //ili po knopke klaviaturi
            nop
        #endasm
     }
     

}

 

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

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

ну для слипа есть стандартная команда хайтека SPEEP();

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

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

3 минуты назад, Alex сказал:

Ошибку покажите. И строку, на которую она указывает.
 

ошибку не выдает, не хочет по моему компилировать.

 раздел сейчас перечитаю

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

9 минут назад, Bugrim сказал:

не хочет по моему компилировать

Это как ? В дизасме не то ? Или что ?

 

Команда SLEEP() - это есть обычная АСМ-вставка :



#define	SLEEP()		asm("sleep")

Находится в "pic.h". Ничего нового...

Лучше поподробнее объясните, что не так у Вас компилируется. Ибо из Вашего текста ничего не понятно по проблеме.

 

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

Proteus, при симуляции, на нее не входит. И в реальном, пошаговом режиме (PICkit2) мимо нее.

Цитата

Это как ?

Прописывается в условие "if((F_power_on)&&(++chetchik_power==5))", а должен выполнятся не взирая на условие.

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

1 минуту назад, Bugrim сказал:

Прописывается в условие

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

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

Вот проект полностью.

А в общем руководстве п.26.4 никаких обязательств не нашел. Только рекомендации.

Работаю в MPLAB X IDE v3.50, XC8 (v1.33)

termometr.rar

Изменено пользователем Bugrim
Ссылка на комментарий
Поделиться на другие сайты

Что то я файла дизасма не нахожу. А тот, что в папке "disassembly" - это совсем не то, код там вообще другой какой-то...

Нашёл листинг :

   843                           ;termometr.c: 273: if (F_knopka)
   844  122C  1283               	bcf	3,5	;RP0=0, select bank0
   845  122D  1303               	bcf	3,6	;RP1=0, select bank0
   846  122E  1D21               	btfss	33,2	;volatile
   847  122F  2A3A               	goto	l161
   848                           
   849                           ;termometr.c: 274: {
   850                           ;termometr.c: 275: if(!F_power_on)
   851  1230  18A2               	btfsc	34,1	;volatile
   852  1231  2A34               	goto	l5658
   853                           
   854                           ;termometr.c: 276: {
   855                           ;termometr.c: 277: F_power_on=1;
   856  1232  14A2               	bsf	34,1	;volatile
   857                           
   858                           ;termometr.c: 278: RC2=1;
   859  1233  1507               	bsf	7,2	;volatile
   860  1234                     l5658:	
   861                           
   862                           ;termometr.c: 282: }
   863                           ;termometr.c: 283: klava();
   864  1234  120A  158A  2020  160A  118A  	fcall	_klava
   865                           
   866                           ;termometr.c: 284: }
   867  1239  2A11               	goto	l5640
   868  123A                     l161:	
   869                           
   870                           ;termometr.c: 285: else
   871                           ;termometr.c: 286: {
   872                           ;termometr.c: 287: if((F_power_on)&&(++chetchik_power==5))
   873  123A  1CA2               	btfss	34,1	;volatile
   874  123B  2A11               	goto	l5640
   875  123C  0AEE               	incf	main@chetchik_power,f
   876  123D  086E               	movf	main@chetchik_power,w
   877  123E  3A05               	xorlw	5
   878  123F  1D03               	skipz
   879  1240  2A11               	goto	l5640
   880                           
   881                           ;termometr.c: 288: {
   882                           ;termometr.c: 289: F_power_on=0;
   883  1241  10A2               	bcf	34,1	;volatile
   884                           
   885                           ;termometr.c: 290: RC2=0;
   886  1242  1107               	bcf	7,2	;volatile
   887                           
   888                           ;termometr.c: 291: chetchik_power=0;
   889  1243  01EE               	clrf	main@chetchik_power
   890  1244  0063               	sleep	;# 
   891  1245  0000               	nop	;# 
   892  1246  2A11               	goto	l5640
   893  1247                     __end_of_main:	

Сейчас прикинем.

Метка "l5640" - это начало цикла while(1).
Да, действительно, команда sleep выполнится только по условию.
 

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

Заработало. И в железе видно. Alex спасибо. Теперь в спящем режиме без подцветки - 1,3мА, из них 0,8 - индикатор, интересно долго при таком потреблении 3 пальчиковых батареи последовательно прослужат?

А что этими скобками мы указали? А то мне как то не совсем понятно. 

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

2 минуты назад, Bugrim сказал:

А что этими скобками мы указали?

Выделили отдельный блок кода. Компилятор просто не имел право его проигнорировать :)

 

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

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

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

ого-го-шечки какие гигантские токи :wacko:

смотря какие "пальчики", узнаем примерную емкость и вычисляем примерное время жизни

у меня часики: МК - mega8, диспл. - nokia5110, ds18b20 2шт. потребляют ~270мкА и то сердце кровью обливается

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

Присоединяйтесь к обсуждению

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

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...