Форум Микро-Чип
Поиск и заказ электронных компонентов
 

Вернуться   Форум Микро-Чип > Продукция MICROCHIP

Продукция MICROCHIP Технические вопросы по всей продукции Microchip

Ответ
 
Опции темы Опции просмотра
Старый 26.07.2020, 22:32   #1
КотДаВинчи
Member
 
Регистрация: 27.08.2015
Сообщений: 41
Вес репутации: 91/0
КотДаВинчи will become famous soon enough
По умолчанию Выход из прерывания в PIC16F628A

Здравствуйте!
Столкнулся со следующей проблемой- выход из обработки прерывания не всегда проходит штатно. Собран макет с двумя кнопками: по нажатию одной устройство заходит в программу обработки прерывания, по нажатию другой выходит из обработки прерывания.
В основной программе счетчик count инкрементируется, для контроля процесса подключены светодиоды. Младший бит PORTB занят для внешнего прерывания, поэтому отображается в RA3.
В обработчике прерывания применен бесконечный цикл вкл/выкл светодиодом_1, для контроля процесса. По нажатию на кнопку выхода из обработки прерывания, ПИК выходит в основную программу.
Если обработка прерывания длится более минуты ( внутренний 4 МГц), то основная программа перестает работать - зажигаются светодиоды в статическом режиме, т.е. счетчик count не работает?
При вторичном нажатии кнопки прерывания ПИК заново входит в обработчик, портВ переходит в режим "прием", светодиод_1 прерывания моргает, при выходе из прерывания статическое состояние светодиодов портВ остается.
Если процесс прерывания менее минуты, то все работает, как по написанному.
В чем проблема?
КотДаВинчи вне форума   Ответить с цитированием
Старый 26.07.2020, 22:36   #2
КотДаВинчи
Member
 
Регистрация: 27.08.2015
Сообщений: 41
Вес репутации: 91/0
КотДаВинчи will become famous soon enough
По умолчанию Re: Выход из прерывания в PIC16F628A

Качество не очень...
Миниатюры
макет.png  
КотДаВинчи вне форума   Ответить с цитированием
Старый 26.07.2020, 22:38   #3
КотДаВинчи
Member
 
Регистрация: 27.08.2015
Сообщений: 41
Вес репутации: 91/0
КотДаВинчи will become famous soon enough
По умолчанию Re: Выход из прерывания в PIC16F628A

Код:
list      p=16F628A           ; list directive to define processor
	#include <p16F628A.inc>       ; processor specific variable definitions

	errorlevel  -302              ; suppress message 302 from list file
	__CONFIG   _CP_OFF & _DATA_CP_OFF & _LVP_OFF & _BOREN_OFF & _MCLRE_OFF & _WDT_OFF & _PWRTE_ON & _INTOSC_OSC_NOCLKOUT 

;***** VARIABLE DEFINITIONS (examples)

; example of using Shared Uninitialized Data Section
;INT_VAR		UDATA_SHR	0x71   
w_temp		RES     1		; variable used for context saving 
status_temp	RES     1		; variable used for context saving
count_temp	RES     1		; 
count		equ		20		; счетчик для переключения светодиодов в нормальном режиме без прерывания
DGPIOA		equ		0x31	; Выходное слово для PORTA
DGPIOB		equ		0x32	; Выходное слово для PORTB

Keyint		equ		0		;RB0
Keyout		equ		3		;RA3

;**********************************************************************
; initialize eeprom locations

;EE		CODE	0x2100
;		DE	0x00, 0x01, 0x02, 0x03

;RESET_VECTOR	CODE
		org	0x000		; processor reset vector
		goto   INT
		goto    main              ; go to beginning of program


;INT_VECTOR	CODE	
		org	0x004		; interrupt vector location
;INT
		movwf   w_temp            ; save off current W register contents
		movf	STATUS,w          ; move status register into W register
		movwf	status_temp       ; save off contents of STATUS register

; обработка прерывания

		call	InPORTB				;перевод линий порта В на прием

S1
		btfss	PORTA,Keyout		;выход из пп, если нажата клавиша		
		goto	S2

		bsf 	DGPIOA,1			;гасим светодиод "0"
		bcf 	DGPIOA,2			;зажигаем светодиод
		movf 	DGPIOA,0 			;
		movwf 	PORTA 				;
		call	del_524ms			;задержка 

		bsf 	DGPIOA,2			;гасим светодиод
		movf 	DGPIOA,0 			;
		movwf 	PORTA 				;
		call	del_524ms			;задержка 

		goto	S1
S2


		bcf		INTCON,INTF			;сброс поднятого флага прерывания
		call	OutPORTB		;перевод линий порта В на передачу

		movf    status_temp,w     ; retrieve copy of STATUS register
		movwf	STATUS            ; restore pre-isr STATUS register contents
		swapf   w_temp,f
		swapf   w_temp,w          ; restore pre-isr W register contents
		clrf	count

;		goto INT
		retfie                    ; return from interrupt


