|
помогите с PCO |
|
|
|
Mar 25 2008, 15:15
|
Участник

Группа: Участник
Сообщений: 65
Регистрация: 18-01-08
Из: Moscow
Пользователь №: 34 201

|
привет! собираю схему для прерывания по падению напряжения для записи данных во внутренний EEPROM на контроллере PIC16F876A. после dc/dc преобразователя через диод стоит электролит 1000uF*16, а на вход portB4 сигнал подается через делитель 10к/100к. такая схема не работает нормально. коротим пинцетом питание на землю все работает, те происходит запись в память и чтение из нее после восстановления питания. может кто знает другой вариант решения или что здесь подправить.
|
|
|
|
|
Mar 26 2008, 03:17
|
Частый гость
 
Группа: Свой
Сообщений: 166
Регистрация: 1-12-05
Из: Иркутск
Пользователь №: 11 630

|
Цитата(swagger @ Mar 25 2008, 23:15)  может кто знает другой вариант решения или что здесь подправить. А на порт подается напруга до или после DC-DC? Нужно до него. И емкость конденсатора до DC-DC должна быть меньше чем после ИМХО. Чтобы при понижении питания до DC-DC, контроллеру хватило питания для обработки ситуации и записи в ЕЕПРОМ Еще сталкивался с такой ситуацией (на каком-то 16м пике): уже точно не помню, толи изменение фронта происходило достаточно медленно, толи по напруге было ниже напряжения питания, но короче, в цикле выводил значение RB0, оно изменялось с 0 в 1 (или наоборот, непомню) а флаг прерывания не выставлялся... (INT0IF) хотя фронт прерывания был настроен правильно!
|
|
|
|
|
Mar 26 2008, 05:53
|
Участник

Группа: Участник
Сообщений: 65
Регистрация: 18-01-08
Из: Moscow
Пользователь №: 34 201

|
да сигнал заводим до dc/dc преобразователя, кондер стоит там намного меньше чем после него. сейчас думаю ставить стабилитрон и делитель для напряжения прерывания. может кто подскажет как тогда грамотно развязать земли (у меня аналоговая +24В и цифровая +5В).
|
|
|
|
|
Mar 26 2008, 06:36
|
Участник

Группа: Участник
Сообщений: 65
Регистрация: 18-01-08
Из: Moscow
Пользователь №: 34 201

|
а кто-нибудь использовал мониторы питания или супервизоры (типа микрочип или maxim). я только про них читал, но ни разу не пользовал. стоит ли на них заморачиваться?
|
|
|
|
|
Mar 26 2008, 07:41
|
Частый гость
 
Группа: Свой
Сообщений: 166
Регистрация: 1-12-05
Из: Иркутск
Пользователь №: 11 630

|
Цитата(swagger @ Mar 26 2008, 14:36)  а кто-нибудь использовал мониторы питания или супервизоры (типа микрочип или maxim). я только про них читал, но ни разу не пользовал. стоит ли на них заморачиваться? Вполне можно использовать - будет на много "железнее".
|
|
|
|
|
Mar 26 2008, 09:49
|
Группа: Участник
Сообщений: 13
Регистрация: 3-02-06
Пользователь №: 13 954

|
Цитата(swagger @ Mar 25 2008, 18:15)  привет! собираю схему для прерывания по падению напряжения для записи данных во внутренний EEPROM на контроллере PIC16F876A. после dc/dc преобразователя через диод стоит электролит 1000uF*16, а на вход portB4 сигнал подается через делитель 10к/100к. такая схема не работает нормально. коротим пинцетом питание на землю все работает, те происходит запись в память и чтение из нее после восстановления питания. может кто знает другой вариант решения или что здесь подправить. Порекомендую также обратить внимание на более современные контроллеры имеющие на борту PLVD, который и предназначенн как раз для этих целей. PIC16F916, например. Он и стоит дешевле $2.20 вместо $3.4 Связка plvd + bor отлично работает.
|
|
|
|
|
Mar 27 2008, 05:43
|
Участник

Группа: Участник
Сообщений: 65
Регистрация: 18-01-08
Из: Moscow
Пользователь №: 34 201

