Jump to content
NebsteR

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

Recommended Posts

7 часов назад, UVV сказал:

Err_c = Err_c + 1; //запрещенное состояние Err_c это переменная или нет если переменная то где что дальше с ней делается за циклом switch?

если энкодер подключен к двум входам порта Б то откуда берутся изменения в 0b00001101 в третьем и четвертом бите. 

то есть к каким пинам по счёту энкодер подключен

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

2. Алекс уже ответил

3. к PORTB<1:0>,  строку

Enc_state |= PORTB;//Проверяем входные линии

исправить на

Enc_state |= PORTB&((1<<1)|(1<<0)); //Проверяем входные линии

 

Share this post


Link to post
Share on other sites

@IMXO этот вариант тоже надо отработать и выложить. Народ тоже нуждается в энкодерах.

@IMXO может отдельную тему создать и закрепить про энкодеры?

Share this post


Link to post
Share on other sites

зачем ? тема уже давно существует http://forum.cxem.net/index.php?/topic/194645-подключение-и-работа-с-энкодером/ в соответствующем разделе форума, достаточно включить поиск по сайту и получить почти четыре десятка страниц с упоминанием эндкодера, как минимум пять тем где обсуждаются алгоритмы  обработки 

 

23 часа назад, UVV сказал:

программу обработки команд энкодера я спиз... у кого то

этот код тоже самый кейс только написанный через опу с лишними проверками приводящий к увеличению машинного кода

 

Share this post


Link to post
Share on other sites

Приглашаем на вебинар «Инновационные технологии Analog Devices в области управления питанием» (11.08.2021)

В программе вебинара технология Silent Switcher® - сочетание высокого КПД и сверхмалого уровня ЭМИ, технология uModule® - высокоинтегрированные решения для источников питания, микро- и нанопотребляющие DC/DC-преобразователи, решения для резервного питания, цифровое управление системой питания (PSM), безоптронные изолированные обратноходовые преобразователи. В практической части вебинара будут продемонстрированы примеры работы с инструментами Analog Devices для проектирования источников питания.
Подробнее

да? ну ладно.

вообще надо на 32 pic переходить я его ещё не изучал

Share this post


Link to post
Share on other sites

Концевые микропереключатели KLS – простая и надежная коммутация по оптимальной цене

На складе Компэл широко представлены нажимные переключатели от KLS в стандартных и миниатюрных корпусах с различными типами актуаторов. Микропереключатели серий KLS7-KW10 и KLS7-KW4-3Z соответствуют строгим стандартам электрической безопасности и эффективности, что гарантирует надежную коммутацию цепей управления.

Подробнее

Есть дисплей 2х16, нужно сделать вольтамперметр на БП с 2мя независимыми каналами. Как это сделать? есть такая идея: допустим 1канал будет гальванически связан  например с  16f873A, на второй канал сделать отдельный измеритель напряжения и тока на 12f675 и связать два контроллера без гальв. связи.

Share this post


Link to post
Share on other sites

Датчики STMicroelectronics – новые возможности систем умного дома ST

Согласно прогнозам аналитиков, в ближайшие пару лет будет наблюдаться заметный рост рынка датчиков движения и положения для умного дома. Компания STMicroelectronics предлагает одну из самых широких линеек MEMS-датчиков, включая акселерометры, гироскопы, цифровые компасы, модули IMU, микрофоны и датчики параметров окружающей среды. Рассмотрим применение датчиков и тенденции их развития.
Подробнее

У меня не вопрос, а подсказка для тех, кто напорется на ту же проблему. Поиск может быть выведет сюда.

МК - PIC16F18446 на подарочной демо-плате DM164144. Неделю мучился (в свободное время), не мог получить "эхо" от УАРТа, при этом передача работала. Наконец со злости сделал новый тестовый проект, но теперь уже посредством конфигуратора (МСС). "Эхо" появилось. Начал копаться в МСС конфиге - все примерно как у меня. Одно отличие - вручную я писал на ХС8 версии 1.45, а МСС делал на версии 2.05. Оказалось, что в версии 1.45 адрес RX1DTPPS в заголовке указан 0x1EC9, а в версии 2.05 правильный - 0x1ECB. Это не считая того, что в ДШ он вообще называется RX1PPS.

