Jump to content
NebsteR

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

Recommended Posts

Добрый день. У меня вопрос по PIC16F946. Есть одна схема и две прошивки, с одной внешний кварц на 8 мгц нормально запускается, со второй не хочет. В битах конфигурации всё идентично, стоит бит HS. На внутреннем генераторе обе прошивки работают. Я так понимаю нужно что-то править ещё в самой прошивке? Хотя мне казалось при установке HS кварц по любому должен заводиться. 

Share this post


Link to post
Share on other sites

Если 2 разные прошивки на одном и том же железе ведут себя по-разному, какой логический вывод можно из этого сделать ? Неужели на железо хотите грешить ?

Share this post


Link to post
Share on other sites

Логический вывод напросился сам: хочешь что-то сделать - делай сам! ....... На другие ответы не особо рассчитывал.))

P.S. Спасибо за неоценимую помощь КЭП!

Share this post


Link to post
Share on other sites

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

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

Подробнее

Микроконтроллер PIC16f84a.

Возможен паереход из основной программы в прерывание а при выходе из прерывания в "START" основной программы?

Заранее спасибо!

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.

Подробнее

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

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

Подробнее

4 часа назад, IMXO сказал:

возможен, вопрос зачем...:unknw:

Для того чтоб исключить проверки в циклах.
Как это можно реализовать?

Через стэк?

Share this post


Link to post
Share on other sites

проверки чего? 

для перейти на вектор сброса достаточно goto... , другой вопрос, что стек в пик16 не доступен и будет рушится.

Share this post


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

PIC16f84a. Возможен переход?

Странный выбор контроллера для подобных извращений...

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

Share this post


Link to post
Share on other sites
Posted (edited)
3 часа назад, my504 сказал:

Странный выбор контроллера для подобных извращений...

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

Возможно, поэтому и обратился в этот раздел.

Конечная задача - генерация импульсов  определенной длительности  с выхода RA4.

 

Это один из 3 циклов основной программы:

lo_cyc        decfsz    ml_b_lo_tmp,1
        goto    lo_cyc
        decfsz    sr_b_lo_tmp,1
        goto    lo_cyc
        ;decfsz    st_b_lo_tmp,1
        ;goto    lo_cyc
        bsf        PORTA,4
        
        movf    ml_b_hi,0
        movwf    ml_b_hi_tmp
        movf    sr_b_hi,0
        movwf    sr_b_hi_tmp
        movf    st_b_hi,0
        movwf    st_b_hi_tmp
        
        goto    hi_cyc
        
        
hi_cyc        decfsz    ml_b_hi_tmp,1
        goto    hi_cyc
        decfsz    sr_b_hi_tmp,1
        goto    hi_cyc
        ;decfsz    st_b_hi_tmp,1
        ;goto    hi_cyc
        bcf        PORTA,4
        
        movf    ml_b_lo,0
        movwf    ml_b_lo_tmp
        movf    sr_b_lo,0
        movwf    sr_b_lo_tmp
        movf    st_b_lo,0
        movwf    st_b_lo_tmp
        
        goto    lo_cyc

в прерывании я изменяю длительность импульсов и перехожу на "START" программы, после "START" я провожу проверку регистров и перехожу на один из 3 таких циклов.

почему 3 цикла? потомучто самый старший регистр может быть нулем и я его хочу исключить в других циклах. при старте и проверок на 0.

кто нибудь подскажет как можно из прерывания попасть на "START" программы?

 

 

Edited by legik

Share this post


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

проверки чего? 

для перейти на вектор сброса достаточно goto... , другой вопрос, что стек в пик16 не доступен и будет рушится.

Вы имеете ввиду "goto 0000h"?

Сброс стэка тоже произойдет?

Share this post


Link to post
Share on other sites

legik - Сброс стэка тоже произойдет?

 

Почему вы решили, что произойдёт сброс? Разве где-то в даташите на данный МК такое упоминалось?
Здесь только программный возврат из прерывания приведёт стек в предыдущее его состояние. Ибо задача и логика (сиречь суть) прерывания - ТОЛЬКО срочно ПРЕРВАТЬ выполнения основной программы и выполнив там некие действа, вернуться и продолжить её исполнение. Всё, что не так (в вашем предположении тоже), будет заполнять стек и в итоге приведёт к его переполнению и как следствbе - к сбою выполнения программы. Стек в данном МК программно не доступен.
Ищите другие пути логики вашего процесса. И поверьте, они есть. :)

Share this post


Link to post
Share on other sites
2 hours ago, legik said:

Сброс стэка тоже произойдет?

В этом МК не надо беспокоиться о сбросе стека. Стек представляет собой циклический буфер на 8 ячеек, и указатель стека ходит по кругу. При записи в стек более восьми раз: указатель сбросится и запись начнётся с начала стека.

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

Думаю, что просто напишите в прерывании последней строчкой "goto START", а о стеке не беспокойтесь.

Share this post


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

Главное, в программе не делать более 8 вложенных вызовов функций или прерываний.

Думаю, что просто напишите в прерывании последней строчкой "goto START", а о стеке не беспокойтесь.

это если уходить из прерывания по return , retlw or retfie .

выход по goto  будет изменять расположение вершины стека. поэтому здесь даже одного вызова функции ужо не получецо  и  придется забыть о командах call,  return , retlw or retfie и использовать программный стек и прямую запись в PCL

