TODOPIC

Microcontroladores PIC => Primeros pasos - Iniciación a los microcontroladores => Mensaje iniciado por: Fabri Olivari en 15 de Septiembre de 2019, 21:22:59

Título: Contado Ascendente y Descendente 0 a 99 con Interrupciones
Publicado por: Fabri Olivari en 15 de Septiembre de 2019, 21:22:59
Hola comunidad de TODOPIC :-/. Estoy trabando en un proyecto con el PIC 16F877 en el entorno de MPLAB y usando el compilador XC8;
El proyecto consiste en un cornometro con 3 pulsadores: RB0, RB1 y RB2;
RB0 = al ser presionado inicio/para la cuenta
RB1 = incrementa la cuenta
RB2 = decrementa la cuenta
La cuenta se visualizara en dos displays de 7 segmentos multiplexados
Estoy teniendo problema con las interrupciones por cambio de estado, lo que yo hago es lo siguiente, tengo habilitadas las interrupciones por cambio de estado desde el pin RB0 a RB2. Cuando presiono un pulsador la bandera de la interrupcion RBIF se pone en uno, lo que hago para identificar que pulsador fue presionado es lo siguiente: pregunto que pin (de RB0 a RB1) esta en 0, los pulsadores tienen logica negativa, Al hacer esto estoy identificando que pulsador fue presionado.
Lo que yo quiero hacer es lo siguiente : Luego de identificar que interrupcion fue activada, hacer la operación correspondiente a cada pulsador:
RB0 = al ser presionado inicio/para la cuenta
RB1 = incrementa la cuenta
RB2 = decrementa la cuenta

En resumen el problema que tengo que que no puedo incremetar una variable adentro de la interrupcion. Lo que necesito hacer es incrementar una variable dentro de una interrupcion y poder usarla luego dentro del while.
Aclaracion: La variable a incrementar es una variable global. Hay partes de codigo que faltan, porque no esta terminado, no puedo avanzar hasta solucionar este problema. Solo necesito eso de incrementar la variable contador GRACIAS.
 
Le dejo mi codigo, cualquier consulta dejarla en los comentarios y cualquier ayuda tambien.
El codigo se tiene que hacer si o si con interrupciones

GRACIAAAAS!!!

CODIGO:
/*
 * File:   Ejercicio16.c
 * Author: Almacen Informatico
 *
 * Created on 9 de septiembre de 2019, 00:13
 *
 * PROYECTO
 *
 */

#include <xc.h>
#include "Ejercicio16.h"

//Pines Display 7 seg
#define a RD0
#define b RD1
#define c RD2
#define d RD3
#define e RD4
#define f RD5
#define g RD6
#define h RD7 //punto 
//Pulsadores
#define btn_start_stop RB0 //Boton start/stop
//  const int btnf1 = 0; //flag btn1
#define btn_up RB1 //Boton Subir   
//  const int btnf2 = 0; //flag btn2
#define btn_down RB2 //Boton Bajar
//  const int btnf3 = 0; //flag btn3
//Definimos el comun de cada display
#define c1 RB3 //Comun display unidades
#define c2 RB4 //Comun display decenas
//Zumbador
#define zumbador RB5
//Funciones
void disp7seg();
void multiplexar();
//Numeros
#define CERO   PORTD = 0x3F //Definicion de cada numero del display
#define UNO    PORTD = 0x06;
#define DOS    PORTD = 0x5B;   
#define TRES   PORTD = 0x4F; 
#define CUATRO PORTD = 0x66;   
#define CINCO  PORTD = 0x6D;
#define SEIS   PORTD = 0x7D;   
#define SIETE  PORTD = 0x07; 
#define OCHO   PORTD = 0x7F;   
#define NUEVE  PORTD = 0x67; 
//Contador
/*  Aclaracion
 *No uso una sola variable para el contador
  ya que, el maximo valor hasta el que se podria
  contar en caso de usar int seia hasta 256, esto si
  se aplica lo de dividir por 10 para sacar las unidades y decenas.
 
 */
int timer0 = 0;

int contador = 0; //No usar todavia
int unidades = 0;
int decenas = 0;
int centenas = 0;; //Vemos si lo hacemos jaja

int inicio = 0;
int parar = 0;

int ea1 = 0; //variables para probrar cosas
int ea2 = 0;
int ea3 = 0;