main
; первоначальная настройка

		clrf	INTCON				; запрещаем все прерывания, 	
		bsf		INTCON,7			; разрешение прерываний глобальное
		bsf		INTCON,4			; разрешение прерываний по входу RB0



        clrf	RCSTA   		    ; Отключение USART.
        clrf	T1CON				; ----"----  TMR1.
        clrf	T2CON       		; ----"----  TMR2.
        clrf	CCP1CON     		; ----"----  CCP.
		clrf	PORTA				; Выключение компаратора
		movlw	0x07				;
		movwf	CMCON				;
		bcf     STATUS,IRP       	; переход в 1 банк косвенная адресация
		bsf     STATUS,RP0       	; переход в 1 банк  
		bcf     STATUS,RP1       	; переход в 1 банк 
        clrf    VRCON       		; Откл. ИОП 
		clrf 	PIE1				; запрет разрешения прерываний от ЕПРОМ,компараторов, USART, CCP1,TMR1,TMR2
		clrf 	TXSTA				; модуль USART отключен сбросом бита 5 (TXEN)
		movlw	b'10010111'			; запись в регистр OPTION_REG
		movwf	OPTION_REG			; констант управления
;биты 0-2 выбор коэфф деления частоты для таймера0/сторожа
;бит 3 выбор таймера0/сторожа 1- сторож
;бит 4 выбор фронта для таймера0 от входа RA4
;бит 5 выбор источника тактовых импульсов RA4 или внутреннего тактового импульса 1- от внешнего
;бит 6 выбор фронта для прерывания от RB0/INT 0-спадающий фронт, при 
;бит 7 запрет/разрешение индивидуально подтяжки внутренними резисторами входов 1 - запрет

;		movlw	b'00110100'			;Определить каналы вход/выход для порта А 
		movlw	b'00001000'	
		movwf	TRISA				;
		movlw	b'00000001'			;Определить каналы вход/выход для порта B 
		movwf	TRISB				;
		bcf     STATUS,RP0       	;переход в нулевой банк

;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++


BEGIN


		call del_524ms				;задержка в 
		bcf 	DGPIOA,1			;сбрасываем младший бит
		btfsc	count,0				;проверка младшего бита
		bsf 	DGPIOA,1			;устанавливаем 1 если
		call del_524ms				;задержка в 
		bcf 	DGPIOA,1			;сбрасываем младший бит
		btfsc	count,0				;проверка младшего бита
		bsf 	DGPIOA,1			;устанавливаем 1 если



		incf	count				;увеличение счетчика

		bcf 	DGPIOA,1			;сбрасываем младший бит
		btfsc	count,0				;проверка младшего бита
		bsf 	DGPIOA,1			;устанавливаем 1 если

		movf 	DGPIOA,0 			;
		movwf 	PORTA 				;

		movf 	count,0 			;
		movwf 	PORTB 				;


		goto 	BEGIN		  ; loop forever, remove this instruction, for test only
;=====================================================
;блок задержки на 0.5 сек для 4 МГц
;описание блока счетчика TMR1 регистр T1CON(10h) 
;Выбор внутреннего источника T1CON<1>=0, (TMR1CS=0)
;Выбор коэфф деления предделителя TMR1 (T1CKPS1: T1CKPS0) 00=1:1, 01=1:2, 10=1:4, 11=1:8.
;Включение модуля TMR1 T1CON<0>=1, (TMR1ON=1)
;======================================================
del_524ms
	bcf		PIR1,0					;Обнуление флага переполнения 16-разрядного счетчика
	movlw	b'00000000'				;запись константы в старший байт 16 разрядного счетчика таймера TMR1 b'10011110'	
	movwf	TMR1H					;
	movlw	b'00000000'				;запись константы в младший байт 16 разрядного счетчика таймера TMR1 b'01010111'
	movwf	TMR1L					;	
	movlw	b'00100001'				;Установка коэф деления 1:8 Запуск счета b'00110001'			
	movwf	T1CON					;Установка коэф деления 1:1 Запуск счета b'00000001'
delay1	
	btfss	PIR1,0					;Цикл ожидания окончания счета, опрос бита переполнения
	goto	delay1	
	bcf		T1CON,0					;выключение таймера

	return
;========================
;Окончание задержки в 0.5 секунду
;========================

;++++++++++++++++++++++++++++++++++++++++++
;ПЕРЕВОД ЛИНИЙ PortB на прием
InPORTB
		bcf     STATUS,IRP       	; переход в 1 банк косвенная адресация
		bsf     STATUS,RP0       	; переход в 1 банк  
		bcf     STATUS,RP1       	; переход в 1 банк 

		movlw	b'11111111'			;Определить каналы вход для порта B 
		movwf	TRISB				;
		bcf     STATUS,RP0       	;переход в нулевой банк
		return
;+++++++++++++++++++++++++++++++++++++++++++
;++++++++++++++++++++++++++++++++++++++++++
;ПЕРЕВОД ЛИНИЙ PortB на передачу
OutPORTB
		bcf     STATUS,IRP       	; переход в 1 банк косвенная адресация
		bsf     STATUS,RP0       	; переход в 1 банк  
		bcf     STATUS,RP1       	; переход в 1 банк 

		movlw	b'00000001'			;Определить каналы выход для порта B 
		movwf	TRISB				;
		bcf     STATUS,RP0       	;переход в нулевой банк

		return
;+++++++++++++++++++++++++++++++++++++++++++

		END
КотДаВинчи вне форума   Ответить с цитированием
Старый 27.07.2020, 03:02   #4
DmitrijVDN
Senior Member
 
