Jump to content
NebsteR

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

Recommended Posts

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

Я просто в недоумении... В этом МК есть только ДВА источника прерываний касающихся событий времени - внешнее прерывание и прерывание по TMR0.

Виноват,  в прерывание заходим при изменении регистров кнопками но это не меняет сути

Share this post


Link to post
Share on other sites
Posted (edited)
10 минут назад, legik сказал:

Виноват

Ну слава Богу, это выяснили...

Тогда вопрос. Кнопки явно не относятся к периферии реального времени. То есть от момента нажатия до момента реакции программы на нажатие может пройти достаточно неопределенное (в разумных пределах) время. То есть нет никакой необходимости странным образом ресетить МК из прерывания.

Вообще то так это не делается. Во первых, нужна защита от дребезга кнопки. Это уже потребует интервала ее опроса. Иначе одно нажатие будет приводить к серии прерываний (и при нажатии и при отпускании) или потребует фильтра на входе.

Я не зря спросил про параметры генерируемого сигнала. Наличие таймера даст возможность сформировать опорный интервал в котором можно инкрементить софтовые  счетчики и опрашивать кнопку.

Основной цикл освободится от циклов счета и позволит спокойно решать вопрос с перегрузкой параметров генерируемого сигнала...

Edited by my504

Share this post


Link to post
Share on other sites

да, может быть...

но  мне проще будет посчитать длительность имульса без таймера в цикле по моему мнению.

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

Share this post


Link to post
Share on other sites

Драйверы MOSFET/IGBT Infineon – силой нужно управлять!

Специалисты Infineon усовершенствовали традиционные кремниевые MOSFET и IGBT и выпустили компоненты на базе принципиально иных материалов – нитрида галлия и карбида кремния. Мы создали подборку полезных материалов, чтобы вы разобрались во всех тонкостях и стали экспертом по управлению силовыми приборами нового поколения CoolMOS, CoolGaN, CoolSiC!

Подробнее

Только что, legik сказал:

но  мне проще будет

Прикольно... Значит считать машинные циклы с учетом разного времени при ветвлениях вам проще, чем считать базовые интервалы таймера? :crazy:

Вы видимо плохо понимаете о чем я веду речь....

Share this post


Link to post
Share on other sites

Снижена цена на DC/DC и AC/DC преобразователи Mornsun в Компэл!

Компэл снизил цены на всю продукцию Mornsun. В ассортименте – как широко известные и популярные позиции, так и новинки. Доступны AC/DC, неизолированные DC/DC-преобразователи или импульсные стабилизаторы (семейство K78/R3), изолированные DC/DC, и новейшее поколение R4.

Подробнее

я так понимаю про таймер, предделитель и дополнительный регистр

Share this post


Link to post
Share on other sites

Новинки гибридных конденсаторов: преимущества технологии

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

Подробнее

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

поэтому и предлагали 628а , у него 16бит таймер имеетцо

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

:lol: какую прелестную чушь вы несете..

Share this post


Link to post
Share on other sites

для таймера без предделителя шаг изменения 1маш.цикл

для циклов

lo_cyc        decfsz    ml_b_lo_tmp,1
        goto    lo_cyc    // для одного цикла 2маш.цикла
        decfsz    sr_b_lo_tmp,1
        goto    lo_cyc    // для двух циклов 4маш.цикла
        ;decfsz    st_b_lo_tmp,1
        ;goto    lo_cyc   // для трех циклов  6маш.циклов
        bsf        PORTA,4

Share this post


Link to post
Share on other sites
7 minutes ago, legik said:

не использую таймер а чисто цикл

Да нормально, нет проблем, делайте как делаете программный счётчик - и все будет хорошо.

У этих таймеров только 1-2 байта на весь период, у Вас же используется 3 байта, можно сделать длинный период с мелким шагом изменения.

Share this post


Link to post
Share on other sites
1 минуту назад, Yurkin2015 сказал:

нет проблем, делайте как делаете программный счётчик - и все будет хорошо.