Вот теперь задумался, а не из-за кривого ли заголовка у меня не завелся 32 kHz кварц на этой плате?!

Share this post


Link to post
Share on other sites

А чем же Вы целую неделю занимались? 

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

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

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

Share this post


Link to post
Share on other sites

У меня нет времени постоянно этим заниматься, это не работа, а хобби, которому не каждый день уделяется. Неделя - это срок с момента обнаружения проблемы и до того, как удалось взяться за неё. В промежутке я только урывками читал ДШ в поисках проблемы у себя в конфиге, не верилось, что могли допустить такую грубую ошибку в адресации такой популярной периферии.

Edited by Zhuk72

Share this post


Link to post
Share on other sites

Ерунду не надо писать. 

Это просто опечатка технического писателя. 

Ее пофиксили в следующей версии компилятора. 

Элементарно обнаруживается через пару минут после включения отладчика... 

Share this post


Link to post
Share on other sites

Марк, спуститесь на землю, здесь тоже люди живут.

Еще раз повторяю: у меня в данное время нет времени и условий заниматься этим хобби даже 20 минут без того, чтоб меня не оторвали на посторонние дела. До этого ни разу я с подобной ошибкой не сталкивался ни на одной чипе PIC, STC, C8051 или STM32. Мне не приходило в голову, что могут выпустить компилятор без проверки хотя бы базовой периферии.

Что касается пары минут... Ну не за пару, но за 20-30 минут (учитывая, что я впервые использовал МСС) я вышел на источник проблемы. Этой платой я начал заниматься еще в марте прошлого года, тогда и вылезла эта проблема. С того времени и до мая этого года было не до МК вообще. После таких перерывов трудно включаться обратно и поневоле возникают сомнения в правильности своих действий. Так что не судите всех по себе.

Уже жалею, что вообще поделился этим наблюдением.

Share this post


Link to post
Share on other sites

Ошибки в хедерах достаточно часты. Иногда их ловит компилятор, иногда нет. 

Зависит от синтаксиса ошибки. 

Это просто надо воспринимать как возможное. 

Share this post


Link to post
Share on other sites

Вопрос по видимости меток в другом файле. Есть проект загрузчика. В файле "memory.s" описаны глобальные метки: (извиняюсь за форматирование, проблемы с кнопкой CODE)

.global _F1, _F2, _F3

_F1:

        mov W0, NVMADRU

      mov W1, NVMADR

 

Далее в файле "main.c" объявлено:

extern   UWORD16   F1 (UWORD16,  UWORD16)

и далее происходит вызов функции

F1 (A, B);

Я вот не пойму, объявление global с подчеркиванием, а функция без него. Как компилятор понимает, что вызывая   F1 (A, B);   нужно перейти на метку _F1    ?

Никак не пойму. Больше в проекте никаких функций F1 (тоже самое и с F2, F3) нет !

         

Share this post


Link to post
Share on other sites

Читаем мануал на XC16 на странице 226:

Quote

Variables or functions declared within a separate assembly file that will be
referenced by any C source file should be declared as global using the assembler
directive.global. External symbols should be preceded by at least one
underscore. The C function main is named _main in assembly and conversely an
assembly symbol _do_something will be referenced in C as do_something.
Undeclared symbols used in assembly files will be treated as externally defined.

 

Share this post


Link to post
Share on other sites

Ребят, прошивал один раз только "аттини" и то лет 6 назад.