Регистрация: 09.04.2010
Сообщений: 862
Вес репутации: 1709/63
DmitrijVDN has a brilliant futureDmitrijVDN has a brilliant futureDmitrijVDN has a brilliant futureDmitrijVDN has a brilliant futureDmitrijVDN has a brilliant futureDmitrijVDN has a brilliant futureDmitrijVDN has a brilliant futureDmitrijVDN has a brilliant futureDmitrijVDN has a brilliant futureDmitrijVDN has a brilliant futureDmitrijVDN has a brilliant future
По умолчанию Re: Выход из прерывания в PIC16F628A

Цитата:
Сообщение от КотДаВинчи Посмотреть сообщение
Столкнулся со следующей проблемой-
В чем проблема?
1. в куда переходите по goto INT на нулевом адресе?
2. зачем включаете прерывания до инициализации МК?
3. когда должно выполнится условие в функции задержки в основном цикле , если в прерывании вы выключили TMR1 и сбросили флаг TMR1IF?


ЗЫ что мешает вместо магических цЫфр и тупых коментов в командах
Код:
btfss    PIR1,0                    ;Цикл ожидания окончания счета, опрос бита переполнения
    goto    delay1    
    bcf        T1CON,0                    ;выключение таймера
использовать зарезервированные слова из инклюда
Код:
 btfss    PIR1,TMR1IF
    goto    delay1    
     bcf        T1CON,TMR1ON
, религия?
ЗЫЫ таймер1 сначала настраивается, потом запускается
Код:
movlw    (1<<T1CKPS1)|(0<<T1CKPS0)|(0<<TMR1CS)
    movwf    T1CON                    

    bsf T1CON,TMR1ON

Последний раз редактировалось DmitrijVDN; 27.07.2020 в 03:18.
DmitrijVDN вне форума   Ответить с цитированием
Старый 27.07.2020, 08:16   #5
SergP01
Senior Member
 
Аватар для SergP01
 
Регистрация: 09.11.2012
Адрес: SPB
Возраст: 52
Сообщений: 1,634
Вес репутации: 790/52
SergP01 is a splendid one to beholdSergP01 is a splendid one to beholdSergP01 is a splendid one to beholdSergP01 is a splendid one to beholdSergP01 is a splendid one to beholdSergP01 is a splendid one to beholdSergP01 is a splendid one to behold
По умолчанию Re: Выход из прерывания в PIC16F628A

да уж.... на таком уровне и вложенные прерывания....

топикастер....
создайте флаг PUSH_ON

в одном прерывании делайте его true, в другом -false

а в основном цикле программы этот флаг обрабатывайте...
SergP01 вне форума   Ответить с цитированием
Старый 27.07.2020, 08:54   #6
КотДаВинчи
Member
 
Регистрация: 27.08.2015
Сообщений: 41
Вес репутации: 91/0
КотДаВинчи will become famous soon enough
По умолчанию Re: Выход из прерывания в PIC16F628A

Код:
list      p=16F628A           ; 
	#include <p16F628A.inc>       ;

	errorlevel  -302              ; 
	__CONFIG   _CP_OFF & _DATA_CP_OFF & _LVP_OFF & _BOREN_OFF & _MCLRE_OFF & _WDT_OFF & _PWRTE_ON & _INTOSC_OSC_NOCLKOUT 

;***** VARIABLE DEFINITIONS (examples)

  
w_temp		RES     1		; 
status_temp	RES     1		; 
count		equ		20		; счетчик для переключения светодиодов в нормальном режиме без прерывания
DGPIOA		equ		0x31	; Выходное слово для PORTA
DGPIOB		equ		0x32	; Выходное слово для PORTB

Keyout		equ		3		;RA3

;**********************************************************************

		org	0x000		; processor reset vector
		goto    main              ; go to beginning of program


	
		org	0x004		; interrupt vector location
		movwf   w_temp            ; save off current W register contents
		movf	STATUS,w          ; move status register into W register
		movwf	status_temp       ; save off contents of STATUS register

; обработка прерывания

		call	InPORTB				;перевод линий порта В на прием

S1
		btfss	PORTA,Keyout		;выход из пп, если нажата клавиша		
		goto	S2

		bsf 	DGPIOA,1			;гасим светодиод "0"
		bcf 	DGPIOA,2			;зажигаем светодиод
		movf 	DGPIOA,0 			;
		movwf 	PORTA 				;
		call	del_524ms			;задержка 

		bsf 	DGPIOA,2			;гасим светодиод
		movf 	DGPIOA,0 			;
		movwf 	PORTA 				;
		call	del_524ms			;задержка 

		goto	S1
S2


		bcf		INTCON,INTF			;сброс флага прерывания
		call	OutPORTB		;перевод линий порта В на передачу

		movf    status_temp,w     ; retrieve copy of STATUS register
		movwf	STATUS            ; restore pre-isr STATUS register contents
		swapf   w_temp,f
		swapf   w_temp,w          ; restore pre-isr W register contents
		clrf	count

		retfie                    ; 


