uControl
Octubre 01, 2014, 11:18:57 *
Bienvenido(a), Visitante. Por favor, ingresa o regístrate.
¿Perdiste tu email de activación?

Ingresar con nombre de usuario, contraseña y duración de la sesión
 
   Inicio   Ayuda Buscar Ingresar Registrarse  

La gente de Niple nos ofrece un descuento especial para usuarios de uControl.
Entérate de como puedes aprovechar esta oferta haciendo click aqui.

Súmate, y ayuda a uControl con tu participación en esta interesante oportunidad que nos oferece Niple.

Páginas: [1]   Ir Abajo
  Imprimir  
Autor Tema: Interrupciones en XC8  (Leído 1886 veces)
0 Usuarios y 1 Visitante están viendo este tema.
nimio
PIC10F
*
Desconectado Desconectado

Mensajes: 12


« : Noviembre 04, 2012, 10:27:13 »

Hola, alguien podría decirme la forma correcta de hacer una interrupción con el compilador XC8 en un 16F84A??

Quiero pulsar un botón (sin usar RB0/INT) y que el programa me cambie de secuencia de leds al pulsar.

Voy averiguando algo pero doy palos de ciego y estoy más que mareado, os lo agradecería.

Si de paso me podéis explicar también como hacerlo con TIMER0 y RB0/INT sería genial, pero me urge el poderlo hacer desde cualquier puerto (si lo permite el 16F84A), aunque creo que se puede hacer sólo desde cualquier pin siempre que sea del PUERTO B.

No entiendo como no se anima más gente a usar el compilador de Microchip (apenas hay información en castellano), yo no tengo ni idea de programación y voy avanzando poco a poco y para empezar con "sucedáneos" creo que es mejor usar lo "oficial".

Saludos
En línea
Suky
**----- ^^ ------**
Moderador
dsPIC
******
Desconectado Desconectado

Sexo: Masculino
Mensajes: 5437


Con Qt...


WWW
« Respuesta #1 : Noviembre 05, 2012, 09:40:31 »

Hola! Primero que nada sería bueno darle una leída de que interrupciones tiene el 16F84 y como podrías utilizarlas. Para una interrupción externa tienes RB0, RB4-RB7 y de alguna manera RA4 con Timer0, pero no cualquier pin. Por acá hay algo: http://www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/mis-primeros-programas-pic16f84a-y-pic16f628a/msg4993/#msg4993

Después en XC8 creería (no tengo herramientas para comprobarlo) que la rutina de atención a la interrupción se realiza de la siguiente manera:

Código:
static void interrupt ISR(void){

}

Y dentro de ella determinas cual fue la fuente de interrupción. Aquí el modificador interrupt le indica al compilador que esta función es llamada al ocurrir una interrupción o directamente es posicionada a partir del vector 0x04 para un PIC16

Saludos!
En línea

nimio
PIC10F
*
Desconectado Desconectado

Mensajes: 12


« Respuesta #2 : Noviembre 05, 2012, 03:16:19 »

Hola Suky, gracias por el interés!

Si... estoy al tanto de los modos de interrupción del 16F84A pero no de como implementarlos jeje.

Yo simplemente quiero que el pic detecte la activación de un pulsador en RB5 y que cambie de una secuencia de luces a otra y al finalizar vuelva a la primera secuencia de luces hasta que no se vuelva a pulsar el botón.

He mirado el link que me pusiste pero no acabo de aclararme.

Mi código hace la primera secuencia de leds en cuanto se programa el chip y luego pasa automáticamente a la segunda sin salir de ahí (aunque pulse el botón de reset), tanto pulse como si no el pulsador en RB5... no hace nada.

El código que llevo hecho es el siguiente:

Código:
/*
 * File:   main.c
 * Author: nimio
 *
 * Programa para encender una secuencia de 5 Leds en el Puerto B (RB0-RB4)
 * Con pulsador haciendo uso de las interrupciones en RB5.
 *
 * Created on 3 de noviembre de 2012, 21:20
 */

#include <xc.h> //Librería del compilador de Microchip, en este caso el XC8.
//#include <stdint.h> // Librería interrupciones ¿?

#define _XTAL_FREQ 4000000 //Frecuencia del Cristal a 4MHz.

#pragma config FOSC=XT, WDTE=OFF, PWRTE=ON, CP=OFF // Definición Fuses del PIC:
                                                   // Osc. tipo XT, P.Guardián OFF,
                                                   // PWRTE ON para dar tiempo a que se estabilice la tensión,
                                                   // Protección de Código OFF
//#pragma interrupt_level 1
//
//
//

