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

Общие вопросы по PIC-микроконтроллерам


NebsteR

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

3 часа назад, Splav сказал:

А надо ли в PIC16 указывать адрес прерывания, как это делается в PIC18, для разведения по сторонам прерывания высокого приоритета и низкого?

Во первых, у 16-х нет двух векторов с разными приоритетами.

Во вторых, вам бы следовало понять как вообще работает компилятор в смысле от исходника до генерации хекса.

Так вопросами привязки кода к абсолютным адресам занимается ЛИНКЕР. В 16-х пиках вектор прерывания прибит намертво гвоздями к адресу 0х0004. И линкер  в этой части не настраивается.

戦う前に相手のベルトの色に注目

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

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

@my504 Спасибо.
Изучение Си началось не так давно, возникают вопросы, которые глупые.
Пока все кажется новым, непонятным и непривычным. Знаний не достаочно.
Опытного наставника рядом нет, подсказать и объяснить некому. Поэтому форум.
Со временем, надеюсь, количество глупых вопросов будет уменьшаться.

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

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

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

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

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

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

21 час назад, Splav сказал:

все кажется новым, непонятным и непривычным.

Компиляция исходника на Си проходит в ТРИ этапа.

1. Препроцессинг (подстановка макроопределений в код, включая исполнение директив условной компиляции, когда выбираются только разрешенные условиями ветки кода).

2. Компиляция объектного (перемещаемого) кода.

3. Линкование (привязка к абсолютным адресам).

 

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

戦う前に相手のベルトの色に注目

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

Организация питания на основе надежных литиевых аккумуляторов EVE и микросхем азиатского производства

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

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

Доброго времени суток, уважаемые форумчане.
Си, компилятор XC8.
Появилась необходимость контролировать переполнение 8-ми битной переменной после операции сложения.
Или использовать 16 битную переменную и раздувать объем?
Все события будут в прерывании и стараюсь не делать лишних движений.
Похожего решения пока не нашел.
Думается, что будет выглядеть следующим образом:
 

Скрытый текст

unsigned char x;

void error (void){
	static unsigned char a;
  	a=a+x;
	if(STATUSbits.C){ // проверить переполнение
		.. сделать первое и
		.. второе
	}
	else if(~a^0xFF){ // проверить на максимум
		.. сделать третье и 
		.. четвертое
	}
  	else{
    	.. сделать пятое и
        .. шестое
    }
}

 

Я правильно улавливаю суть?

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

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

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

таки да, только не надо усложнять, пишите проще

Скрытый текст

 


78:                  else if(~y^0xFF) 
   392    0831     MOVF 0x31, W
   393    00A5     MOVWF 0x25
   394    30FF     MOVLW 0xff
   395    01A6     CLRF 0x26
   396    09A5     COMF 0x25, F
   397    09A6     COMF 0x26, F
   398    0625     XORWF 0x25, W
   399    00A7     MOVWF 0x27
   39A    0826     MOVF 0x26, W
   39B    00A8     MOVWF 0x28
   39C    0427     IORWF 0x27, W
   39D    1903     BTFSC 0x3, 0x2
   39E    2BA3     GOTO 0x3a3
