реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> помогите с PCO
swagger
сообщение Mar 25 2008, 15:15
Сообщение #1


Участник
*

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



привет!
собираю схему для прерывания по падению напряжения для записи данных во внутренний EEPROM на контроллере PIC16F876A. после dc/dc преобразователя через диод стоит электролит 1000uF*16, а на вход portB4 сигнал подается через делитель 10к/100к. такая схема не работает нормально.
коротим пинцетом питание на землю все работает, те происходит запись в память и чтение из нее после восстановления питания. может кто знает другой вариант решения или что здесь подправить.
Go to the top of the page
 
+Quote Post
Ilya_A
сообщение Mar 26 2008, 03:17
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 166
Регистрация: 1-12-05
Из: Иркутск
Пользователь №: 11 630



Цитата(swagger @ Mar 25 2008, 23:15) *
может кто знает другой вариант решения или что здесь подправить.

А на порт подается напруга до или после DC-DC? Нужно до него. И емкость конденсатора до DC-DC должна быть меньше чем после ИМХО. Чтобы при понижении питания до DC-DC, контроллеру хватило питания для обработки ситуации и записи в ЕЕПРОМ

Еще сталкивался с такой ситуацией (на каком-то 16м пике): уже точно не помню, толи изменение фронта происходило достаточно медленно, толи по напруге было ниже напряжения питания, но короче, в цикле выводил значение RB0, оно изменялось с 0 в 1 (или наоборот, непомню) а флаг прерывания не выставлялся... (INT0IF) хотя фронт прерывания был настроен правильно!
Go to the top of the page
 
+Quote Post
swagger
сообщение Mar 26 2008, 05:53
Сообщение #3


Участник
*

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



да сигнал заводим до dc/dc преобразователя, кондер стоит там намного меньше чем после него. сейчас думаю ставить стабилитрон и делитель для напряжения прерывания. может кто подскажет как тогда грамотно развязать земли (у меня аналоговая +24В и цифровая +5В).
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Mar 26 2008, 06:04
Сообщение #4


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Чтобы сформировать крутой фронт, надо поставить триггер шмитта на контрольном входе , тогда и фронт нормальный будет, и уровни, и защита от помех (широкий гистерезис).


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
swagger
сообщение Mar 26 2008, 06:36
Сообщение #5


Участник
*

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



а кто-нибудь использовал мониторы питания или супервизоры (типа микрочип или maxim). я только про них читал, но ни разу не пользовал. стоит ли на них заморачиваться?
Go to the top of the page
 
+Quote Post
Ilya_A
сообщение Mar 26 2008, 07:41
Сообщение #6


Частый гость
**

Группа: Свой
Сообщений: 166
Регистрация: 1-12-05
Из: Иркутск
Пользователь №: 11 630



Цитата(swagger @ Mar 26 2008, 14:36) *
а кто-нибудь использовал мониторы питания или супервизоры (типа микрочип или maxim). я только про них читал, но ни разу не пользовал. стоит ли на них заморачиваться?

Вполне можно использовать - будет на много "железнее".
Go to the top of the page
 
+Quote Post
abivan
сообщение Mar 26 2008, 09:49
Сообщение #7





Группа: Участник
Сообщений: 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 отлично работает.
Go to the top of the page
 
+Quote Post
swagger
сообщение Mar 27 2008, 05:43
Сообщение #8


Участник
*

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



сейчас поставил пока стабилитрон+делитель. немного поковырялся с программой и выяснил следующий момент. при организации записи в память прямо из подпрограммы обработки прерывания, запись и чтение отрабатывают нормально, а если делать выставление флага по прерыванию на PORTB,4 и опрос его потом в основном цикле программы, то записи не происходит и вообще этот флаг не выставляется. Может кто-нибудь знает почему так происходит?
Go to the top of the page
 
+Quote Post
Ilya_A
сообщение Mar 27 2008, 07:29
Сообщение #9


Частый гость
**

Группа: Свой
Сообщений: 166
Регистрация: 1-12-05
Из: Иркутск
Пользователь №: 11 630



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

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

Единственное, что можно сказать - это то, что у вас слишком долго крутится основной цикл программы, и проверка флага происходит редко. Либо что-то не так написано...
Go to the top of the page
 
+Quote Post
swagger
сообщение Mar 27 2008, 08:12
Сообщение #10


Участник
*

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
Ilya_A
сообщение Mar 27 2008, 09:31
Сообщение #11


Частый гость
**

Группа: Свой
Сообщений: 166
Регистрация: 1-12-05
Из: Иркутск
Пользователь №: 11 630



Хорошо. Только странно - зачем выкладывать рабочую версию, если проблемы с нерабочей ? smile.gif

Появились вопросы:

Вы когда пишете в ЕЕПРОМ прерывания выключаете?

В процедуре CheckStat у вас случайно не меняется банк? Если так, то перед очередной проверкой btfsc itog,6 нужно сново выполнить banksel itog

А в прерывании не надо тоже сделать banksel itog для надежности?

И вообще, пишите лучше на Си ; )
Go to the top of the page
 
+Quote Post
swagger
сообщение Mar 27 2008, 11:34
Сообщение #12


Участник
*

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



Цитата(Илья @ Mar 27 2008, 12:31) *
Хорошо. Только странно - зачем выкладывать рабочую версию, если проблемы с нерабочей ? smile.gif

Появились вопросы:

Вы когда пишете в ЕЕПРОМ прерывания выключаете?

В процедуре CheckStat у вас случайно не меняется банк? Если так, то перед очередной проверкой btfsc itog,6 нужно сново выполнить banksel itog

А в прерывании не надо тоже сделать banksel itog для надежности?

И вообще, пишите лучше на Си ; )


Спасибо за уточнения. везде проверил, банки выбраны правильно. При записи все прерывания запрещаем.
Еще вопрос по ходу возник: Есть мнение, что основной цикл и подпрограмма обработки прерывания должна быть как можно короче? Насколько это соответсвует действительности? Исходя из этого я и не хочу, чтобы запись в память была в подпрг обработки прерывания.

ps С в процессе изучения =)
Go to the top of the page
 
+Quote Post
Ilya_A
сообщение Mar 27 2008, 13:26
Сообщение #13


Частый гость
**

Группа: Свой
Сообщений: 166
Регистрация: 1-12-05
Из: Иркутск
Пользователь №: 11 630



А по каким признакам вы делаете вывод что бит itog,6 в прерывании не выставляется?

Цитата(swagger @ Mar 27 2008, 19:34) *
Есть мнение, что основной цикл и подпрограмма обработки прерывания должна быть как можно короче? Насколько это соответсвует действительности?


Сложно оценить, приведите процедуры trmStatus и CheckStat
А также неработающую версию программы
Go to the top of the page
 
+Quote Post
swagger
сообщение Mar 28 2008, 05:44
Сообщение #14


Участник
*

Группа: Участник
Сообщений: 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 и на запись они вообще не влияют.
Go to the top of the page
 
+Quote Post
abivan
сообщение Mar 28 2008, 08:37
Сообщение #15





Группа: Участник
Сообщений: 13
Регистрация: 3-02-06
Пользователь №: 13 954



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

Так программа при пропаже питания не должна ничего больше делать кроме как писать в EEPROM. Поэтому в данном случае самое правильное расположить код записи в EEPROM непосредственно в прерывании. Только нужно не забыть обеспечить целосность сохраняемых данных. Это когда половина обновилась в основной проге, а половина не успела потому что прерывание пришло.
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 04:31
Рейтинг@Mail.ru


Страница сгенерированна за 0.01957 секунд с 7
ELECTRONIX ©2004-2016