main
; первоначальная настройка

		clrf	INTCON				; запрещаем все прерывания, 	
		bsf		INTCON,7			; разрешение прерываний глобальное
		bsf		INTCON,4			; разрешение прерываний по входу RB0



        clrf	RCSTA   		    ; Отключение USART.
        clrf	T1CON				; ----"----  TMR1.
        clrf	T2CON       		; ----"----  TMR2.
        clrf	CCP1CON     		; ----"----  CCP.
		clrf	PORTA				; Выключение компаратора
		movlw	0x07				;
		movwf	CMCON				;
		bcf     STATUS,IRP       	; переход в 1 банк косвенная адресация
		bsf     STATUS,RP0       	; переход в 1 банк  
		bcf     STATUS,RP1       	; переход в 1 банк 
        clrf    VRCON       		; Откл. ИОП 
		clrf 	PIE1				; запрет разрешения прерываний от ЕПРОМ,компараторов, USART, CCP1,TMR1,TMR2
		clrf 	TXSTA				; модуль USART отключен сбросом бита 5 (TXEN)
		movlw	b'10010111'			; запись в регистр OPTION_REG
		movwf	OPTION_REG			; констант управления

;		movlw	b'00110100'			;Определить каналы вход/выход для порта А 
		movlw	b'00001000'	
		movwf	TRISA				;
		movlw	b'00000001'			;Определить каналы вход/выход для порта B 
		movwf	TRISB				;
		bcf     STATUS,RP0       	;переход в нулевой банк

;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++


BEGIN


		call del_524ms				;задержка в 
		bcf 	DGPIOA,1			;сбрасываем младший бит
		btfsc	count,0				;проверка младшего бита
		bsf 	DGPIOA,1			;устанавливаем 1 если
		call del_524ms				;задержка в 
		bcf 	DGPIOA,1			;сбрасываем младший бит
		btfsc	count,0				;проверка младшего бита
		bsf 	DGPIOA,1			;устанавливаем 1 если

		incf	count				;увеличение счетчика

		bcf 	DGPIOA,1			;сбрасываем младший бит
		btfsc	count,0				;проверка младшего бита
		bsf 	DGPIOA,1			;устанавливаем 1 если

		movf 	DGPIOA,0 			;
		movwf 	PORTA 				;

		movf 	count,0 			;
		movwf 	PORTB 				;


		goto 	BEGIN		  ; loop forever, remove this instruction, for test only
;=====================================================
;блок задержки на 0.5 сек для 4 МГц
;описание блока счетчика TMR1 регистр T1CON(10h) 
;Выбор внутреннего источника T1CON<1>=0, (TMR1CS=0)
;Выбор коэфф деления предделителя TMR1 (T1CKPS1: T1CKPS0) 00=1:1, 01=1:2, 10=1:4, 11=1:8.
;Включение модуля TMR1 T1CON<0>=1, (TMR1ON=1)
;======================================================
del_524ms
	bcf		PIR1,0					;Обнуление флага переполнения 16-разрядного счетчика
	movlw	b'00000000'				;запись константы в старший байт 16 разрядного счетчика таймера TMR1 b'10011110'	
	movwf	TMR1H					;
	movlw	b'00000000'				;запись константы в младший байт 16 разрядного счетчика таймера TMR1 b'01010111'
	movwf	TMR1L					;	
	movlw	b'00100001'				;Установка коэф деления 1:8 Запуск счета b'00110001'			
	movwf	T1CON					;Установка коэф деления 1:1 Запуск счета b'00000001'
delay1	
	btfss	PIR1,0					;Цикл ожидания окончания счета, опрос бита переполнения
	goto	delay1	
	bcf		T1CON,0					;выключение таймера

	return
;========================
;Окончание задержки в 0.5 секунду
;========================

;++++++++++++++++++++++++++++++++++++++++++
;ПЕРЕВОД ЛИНИЙ PortB на прием
InPORTB
		bcf     STATUS,IRP       	; переход в 1 банк косвенная адресация
		bsf     STATUS,RP0       	; переход в 1 банк  
		bcf     STATUS,RP1       	; переход в 1 банк 

		movlw	b'11111111'			;Определить каналы вход для порта B 
		movwf	TRISB				;
		bcf     STATUS,RP0       	;переход в нулевой банк
		return
;+++++++++++++++++++++++++++++++++++++++++++
;++++++++++++++++++++++++++++++++++++++++++
;ПЕРЕВОД ЛИНИЙ PortB на передачу
OutPORTB
		bcf     STATUS,IRP       	; переход в 1 банк косвенная адресация
		bsf     STATUS,RP0       	; переход в 1 банк  
		bcf     STATUS,RP1       	; переход в 1 банк 

		movlw	b'00000001'			;Определить каналы выход для порта B 
		movwf	TRISB				;
		bcf     STATUS,RP0       	;переход в нулевой банк

		return
;+++++++++++++++++++++++++++++++++++++++++++

		END

Последний раз редактировалось КотДаВинчи; 27.07.2020 в 09:00.
КотДаВинчи вне форума   Ответить с цитированием
Старый 27.07.2020, 09:14   #7
КотДаВинчи
Member
 
Регистрация: 27.08.2015
Сообщений: 41
Вес репутации: 91/0
КотДаВинчи will become famous soon enough
По умолчанию Re: Выход из прерывания в PIC16F628A

