#INT_TIMER1
void interrupcion_timer1()
{
setup_timer_1(T1_DISABLED);
}
#ZERO_RAM
void main()
{
setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);
enable_interrupts(int_timer1);
enable_interrupts(global);
set_timer1(64429);
sleep();
LCD_PUTC("\fz"); //Esto lo uso para ver si se interrumpe o no, faltaría el include del lcd y el lcd_init() y todo eso que tb lo tengo puesto
}
#include <18F4550.h>
#FUSES NOWDT //No Watch Dog Timer
#FUSES WDT128 //Watch Dog Timer uses 1:128 Postscale
#FUSES HS //High speed Osc (> 4mhz)
#FUSES NOPROTECT //Code not protected from reading
#FUSES NOBROWNOUT //No brownout reset
#FUSES BORV20 //Brownout reset at 2.0V
#FUSES NOPUT //No Power Up Timer
#FUSES NOCPD //No EE protection
#FUSES STVREN //Stack full/underflow will cause reset
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOWRT //Program memory not write protected
#FUSES NOWRTD //Data EEPROM not write protected
#FUSES IESO //Internal External Switch Over mode enabled
#FUSES FCMEN //Fail-safe clock monitor enabled
#FUSES NOPBADEN //PORTB pins are configured as digital I/O on RESET
#FUSES NOWRTC //configuration not registers write protected
#FUSES NOWRTB //Boot block not write protected
#FUSES NOEBTR //Memory not protected from table reads
#FUSES NOEBTRB //Boot block not protected from table reads
#FUSES NOCPB //No Boot Block code protection
#FUSES MCLR //Master Clear pin enabled
[u]#FUSES NOLPT1OSC //Timer1 configured for low-power operation[/u]
#FUSES NOXINST //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
#FUSES PLL1 //No PLL PreScaler
#use delay(clock=12000000)
#int_TIMER1
TIMER1_isr()
{
setup_timer_1(T1_DISABLED);
}
#define LCD_TYPE 2
#include <lcd.c>
void main()
{
lcd_init();
setup_adc_ports(NO_ANALOGS|VSS_VDD);
setup_adc(ADC_OFF);
setup_psp(PSP_DISABLED);
setup_spi(FALSE);
setup_wdt(WDT_OFF);
setup_timer_0(RTCC_INTERNAL);
setup_timer_2(T2_DISABLED,0,1);
setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
setup_oscillator(False);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);
// TODO: USER CODE!!
LCD_PUTC("\fINICIO");
set_timer1(50000);
enable_interrupts(INT_TIMER1);
enable_interrupts(GLOBAL);
sleep();
LCD_PUTC("\nok");
WHILE(1);
}
#bit TMR1ON=0xFCD.0Publicado por: vszener
Vamos a ver que nos aclaremos, quitando la instrucción sleep(); debe funcionar teóricamente.
El micro no se despierta del estado sleep mediante el timer, lo indica el data sheet.
Aparte, si que te enrará una vez, sólamente, en la interrupción, lo que pasa, que en dicha interrupción tienes puesto la instrucción de desactivar el timer1, así que no te entrará más.
Prueba con quitar la instrucción sleep(); (es obligatorio para que pueda el micro abordar la interrupción del timer), y ponerle en la rutina de interrupción, el intercambio de estado de, por ejemplo, un led.
Publicado por: maunix
Bueno, las cosas que veo.
1) No has hecho arrancar a el timer, por eso hacer TMR1ON lo ha hecho andar y que se produzca la interrupción. (si te fijas es lo que puse en mi primera respuesta donde te preguntaba donde lo encendías al timer)
2) Es posible que no estés regresando del vector de interrupciones y/o que no estes borrando el flag de la interrupción del timer1. No se si el CCS hace esto automático o lo debes hacer tu. En concreto es PIR1.TMR1IF = 0 y PIE1.TMR1IE = 0
El pic que estas usando prevé el uso de 2 niveles de interrupción, ¿estás teniendo esto en cuenta?
3) Otra pregunta, si quitas todo lo relacionado al timer, esas instrucciones del LCD se procesan bien y se ven en el display? Acaso no será ese el problema?