problema al utilizar temporizadores con PIC18F4550, ¿Necesitas ayuda?

E

elrayes

Guest
Hola a todos

Sólo quiero usar timer0 en PIC18F4550 y realmente estoy cansada de leer y tratar, al lado soy un programador muy mal, a fin de tratar de ayudarme en este código, estoy usando el compilador MPLAB C18, este código se utiliza para luz algunos LED's en el puerto D, cuando el temporizador expira, solía ISR para aplicar todo esto, el código de construcción es muy fina y descargadas en el objetivo, pero el MCU no está funcionando:

# include <p18f4550.h>
# include <stdlib.h>
# include <timers.h>

# pragma interrumpir high_isr
# low_isr pragma interruptlow

init_int (void)
(
/ / Configuración de las interrupciones
INTCON = 0xA0;
INTCON2 = 0x04;
)

# pragma high_vector code = 0x08
interrupt_at_high_vector (void)
(
Ir _endasm _asm high_isr
)
# pragma code

# pragma low_vector code = 0x18
interrupt_at_low_vector (void)
(
Ir _endasm _asm low_isr
)
# pragma code# pragma interrumpir high_isr

high_isr (void)
(
if (INTCONbits.TMR0IF == 1)
(
INTCONbits.TMR0IF = 0;
PORTD = 0x0f;
)
)

# low_isr pragma interruptlow
low_isr (void)
(
)

# pragma code

int x = 0x0000;
void main (void)
(
TRISD = 0x00;
LATD = 0x00;

OpenTimer0 (TIMER_INT_ON & T0_16BIT & T0_SOURCE_INT & T0_PS_1_8);
WriteTimer0 (0x0000);

while (1)
(
high_isr ();
)
)

Espero que alguien pueda solucionar esto.
gracias

 
Sólo un consejo ....

Usted quiere que el LED se ilumine basado en el concepto de interrupción y no el concepto de votación.Pero aquí está usted llamando a la función "high_isr" en el bucle while, que es un ISR.Cuando el contador expira se llama automáticamente a la ISR.

Una vez que consulte con la interrupción y los conceptos de votación para hacer su trabajo del programa.

 
¿Ha asignado una alta prioridad a la timer0 interrumpir?

¡Salud!

Ravi

 
de hecho he cambiado el código de arriba a otro que encontré en los ejemplos de C18 de microchip y aún no funciona y realmente estoy en un lío, este es el nuevo código:

# include <p18f4550.h>
# include <timers.h>

//------------------------------------------------ ----------------------------

void main (void);
void InterruptHandlerHigh (void);

unión
(
struct
(
tiempo de espera sin firmar: 1 / / bandera para indicar un tiempo de espera TMR0
Ninguno sin firmar: 7;
Bit);
unsigned char Byte;
Banderas);

//------------------------------------------------ ----------------------------
/ / Rutina principal

void
main ()
(
Flags.Byte = 0;
INTCON = 0x20; / / TMR0 desactivar mundial y activar la interrupción
INTCON2 = 0x84; prioridad / / TMR0 alta
RCONbits.IPEN = 1; / / permitir niveles de prioridad
TMR0H = 0; / / temporizador claro
TMR0L = 0; / / temporizador claro
T0CON = 0x87; / / establecer timer0 - prescaler 1:8 / / 0x82
/ / T0CON = 0xB8; / / no pre-escalador asignado
/ / T0CON = 0b10011000; / / no pre-escalador asignado
INTCONbits.GIEH = 1; / / habilitar interrupciones
TRISB = 0;
TRISA = 0;
/ / LATA = 0x00;

while (1)
(
PORTA = 0x01;
if (Flags.Bit.Timeout == 1)
(/ / Tiempo de espera?
Flags.Bit.Timeout = 0; / / indicor tiempo de espera claro
LATBbits.LATB7 = LATBbits.LATB0; / / LED de estado de copia de RB0 a RB7
)
)
)

//------------------------------------------------ ----------------------------
/ / Alta prioridad vector de interrupción

# pragma code InterruptVectorHigh = 0x08
void
InterruptVectorHigh (void)
(
_asm
Ir InterruptHandlerHigh / / ir al interrumpir la rutina
_endasm
)

//------------------------------------------------ ----------------------------
/ / Alta prioridad rutina de interrupción

# pragma code
# pragma interrumpir InterruptHandlerHigh

void
InterruptHandlerHigh ()
(
if (INTCONbits.TMR0IF)
(/ / Comprueba el desbordamiento de TMR0
INTCONbits.TMR0IF = 0; / / claro indicador de interrupción
Flags.Bit.Timeout = 1; / / indicar tiempo de espera
= LATBbits.LATB0! LATBbits.LATB0 / / alternar LED en RB0
)
)

interrupciones de alta prioridad habilitado
cualquier persona puede ayudar??

gracias de antemano

 
1.Yo no soy tan bueno en C. ¿Ha asignado timer0 interrupción de prioridad alta?
2.¿Ha simulado en MPLAB SIM?Usted va a conocer el problema.

¡Salud!

Ravi

 
Consulte con los ajustes de configuración, su Junta debe apoyar la configuración de oscilador que usted proporciona en eso.
Ex: Funda diste 4 * HSPLL y oscilador de cristal es en torno a 25MHz, que da alrededor de 4 * 25 MHz = 100MHz.Pero si el controlador que está utilizando admite menos que esto (<100 MHz), su código no funciona con eso.

Además, no se cargaron los valores a los registros de temporizador (TMR0L)
Inicializar cada vez que los registros en el ISR.

 

Welcome to EDABoard.com

Sponsor

Back
Top