|
сейчас поставил пока стабилитрон+делитель. немного поковырялся с программой и выяснил следующий момент. при организации записи в память прямо из подпрограммы обработки прерывания, запись и чтение отрабатывают нормально, а если делать выставление флага по прерыванию на PORTB,4 и опрос его потом в основном цикле программы, то записи не происходит и вообще этот флаг не выставляется. Может кто-нибудь знает почему так происходит?
|
|
|
|
|
Mar 27 2008, 07:29
|
Частый гость
 
Группа: Свой
Сообщений: 166
Регистрация: 1-12-05
Из: Иркутск
Пользователь №: 11 630

|
Цитата(swagger @ Mar 27 2008, 13:43)  сейчас поставил пока стабилитрон+делитель. немного поковырялся с программой и выяснил следующий момент. при организации записи в память прямо из подпрограммы обработки прерывания, запись и чтение отрабатывают нормально, а если делать выставление флага по прерыванию на PORTB,4 и опрос его потом в основном цикле программы, то записи не происходит и вообще этот флаг не выставляется. Может кто-нибудь знает почему так происходит? Вообще-то мы тут не телепаты, как можно ответить что-то конкретное не наблюдая исходного кода программы? Единственное, что можно сказать - это то, что у вас слишком долго крутится основной цикл программы, и проверка флага происходит редко. Либо что-то не так написано...
|
|
|
|
|
Mar 27 2008, 08:12
|
Участник

Группа: Участник
Сообщений: 65
Регистрация: 18-01-08
Из: Moscow
Пользователь №: 34 201

|
ок вот текст проги. сейчас дана рабочая версмя программы, когда на запись уходим прямо из прерывания, а когда выставляем флаг и опрашиваем его в основном цикле, то ничего не работает. Код ;================ Начало ================ ;Версия программы:3.00 processor 16F876a;Используемый процессор. include"p16f876a.inc";Заголовочный файл для микроконтроллера PIC16F876a. #define flagMlp rFlag,0 ; #define zero STATUS,2 ; #define carry STATUS,0 ; #define enHrd PORTC,5 ; 0 data ready to trm, 1-data rdy to rsv
__CONFIG( _CP_OFF & _BODEN_OFF & _HS_OSC & _WRT_OFF & _WDT_OFF & _PWRTE_ON & _DEBUG_ON & _CPD_OFF & _LVP_OFF )
count equ 0x020 countr equ 0x021 itog equ 0x023 chet equ 0x024 chet1 equ 0x025 ; crc registers rAdrDev equ 50; rCmd equ 51; rAdrH equ 52; rAdrL equ 53; wrdNumH equ 54 wrdNumL equ 55; rCrcL equ 56; rCrcH equ 57;
rPauseHH equ 26; delay register rPauseH equ 27; delay register rPauseM equ 28; delay register rPauseL equ 29; delay register cByteCrc equ 25; cBitCrc equ 30; bufCrc equ 39; rFlag equ 3a; cPause equ 3b; cPauseOne equ 3f; bufTrm equ 40; cAdrFifo equ 41; cParity equ 42; bufParity equ 43; cPsRsp equ 44; cnstEAU equ 45;
; разряды в регистрах w equ 0 f equ 1 ;enables & flags FERR equ 2; OERR equ 1; RCIF equ 5; TXIF equ 4; fTest equ 0; fRunDrc equ 1;
org 0x0000;Вектор сброса процессора, после сброса программа ;начинает выполняться отсюда. nop ;Этот nop жизненно необходим для корректной работы MPLAB-ICD nop
goto Start;Обход вектора прерывания и блока подпрограмм.
;********** Начало обработчика прерываний ********** org 0x0004;Вектор прерывания.
btfsc PORTB,5; bsf itog,5 ;
btfsc PORTB,0; bsf itog,0
btfss PORTB,4; переход к подпрограмме сохранения результата goto Write ;bsf itog,6 ;
bcf INTCON,RBIF; bcf INTCON,INTF; retfie ;конец обработки прерывания ;********** Конец обработчика прерываний************
;***************** Блок подпрограмм ****************
;******************Запись в память************ Write ;....... retlw 0
;************Чтение из памяти**************** Read ;....... retlw 0 ;*************************************************** ;************* Конец блока подпрограмм *************
;********************* Программа********************** ;********** Начало Инициализации процессора **********
Start clrwdt banksel INTCON clrf INTCON banksel OPTION_REG movlw b'11100000'; movwf OPTION_REG;используем сторожевой таймер movlw b'11111111'; movwf TRISA ; movlw b'11111111'; movwf TRISB ; movlw b'10000000'; movwf TRISC ; banksel PIE1 clrf PIE1 banksel RCSTA clrf RCSTA
banksel PORTA clrf PORTA clrf PORTB clrf PORTC clrf count; clrf countr; clrf itog; ;config the hard uart banksel SPBRG movlw 081 ;129d for asinh movwf SPBRG ;speed 9.6 k movlw b'01100100' movwf TXSTA;TX9=1,TXEN=1,SYNC=0,BRGH=1, TXD9=0 (8,e,1) 11 bit, 9600k bcf TXSTA,TXEN banksel RCSTA movlw b'11010000' movwf RCSTA; SPEN=1,RX9=1,CREN=1,ADDEN=0, RX9D=0 (8,e,1) 11 bit, 9600k
;********** Конец Инициализации процессора ********* ;====================================================
;==================================================== banksel INTCON movlw b'10011000'; movwf INTCON ; глобальное разрешение прерываний и разрешение прерываний по RB0, RB4-RB7 call Read
banksel PIR1 bcf PIR1,RCIF
Begin bcf enHrd bsf RCSTA,CREN; rcv enable clrwdt btfsc PIR1,RCIF; check status registers call trmStatus; fMainPrg banksel itog btfsc itog,5 ; call CheckStat btfsc itog,6 ; goto Write; btfsc itog,0 ; goto Null ; goto Begin ; clrwdt end
Сообщение отредактировал swagger - Mar 27 2008, 08:25
|
|
|
|
|
Mar 27 2008, 09:31
|
Частый гость
 
