Interrupcion de Timer1 SDCC con PIC18F2550
3 participantes
Página 1 de 1.
Interrupcion de Timer1 SDCC con PIC18F2550
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 ( https://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
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 ( https://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 ( https://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
- 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 ( https://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 ( https://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
maigke- Asiduo del Foro
- Mensajes : 210
Fecha de inscripción : 12/04/2009
Edad : 47
Localización : Mexico
Re: Interrupcion de Timer1 SDCC con PIC18F2550
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.
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.
Mas de una interrupción
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?
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
- Mensajes : 4
Fecha de inscripción : 16/04/2011
Re: Interrupcion de Timer1 SDCC con PIC18F2550
Es correcto como lo mencionas mi estimado lejan!, saludos
maigke- Asiduo del Foro
- Mensajes : 210
Fecha de inscripción : 12/04/2009
Edad : 47
Localización : Mexico
Temas similares
» Libreria LCD 20x 4 Flexible 3 bits SDCC PIC18F2550
» Libreria LCD 20 x 4 Flexible 4 bits SDCC PIC18F2550
» Piklab PIC18F2550 sdcc y proteus en Ubuntu 10.04
» Pre Alfa Guia didáctica para practicas con PIC18F2550 y SDCC
» Problema con interrupción en PIC16F84A
» Libreria LCD 20 x 4 Flexible 4 bits SDCC PIC18F2550
» Piklab PIC18F2550 sdcc y proteus en Ubuntu 10.04
» Pre Alfa Guia didáctica para practicas con PIC18F2550 y SDCC
» Problema con interrupción en PIC16F84A
Página 1 de 1.
Permisos de este foro:
No puedes responder a temas en este foro.