79:                   {

78:                  else if(y==0xff) 
   39B    082E     MOVF 0x2e, W
   39C    3AFF     XORLW 0xff
   39D    1D03     BTFSS 0x3, 0x2
   39E    2BA3     GOTO 0x3a3
79:                   {

 

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

Литиевые аккумуляторы EVE Energy и решения для управления перезаряжаемыми источниками тока (материалы вебинара)

Опубликованы материалы вебинара Компэл, посвященного литиевым аккумуляторам EVE Energy и решениям для управления перезаряжаемыми источниками тока.

На вебинаре мы представили информацию не только по линейкам аккумуляторной продукции EVE, но и по решениям для управления ею, что поможет рассмотреть эти ХИТ в качестве дополнительной альтернативы для уже выпускающихся изделий. Также рассмотрели нюансы работы с производителем и сервисы, предоставляемые Компэл по данной продукции. Подробнее>>

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

6 часов назад, Splav сказал:

Я правильно улавливаю суть?

Нет, не правильно! Надо формулировать и решать реальные задачи, а не придумывать абстрактные.

И это в любом случае: если хотите кого то удивить, и если хотите что то сделать работающее.

Можно сделать все! Но чем больше можно, тем больше нельзя!

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

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

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

11 hours ago, Splav said:

if(~a^0xFF){ // проверить на максимум

Так себе проверка: сначала побитно инвертируем переменную, а потом ксорим с 0хff, что тоже есть побитное инвертирование. В результате имеем обратно начальное значение переменной и проверку на ненулевое значение, а не на максимум.

Если, уж, хотите проверять на максимум с вывертом, то можно писать:

if(!(a^0xFF)){ // проверить на максимум

или так
if(!(~a)){ // проверить на максимум

 

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

@ruhi это часть реальной задачи.
Алгоритм Брезенхама.
В "а" находится суммарная ошибка, как только переполнение или равенство максимуму - включить нагрузку. Куда же еще реальнее задача чем эта?
Если контролировать переполнение и равенство, то больше никакой математики не надо. Проверка в прерывании, поэтому время имеет значение.
Если переполнилось, то остаток уже находится в переменной.
Если равенство, то сбросить переменную и включить нагрузку.
В ассемблере этот алгоритм работает в железе. Теперь пришла очередь Си.
А удивлять вы можете свою жену/подругу/детей/знакомых/соседку или еще кого нибудь(нужное подчеркнуть), я прошу конструктивного совета в конкретном вопросе.
Конструктивные замечания будут?

@IMXO спасибо.
Двухбайтная переменная сразу решит все мои проблемы.

@Yurkin2015  спасибо, ксор и логическое НЕ выглядят лучше, да, перегнул.
А как лучше проверить на максимум?
Вычитание 0xFF и проверкой на ноль - будет быстрее, ведь так?

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

@Splav Да по-простому и проверяйте

if(а == 0xff)

и людям потом будет понятно читать Ваш код.

Кстати, если посмотреть листинг в посте @IMXO, такое прямое сравнение как раз ксорит переменную с проверяемым числом и затем проверяет на ноль.

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

@Yurkin2015 Да,верно, но выход неожиданно был найден.
 

unsigned char x;

void error (void){
 static unsigned int a;
  a = x + a; //суммарная ошибка;
  if(a>=255){ // контроль максимума и переполнения;
    a = a - 255; // в обоих случаях необходимо привести к значению a<255;
    triac_pin = 1;// накопленная ошибка превысила допустимую, включить нагрузку;
  }
}

Получилось просто и понятно.
Всем участвующим спасибо за наводящие вопросы и мнения, без этого бы не произошло.

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

21 час назад, Splav сказал:

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

вы пишите какой то бред (с точки зрения математики), потому что остаток бывает от деления, а у вас, похоже подразумевается вычитание, а зачем он вам нужен этот остаток, который: где то "УЖЕ находится", совсем не понятно, и не понятно зачем вы про него пишете если он не нужен.

21 час назад, Splav сказал:

я прошу конструктивного совета в конкретном вопросе.

Нет никакой конкретики в вашем вопросе, бред какой то (смотри замечания выше)! Так что ваши эмоции не обоснованы.

18 часов назад, Splav сказал:

a = a - 255; // в обоих случаях необходимо привести к значению a<255;

Если что, после этого значение "а" не обязательно <255, потому, что бы это значило? У меня только одна версия: "бред какой то!"

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

Можно сделать все! Но чем больше можно, тем больше нельзя!

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

@ruhi что происходит в 8-ми битной переменной, если при сложении ее значение оказывается больше 0хFF?
OxFA + 0x30, например? Какой результат сложения? Какое числовое значение будет?
Вам не знаком термин остаток от переполнения?
Вы не понимаете почему он важен и какой от него смысл?
Не понимаю зачем тогда вы находитесь в профильном форуме. Да и ваши знания в математике тоже вызывают сомнения.
Ваши версии выгладят бредово от недостатка знаний, тут уж никто не в силах помочь.
В продолжении полемики не вижу смысла, читайте книги и прибудет с вами сила. Возможно. Но это не точно.

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

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

вы пишите какой то бред (с точки зрения математики)

К сожалению, это бред не с точки зрения математики, а с вашей точки зрения, что многое говорит о вашем уровне знаний. :)

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

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

что происходит в 8-ми битной переменной, если при сложении ее значение оказывается больше 0хFF?

Я рад что вы это освоили, вам осталось только найти где у вас используется 8-ми битная переменная, а где переменная типа int. Ну и разобраться в чем между ними разница.

А насчет моих замечаний вы зря так расстраиваетесь, я, действительно, пытаюсь помочь, хоть и с некоторой долей сарказма. И мне кажется мой сарказм оправдан в ответ на ваш безапеляционный тон ни к чему не привязанных, не обоснованных заявлений.

Изменено пользователем ruhi
дополнил

Можно сделать все! Но чем больше можно, тем больше нельзя!

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

@ruhi изначально предполагалось использовать unsigned char a, отсюда вопрос по контролю переполнения.
Позже стало ясно, что проще будет использовать unsigned int a.
Но вы пропустили этот момент мимо.
Вы смешной, пишите исчо, очень интересно.

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

2 часа назад, Splav сказал:

Позже стало ясно, что проще будет использовать unsigned int a.
Но вы пропустили этот момент мимо.

Я действительно пропустил один момент, но не этот. Я не обратил внимание что переменная "а" сохраняется между вызовами функции поскольку статическая, конструкция очень не стандартная поэтому я даже не пытался ее анализировать, потому что безапеляционно решил что это ошибка, так бывает у всех - не все в состоянии это признать.

С учетом этого моего упущения смысл, действительно, появляется. Похоже ваша улыбка простимулировала понимание, или более дружелюбные коментарии ... :) !

А вообще такие трюки нестандартные обязательно пояснять надо тщательно - вы через месяц сами замучались бы вспоминать о чем это написано, если б не это обсуждение :)

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

Можно сделать все! Но чем больше можно, тем больше нельзя!

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

@Splav , если Вы пишите под PIC, и Вам очень хочется сделать этот алгоритм быстрый, с однобайтовыми переменными, то просто вставьте кусок АСМ-кода. Тогда вся конструкция выльется всего в несколько команд - сложение с проверкой бита переполнения (пропуск следующей команды, которая открывает триак). Остаток, как Вы его называете, будет сам оставаться в переменной, после переполнения.

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

@Alex спасибо, именно так это и работает в асме. Есть готовая рабочая программа. Быстрый алгоритм для обработчика прерывания. Регулятор мощности собран в железе.
Сейчас начал изучать Си, поэтому решил тренироваться написать программы которые уже работают на асме и потом можно сравнивать.
Но философия асма и Си отличаются.
Обучение проходит в муках)))

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