Цитата:
Сообщение от DmitrijVDN Посмотреть сообщение
1. в куда переходите по goto INT на нулевом адресе?
2. зачем включаете прерывания до инициализации МК?
3. когда должно выполнится условие в функции задержки в основном цикле , если в прерывании вы выключили TMR1 и сбросили флаг TMR1IF?


ЗЫ что мешает вместо магических цЫфр и тупых коментов в командах
Код:
btfss    PIR1,0                    ;Цикл ожидания окончания счета, опрос бита переполнения
    goto    delay1    
    bcf        T1CON,0                    ;выключение таймера
использовать зарезервированные слова из инклюда
Код:
 btfss    PIR1,TMR1IF
    goto    delay1    
     bcf        T1CON,TMR1ON
, религия?
ЗЫЫ таймер1 сначала настраивается, потом запускается
Код:
movlw    (1<<T1CKPS1)|(0<<T1CKPS0)|(0<<TMR1CS)
    movwf    T1CON                    

    bsf T1CON,TMR1ON
Служение технике не терпит суеты...
Не нашел, как отредактировать текст программы, убрал все лишнее и наносное, привел, так сказать, к первоначальному виду программу, которая зашита в пик.
Нащот цыфири - согласен, надо покрасивше писать. Убрать все "тупые" комменты, что бы не резало глаз? что только не сделаешь, когда обнаруживаешь, что уперся в стенку.
Итак, что по существу вопроса? Какой счетчик переполняется и программа начинает работать, как было описано выше?
КотДаВинчи вне форума   Ответить с цитированием
Старый 27.07.2020, 09:19   #8
SergP01
Senior Member
 
Аватар для SergP01
 
Регистрация: 09.11.2012
Адрес: SPB
Возраст: 52
Сообщений: 1,634
Вес репутации: 790/52
SergP01 is a splendid one to beholdSergP01 is a splendid one to beholdSergP01 is a splendid one to beholdSergP01 is a splendid one to beholdSergP01 is a splendid one to beholdSergP01 is a splendid one to beholdSergP01 is a splendid one to behold
По умолчанию Re: Выход из прерывания в PIC16F628A

кстати... а зачем тут вообще прерывание нужно?


и задержку я бы по другому сделал....
настроил бы таймер что тикал раз в 1ms
в прерывании делал бы глобальной переменной tick++;

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

if(tick-old_tick>=24){old_tick=tick;.......}
if(tick-old_tick2>=1100){old_tick2=tick;.......}
SergP01 вне форума   Ответить с цитированием
Старый 27.07.2020, 09:20   #9
КотДаВинчи
Member
 
Регистрация: 27.08.2015
Сообщений: 41
Вес репутации: 91/0
КотДаВинчи will become famous soon enough
По умолчанию Re: Выход из прерывания в PIC16F628A

Цитата:
Сообщение от SergP01 Посмотреть сообщение
да уж.... на таком уровне и вложенные прерывания....

топикастер....
создайте флаг PUSH_ON

в одном прерывании делайте его true, в другом -false

а в основном цикле программы этот флаг обрабатывайте...
Нет в проге никаких вложенных прерываний. В обработчике опрос состояния второй кнопки прямой, прямо с порта.

Напомню проблему
"В обработчике прерывания применен бесконечный цикл вкл/выкл светодиодом_1, для контроля процесса. По нажатию на кнопку выхода из обработки прерывания, ПИК выходит в основную программу.
Если обработка прерывания длится более минуты ( внутренний 4 МГц), то основная программа перестает работать - зажигаются светодиоды в статическом режиме,.....
При вторичном нажатии кнопки прерывания ПИК заново входит в обработчик, портВ переходит в режим "прием", светодиод_1 прерывания моргает, при выходе из прерывания статическое состояние светодиодов портВ остается.
Если процесс прерывания менее минуты, то все работает, как по написанному.
В чем проблема?"


Если программа обработки прерывания работает менее минуты, то все работает, как по написанному, иначе при выходе в основную программу видно, что программа (основная) не выполняется.
КотДаВинчи вне форума   Ответить с цитированием
Старый 27.07.2020, 09:31   #10
КотДаВинчи
Member
 
Регистрация: 27.08.2015
Сообщений: 41
Вес репутации: 91/0
КотДаВинчи will become famous soon enough
По умолчанию Re: Выход из прерывания в PIC16F628A

Цитата:
Сообщение от SergP01 Посмотреть сообщение
кстати... а зачем тут вообще прерывание нужно?


и задержку я бы по другому сделал....
настроил бы таймер что тикал раз в 1ms
в прерывании делал бы глобальной переменной tick++;

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

if(tick-old_tick>=24){old_tick=tick;.......}
if(tick-old_tick2>=1100){old_tick2=tick;.......}
ПИК будет встроен в сложное устройство в связке с СТМ32. А эта прога - вспомогательная, посмотреть, как данный ПИК будет работать в режиме внешних прерываний. Сейчас "сложный " девайс работает в одном режиме - ПИК принимает по протоколу UART поток данных, их отфильтровывает и пересылает в СТМ32, в котором вертятся три пп прерывания. Не надо спрашивать, "зачем это, да на СТМ свои порты есть...". Обнаружил вот именно такой эффект с ПИКом, а понять, в чем проблема - пока не могу.

