Ahora voy entendiendo mejor lo que es una variable volatile, pero igual creo que es mejor no usarla, ya que al no haberla aprendido en el colegio, si me llega a ir mal en mi examen en las proximas semanas debido a que use una variable que no fue enseñada, no voy a tener excusa ya que utilize temas mas avanzados.
Si no es molestia, paso mi codigo por aca (El cual termine ayer) y me podrian decir si puede que funcione o que le faltaria o esta mal. Yo estoy creando una placa en protheus para probar el codigo, pero si alguien ve un error de entrada me lo podria hacer saber.
Desde ya, muchas gracias.
-Codigo terminado:
/*
* File: _Code febrero.c
* Author: Gonzalez, Lautaro.
*
* Created on 5 de febrero de 2018, 10:37
*/
#include <stdio.h>
#include <stdlib.h>
#include "_Config febrero.h"
#define cero 63
#define uno 6
#define dos 91
#define tres 79
#define cuatro 102
#define cinco 109
#define seis 125
#define siete 7
#define ocho 127
#define nueve 103
#define Tuni PORTEbits.RE1 // Se define como "Tuni" al pin RE0.
#define Tdec PORTEbits.RE0 // Se define como "Tdec" al pin RE1.
#define Pulsador PORTBbits.RB0 // Se define como "Pulsador" al pin RB0.
void visualizar (); // Se declara la funcion visualizar.
void pausa (); // Se declara la funcion pausa.
void despausa (); // Se declara la funcion despausa.
int Unidad = 0; // Variable que guarda el numero de la unidad.
int Decena = 0; // Variable que guarda el numero de la decena.
int A = 0; // Variable para visualizar los numeros cada 1 segundo.
int B = 0; // Variable para visualizar los numeros de la cuenta a 2 Hz.
int modo = 0; // Variable para pausa/despausa.
int cuenta = 30; // Variable que lleva el numero que se muestra en los displays.
void main ()
{
INTCON = 0xB0; // Configuracion del registro de interrupciones.
T0CON = 0xC7; // Configuracion del registro del timer0.
TRISD = 0x00; // Se configuran los pines, donde estan conectados los displays, como salida.
TRISBbits.RB0 = 1; // Se configura el pin "RB0", el cual se conecta al pulsador, como entrada.
ADCON1bits.PCFG0 = 0;
ADCON1bits.PCFG1 = 1;
ADCON1bits.PCFG2 = 1;
ADCON1bits.PCFG3 = 0;
while(1)
{
}
}
void visualizar ()
{
Decena = cuenta/10; // El numero que se tiene que mostrar en la decena de la cuenta, se obtiene dividiendo el numero en 10.
Unidad = cuenta%10; // Para obtener la unidad, se divide el numero en 10 pero el valor que toma la variable es el numero despues de la coma.
switch (Unidad)
{
case 0:
PORTD = cero;
break;
case 1:
PORTD = uno;
break;
case 2:
PORTD = dos;
break;
case 3:
PORTD = tres;
break;
case 4:
PORTD = cuatro;
break;
case 5:
PORTD = cinco;
break;
case 6:
PORTD = seis;
break;
case 7:
PORTD = siete;
break;
case 8:
PORTD = ocho;
break;
case 9:
PORTD = nueve;
break;
}
Tuni = 1; // Se activa el transistor predeterminado para mostrar la unidad.
__delay_ms(10); // El numero se muestra por 10 ms.
Tuni = 0; // Se pone a cero el transistor para que no muestre mas el numero.
switch (Decena)
{
case 0:
PORTD = cero;
break;
case 1:
PORTD = uno;
break;
case 2:
PORTD = dos;
break;
case 3:
PORTD = tres;
break;
case 4:
PORTD = cuatro;
break;
case 5:
PORTD = cinco;
break;
case 6:
PORTD = seis;
break;
case 7:
PORTD = siete;
break;
case 8:
PORTD = ocho;
break;
case 9:
PORTD = nueve;
break;
}
Tdec = 1; // Se activa el transistor predeterminado para mostrar la decena.
__delay_ms(10); // El numero se muestra por 10 ms.
Tdec = 0; // Se pone a cero el transistor para que no muestre mas el numero.
}
void interrupt isr ()
{
if (INTCONbits.TMR0IF == 1) // Si se activa la interrupcion por timer.
{
visualizar(); // Se muestra el numero de la cuenta en los displays.
A++; // La variable "A" se pone a contar.
if (A == 15) // Si "A" llega a 15.
{
A = 0; // "A" regresa a 0.
cuenta--; // La cuenta disminuye un numero.
}
if (cuenta < 10) // Si la cuenta es menor a 10.
{
B++; // La variable "B" se pone a contar.
if (B ==
// Si "B" llega a 8.
{
PORTD = 0x00; // Se ponen todos los pines "D" en 0, apagandose los displays.
}
if (B == 16) // Si "B" llega a 16.
{
PORTD = 0xFF; // Se ponen todos los pines "D" en 1, prendiendose nuevamente los displays.
}
}
if (cuenta == 0) // Si la cuenta llega a 0.
{
pausa();
}
INTCONbits.TMR0IF = 0; // Se baja la bandera de interrupcion por timer.
}
if (INTCONbits.INT0IF == 1) // Si se activa la interrupcion externa.
{
if (cuenta > 0) // Si al activarse la interrupcion externa, la cuenta es mayor a 0.
{
modo++; // La variable "modo" se incrementa.
if (modo == 1) // Si "modo" es igual a 1.
{
pausa(); // Se desata la funcion "pausa".
}
if (modo == 2) // Si "modo" llega a 2.
{
modo = 0; // "modo" vuelve a 0.
despausa(); // Se desata la funcion "despausa".
}
}
if( cuenta == 0) // Si la cuenta es igual a 0.
{
cuenta = 30; // Reinicia la cuenta, volviendo a 30.
}
INTCONbits.INT0IF = 0; // Se baja la bandera de interrupcion por timer.
}
}
void pausa ()
{
A = A; // La variable "A" se queda con el valor con el que tenia.
}
void despausa ()
{
A = 0; // "A" vuelve a 0.
}