void interrupt pulsador(void) {  // Función llamada "pulsador" de interrupción.
                                 // Si no se especifica es high_priority.

    if (RBIF=1) {       // Si detecta cambio en RB4-RB7.

            __delay_ms(150);  // Retardo para antirrebote para el pulsador.

            if (RBIF=1) {

                __delay_ms(1000); // Retardo
                PORTB=0b00011111;
                __delay_ms(1000); // Retardo
                PORTB=0b00011011;
                __delay_ms(1000); // Retardo
                PORTB=0b00000100;
                __delay_ms(1000); // Retardo
                PORTB=0b00011000;
                __delay_ms(1000); // Retardo
                PORTB=0b00001100;
                __delay_ms(1000); // Retardo
                PORTB=0b00000110;
                __delay_ms(1000); // Retardo
                PORTB=0b00000011;
                __delay_ms(1000); // Retardo
                PORTB=0b00001010;
                __delay_ms(1000); // Retardo
                PORTB=0b00011111;
                __delay_ms(200); // Retardo
                PORTB=0b00000000;
                __delay_ms(200); // Retardo
                PORTB=0b00011111;
                __delay_ms(200); // Retardo

        INTCONbits.RBIF=0; // Se inicializa a 0 el Flag de interrupción en PUERTO B.
       
            }
       
        }
        return; // necesario ¿?
       
}



void main(void) {

   
    TRISB=0b00100000;   // Definición PUERTO B: Todos salidas menos RB5 que es entrada.
    PORTB=0;            // Salidas PUERTO B a 0 voltios.
   
   

    //HABILITAR INTERRUPCIONES:

    INTCONbits.GIE=1;   // Habilita TODAS las interrupciones. Para permitir interrupciones hay q habilitarlas
                        // tanto Globalmente como... Individualmente ¿?.

    //CONFIGURACIÓN INTERRUPCIÓN EXTERNA:

   
    //OPTION_REGbits.INTEDG=0; // Se activa la interrupción por flanco: 0=descendente, 1=ascendente.
                             // Para RB0/INT.

    INTCONbits.RBIE=1; // Se habilita detección de interrupción en PUERTO B.
                       // No se si con configurar un pin del Puerto B como entrada ya se autoconfigura.
   

    //ei ();              // Habilita las interrupciones Globales.

    //di();             // Deshabilita todas las interrupciones.
    //INTCON=0b10001001;    // El Bit 3 me parece que es para habilitar cualquier interrupción en RB
   
    while (1) {

        __delay_ms(800); // Retardo de 600 milisegundos.
        PORTB=0b00000001; // RB0 a 5 voltios y el resto a 0 voltios.
        __delay_ms(800); // Retardo de 600 milisegundos.
        PORTB=0b00000010; // RB1 a 5 voltios y el resto a 0 voltios.
        __delay_ms(800); // Retardo de 600 milisegundos.
        PORTB=0b00000100; // RB2 a 5 voltios y el resto a 0 voltios.
        __delay_ms(800); // Retardo a 600 milisegundos.
        PORTB=0b00001000; // RB3 a 5 voltios y el resto a 0 voltios.
        __delay_ms(800); // Retardo de 600 milisegundos.
        PORTB=0b00010000; // RB4 a 5 voltios y el resto a 0 voltios.
        __delay_ms(800); // Retardo de 600 milisegundos.
        PORTB=0b00011111; // RB0-RB4 a 5 voltios y el resto a 0 voltios.
        __delay_ms(800); // Retardo de 600 milisegundos.
        PORTB=0b00010001; // RB0 Y RB4 a 5 voltios y el resto a 0 voltios.
        __delay_ms(800); // Retardo de 600 milisegundos.
        PORTB=0b00001010; // RB1 y RB3 a 5 voltios y el resto a 0 voltios.
        __delay_ms(800); // Retardo a 600 milisegundos.
        PORTB=0b00000100; // RB2 a 5 voltios y el resto a 0 voltios.
        __delay_ms(800); // Retardo de 600 milisegundos.
        PORTB=0b00010101; //RB0, RB2 y RB4  5 voltios y el resto a 0 voltios.
        __delay_ms(800); // Retardo de 600 milisegundos.

       
    }


}

Comentar que no se si tengo que llamar a la función de interrupción (que he llamado pulsador) o si al ser una función de interrupción se invoca sola.

A ver si veis que tengo mal o que me falta.

Saludos!!
En línea
nimio
PIC10F
*
Desconectado Desconectado

Mensajes: 12


« Respuesta #3 : Noviembre 06, 2012, 04:14:14 »

Buenas nuevamente,

sólo comentar que ya conseguí crear interrupciones tanto en RB0/INT como en RB (RB4-RB7), concretamente en RB5.

Tenía un error tonto en el MPLAB y no compilaba lo que tenía que compilar...  cabezaso a la pared