Splav  
<
Но философия асма и Си отличаются.
Обучение проходит в муках)))>

Так вот "в муках" это в основном у тех, кто не умеет писать блоки на АСМ. А если вы владеете АСМ, то незачем придумывать (с моей точки зрения) замысловатые конструкции на СИ, при простом их решении на АСМ.

Правда если вы задались целью сравнить результат компиляции "всё на СИ", с вашим на "чистом АСМ" и грамотной смеси "СИ + блоки АСМ", то уверяю вас - последние два будут выглядеть более компактно и логично. ;)

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

5 часов назад, Splav сказал:

Но философия асма и Си отличаются.

Естественно. АСМ - язык конкретного железа. А Си - язык высокого уровня, который не может захватить все существующие процессоры и их команды. По этому, у него нет оператора "сложить с пропуском по переполнению" :)

Как вариант, на вскидку :

unsigned char x;

{
static unsigned char a=0xff;

if(a<x) open_triac();
a-=x;

}

 

XC8 :

10:                void fun(){
   7F4    3032     MOVLW 0x32
11:                static unsigned char a=0xff;
   7FC    30FF     MOVLW 0xff
12:                
13:                if(a<x) open_triac();
   7F5    0270     SUBWF fun@a, W
   7F6    1803     BTFSC STATUS, 0
   7F7    2FF9     GOTO 0x7f9
   7F8    27EF     CALL open_triac
14:                a-=x;
   7F9    3032     MOVLW 0x32
   7FA    02F0     SUBWF fun@a, F
15:                
16:                
17:                }
   7FB    0008     RETURN

Неоптимально, конечно. Хоть и PRO-версия.

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

А вот такой вариант :

signed char x = 50;

void fun(){
static signed char a=0xff;

if((a-=x)<0) open_triac();


}


уже имеет более красивую картинку :

2021-01-21_00-06-51.png.4c7d82610283359dbdf070de9a825acc.png

B)


PS: А это Ваш вариант функции error :

Скрытый текст

2021-01-21_00-16-45.png.049c8b802745bb251d79254e52f0b924.png

 

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

@Alex  алгоритм не полный вышел, нагрузка включается при переполнении или при равенстве 0xFF.
Проверка на больше и на равенство. Вот кусок из асм программы, почти как из листинга))

Скрытый текст

error			movf	setp_val,w	; Посчитать ошибку.
			addwf	err_val,f	; 
			btfsc	STATUS,C	; Больше максимального?
		 	 goto	isr_int1	; да, пойти включить нагрузку
			incf	err_val,w	; 
			btfss	STATUS,С	; максимум?
		 	 goto	isr_exit	; нет, ничего не делать и уйти
			clrf	err_val		; 
isr_int1		........

 

Вариант на Си получился очень больше в размере после компиляции. Но очень наглядный при написании. Это, конечно же ни для кого не секрет.
Но есть куда расти и к чему стремиться. Все ведь только началось.
@valentinovich  может вы гениальная личность и изучение нового материала с умением его применить наступает мгновенно, но обычным смертным требуется на это время. Для усвоения, закрепления и приобретения навыков применения.
Изучение происходит в свободное от основной деятельности время, несистемно.
К тому же, программирование никак не связано с основным родом деятельности даже близко, это увлекательное хобби, поэтому, если даже асм не в "правильных блоках", не оптимален - я от этого не страдаю, при любом раскладе мне это приносит удовлетворение. Со временем получается намного лучше.

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

6 часов назад, Splav сказал:

алгоритм не полный вышел

Это о каком алгоритме речь ? Если вычитать и проверять на <0, то FF будет считаться уже переполнением.

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

20.01.2021 в 18:01, Splav сказал:

философия асма и Си отличаются.

Прежде всего, отличается философия писателей кода. И не важно на каком языке пишется код.

Просто Си как то следит за "философией", а АСМ позволяет писать практически как Бог на душу положит. Но из последнего не следует, что так нужно писать.

戦う前に相手のベルトの色に注目

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

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

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

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

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

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

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

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

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

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

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

×
×
  • Создать...