Задержка сделана для облегчения восприятия - моргающий светодиод(ы) с частотой примерно 0,5 сек, отлично воспринимается глазом, в отличии от частоты 0,05 сек.

Последний раз редактировалось КотДаВинчи; 27.07.2020 в 09:47.
КотДаВинчи вне форума   Ответить с цитированием
Старый 27.07.2020, 10:17   #11
SergP01
Senior Member
 
Аватар для SergP01
 
Регистрация: 09.11.2012
Адрес: SPB
Возраст: 52
Сообщений: 1,634
Вес репутации: 790/52
SergP01 is a splendid one to beholdSergP01 is a splendid one to beholdSergP01 is a splendid one to beholdSergP01 is a splendid one to beholdSergP01 is a splendid one to beholdSergP01 is a splendid one to beholdSergP01 is a splendid one to behold
По умолчанию Re: Выход из прерывания в PIC16F628A

Цитата:
Сообщение от КотДаВинчи Посмотреть сообщение

Задержка сделана для облегчения восприятия - моргающий светодиод(ы) с частотой примерно 0,5 сек, отлично воспринимается глазом, в отличии от частоты 0,05 сек.
задержка глушит прогу на 0.5 сек..... скока там таких задержек понатыкано?

я не АСМист, но на С данная задача реализуется за 30 мин с парой перекуров
SergP01 вне форума   Ответить с цитированием
Старый 27.07.2020, 10:27   #12
КотДаВинчи
Member
 
Регистрация: 27.08.2015
Сообщений: 41
Вес репутации: 91/0
КотДаВинчи will become famous soon enough
По умолчанию Re: Выход из прерывания в PIC16F628A

Цитата:
Сообщение от SergP01 Посмотреть сообщение
задержка глушит прогу на 0.5 сек..... скока там таких задержек понатыкано?

я не АСМист, но на С данная задача реализуется за 30 мин с парой перекуров
Прога соответствует тексту. "задержка глушит прогу на 0.5 сек." - она и должна глушить. В данном примере основная программа ничего не делает, кроме увеличения счетчика и отображения его на выходах PORTB, кроме RB0, вместо последнего используется RA2. По сути данное решение не влияет ни на что. Почему после 1 минуты "верчения" пп прерывания, основная программа напрочь стопорится? Если менее минуты, 40 сек, к примеру, то все в порядке?

На такой ПИК на С писать проги не всегда выгодно. Понадобилась прога для вычисления 16 битовых вычислений... одна сумма двух чисел заняла 87% памяти. При адаптации на АСМ всех вычислений (несколько сот строк кода), осталось 47% памяти свободно.

Почему после 1 минуты "верчения" пп прерывания, основная программа напрочь стопорится? Если менее минуты, 40 сек, к примеру, то все в порядке?

Последний раз редактировалось КотДаВинчи; 27.07.2020 в 10:36.
КотДаВинчи вне форума   Ответить с цитированием
Старый 27.07.2020, 10:43   #13
SergP01
Senior Member
 
Аватар для SergP01
 
Регистрация: 09.11.2012
Адрес: SPB
Возраст: 52
Сообщений: 1,634
Вес репутации: 790/52
SergP01 is a splendid one to beholdSergP01 is a splendid one to beholdSergP01 is a splendid one to beholdSergP01 is a splendid one to beholdSergP01 is a splendid one to beholdSergP01 is a splendid one to beholdSergP01 is a splendid one to behold
По умолчанию Re: Выход из прерывания в PIC16F628A

я в АСМ не силён.... в тексте проги не вижу как мы влетаем в S1

если как то влетаем, то счётчик там надо заново взводить
SergP01 вне форума   Ответить с цитированием
Старый 27.07.2020, 10:52   #14
КотДаВинчи
Member
 
Регистрация: 27.08.2015
Сообщений: 41
Вес репутации: 91/0
КотДаВинчи will become famous soon enough
По умолчанию Re: Выход из прерывания в PIC16F628A

Прерывание вызывается аппаратно - от внешнего воздействия (перепадом уровней на RB0). Адрес программы запихивается в стек, запоминаются аккумулятор и регистр Статуса, как рекомендовано мануалами. При выходе из пп прерывания, восстанавливаются аккум и Статус. Из стека извлекается адрес, с которого продолжится основная программа, сбрасывается флаг прерывания. То есть, ничего особенного, как рекомендуют лучшие собаководы. Прикол в том, что если пп прерывания выполняется более некоторого времени (около 60 сек), то при выходе в основную программу, светодиоды 0 - 7, показывают статический режим, как будто на выходные защелки ПИКа ничего не посылается! При этом "зависании" , возможно сколько угодно заходить в пп прерывания и из неё выходить , при том же самом статическом состоянии выходных защелок. Режим Вход/Выход на портах выполняется.
Если пп прерывание длится 40 сек, то все в порядке, работает, как надо.
Где собака порылась?
КотДаВинчи вне форума   Ответить с цитированием
Старый 27.07.2020, 11:22   #15
SergP01
Senior Member
 
Аватар для SergP01
 
Регистрация: 09.11.2012
Адрес: SPB
Возраст: 52
Сообщений: 1,634
Вес репутации: 790/52
SergP01 is a splendid one to beholdSergP01 is a splendid one to beholdSergP01 is a splendid one to beholdSergP01 is a splendid one to beholdSergP01 is a splendid one to beholdSergP01 is a splendid one to beholdSergP01 is a splendid one to behold
По умолчанию Re: Выход из прерывания в PIC16F628A