Adjunto el programa para 16F84A y compilador XC8:

Código:
/*
 * File:   main.c
 * Author: nimio
 * 16F84A
 * Programa para encender 2 secuencias de 5 Leds en el Puerto B (RB0-RB4)
 * Con pulsador haciendo uso de las interrupciones en RB5.
 *
 * Created on 3 de noviembre de 2012, 21:20
 */

#include <xc.h> //Librería del compilador de Microchip, en este caso el XC8.

#define _XTAL_FREQ 4000000 //Frecuencia del Cristal a 4MHz.

#pragma config FOSC=XT, WDTE=OFF, PWRTE=ON, CP=OFF // Definición Fuses del PIC:
                                                   // Osc. tipo XT, P.Guardián OFF,
                                                   // PWRTE ON para dar tiempo a que se estabilice la tensión,
                                                   // Protección de Código OFF
//
//
//
//

void interrupt pulsador(void) {  // Función llamada "pulsador" de interrupción.
                                 // Si no se especifica es high_priority.
    //INTCONbits.GIE=0; // Se deshabilitan las interrupciones Globales para que no se
                        // produzca otra interrupción mientras se atiende esta.

    if (RBIF) {       // Si detecta cambio en RB4-RB7.

            __delay_ms(150);  // Retardo para antirrebote para el pulsador.

            if (RBIF) {

                __delay_ms(2000); // Retardo
                PORTB=0b00011111;
                __delay_ms(2000); // Retardo
                PORTB=0b00000000;
                __delay_ms(100); // Retardo
                PORTB=0b00000001;
                __delay_ms(100); // Retardo
                PORTB=0b00000010;
                __delay_ms(100); // Retardo
                PORTB=0b00000100;
                __delay_ms(100); // Retardo
                PORTB=0b00001000;
                __delay_ms(100); // Retardo
                PORTB=0b00010000;
                __delay_ms(100); // Retardo
                PORTB=0b00000000;
                __delay_ms(100); // Retardo
                PORTB=0b00011111;
                __delay_ms(200); // Retardo
                PORTB=0b00000000;
                __delay_ms(200); // Retardo
                PORTB=0b00011111;
                __delay_ms(200); // Retardo

                INTCONbits.RBIF=0; // Se inicializa a 0 el Flag de interrupción en PUERTO B.
       
            }
       
        }     
}



void main(void) {

   
    TRISB=0b00100000;   // Definición PUERTO B: Todos salidas menos RB5 que es entrada.
    PORTB=0;            // Salidas PUERTO B a 0 voltios.
 

    INTCONbits.RBIE=1; // Se habilita detección de interrupción en PUERTO B.
                       // No se si con configurar un pin del Puerto B como entrada ya se autoconfigura.
   
    INTCONbits.RBIF=0; // Se pone a 0 el Flag indicador de interrupción en RB4-RB7.
                       // Es conveniente ponerlo a 0 ya que RB4-RB7 sólo detecta cambio de estado
                       // y puede dar problemas si no se pone.

    INTCONbits.GIE=1;   // Habilita TODAS las interrupciones. Para permitir interrupciones hay q habilitarlas
                        // tanto Globalmente como... Individualmente ¿?.
   
    while (1) {

        __delay_ms(800); // Retardo
        PORTB=0b00000000;
        __delay_ms(800); // Retardo
        PORTB=0b00011111;
        __delay_ms(800); // Retardo
        PORTB=0b00000000;
        __delay_ms(800); // Retardo
        PORTB=0b00011111;
        __delay_ms(800); // Retardo
        PORTB=0b00000000;
        __delay_ms(800); // Retardo
        PORTB=0b00011111;
        __delay_ms(800); // Retardo
        PORTB=0b00000000;
        __delay_ms(800); // Retardo
        PORTB=0b00011111;
        __delay_ms(800); // Retardo
        PORTB=0b00000000;
        __delay_ms(800); // Retardo
        PORTB=0b00011111;
        __delay_ms(800); // Retardo

       
    }


}


Ahora supongo que probare el TIMER0

Gracias por todo.

Saludos
En línea

La gente de Niple nos ofrece un descuento especial para usuarios de uControl.
Entérate de como puedes aprovechar esta oferta haciendo click aqui.

Súmate, y ayuda a uControl con tu participación en esta interesante oportunidad que nos oferece Niple.

Páginas: [1]   Ir Arriba
  Imprimir  
 
Ir a:  

Impulsado por MySQL Impulsado por PHP Powered by SMF 1.1.19 | SMF © 2011, Simple Machines
SMFAds for Free Forums
XHTML 1.0 válido! CSS válido!
Página creada en 0.09 segundos con 29 consultas. (Pretty URLs adds 0.006s, 3q)