хотя мы до сих пор не знаем, что собственно надо ТС и какие требования выдвигаются к стабильности сигнала на выходе RA4 ,  даже обычный вызов прерывания (с возвратом по retfie) из выше озвученных циклов будет рвать сигнал в ..овно.

Share this post


Link to post
Share on other sites

Yurkin2015 - В этом МК не надо беспокоиться о сбросе стека. Стек представляет собой ...

Беспокоится надо прежде всего о правильной, грамотной, читабельной и понятной логике программирования. И также к умению правильно увязывать требования процесса с не только (а вдруг в этом МК прокатит "нЕчто") с недокументированными возможностями МК, но и с возможным использованием программы на другом МК того же семейства (к примеру 628 и пр. подобных),

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

Share this post


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

Конечная задача - генерация импульсов  определенной длительности  с выхода RA4.

в прерывании я изменяю длительность импульсов и перехожу на "START" программы....

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

1. Первая часть вопроса - почему взят этот контроллер для такой задачи? Это я к тому, что есть ПИН2ПИН совместимый PIC16F628A с модулем CCP и тремя таймерами.

2. Вторая часть вопроса - в чем причина столь экзотического решения? Что мешает в прерывании изменять параметр и выставлять флаг требования изменить программный счетчик в основном цикле по завершению очередного цикла генерации?

3. Под конечной задачей я понимаю ВСЮ задачу ПО СУЩЕСТВУ, а не какие то обрывки фраз из которых нужно догадываться о Ваших реальных намерениях.

Конкретно. Что такое входной сигнал? Я так понимаю, что это сигнал на входе внешнего прерывания? Параметры сигнала какие? Частота, скважность?

Что такое выходной сигнал по отношению к входному ?  Частота, скважность?

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

Share this post


Link to post
Share on other sites
03.07.2020 в 23:05, legik сказал:

Возможен паереход из основной программы в прерывание а при выходе из прерывания в "START" основной программы?

Именно нужно в "START" возвращаться?

Если задействовать пин контроллера "RESET" - так не подойдёт? С полным сбросом контроллера очень просто получается, причём с любым контроллером.


Технические вопросы решаю в теме , в личке не обсуждаю !!!

Share this post


Link to post
Share on other sites

да, про "RESET" я уже задумывался но хочеться более корректно решить задачу

Share this post


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

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

1. Первая часть вопроса - почему взят этот контроллер для такой задачи? 

Использую то что есть.

10 часов назад, my504 сказал:

2. Вторая часть вопроса - в чем причина столь экзотического решения? Что мешает в прерывании изменять параметр и выставлять флаг требования изменить программный счетчик в основном цикле по завершению очередного цикла генерации?

В прерывании я изменяю длительность импульсов высокого и длительность низкого уровня сигнала.

 

11 часов назад, my504 сказал:

Конкретно. Что такое входной сигнал?

нет входного  сигнала, просто генератор импульсов.

11 часов назад, my504 сказал:

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

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

Основновной код я выложил. Он состоит из цикла который генерирует длительность низкого уровня и цикла который генерирует высокий уровень и всё.

В дальнейшем добавлю еще 2 таких цикла но без самых старших регистров("st_b_hi" или "st_b_lo" если они будут равны "0").

Share this post


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

В прерывании я изменяю

В прерывании ОТ ЧЕГО?  О каких частотах ШИМ идет речь? О каких скважностях идет речь?

Share this post


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

выход по goto  будет изменять расположение вершины стека. поэтому здесь даже одного вызова функции ужо не получецо  и  придется забыть о командах call,  return , retlw or retfie ....

Впринципе устраивает вариант. Буду пробывать,  всем спасибо.

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

В прерывании ОТ ЧЕГО?  О каких частотах ШИМ идет речь? О каких скважностях идет речь?

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

Share this post


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

и после прерывания прехожу в цикл.

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

 

6 минут назад, legik сказал:

меняю 3 регистра длительности высокого уровня и 3 регистра длительности низкого уровня.

Вообще то это и есть ШИМ. Программный, но ШИМ.

Share this post


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

да, про "RESET" я уже задумывался но хочеться более корректно решить задачу

Да что там делать-то?

В конце цикла прерывания переводишь один разряд какого-либо порта в "0". Этот разряд соединяешь с RESET. С резистором подтягиваешь это соединение к "+" питания. И всего-то делов. 

В конце цикла прерывания просто рестартируется контроллер.


Технические вопросы решаю в теме , в личке не обсуждаю !!!

Share this post


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

В конце цикла прерывания

Мне начало казаться, что нет никакого прерывания... :crazy: 

Есть такое мнение, что формальные советы могут завести в тупик. Автор вопроса говорит на каком то своем языке...

Share this post


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

Мне начало казаться, что нет никакого прерывания... :crazy: 

 

А это что?:

 

03.07.2020 в 23:05, legik сказал:

Возможен паереход из основной программы в прерывание а при выходе из прерывания в "START" основной программы?

 

Edited by Shahabbas

Технические вопросы решаю в теме , в личке не обсуждаю !!!

Share this post


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

А это что?

Это то, что автор не может внятно объяснить ничего про ИСТОЧНИК этих прерываний. Прежде чем давать формальные советы стоит разобраться в ситуации. А ситуация противоречит здравому смыслу. Внешнего прерывания нет, а из внутренних остается только TMR0. Вы можете объяснить каким образом прерывания от таймера могут вызвать описанную автором ситуацию? Лично я - нет.

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

  • Сообщения


  • Модуль часов реального времени на основе DS1307

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