меня вот это смущает...
movf DGPIOA,0 ;
movwf PORTA
у вас, что на гасим, что на зажигаем- одно и тоже....
и нет перевода линий на выход- вход.....

вроде как надо включить на вход... проверить кнопку.... ежели нет- включить на выход...

и вообще не понятно- зачем постоянно переключать на вход- выход....
вроде как при ините можно сразу задать биты на вход-выход....
;

Последний раз редактировалось SergP01; 27.07.2020 в 11:28.
SergP01 вне форума   Ответить с цитированием
Старый 27.07.2020, 11:25   #16
геннадий75
Member
 
Регистрация: 05.02.2012
Адрес: г.Саяногорск
Возраст: 44
Сообщений: 89
Вес репутации: 255/34
геннадий75 is a jewel in the roughгеннадий75 is a jewel in the roughгеннадий75 is a jewel in the rough
По умолчанию Re: Выход из прерывания в PIC16F628A

swapf w_temp,f
swapf w_temp,w ; restore pre-isr W register contents
clrf count

retfie ;

УБЕРИ clrf count
геннадий75 вне форума   Ответить с цитированием
Старый 27.07.2020, 11:28   #17
КотДаВинчи
Member
 
Регистрация: 27.08.2015
Сообщений: 41
Вес репутации: 91/0
КотДаВинчи will become famous soon enough
По умолчанию Re: Выход из прерывания в PIC16F628A

Цитата:
Сообщение от геннадий75 Посмотреть сообщение
swapf w_temp,f
swapf w_temp,w ; restore pre-isr W register contents
clrf count

retfie ;

УБЕРИ clrf count
Первоначально его там не было. Это в качестве эксперимента очищал счетчик. До 60 сек работы пп прерывания при выходе из неё очищает. Можно убрать и будет сохранять свое значение.
КотДаВинчи вне форума   Ответить с цитированием
Старый 27.07.2020, 11:29   #18
КотДаВинчи
Member
 
Регистрация: 27.08.2015
Сообщений: 41
Вес репутации: 91/0
КотДаВинчи will become famous soon enough
По умолчанию Re: Выход из прерывания в PIC16F628A

Цитата:
Сообщение от SergP01 Посмотреть сообщение
меня вот это смущает...
movf DGPIOA,0 ;
movwf PORTA
у вас, что на гасим, что на зажигаем- одно и тоже....
и нет перевода линий на выход- вход.....

вроде как надо включить на вход... проверить кнопку.... ежели нет- включить на выход...

и вообще не понятно- зачем постоянно переключать на вход- выход....
вроде как при ините можно сразу задать биты на вход-выход....
;
На Вход/Выход - это только для PORTB. При опросе состояния второй кнопки порт настроен на ВХОД (RA3).
КотДаВинчи вне форума   Ответить с цитированием
Старый 27.07.2020, 12:55   #19
Илья
Senior Member
 
Регистрация: 26.02.2007
Адрес: SPb
Сообщений: 1,227
Вес репутации: 1804/80
Илья has a brilliant futureИлья has a brilliant futureИлья has a brilliant futureИлья has a brilliant futureИлья has a brilliant futureИлья has a brilliant futureИлья has a brilliant futureИлья has a brilliant futureИлья has a brilliant futureИлья has a brilliant futureИлья has a brilliant future
По умолчанию Re: Выход из прерывания в PIC16F628A

del_524ms вызывается в прерываниях и вызывается из main.

внутри del_524ms запрещается работа таймера.

Что будет, если в main зашли в del_524ms, произошло прерывание, внутри Int отработали del_524ms и вышли из прерывания?
Так как таймер не работает (выключен в int), то видимо программа не выйдет из del_524ms, который был вызван в main.
Илья вне форума   Ответить с цитированием
Старый 27.07.2020, 13:31   #20
DmitrijVDN
Senior Member
 
Регистрация: 09.04.2010
Сообщений: 862
Вес репутации: 1709/63
DmitrijVDN has a brilliant futureDmitrijVDN has a brilliant futureDmitrijVDN has a brilliant futureDmitrijVDN has a brilliant futureDmitrijVDN has a brilliant futureDmitrijVDN has a brilliant futureDmitrijVDN has a brilliant futureDmitrijVDN has a brilliant futureDmitrijVDN has a brilliant futureDmitrijVDN has a brilliant futureDmitrijVDN has a brilliant future
По умолчанию Re: Выход из прерывания в PIC16F628A

Цитата:
Сообщение от КотДаВинчи Посмотреть сообщение
Итак, что по существу вопроса?
так я вам ответил 3-им пунктом, у вас рекурсия функции del_524ms через прерывание с последующей блокировкой выхода из нее в главном цикле
DmitrijVDN вне форума   Ответить с цитированием
Старый 27.07.2020, 13:47   #21
КотДаВинчи
Member
 
Регистрация: 27.08.2015
Сообщений: 41
Вес репутации: 91/0
КотДаВинчи will become famous soon enough
По умолчанию Re: Выход из прерывания в PIC16F628A

