Red de conocimiento de abogados - Derecho de sociedades - Ayuda: El reinicio del botón Mega16 no es muy bueno, no se reinicia después del encendido, ¿por qué?

Ayuda: El reinicio del botón Mega16 no es muy bueno, no se reinicia después del encendido, ¿por qué?

//////////////////////////////////////////// // ///////////////////

// Archivo: KEY_Interrupt.C //

// Entorno: compilado en ICC AVR6 31A, emulado como AVR Studio4.12sp4 //

// Hardware: chip ATMEGA16 //

// Fecha: 28 de mayo de 2007 //

<. p >// Función: Escanee el tubo digital regularmente, presione las teclas INT0 e INT1 e interrumpa en el flanco descendente para hacer //

// que el valor de la tecla aumente o disminuya en 1 respectivamente.

//

// Observaciones: //

//////////////////////////// / ///////////////////////////////////

#include lt;iom16v.hgt ; // Contiene el archivo de encabezado del modelo del microcontrolador

#include lt; macros.hgt; //Contiene el archivo de encabezado de operación "bit"

#include lt;delay.hgt; /Contiene el archivo de encabezado de retraso

#include lt;AVR_XQV12.hgt; //Contiene archivos de encabezado de definición de macros y funciones comunes

/********** ******* ****************************************/

/** **** Nombre de la función: Int0_isr() ******/

/****** Función: la función de interrupción INT0 aumenta el valor de la clave en 1 * *****/

/****** Parámetros: Ninguno ******/

/****** Valor de retorno: Ninguno ** ****/

/****** p>

/*************************** *********************** *************/

#pragma interrupt_handler Int0_isr: 2

void Int0_isr(void)

{

delay_nms(20); //Retraso de unos 20 milisegundos, rebote

if(KEY0) ==0) //Determinar nuevamente si la tecla está presionada

{

while(KEY0==0); //Esperar a que se suelte la tecla

Key_Number; //Aumentar el valor de la clave en 1

}

}

/************** ******************************** ***********/

/****** Nombre de la función: Int1_isr() ******/

/*** *** Función: función de interrupción INT1, disminuye el valor de la clave en 1 * *****/

/****** Parámetros: Ninguno ******/

/****** Valor de retorno: Ninguno** ****/

/************************************** ******************/

#pragma interrupt_handler Int1_isr: 3

void Int1_isr(void)

p>

{

delay_nms(20); //Retraso de unos 20 milisegundos, rebote

if(KEY1==0) //Verifique nuevamente si la tecla está presionada

{

while(KEY1==0); //Espera a que se libere la clave

Key_Number-- //Disminuye el valor de la clave en 1.

}

}

/*************************** ********** **********************/

/****** Nombre de la función: Timer0_ovf_isr() ***** */

/****** Función: interrupción de desbordamiento del Timer0, escaneo de tubo digital******/

/** **** Parámetro: Ninguno* *****/

/****** Valor de retorno: Ninguno******/

/*** ********* ******************************************* *******/

#pragma interrupt_handler Timer0_ovf_isr: 10

void Timer0_ovf_isr(void)

{

Display_One_SMG( 1,Key_Number/10); //En la segunda posición el tubo digital muestra el dígito de las decenas

Display_One_SMG(0, Key_Number10); //El primer tubo digital muestra el dígito de las unidades

}

/**** ************************************* *************** */

/****** Nombre de la función: Timer0_Init() ******/

/****** Función: Programa de inicialización Timer0** ****/

/****** Parámetros: Ninguno ******/

/****** Valor de retorno: Ninguno*** ***/

/************************ ******************* *******************/

void Timer0_Init(void)

{

TCCR0 = 0x00; / /Detener el funcionamiento del temporizador0

TCNT0 = 0x00; //Borrar TCNT0

TCCR0|=(1lt ;lt;CS02); //Inicia Timer0, el reloj del sistema se divide por 256

}

/****************** ********************** *******************/

/** **** Nombre de la función: principal()

******/

/****** Función: escanea periódicamente el tubo digital, botones INT0, INT1 ******/

/** * *** El flanco descendente desencadena una interrupción, lo que hace que los valores clave se incrementen y ******/

/****** disminuyan en 1 respectivamente. ******/

/****** Parámetros: Ninguno ******/

/****** Valor de retorno: Ninguno* *****/

/************************************ *******************/

void main(void)

{

CLI() ; //Desactivar interrupciones

CPU_Init(); //Inicializar CPU

Timer0_Init(); //Inicializar temporizador 0

MCUCR|=(1lt; lt;ISC11)|(1lt;lt;ISC01); //Establece la interrupción del disparador de flanco descendente de INT0 e INT1

GICR|=(1lt;lt;INT1)|(1lt;lt;INT0) ; //Habilitar interrupciones INT0, INT1

TIMSK|=(1lt;lt;TOIE0); //Habilitar interrupción de desbordamiento del Timer0

SEI(); //Activar interrupción

SEI(); p >

while(1); //Pausa dinámica

}

2009-07-17, 11:49:04 Datos Correo electrónico Responder Cita Responder Editar Eliminar

1F TAIYUAN

Puntos: 9

Facción:

Nivel: ------

De:

#pragma interrupt_handler Timer0_ovf_isr: 10

void Timer0_ovf_isr(void)

{

Display_One_SMG(1,Key_Number/10); Muestra el dígito de las decenas en el segundo tubo digital

Display_One_SMG(0, Key_Number10); //Muestra el dígito de las unidades en el primer tubo digital

}

Sí No es que TCNT0 no se reinicialice en esta función Intente cambiarlo a lo siguiente:

#pragma interrupt_handler Timer0_ovf_isr: 10

void Timer0_ovf_isr(void)

{

TCNT0=0X00;

Display_One_SMG(1, Key_Number/10); //Muestra el dígito de las decenas en el segundo tubo digital

Display_One_SMG( 0, Key_Number10); //Muestra el dígito de las unidades en el primer tubo digital

}