Группа: Свой
Сообщений: 166
Регистрация: 1-12-05
Из: Иркутск
Пользователь №: 11 630

|
Хорошо. Только странно - зачем выкладывать рабочую версию, если проблемы с нерабочей ?  Появились вопросы: Вы когда пишете в ЕЕПРОМ прерывания выключаете? В процедуре CheckStat у вас случайно не меняется банк? Если так, то перед очередной проверкой btfsc itog,6 нужно сново выполнить banksel itog А в прерывании не надо тоже сделать banksel itog для надежности? И вообще, пишите лучше на Си ; )
|
|
|
|
|
Mar 27 2008, 11:34
|
Участник

Группа: Участник
Сообщений: 65
Регистрация: 18-01-08
Из: Moscow
Пользователь №: 34 201

|
Цитата(Илья @ Mar 27 2008, 12:31)  Хорошо. Только странно - зачем выкладывать рабочую версию, если проблемы с нерабочей ?  Появились вопросы: Вы когда пишете в ЕЕПРОМ прерывания выключаете? В процедуре CheckStat у вас случайно не меняется банк? Если так, то перед очередной проверкой btfsc itog,6 нужно сново выполнить banksel itog А в прерывании не надо тоже сделать banksel itog для надежности? И вообще, пишите лучше на Си ; ) Спасибо за уточнения. везде проверил, банки выбраны правильно. При записи все прерывания запрещаем. Еще вопрос по ходу возник: Есть мнение, что основной цикл и подпрограмма обработки прерывания должна быть как можно короче? Насколько это соответсвует действительности? Исходя из этого я и не хочу, чтобы запись в память была в подпрг обработки прерывания. ps С в процессе изучения =)
|
|
|
|
|
Mar 27 2008, 13:26
|
Частый гость
 
Группа: Свой
Сообщений: 166
Регистрация: 1-12-05
Из: Иркутск
Пользователь №: 11 630

|
А по каким признакам вы делаете вывод что бит itog,6 в прерывании не выставляется? Цитата(swagger @ Mar 27 2008, 19:34)  Есть мнение, что основной цикл и подпрограмма обработки прерывания должна быть как можно короче? Насколько это соответсвует действительности? Сложно оценить, приведите процедуры trmStatus и CheckStat А также неработающую версию программы
|
|
|
|
|
Mar 28 2008, 05:44
|
Участник

Группа: Участник
Сообщений: 65
Регистрация: 18-01-08
Из: Moscow
Пользователь №: 34 201