Блокировка в главном цикле образуется при работе пп прерывания только по истечении определенного времени. И это время по меркам ПИКа - громадное. Около 60 сек. А если раньше выходишь из пп, то все ОК. Скорее всего идет какое то внутреннее прерывание по переполнению 16 разрядного счетчика, а потом программа ждет какого либо сброса.
КотДаВинчи вне форума   Ответить с цитированием
Старый 27.07.2020, 13:47   #22
SergP01
Senior Member
 
Аватар для SergP01
 
Регистрация: 09.11.2012
Адрес: SPB
Возраст: 52
Сообщений: 1,634
Вес репутации: 790/52
SergP01 is a splendid one to beholdSergP01 is a splendid one to beholdSergP01 is a splendid one to beholdSergP01 is a splendid one to beholdSergP01 is a splendid one to beholdSergP01 is a splendid one to beholdSergP01 is a splendid one to behold
По умолчанию Re: Выход из прерывания в PIC16F628A

Цитата:
Сообщение от DmitrijVDN Посмотреть сообщение
так я вам ответил 3-им пунктом, у вас рекурсия функции del_524ms через прерывание с последующей блокировкой выхода из нее в главном цикле
это точно.....
вот только утверждение про 1мин непонятно....
SergP01 вне форума   Ответить с цитированием
Старый 27.07.2020, 13:50   #23
SergP01
Senior Member
 
Аватар для SergP01
 
Регистрация: 09.11.2012
Адрес: SPB
Возраст: 52
Сообщений: 1,634
Вес репутации: 790/52
SergP01 is a splendid one to beholdSergP01 is a splendid one to beholdSergP01 is a splendid one to beholdSergP01 is a splendid one to beholdSergP01 is a splendid one to beholdSergP01 is a splendid one to beholdSergP01 is a splendid one to behold
По умолчанию Re: Выход из прерывания в PIC16F628A

Цитата:
Сообщение от КотДаВинчи Посмотреть сообщение
Блокировка в главном цикле образуется при работе пп прерывания только по истечении определенного времени. И это время по меркам ПИКа - громадное. Около 60 сек. А если раньше выходишь из пп, то все ОК. Скорее всего идет какое то внутреннее прерывание по переполнению 16 разрядного счетчика, а потом программа ждет какого либо сброса.
дык.... таблицу векторов посмотрите
SergP01 вне форума   Ответить с цитированием
Старый 27.07.2020, 14:04   #24
DmitrijVDN
Senior Member
 
Регистрация: 09.04.2010
Сообщений: 862
Вес репутации: 1709/63
DmitrijVDN has a brilliant futureDmitrijVDN has a brilliant futureDmitrijVDN has a brilliant futureDmitrijVDN has a brilliant futureDmitrijVDN has a brilliant futureDmitrijVDN has a brilliant futureDmitrijVDN has a brilliant futureDmitrijVDN has a brilliant futureDmitrijVDN has a brilliant futureDmitrijVDN has a brilliant futureDmitrijVDN has a brilliant future
По умолчанию Re: Выход из прерывания в PIC16F628A

Цитата:
Сообщение от КотДаВинчи Посмотреть сообщение
Блокировка в главном цикле образуется при работе пп прерывания только по истечении определенного времени. И это время по меркам ПИКа - громадное. Около 60 сек. А если раньше выходишь из пп, то все ОК. Скорее всего идет какое то внутреннее прерывание по переполнению 16 разрядного счетчика, а потом программа ждет какого либо сброса.
пипец какой-то... ты в главном цикле вызываешь del_524ms запускаешь таймер и ждешь установки флага TMR1IF , проходит прерывание в котором ты повторно вызываешь del_524ms в котором переустанавливаешь уже работающий счетчик , ловишь установку флага TMR1IF , останавливаешь счетчик, и сбрасываешь флаг, выходишь из прерывания в del_524ms и получаешь вечный цикл потомушта TMR1IF уже никогда не установится
DmitrijVDN вне форума   Ответить с цитированием
Старый 27.07.2020, 14:06   #25
КотДаВинчи
Member
 
Регистрация: 27.08.2015
Сообщений: 41
Вес репутации: 91/0
КотДаВинчи will become famous soon enough
По умолчанию Re: Выход из прерывания в PIC16F628A

Угу... Приеду домой и обмозгую. Обязательно найду, для копилки инженера.
Но для себя решил, для данного проекта не использовать прерывание на ПИКе. Сделаю обмен данными между контроллерами немного по другому.
КотДаВинчи вне форума   Ответить с цитированием
Ответ

Метки
прерывание


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не запрещаются прерывания из обработчика прерываний shan Продукция MICROCHIP 13 10.02.2008 22:15
Выход из спячки Pic16f628 Behemoth Продукция MICROCHIP 18 12.10.2007 18:39
проблемка с PIC16F628A bereg_ok Продукция MICROCHIP 72 07.09.2007 11:00
dsPIC30F4011 - выход из строя, или...? Степной Волк Продукция MICROCHIP 11 25.07.2007 13:09
Выход из Sleep Mode MCP2515 Алексей_М Продукция MICROCHIP 0 12.06.2007 15:20


Часовой пояс GMT +3, время: 08:37.


Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, Jelsoft Enterprises Ltd. Перевод: zCarot