void main(void) {
    //Config Oscilador
    OSCCON = 0x67;
    //Puertos
    ANSEL = 0x00;
    ANSELH = 0x00;
    TRISB = 0x07; //
    PORTD = 0x00;
    TRISD = 0x00;
    PORTD = 0x00;
    //Interrupciones
    INTCON = 0xB8;
    //Interrupcion por cambio de estado
    IOCB = 0x07; //Habilitacion
    //Timer0
    OPTION_REG = 0x41; // 1:4
   
    while(1){
       
    }
}

void __interrupt()isr(){   
    if(RBIF == 1){
        if(btn_start_stop == 0){
            //RD7 =! RD7;
            //Inicio / Stop
            __delay_ms(100);
            RBIF = 0;
        }
        if(btn_up == 0){
            //RD6 =! RD6;
            contador++;
            __delay_ms(100);
            RBIF = 0;
        }
        if(btn_down == 0){
            //RD5 =! RD5;
             contador--;
            __delay_ms(100);
            RBIF = 0;
        }
        RBIF = 0;
    }
//    if(TMR0IF == 1){   
//        timer0++;
//        if(timer0 == 1000){
//            //RD4 = !RD4;
//            timer0 = 0;
//            TMR0IF = 0;
//        }
//        TMR0IF = 0;
//    }   
}

void disp7seg (int i){
    switch(i){
        case(0):
            CERO;
            break;
        case(1):
            UNO;
            break;
        case(2):
            DOS;
            break;
        case(3):
            TRES;
            break;
        case(4):
            CUATRO;
            break;
        case(5):
            CINCO;
            break;
        case(6):
            SEIS;
            break;
        case(7):
            SIETE;
            break;
        case(8):
            OCHO;
            break;
        case(9):
            NUEVE;
            break;
    }
}
Título: Re:Contado Ascendente y Descendente 0 a 99 con Interrupciones
Publicado por: AccioRw en 16 de Septiembre de 2019, 05:49:32

En resumen el problema que tengo que que no puedo incremetar una variable adentro de la interrupcion.

/*  Aclaracion
 *No uso una sola variable para el contador
  ya que, el maximo valor hasta el que se podria
  contar en caso de usar int seia hasta 256, esto si
  se aplica lo de dividir por 10 para sacar las unidades y decenas.
 
 */


Hola Fabri olivari, aun no he aprendido a citar varias partes de tu mensaje así que como solo se citar una sola vez el mensaje te dejo las partes que has escrito que me llaman la atención.

Por un lado lo primero que te quiero preguntar es si directamente entras a la interrupción, la tienes puesta debajo del main y no la veo nombrada arriba por lo tanto creo que no entras en esa función y esa puede ser la explicación del porque no te suma la variable o no te hace nada, ponla arriba, encima del main si quieres por asegurar que no sea eso.

Por otro lado, dice s que trabajas con XC8, en el tamaño de las variables te estas equivocando.
Una variable unsigned char son 8 bits por lo tanto llegas a sumar hasta 256
Una variable int son 16bits así que puedes sumar desde -32768 hasta 32768
De ser unsigned int también son 16bits así que sería hasta 65536
En el caso de las unsigned long son 32bits así que almacena hasta 4.294.967.296‬
(todo esto teniendo en cuenta que si empezamos de 0 terminamos un numero antes, es decir en unsigned char seria desde 0 hasta 255)


Título: Re:Contado Ascendente y Descendente 0 a 99 con Interrupciones
Publicado por: KILLERJC en 16 de Septiembre de 2019, 13:57:27
Citar
Estoy teniendo problema con las interrupciones por cambio de estado, lo que yo hago es lo siguiente, tengo habilitadas las interrupciones por cambio de estado desde el pin RB0 a RB2. Cuando presiono un pulsador la bandera de la interrupcion RBIF se pone en uno, lo que hago para identificar que pulsador fue presionado es lo siguiente: pregunto que pin (de RB0 a RB1) esta en 0, los pulsadores tienen logica negativa, Al hacer esto estoy identificando que pulsador fue presionado.

Solo Rb0 tiene interrupcion por flanco, los demas que son RB4 a RB7 tienen interrupcion por nivel. A no ser que uses unos 2 diodos externos para usar la interrupcion del RB0 no entiendo como lo hiciste... Y si  es asi, por que complicarse tanto. Seria mejor usar RB4 a RB7.

Pero... porque complicarse con las entradas? Para eso usa la interrupcion de un timer para manejar el display y aumentar la cuenta, y deja el main para los botones.