Interrupcion de Timer1 SDCC con PIC18F2550

Ver el tema anterior Ver el tema siguiente Ir abajo

Interrupcion de Timer1 SDCC con PIC18F2550

Mensaje por maigke el Lun 5 Jul 2010 - 1:08

Saludos ando tratando de entender como trabaja SDCC y despues de leer bastantito, y ver muchas de las recomendaciones de los compañeros del foro (podrán ver muchas de mis dudas en el foro, y gracias por sus amables respuestas) y siguiendo un codigo que ponen de ejemplo en el siguiente link de este mismo foro ( http://pic-linux.forosactivos.net/sdcc-f1/problema-con-la-libreria-delay-en-los-18f-t79.htm ), pude realizar la interrupción básica del Timer1, espero que el código sea lo suficientemente claro

Código:

/* ----------------------------------------------------------------------- */
/* Plantilla generada por Piklab */
#include <pic18f2550.h>
#include <delay.h>
//#include <signal.h>
//#include <stdio.h>
//#include <usart.h>
/* ----------------------------------------------------------------------- */
/* Bits de configuración: adapte los parámetros a su necesidad */
code char at __CONFIG1L CONFIG1L = _USBPLL_CLOCK_SRC_FROM_96MHZ_PLL_2_1L &
                                  _CPUDIV__OSC1_OSC2_SRC___1__96MHZ_PLL_SRC___2__1L &
                  _PLLDIV_DIVIDE_BY_5__20MHZ_INPUT__1L; 
//Se usa un cristal de 20MHz, sin el PLL habilitado, por lo tanto el CPUDIV se aplica por 1 (postscaler)
code char at __CONFIG1H CONFIG1H = _OSC_HS__USB_HS_1H &
                  _FCMEN_ON_1H & _IESO_OFF_1H;

code char at __CONFIG2L CONFIG2L = _PUT_ON_2L &
                  _BODEN_ON_2L &
                  _BODENV_2_0V_2L &
                                  _VREGEN_OFF_2L;

code char at __CONFIG2H CONFIG2H = _WDT_DISABLED_CONTROLLED_2H &
                  _WDTPS_1_32768_2H;
code char at __CONFIG3H CONFIG3H = _CCP2MUX_RC1_3H &
                  _PBADEN_PORTB_4_0__CONFIGURED_AS_DIGITAL_I_O_ON_RESET_3H &
                    _LPT1OSC_OFF_3H & _MCLRE_MCLR_ON_RE3_OFF_3H;
code char at __CONFIG4L CONFIG4L = _STVR_ON_4L &
                  _LVP_OFF_4L &
                    _ENHCPU_OFF_4L &
                  _BACKBUG_OFF_4L;

//Estos codigos son para la protección de la escritura
//En este caso todas las protecciones estan fuera

code char at __CONFIG5L CONFIG5L = _CP_0_OFF_5L & _CP_1_OFF_5L & _CP_2_OFF_5L & _CP_3_OFF_5L;
code char at __CONFIG5H CONFIG5H = _CPB_OFF_5H;
code char at __CONFIG6L CONFIG6L = _WRT_0_OFF_6L & _WRT_1_OFF_6L & _WRT_2_OFF_6L & _WRT_3_OFF_6L;
code char at __CONFIG6H CONFIG6H = _WRTC_OFF_6H & _WRTB_OFF_6H;
code char at __CONFIG7L CONFIG7L = _EBTR_0_OFF_7L & _EBTR_1_OFF_7L & _EBTR_2_OFF_7L & _EBTR_3_OFF_7L;
code char at __CONFIG7H CONFIG7H = _EBTRB_OFF_7H;


//Macros para definir los vectores de interrupcion disponibles


int j=0xFF;

//Prototipos
void init_board(void);
void delay_ms(int milis);
void delay_us(int milis);

//Sección de interruupciones

static void isr_Tmr0() interrupt 1    //Esta es una interrupcion de alta prioridad
{
    LATBbits.LATB7^=1; //complementamos el valor del bit
    PIR1bits.TMR1IF=0; //limpiamos la bandera de interrupcion
}


//Funcion Principal
void main() {
//declaracion de variables
int i=0;
int button_down=1;
int valTimer=0;

RCONbits.IPEN=1; //interrupciones por prioridad habilitadas


init_board();
PIE1bits.TMR1IE=1; //habilitamos la interrupcion del Timer1
INTCONbits.GIEH=1; //habilitamos las interrupciones globales de alta prioridad
//Si el bit IPEN es cero, entonces hay que habilitar tambien
//PEIE
http://INTCONbits.PEIE = 1 ;


// switch LEDs off
LATBbits.LATB0=1;
LATBbits.LATB1=0;
LATBbits.LATB2=1;
LATBbits.LATB3=0;
LATBbits.LATB7=1;
while (1) {

if (!PORTAbits.RA4) { // is button pressed?
if (!button_down) { // toggle LEDs
LATBbits.LATB0^=1;
LATBbits.LATB1^=1;
LATBbits.LATB2^=1;
LATBbits.LATB3^=1;

delay_ms(2);
delay_us(500);

LATBbits.LATB3^=1;
}
button_down=1;
} else {
button_down=0;
valTimer=TMR1L;
}
}
}

void init_board(void) {
/*
 * En Sdcc podemos definir la función de un periférico usando los bits de control
 * o usando todo el registro, en este caso se muestra el registro T1CON para
 * configurar el timer1 del PIC18F2550
 * el nombre del timer es T1CON y podemos asignar un valor directamente en Hexadecimal
 * por ejemplo
 *
 *    T1CON=0xDA;
 *
 * o podemos asignar de manera individual los valores a cada bit que coforma la estructura (Registro)
 * de la siguiente manera:
 *
 * T1CONbits.TMR1ON=1;
 *
 * en este caso debemos agregar el nombre T1CONbits,
 * extern __sfr __at (0xFCD) T1CON;
 * typedef union {
 *    struct {
 *        unsigned TMR1ON        : 1;  //bit menos significativo
 *        unsigned TMR1CS        : 1;
 *        unsigned NOT_T1SYNC    : 1;
 *        unsigned T1OSCEN      : 1;
 *        unsigned T1CKPS0      : 1;
 *        unsigned T1CKPS1      : 1;
 *        unsigned T1RUN        : 1;
 *        unsigned RD16          : 1;  //bit mas significactivo
 *    };
 * } __T1CON_t;
 * extern volatile __T1CON_t __at (0xFCD) T1CONbits;
 */
ADCON1=0x7; // PORTA used for digital I/O
TRISBbits.TRISB0=0; // configure PORTB0 for output (right LED)
TRISBbits.TRISB1=0; // configure PORTB1 for output (right LED)
TRISBbits.TRISB2=0; // configure PORTB2 for output (center LED)
TRISBbits.TRISB3=0; // configure PORTB3 for output (left LED)
TRISBbits.TRISB7=0; // salida para timer1
TRISAbits.TRISA4=1; // configure PORTA4 for input (pushbutton)

T1CONbits.TMR1ON=1;  //Habilita el timer1
T1CONbits.TMR1CS=0;  //Fuente de tocks interna fosc/4
T1CONbits.NOT_T1SYNC=0;
T1CONbits.T1OSCEN=0; //No habilitamos timer1 como oscilador
T1CONbits.T1CKPS0=0;
T1CONbits.T1CKPS1=0;  //Preescalador en 1:1

//T1CON=0xff;
}

void delay_ms(int milis){
delay1ktcy(5*milis);
}

void delay_us(int milis){
delay10tcy(1*milis);
}



Como veran la interrupcion entra cada 13.107ms lo que nos da una
frecuencia de 38.14 Hz, recordemos que el timer1 es de 16 bits

La compilación la hice con Piklab, tambien siguiendo las instrucciones que encontraran en este foro ( http://pic-linux.forosactivos.net/sdcc-f1/empezar-a-programar-con-sdcc-y-piklab-desde-cero-t286.htm#1418 ) y la depuracion con proteus de acuerdo al siguiente tema ( http://pic-linux.forosactivos.net/piklab-f3/piklab-pic18f2550-sdcc-y-proteus-en-ubuntu-1004-t299.htm#1462 )

Aqui pongo una imagen de la depuracion con proteus


Uploaded with ImageShack.us



Cálculos del temporizado -- Uploaded with ImageShack.us
avatar
maigke
Asiduo del Foro
Asiduo del Foro

Mensajes : 210
Fecha de inscripción : 12/04/2009
Edad : 40
Localización : Mexico

Volver arriba Ir abajo

Re: Interrupcion de Timer1 SDCC con PIC18F2550

Mensaje por Risanti el Mar 6 Jul 2010 - 21:34

Muy bueno maigke..
yo en lo particular no he experimentado mucho con sdcc y pic18, segun lo que he leido tiene mejor soporte
que con los pic16f, creo que empezare ha jugar un poco con estos micro..

Saludos y muy buen aporte..

Saludos
RiSanti.
avatar
Risanti
Asiduo del Foro
Asiduo del Foro

Mensajes : 172
Fecha de inscripción : 07/12/2008
Edad : 32
Localización : La Serena Chile

http://www.facebook.com/risanti.electronica

Volver arriba Ir abajo

Mas de una interrupción

Mensaje por lejan el Lun 25 Abr 2011 - 13:57

Hola, cómo habría que hacer para trabajar con más de una interrupción, al mismo nivel de prioridad? Por ejemplo, tenemos la interrupción del Timer1 y de la USART recepción, ambas nivel low.
Debería colocar un switch en la interrupción de nivel bajo detectando quíen fue el causante de la interrupción?

lejan
Nuevo Usuario
Nuevo Usuario

Mensajes : 4
Fecha de inscripción : 16/04/2011

Volver arriba Ir abajo

Re: Interrupcion de Timer1 SDCC con PIC18F2550

Mensaje por maigke el Lun 25 Abr 2011 - 16:00

Es correcto como lo mencionas mi estimado lejan!, saludos
avatar
maigke
Asiduo del Foro
Asiduo del Foro

Mensajes : 210
Fecha de inscripción : 12/04/2009
Edad : 40
Localización : Mexico

Volver arriba Ir abajo

Re: Interrupcion de Timer1 SDCC con PIC18F2550

Mensaje por Contenido patrocinado


Contenido patrocinado


Volver arriba Ir abajo

Ver el tema anterior Ver el tema siguiente Volver arriba

- Temas similares

 
Permisos de este foro:
No puedes responder a temas en este foro.