|
неработающая отличается только тем, что выход на запись идет из основного цикла, а не из подпрг обработки прерывания. Вот так не работает Код ;================ Начало ================ ;Версия программы:3.00 processor 16F876a;Используемый процессор. include"p16f876a.inc";Заголовочный файл для микроконтроллера PIC16F876a. #define flagMlp rFlag,0 ; #define zero STATUS,2 ; #define carry STATUS,0 ; #define enHrd PORTC,5 ; 0 data ready to trm, 1-data rdy to rsv
__CONFIG( _CP_OFF & _BODEN_OFF & _HS_OSC & _WRT_OFF & _WDT_OFF & _PWRTE_ON & _DEBUG_ON & _CPD_OFF & _LVP_OFF )
org 0x0000 goto Start
;********** Начало обработчика прерываний ********** org 0x0004;Вектор прерывания.
btfsc PORTB,5 ; bsf itog,5 ;
btfsc PORTB,0 ; bsf itog,0
btfss PORTB,4 ; переход к подпрограмме сохранения результата bsf itog,6 ;
bcf INTCON,RBIF; bcf INTCON,INTF; retfie ;конец обработки прерывания ;********** Конец обработчика прерываний************
;***************** Блок подпрограмм ****************
;******************Запись в память************ Write ;....... retlw 0
;************Чтение из памяти**************** Read ;....... retlw 0 ;*************************************************** ;************* Конец блока подпрограмм *************
;********************* Программа********************** ;********** Начало Инициализации процессора **********
Start clrwdt banksel INTCON clrf INTCON ; Перестраховываемся, запрещаем все прерывания. banksel OPTION_REG movlw b'11100000'; movwf OPTION_REG;используем сторожевой таймер movlw b'11111111'; movwf TRISA ; movlw b'11111111'; movwf TRISB ; movlw b'10000000'; movwf TRISC ; banksel PIE1 clrf PIE1 banksel RCSTA clrf RCSTA
banksel PORTA clrf PORTA clrf PORTB clrf PORTC clrf count; clrf countr; clrf itog; ;config the hard uart banksel SPBRG movlw 081 ;129d for asinh movwf SPBRG ;speed 9.6 k movlw b'01100100' movwf TXSTA ;TX9=1,TXEN=1,SYNC=0,BRGH=1, TXD9=0 (8,e,1) 11 bit, 9600k bcf TXSTA,TXEN banksel RCSTA movlw b'11010000' movwf RCSTA ; SPEN=1,RX9=1,CREN=1,ADDEN=0, RX9D=0 (8,e,1) 11 bit, 9600k
;********** Конец Инициализации процессора ********* ;====================================================
;==================================================== banksel INTCON movlw b'10011000'; movwf INTCON ; глобальное разрешение прерываний и разрешение прерываний по RB0, RB4-RB7 call Read
banksel PIR1 bcf PIR1,RCIF
Begin bcf enHrd bsf RCSTA,CREN; rcv enable clrwdt btfsc PIR1,RCIF; check status registers call trmStatus; fMainPrg banksel itog btfsc itog,5 ; call CheckStat btfsc itog,6 ; goto Write ; btfsc itog,0 ; goto Null ; goto Begin ; clrwdt end насчет флага itog,6 - выставляю точку останова, и при такой записи программа туда вообще не уходит. остальные подпрг это обработка uart'a и на запись они вообще не влияют.
|
|
|
|
|
Mar 28 2008, 08:37
|
Группа: Участник
Сообщений: 13
Регистрация: 3-02-06
Пользователь №: 13 954

|
Цитата(swagger @ Mar 27 2008, 14:34)  Еще вопрос по ходу возник: Есть мнение, что основной цикл и подпрограмма обработки прерывания должна быть как можно короче? Насколько это соответсвует действительности? Исходя из этого я и не хочу, чтобы запись в память была в подпрг обработки прерывания. Так программа при пропаже питания не должна ничего больше делать кроме как писать в EEPROM. Поэтому в данном случае самое правильное расположить код записи в EEPROM непосредственно в прерывании. Только нужно не забыть обеспечить целосность сохраняемых данных. Это когда половина обновилась в основной проге, а половина не успела потому что прерывание пришло.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|