YA SOLUCIONÉ EL PROBLEMA, HABIA COMETIDO UN ERROR CON LAS FLAGS. POR FAVOR NO CONTESTAR, GRACIAS!Buenas, soy nuevo en el foro y tengo un problema que paso a detallar:
Estoy tratando de modificar un programa en asm para el PIC 16F877A que tiene interrupciones con contador, funciona de esta manera: Cada veinte interrupciones se guardan en EEPROM una serie de bytes, cuando termina, se reinicia el contador y asi sucesivamente. Es una radio, la frecuencia del display se graba mas o menos cada 3 segundos en EEPROM para que cuando se apague y se vuelva a encender aparezca en el display la frecuencia que se había usado antes del apagado.
El codigo es el siguiente:
T1CON_INIT EQU 0x31 ; Timer1 - Prescale of 8 and enable the timer
INTCON_INIT EQU 0xC0 ; Interrupt Control- Enable Global and Peripheral
COUNT_OF_INTS EQU 20 ; Interrupts before saving
int_counter ; Used to count number of interrupts
;
;
ORG 0x0000
reset_entry
goto Start ; Jump around the band table to main program
ORG 0x0004
interrupt_entry
goto interrupt ; Go to interrupt routine
;
;
Start
movlw count_of_ints ; Get number of interrupts before saving
movwf int_counter ; Initialize the counter
bcf PIR1,TMR1IF ; Reset the Timer 1 interrupt flag
clrf TMR1L ; Set Timer 1 Low and
clrf TMR1H ; Timer 1 High to maximum count
Bank1
bsf PIE1,TMR1IE ; Enable Timer 1 overflow interrupt
Bank0
movlw INTCON_INIT ; Get GIE and PEIE bits and enable
movwf INTCON ; Global and Peripheral interrupts
movlw T1CON_INIT ; Get T1CKPS1, T1CKPS0 and TMR1ON bits
movwf T1CON ; and enable Timer 1 with prescale of 8
;
;
interrupt
movwf save_w ; Store W in save_w
swapf STATUS,w ; Move STATUS to W
clrf STATUS ; Force to Bank 0
movwf save_s ; Store STATUS in save_s
movf FSR,w ; Move FSR into W
movwf save_fsr ; Save FSR
clrf T1CON ; Stop the timer by clearing T1CON
bsf int_flags,T1_INT ; Set the flag for poll_encoder
bcf PIR1,TMR1IF ; Reset the interrupt flag
clrf TMR1L ; Reload Timer 1 Low
clrf TMR1H ; and Timer 1 High
movlw T1CON_INIT ; Restart Timer 1 with prescale = 8
movwf T1CON ; Timer 1 control
movf save_fsr,w ; Get saved FSR
movwf FSR ; Restore the FSR
swapf save_s,w ; Get saved status
movwf STATUS ; Restore STATUS register (now in pre-interrupt Bank)
swapf save_w,f ;
swapf save_w,w ; Restore W register
retfie
;
;
process_int
decfsz int_counter,f ; Decrement the interrupt counter
goto int_exit ; Not zero, exit
; Guarda freq actual en EEPROM
call VFOA_save
movlw count_of_ints ; Initialize the counter
movwf int_counter ; to start over
int_exit
bcf int_flags,T1_INT ; Reset the interrupt flag bit
goto proc_int_rtn ; Back to poll_encoder
Se carga el numero de veces que tienen que realizarse las interrupciones (20) en la variable int_counter, cada vez que se realiza una interrupción, en la rutina process_int se le resta un bit a int_counter, 20 veces hasta llegar a 0, cuando se llega a 0 se llama a la rutina de guardado de los bytes que equivalen a la frecuencia que muestra el display (no puse esta rutina aqui porque creo que no viene al caso). Al terminar de guardar se vuelve a cargar el 20 en int_counter y se reinicia el conteo y asi sucesivamente. En otra rutina en loop va esta otra parte del codigo:
btfsc int_flags,T1_INT ; Has a Timer 1 interrupt occurred
goto process_int ; Yes, go process it
proc_int_rtn ; Return from interrupt processing
Que es el que va a process_int cada vez que se produce una interrupción.
El problema es que cuando quiero grabar en EEPROM otros datos no puedo, no en la rutina de interrupción, si no por medio de una rutina que se acciona al presionar un botón, supongo que no se puede porque las interrupciones estan activadas? y además de eso cada vez que el conteo llega a 0 se llama a una rutina para grabar en EEPROM?
Ya probé tratando de desactivar las interrupciones pero no se si lo hago mal, ya que cada vez que quiero guardar algún dato en EEPROM no se guarda nada ni tampoco lee nada.
La manera en que intenté desactivar las interrupciones fueron las siguientes:
bcf PIE1,TMR1IE <- Primero probé con poner a 0 TMR1IE justo antes de llamar a guardar en EEPROM, desactiva las interrupciones pero no guarda ni lee.
clrf T1CON <- Despues probé con detener el timer justo antes de llamar a guardar en EEPROM, desactiva las interrupciones pero tampoco guarda ni lee.
Los direccionamientos en EEPROM son correctos pero no logro entender por que no guarda ni lee nada...
![redhot :5]](http://www.todopic.com.ar/foros/Smileys/default/redhot.gif)
Resumiendo: necesito frenar las interrupciones para poder grabar manualmente en EEPROM ya que con las interrupciones habilitadas no logro hacerlo.
Agradezco su ayuda.
YA SOLUCIONÉ EL PROBLEMA, HABIA COMETIDO UN ERROR CON LAS FLAGS. POR FAVOR NO CONTESTAR, GRACIAS!