Нужно прошить PIC12F629 (что собираю http://cxem.net/mc/mc265.php)

Программатор есть только USBASP V2.0

На компе windows 10.

Тыкните пальцем на инструкцию, в идеале пошаговая инструкция, тогда точно справлюсь. Спасибо.

Share this post


Link to post
Share on other sites
10 часов назад, d19codec сказал:

Тыкните пальцем на инструкцию, в идеале пошаговая инструкция, тогда точно справлюсь.

на рынке/радиомагазине/интернете/ приобретаешь pickit2, pickit3 или pickit4 , устанавливаешь фирменное ПО , подключаешь МК к программатору и заливаешь прошивку. 

Share this post


Link to post
Share on other sites

Или использовать тини и написать программу.


Я не раздаю удочки. Я продаю рыбу.

Share this post


Link to post
Share on other sites

Всё, спасибо, я просто загуглил что умеет прошивать USBASP V2.0 и сразу понял где я лоханулся.

Share this post


Link to post
Share on other sites

Доброго дня.

Подскажите возможно ли вычислить максимальное время вычисления выражения. В конкретном случае деление/умножение 32 разрядных чисел. Максимальное время выполнения операций необходимо для расчета времени (частоты) опроса датчика, который предоставит новые данные для вычисления. Пишу на xc8.

За ранее благодарен.

Share this post


Link to post
Share on other sites

а разве хусым восьмой умеет перемножать 32 разряда? на сколько понимаю результат имеет размерность 64 бита, а хусым такую разрядность не знает... или нет?

а так время выполнения кода смотрел в протезе по брекпоинтам.

Share this post


Link to post
Share on other sites

Может и за умножение загнул, но так или иначе оперировать надо 32 разрядными. На данном этапе пока что это размышления о будующем проекте. Но в протеусе посмотреть проблемы не составит, однако я подозреваю, что время операции деления числа на 2, 4 или 8 будет отличатся от времени деления на число, например, 863. Все комбинации деления перебрать - глупость, с моей точки зрения. Подозреваю, что не один я столкнулся с подобным.  

Share this post


Link to post
Share on other sites
1 hour ago, Bugrim said:

я подозреваю, что время операции деления числа на 2, 4 или 8 будет отличатся от времени деления на число, например, 863

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

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

Share this post


Link to post
Share on other sites
14 часов назад, Bugrim сказал:

необходимо для расчета времени (частоты) опроса датчика, который предоставит новые данные для вычисления.

Вычисления с высокой целочисленной разрядностью (32*32 или 32/32) нужны достаточно редко. Особенно на 8-битной платформе.

Впрочем, 32-битный флоат так же мало необходим.

Если не секрет, что за вычисления Вы заложили со столь высоким разрешением?

Share this post


Link to post
Share on other sites

ПИД регулятор. Контроль температуры. Хочется:

1 частота опроса 25 Гц для каждого канала.

2 каналов - 3

3 датчик температуры - термопара К типа - 3 шт.

4 динамическая индикация 5 разрядов.

5 органы управления - 4 кнопки.

В первом приближении так.

В вычислениях предполагаю использовать такой формат. 16 бит: 5 разрядов - дробная часть, 10 - целая, 1 знаковый. Расчет примерно так ( ещё обдумываю):

U = K * ( Err + (1/Ti)*Int + Td*dErr )

Eo = E; Нам нужна прошла ошибка. Ошибки — по 16бит

E = Y-X; Вычисляем новое рассогласование. 16bit

Int = Int + (E+Eo)/2; Интегрируем ошибку. При этом считаем полусумму разности (разностная схема). 32bit = 32bit + 16bit

cI = Int * (1/Ti); Считаем интегральный вклад — 32bit * 32bit => 32bit

cD = Td * (E-Eo); Считаем диф вклад — 16*16 => 32bit

PID = E + cI + cD; Подскобочное; 16+32+32 => 32bit

U = K*PID/256; Коэфф; 32*16/8 bit => 40bit.

Будет ли успевать на частоту 25Гц, или изначально снизить надо.

Источник вдохновения - https://m.habr.com/ru/post/145991/

 

 

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

  • Сообщения

    • Для поднятия нч есть простое rc звено на входе УМЗЧ под названием тон-компенсатор. Только в данном случае не стоит нагружать мидбас низкими частотами. Целесообразнее использовать сабвуфер.
    • Всем , у кого такие колонки ещё есть,  или ещё попадутся в ремонте.   Блок питания выполнен на микросхеме о шести ножках , предположительно SG6849 .  Выходное напряжение отремонтированного блока 13.6в. Схема практически равна той,  что в даташите.  http://radio-hobby.org/uploads/datasheet/7/sg68/sg6849.pdf Отвратительный монтаж,  дорожки отслоились в месте пайки громоздкого компонента ( транзистор 4N65 на радиаторе).  Фотографировал уже после припайки дополнительных проводников поверх. Чтобы открутить винт с гайкой,  крепящие плату БП в корпусе,  мне показалось удобнее НЧ-СЧ динамик снять.  Его сопротивление 5.5ом , измерил по второй колонке.
    • Для снижения тока в момент пуска подойдет УПП. В промышленных  УПП еще есть настройка "буст", чтобы увеличить   напряжение при пуске. Похожий случай. Запуск вентиляторов дымоудаления. Такие венты имеют большую мощность (десятки кВт) и большую инерцию, т.е. затяжной пуск с большой просадкой питающего напряжения и последующем выбивании автоматов на подстанции. Проблему решили установкой УПП.
    • Как раз так и стоит! У ТСа выбор или стаб на 10 квт или УПП и стаб на 2-3 квт
    • При детальном рассмотрении под микроскопом, было выявлено что это ржавчина, такое впечатление что БП был в воде или хранился в месте с высокой влажностью, увидел еще белый налет на алюминиевом экране в некоторых местах. Ржавчина была обнаружена и с обратной стороны на некоторых контактах. Выпаял несколько конденсаторов, с помощью мультиметра замерил емкость, все в пределах 20%, поставил обратно. Взял спирт, с помощью зубной щетки очистил этот налет, просушил. Проверил, работает
    • Не спорю. Смысл всей этой случайной затеи был в том чтобы избавиться от регуляторов громкости на задней стороне колонки. К ним неудобно тянуться. Попутно улучшить звук насколько это возможно. Получается что по колонкам достаточно было только проклеить и усилить корпус, с фильтрами можно было не заморачиваться. Поэтому сейчас я получил 2 пассивные колонки и отдельный усилитель. И в целом это всё даже как то играет. Но "крутилки" баса, которая была штатно на SOLO2 не хватает. Крутить её постоянно я не собираюсь, но немного приподнять низы хочется (один раз и навсегда). Большинство регуляторов тембра на опер. усилителях что я нашел в интернете состоят из переменного резистора и 2 конденсаторов. А как от переменника перейти на штатное приподнятие например на 80 герц что то не доходит до меня. Выходит вместо переменного резистора нужен один постоянный и какой то конденсатор к нему и это между опер. усилителей и входом микросхемы усиления TDA8947. Поэтому я и предположил что цепочка C14+R14 в усилителе X23 может являться таким "регулятором". Может она режет бас?
    • Она и запирается. Это можно увидеть по росту напряжения на аноде. Но, крутизна, по всему, изменяется недостаточно сильно. Не знаю, как это работало в усилителе. И, работало ли? Что я могу предложить в качестве простейшего решения вопроса - это применить другой регулирующий элемент Это уже будет работать как компрессор, хотя могут быть вопросы со временем срабатывания. И, не полностью исключено проникновения сигнала управления в канал звука. Что может выражаться в низкочастотных призвуках, сопровождающих резкое увеличение уровня. Красный график - по одному диоду в регуляторе. Синий - по два. Выше порог, но меньше искажения. Зелёный - 2 диода и 5 Вольт порога, установленного потенциометром. В первом случае порог начала компрессии 15 мВ, с двумя диодами, 20, с дополнительным смещением, 70. Если требуется повысить пороги компрессии, надо установить дополнительный делитель на входе, перед R1. Вот, что будет при подаче уровня + 20 дБ Время срабатывания раз в 10 больше требуемого.И видно искажение огибающей из за проникновения сигнала управления. Но, как я говорил выше, человеческие компрессоры и лимитеры строятся совсем не так.
  • Similar Content

    • By Ilya Gray
      Доброго времени суток!
      В целом, имеется опыт разработки малых устройств, что-то понимаю, в общем, старательно читаю даташиты, даже понимаю их, но на звание серьёзного инженера (пока что) не претендую.
      Я пытаюсь использовать I2C на 8-битном PIC16F18326. Сижу в даташитах. Всё понимаю, всё делаю, на мой неопытный взгляд, правильно. Даже копирую полностью рабочие примеры (я даже купил такой же микроконтроллер, как в примере, скопировал код, контролируя, что он делает. Но всё равно не работает - SCL/SDA на 5в и всё тут).
      Так вот: PIC16F18326 on breadboard (прошу прощения, я хз как это по-русски) на внутреннем 32мгц кристалле. Чип пашет, без проблем моргаю LEDкой. Ну, думаю, щас быстренько подниму I2C. В итоге SCL SDA сидят на 5в без движения. Я использую LED для отладки. Судя по LED, код заloopливается в месте, где проверяется while PIR1bits.SSP1IF==0. Я уже везде был, кучу форумов перерыл. Уже попробовал всё, что мог представить. Я довольно новый в мире PIC, хотел попробовать их, а они ужасно сопротивляются. Уже 2 недели долблюсь безуспешно.
      Подтяжки 10к, проблем с ними никогда не было.
      Собственно, вот код (я уже там попробовал повыключать ADC, вычитал про баг, что сначала I2C пины надо делать OUTPUT LOW, а потом уже INPUT из-за бага MSSP, но ничего не помогло).
      // PIC16F18326 Configuration Bit Settings // 'C' source line config statements // CONFIG1 #pragma config FEXTOSC = OFF // FEXTOSC External Oscillator mode Selection bits (Oscillator not enabled) #pragma config RSTOSC = HFINT32 // Power-up default value for COSC bits (HFINTOSC with 2x PLL (32MHz)) #pragma config CLKOUTEN = OFF // Clock Out Enable bit (CLKOUT function is disabled; I/O or oscillator function on OSC2) #pragma config CSWEN = ON // Clock Switch Enable bit (Writing to NOSC and NDIV is allowed) #pragma config FCMEN = ON // Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor is enabled) // CONFIG2 #pragma config MCLRE = ON // Master Clear Enable bit (MCLR/VPP pin function is MCLR; Weak pull-up enabled) #pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled) #pragma config WDTE = OFF // Watchdog Timer Enable bits (WDT disabled; SWDTEN is ignored) #pragma config LPBOREN = OFF // Low-power BOR enable bit (ULPBOR disabled) #pragma config BOREN = ON // Brown-out Reset Enable bits (Brown-out Reset enabled, SBOREN bit ignored) #pragma config BORV = LOW // Brown-out Reset Voltage selection bit (Brown-out voltage (Vbor) set to 2.45V) #pragma config PPS1WAY = ON // PPSLOCK bit One-Way Set Enable bit (The PPSLOCK bit can be cleared and set only once; PPS registers remain locked after one clear/set cycle) #pragma config STVREN = ON // Stack Overflow/Underflow Reset Enable bit (Stack Overflow or Underflow will cause a Reset) #pragma config DEBUG = OFF // Debugger enable bit (Background debugger disabled) // CONFIG3 #pragma config WRT = OFF // User NVM self-write protection bits (Write protection off) #pragma config LVP = ON // Low Voltage Programming Enable bit (Low Voltage programming enabled. MCLR/VPP pin function is MCLR. MCLRE configuration bit is ignored.) // CONFIG4 #pragma config CP = OFF // User NVM Program Memory Code Protection bit (User NVM code protection disabled) #pragma config CPD = OFF // Data NVM Memory Code Protection bit (Data NVM code protection disabled) // #pragma config statements should precede project file includes. // Use project enums instead of #define for ON and OFF. #include <xc.h> #include <htc.h> #include <stdio.h> #include <stdint.h> #define _XTAL_FREQ 32000000 void i2c_is_idle(void){ //while(!PIR1bits.SSP1IF); //while(SSPCON2bits.SEN==1 || SSPCON2bits.RSEN==1 || SSPCON2bits.PEN==1 || SSPCON2bits.RCEN==1 || SSPCON2bits.ACKEN==1 || SSPSTATbits.R_nW==1){}; while(PIR1bits.SSP1IF == 0){ PORTCbits.RC2=1; }; // SSP1IF is set when operation complete PORTCbits.RC2=0; PIR1bits.SSP1IF = 0; // clear interrupt flag } void i2c_start(void){ i2c_is_idle(); SSPCON2bits.SEN = 1; } void i2c_rep_start(void){ i2c_is_idle(); SSPCON2bits.RSEN = 1; } void i2c_stop(void){ i2c_is_idle(); SSPCON2bits.PEN = 1; } void i2c_write(uint8_t i2c_data){ i2c_is_idle(); SSPBUF = i2c_data; while(SSPSTATbits.BF != 0); while(SSPCON2bits.ACKSTAT != 0); } uint8_t i2c_read(uint8_t ack){ uint8_t recieve =0; i2c_is_idle(); SSPCON2bits.RCEN = 1; while(SSPSTATbits.BF != 1); recieve = SSPBUF; SSPCON2bits.ACKEN = ack; return recieve; } void i2c_init(void){ TRISCbits.TRISC0 = 1; TRISCbits.TRISC1 = 1; SSPSTATbits.SMP = 1; SSPSTATbits.CKE = 0; SSPCONbits.SSPM = 0x08; SSPADD = 79; SSPCONbits.SSPEN = 1; } void main(void) { ANSELCbits.ANSC0 = 0; //ADC RC0 OFF ANSELCbits.ANSC1 = 0; //ADC RC1 OFF TRISCbits.TRISC2=0; //LED PIN TRISCbits.TRISC0=0; //MSSP bug counter TRISCbits.TRISC1=0; //MSSP bug counter //__delay_ms(5); LATCbits.LATC1=0; //MSSP bug counter LATCbits.LATC0=0; //MSSP bug counter //__delay_ms(5); INTCONbits.GIE=1; //global interrupt en INTCONbits.PEIE=1; //peripheral interrupt en ADCON0bits.ADON=0; //unpower adc just in case i2c_init(); //THIS SETS TRISC BITS FOR SCL SDA while(1){ i2c_start(); i2c_write(0x3C); i2c_stop(); } return; } Задача: просто увидеть коммуникацию на SCL SDA, я уже потом по даташитам таргет девайсов без проблем напишу дрова. Не получается именно осуществлять коммуникацию.
      Подскажите, пожалуйста, я не понимаю, где я дурак, а между тем волос на голове становится всё меньше, а те, что остались, стремительно приобретают серый окрас, ибо 2 недели я долбаюсь с одной проблемой. Благодарю за ваши советы. Спасибо.
       
    • By Николай кол
      Привет, у меня есть вопрос, как передать данных с микроконтроллера pic через блютуз модуль HC-05 на телефон в виде графика.Не могли бы вы показать скрипт или статю.Про Arduino много а про pic не (нужно передать данные с микроконтроллера на телефон а не на оборот).У же есть приложение на app inventor 2.Нужно примерно как тут https://www.youtube.com/watch?v=WzoCQ2fRsRQ
    • By duty
      Привет, участникам форума! Подскажите, пожалуйста, как можно реализовать связь микроконтроллера pic с адресным ключом (ds2405 или ds2408) по 1-wire (на шине будут висеть несколько ключей)  для считывания pio ключа, во входном режиме, т.е на pio поступает сигнал  с магнитоконтактного датчика о срабатывание его или нет.    Datasheet читал, но мало чего понял.  Тестирование произвожу в proteus 8.6
    • By Максим123456789
      делаю диплом, в схеме у меня микроконтроллер PIC16F688 и мне нужно его заменить на ATmega. Не могу найти похожий
×
×
  • Create New...