угу, при осцилляторе 4МГц , и формировании частот около 10КГц   аппаратный таймер даст шаг 200Гц , программный 1100Гц ,

а так да все будет хорошо...

Share this post


Link to post
Share on other sites
1 час назад, legik сказал:

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

о как... а не беспокоит, что если на кнопки прилетит помеха, МК уйдет в прерывание и будет порушена работа цикла?

Share this post


Link to post
Share on other sites

значит все в помойку...

меня интересовал один вопрос, который я озвучил в самом начале

Share this post


Link to post
Share on other sites

просто вы наступаете на детские грабли , которые многие уже прошли.

Share this post


Link to post
Share on other sites

 

5 минут назад, IMXO сказал:

legik - значит все в помойку...   меня интересовал один вопрос, который я озвучил в самом начале

IMXO - просто вы наступаете на детские грабли , которые многие уже прошли.

Как преподаватель с приличным стажем,  могу только озвучить  - такая "беда" :) совершенно неизбежна по любому предмету при возрастном обучаемом. Тут нельзя  "тыкать носом" в дилетантские ошибки. И совершенно "безболезненно" проходит разъяснение грамотного освоения основ предмета. Типа - что считать "дурным"  тоном в программировании и пути (как правило их не один) как возможно и правильно по "школе". Далее с "мелочами"  человек (чай не мальчик :) ) разберётся во всём сам.
legik, удачи вам в освоении программирования.

Share this post


Link to post
Share on other sites
Posted (edited)
5 часов назад, valentinovich сказал:

Как преподаватель с приличным стажем,  могу

Обучаемый "возрастной" категории в отличии от учеников школьного возраста утрачивает аргументацию связанную с авторитетом старшего. Но подобная аргументация и в школьном возрасте будет негодной. Это аргументация ПЛОХОГО преподавателя.

Зато с возрастом у людей обостряются качества "второй натуры". Но тут качество преподавания бессильно.Самоуверенность соединенная с упрямством и заправленная латентной ленью даст тот салат, который в лучшем случае даст фейковый результат, а в худшем злобу и отвращение к предмету занятий. Фейковым я называю результат. который работает на первый взгляд. но дает баги различной периодичности и фатальности.

ЗЫ. Смешно читать, когда автор пишет про "точность", ни разу не обозначив величины формируемого сигнала и обоснованное разрешение этого сигнала по времени. При трех байтах программного счетчика разрешение по времени составит 1/2^24 = 1/16 777 216. Что же это такой за процесс, которому требуется такое разрешение? Даже ума не приложу...  :crazy:

Тот факт, что разрешение еще не является точностью - это отдельная тема... :bye:

 

Edited by my504

Share this post


Link to post
Share on other sites

my504, по сути-то оно всё верно, но чего-то картинка у вас получилась мрачноватая. :(
Но мы всё же будем надеяться, что legik на нас не сильно обидится, всё поймёт правильно, внемлет призывному голосу познания и продолжит осваивать это увлекательное дело - логику программирования.

Share this post


Link to post
Share on other sites

    swapf    W_Temp,F    ; Поменять местами старший и младший полубайты
                    ; регистра W_Temp с сохранением результата
                    ; операции в нем же.
        swapf    W_Temp,W    ; Поменять местами старший и младший полубайты
                    ; регистра W_Temp с сохранением результата
        
        retfie

Подскажите, зачем дважды менять регистр "W_Temp" при выходе из прерывания? или это надо принять как должное?

Share this post


Link to post
Share on other sites
Posted (edited)

@legik Таким образом восстанавливается обратно содержимое рабочего регистра W из сохранённой копии W_Temp. Применять инструкцию MOVF нельзя, т.к. она изменяет STATUS регистр, который остаться таким как до прерывания. А инструкция SWAPF никак не влияет на STATUS, но она меняет полубайты местами. Поэтому приходится использовать её два раза.

Edited by Yurkin2015

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...

  • Сообщения


  • Бумага для лазерно-утюжной технологии, партия 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...