I am trying to multiplex a 7 segment display, which works through a query, That is, if I press 1, the tens and units will light up, If I press 2, the hundreds and thousands will light up, The first one does it perfectly, the tens and units are displayed. However, when I press the second, it multiplexes correctly, but the thousands digit lights up, but it goes out so fast that the human eye cannot grasp it. You will ask yourself then, how do you know that it turns on? Well, lowering the clock frequency shows that it turns off super fast, and I don't want it to do that and I don't understand why it does it. I am enclosing the project in case you want to keep an eye on it, it is not the best in the world but hey. I'm sure it has to do with electronics since, when I remove the multiplexing code from the interrupt it works perfectly, but when I put it inside the interrupt, which is what I am asked, it simply does not work and it turns off super fast .
Post your code in code tags, not an image.
Don't run code in the interrupt. Make a volitile variable put it in the interrupt, set it to true. In loop an if statement tests the variable, if true run the isr code, set the variable back to false.
Post all your code.
// Programa de demostración
// Programa para hacer parpadear todos los segmentos del dígito de las unidades del display
// y enviar un mensaje a la consola
#define D4 49 // El pin 49 controla el cátodo común del dígito de las unidades (D4)
#define D3 48 // El pin 48 controla el cátodo común del dígito de las decenas (D3)
#define D2 47 // El pin 47 controla el cátodo común del dígito de las centenas (D2)
#define D1 46 // El pin 46 controla el cátodo común del dígito de las unidades de millar (D1)
const int PinBuzzer = 37;
//asignamos los pines a los botones
const int pup = 34;
const int penter = 33;
const int pdown = 31;
const int pright = 30 ;
const int pleft = 32;
volatile const int a = 22;
volatile const int b = 23;
volatile const int c = 24;
volatile const int d = 25;
volatile const int e = 26;
volatile const int f = 27;
volatile const int g = 28;
volatile const int dp = 29;
//variables que almacenan el estado de los botones para realizar el método de antirebote
int presionado = 0; //Almacena si he apretado el botón pup
int presionado1 = 0; //Almacena si he apretado el botón pdown
int presionado2 = 0; //Almacena si he apretado el botón penter
int presionado3 = 0; //Almacena si he apretado el botón pright
int presionado4 = 0; //Almacena si he apretado el botón pleft
//variables que me ayudan a llevar el contador
int unidad = 0;
int decena = 0;
//variables donde almaceno los mensajes que se mostrarán en la consola.
String mensaje1 = "1.- Mostrar el contador en los dos dígitos inferiores del display (decenas-unidades)";
String mensaje2 = "2.- Mostrar el contador en los dos dígitos superiores del display (millares-centenas)";
String mensaje3 = "Elegir opción:";
//variable donde se guarda la opción escogida por el cliente
int numero;
volatile boolean estado1 = false;
void setup() {
// put your setup code here, to run once:
Serial.begin(9600); // inicialización del canal serie para comunicarnos con:
// PC --> "Herramientas/monitor serie" en la plataforma Arduino
// Proteus --> consola en Proteus (VIRTUAL TERMINAL)
//Programar PORTA de salida. Conexión a los segmentos a-b-c-d-e-f-g-dp del display 7-segmentos)
DDRA=0xFF; // También se puede expresar en binario con B11111111 (DDRA = B1111111;)
// Escritura en el PORTA --> Todos los segmentos a "1": encendidos
PORTA = 0xFF; // o también B11111111
// programación de las señales que controlan los cátodos comunes como de salida (OUTPUT o =1)
pinMode(D4,OUTPUT); //unidades
pinMode(D3,OUTPUT); //decenas
pinMode(D2,OUTPUT); //unidades
pinMode(D1,OUTPUT); //decenas
//Declaramos los botones con señales de entrada
pinMode(pup,INPUT);
pinMode(penter,INPUT);
pinMode(pdown,INPUT);
pinMode(pright,INPUT);
pinMode(pleft,INPUT);
//Declaramos los displays
pinMode(a,OUTPUT);
pinMode(b,OUTPUT);
pinMode(c,OUTPUT);
pinMode(d,OUTPUT);
pinMode(e,OUTPUT);
pinMode(f,OUTPUT);
pinMode(g,OUTPUT);
pinMode(dp,OUTPUT);
//declaramos la señal del zumbador
pinMode(PinBuzzer, OUTPUT);
//imprimimos los mensajes por pantalla
Serial.println(mensaje1);
Serial.println(mensaje2);
Serial.println(mensaje3);
//Las interrupciones??????????????????????????????????????????
// Habilitación de la interrupción INT2, flanco de subida (rising)
cli();
EICRA |= (1<<ISC21) | (1<<ISC20);
EIMSK |= (1<<INT2);
sei();
PORTL |=0x0F; // equivalente a PORTL = PORTL | B00001111 (cátodos D1D2D3D4 desactivados)
// se lee el puerto y se hace el "or" con la máscara B00001111 para poner los 4 bits
// menos significativos a "1". Los 4 bits superiores quedan como estaban: no se modifican
// Otra forma: pinMode(D4, OUTPUT); pinMode() para programar pin a pin (en este caso D4)
}
ISR (INT2_vect) {
//Rutina de servicio para la visualización entrelazada
if(estado1){
if(numero == 0 || numero == 1){
digitalWrite(D3,HIGH); //APAGAMOS DECENAS
digitalWrite(D4,LOW); //ENCENDEMOS UNIDADES
digitalWrite(D2,HIGH); //APAGAMOS LAS CENTENAS
digitalWrite(D1,HIGH);//APAGAMOS LOS MILLARES
}else{
digitalWrite(D4,HIGH); //APAGAMOS UNIDADES
digitalWrite(D3,HIGH) ; //APAGAMOS LAS DECENAS
digitalWrite(D2,LOW); //ENCENDEMOS LAS CENTENAS
digitalWrite(D1,HIGH); //APAGAMOS LOS MILLARES
}
mostrar(unidad); //ENCIENDE LOS SEGMENTOS COMO DEBE
}else{
if(numero == 0 || numero == 1){
digitalWrite(D4,HIGH); //APAGO LAS UNIDADES
digitalWrite(D3,LOW); //ENCIENDO LAS DECENAS
digitalWrite(D2,HIGH); //APAGO LAS CENTENAS
digitalWrite(D1,HIGH); //APAGO LOS MILLARES
}else{
digitalWrite(D4,HIGH); //APAGAMOS UNIDADES
digitalWrite(D3,HIGH) ; //APAGAMOS LAS DECENAS
digitalWrite(D2,HIGH); //APAGAMOS LAS CENTENAS
digitalWrite(D1,LOW); //ENCENDEMOS LOS MILLARES
}
mostrar(decena);//ENCIENDE LOS SEGMENTOS COMO DEBE
}
estado1 = !estado1;
} //final
void loop() {
if(Serial.available() > 0){
numero = Serial.parseInt();
Serial.println(numero);
}
if(digitalRead(pright) == LOW) {
presionado3 = 1;
}
if(digitalRead(pright) == HIGH && presionado3 == 1){
if (digitalRead(pup) == LOW) //Pregunta si el pulsador está presionado
{
presionado = 1; //La variable cambia de valor
}
if (digitalRead(pup) == HIGH && presionado == 1)
{
if(unidad <= 9){
unidad = unidad + 2;
tone(PinBuzzer, 500); //Activamos el pitido
delay(50);
noTone(PinBuzzer); //desactivamos el pitido
}
if(unidad > 9) { //Si es mayor que nueve, reseteamos las unidades y sumamos 1 a las decenas.
if(unidad == 10){
unidad = 0;
}
if(unidad == 11){
unidad = 1;
}
decena++;
tone(PinBuzzer, 500); //Activamos el pitido
delay(50);
noTone(PinBuzzer); //desactivamos el pitido
if(decena > 9){ //Si es mayor que nueve, reseteamos las decenas
decena = 0;
tone(PinBuzzer, 500); //Activamos el pitido
delay(50);
noTone(PinBuzzer); //desactivamos el pitido
}
}
presionado = 0; //La variable vuelve a su valor original
}
if (digitalRead(pdown) == LOW) { //Pregunta si el pulsador está presionado
presionado1 = 1; //La variable cambia de valor
}
if (digitalRead(pdown) == HIGH && presionado1 == 1){
if (unidad >= 0) {
if (unidad < 0) {
unidad = 0;
tone(PinBuzzer, 500); //Activamos el pitido
delay(50);
noTone(PinBuzzer); //desactivamos el pitido
}
unidad = unidad-2;
tone(PinBuzzer, 500); //Activamos el pitido
delay(10);
noTone(PinBuzzer); //desactivamos el pitido
}
if(unidad < 0){
unidad = 8;
tone(PinBuzzer, 500); //Activamos el pitido
delay(50);
noTone(PinBuzzer); //desactivamos el pitido
if (decena < 0){
decena = 0;
tone(PinBuzzer, 500); //Activamos el pitido
delay(50);
noTone(PinBuzzer); //desactivamos el pitido
}
decena--;
tone(PinBuzzer, 500); //Activamos el pitido
delay(50);
noTone(PinBuzzer); //desactivamos el pitido
}
if (decena < 0){
tone(PinBuzzer, 500); //Activamos el pitido
delay(50);
noTone(PinBuzzer); //desactivamos el pitido
decena = 9;
}
presionado1 = 0; //La variable vuelve a su valor original
}
if (digitalRead(pleft) == LOW) { //Pregunta si el pulsador está presionado
presionado4 = 1; //La variable cambia de valor
}
if (digitalRead(pleft) == HIGH && presionado4 == 1){
presionado3 = 0;
presionado4 = 0; //La variable vuelve a su valor original
}
if (digitalRead(penter) == LOW) { //Pregunta si el pulsador está presionado
presionado2 = 1; //La variable cambia de valor
}
if (digitalRead(penter) == HIGH && presionado2 == 1){
unidad =0;
decena=0;
presionado2 = 0; //La variable vuelve a su valor original
}
}
if(presionado3 == 1 && digitalRead(pright) == LOW || presionado4 == 0){
if (digitalRead(pup) == LOW) //Pregunta si el pulsador está presionado
{
presionado = 1; //La variable cambia de valor
}
if (digitalRead(pup) == HIGH && presionado == 1)
{
if(unidad <= 9){
unidad++;
tone(PinBuzzer, 500); //Activamos el pitido
delay(50);
noTone(PinBuzzer); //desactivamos el pitido
}
if(unidad > 9) { //Si es mayor que nueve, reseteamos las unidades y sumamos 1 a las decenas.
unidad = 0;
decena++;
tone(PinBuzzer, 500); //Activamos el pitido
delay(50);
noTone(PinBuzzer); //desactivamos el pitido
if(decena > 9){ //Si es mayor que nueve, reseteamos las decenas
decena = 0;
tone(PinBuzzer, 500); //Activamos el pitido
delay(50);
noTone(PinBuzzer); //desactivamos el pitido
}
}
presionado = 0; //La variable vuelve a su valor original
}
if (digitalRead(pdown) == LOW) { //Pregunta si el pulsador está presionado
presionado1 = 1; //La variable cambia de valor
}
if (digitalRead(pdown) == HIGH && presionado1 == 1){
if (unidad >= 0) {
if (unidad < 0) {
unidad = 0;
tone(PinBuzzer, 500); //Activamos el pitido
delay(10);
noTone(PinBuzzer); //desactivamos el pitido
}
unidad--;
tone(PinBuzzer, 500); //Activamos el pitido
delay(10);
noTone(PinBuzzer); //desactivamos el pitido
}
if(unidad < 0){
unidad = 9;
tone(PinBuzzer, 500); //Activamos el pitido
delay(10);
noTone(PinBuzzer); //desactivamos el pitido
if (decena < 0){
decena = 0;
tone(PinBuzzer, 500); //Activamos el pitido
delay(10);
noTone(PinBuzzer); //desactivamos el pitido
}
decena--;
tone(PinBuzzer, 500); //Activamos el pitido
delay(10);
noTone(PinBuzzer); //desactivamos el pitido
}
if (decena < 0){
tone(PinBuzzer, 500); //Activamos el pitido
delay(10);
noTone(PinBuzzer); //desactivamos el pitido
decena = 9;
}
presionado1 = 0; //La variable vuelve a su valor original
}
if (digitalRead(penter) == LOW) { //Pregunta si el pulsador está presionado
presionado2 = 1; //La variable cambia de valor
}
if (digitalRead(penter) == HIGH && presionado2 == 1){
unidad =0;
decena=0;
presionado2 = 0; //La variable vuelve a su valor original
}
}
}
void mostrar(int var){
switch (var){
case 0:
digitalWrite(a,HIGH);
digitalWrite(b,HIGH);
digitalWrite(c,HIGH);
digitalWrite(d,HIGH);
digitalWrite(e,HIGH);
digitalWrite(f,HIGH);
digitalWrite(g,LOW);
digitalWrite(dp, LOW);
break;
case 1:
digitalWrite(a,LOW);
digitalWrite(b,HIGH);
digitalWrite(c,HIGH);
digitalWrite(d,LOW);
digitalWrite(e,LOW);
digitalWrite(f,LOW);
digitalWrite(g,LOW);
digitalWrite(dp, LOW);
break;
case 2:
digitalWrite(a,HIGH);
digitalWrite(b,HIGH);
digitalWrite(c,LOW);
digitalWrite(d,HIGH);
digitalWrite(e,HIGH);
digitalWrite(f,LOW);
digitalWrite(g,HIGH);
digitalWrite(dp, LOW);
break;
case 3:
digitalWrite(a,HIGH);
digitalWrite(b,HIGH);
digitalWrite(c,HIGH);
digitalWrite(d,HIGH);
digitalWrite(e,LOW);
digitalWrite(f,LOW);
digitalWrite(g,HIGH);
digitalWrite(dp, LOW);
break;
case 4:
digitalWrite(a,LOW);
digitalWrite(b,HIGH);
digitalWrite(c,HIGH);
digitalWrite(d,LOW);
digitalWrite(e,LOW);
digitalWrite(f,HIGH);
digitalWrite(g,HIGH);
digitalWrite(dp, LOW);
break;
case 5:
digitalWrite(a,HIGH);
digitalWrite(b,LOW);
digitalWrite(c,HIGH);
digitalWrite(d,HIGH);
digitalWrite(e,LOW);
digitalWrite(f,HIGH);
digitalWrite(g,HIGH);
digitalWrite(dp, LOW);
break;
case 6:
digitalWrite(a,HIGH);
digitalWrite(b,LOW);
digitalWrite(c,HIGH);
digitalWrite(d,HIGH);
digitalWrite(e,HIGH);
digitalWrite(f,HIGH);
digitalWrite(g,HIGH);
digitalWrite(dp, LOW);
break;
case 7:
digitalWrite(a,HIGH);
digitalWrite(b,HIGH);
digitalWrite(c,HIGH);
digitalWrite(d,LOW);
digitalWrite(e,LOW);
digitalWrite(f,LOW);
digitalWrite(g,LOW);
digitalWrite(dp, LOW);
break;
case 8:
digitalWrite(a,HIGH);
digitalWrite(b,HIGH);
digitalWrite(c,HIGH);
digitalWrite(d,HIGH);
digitalWrite(e,HIGH);
digitalWrite(f,HIGH);
digitalWrite(g,HIGH);
digitalWrite(dp, LOW);
break;
case 9:
digitalWrite(a,HIGH);
digitalWrite(b,HIGH);
digitalWrite(c,HIGH);
digitalWrite(d,LOW);
digitalWrite(e,LOW);
digitalWrite(f,HIGH);
digitalWrite(g,HIGH);
digitalWrite(dp, LOW);
break;
}
}
thats the code, ill change the things you told me, but i think it is an electrical problem, ill try to post the circuit
I tried, to do the thing u told me about changing the boolean in the interrupt but i have the same issue.
// Programa de demostración
// Programa para hacer parpadear todos los segmentos del dígito de las unidades del display
// y enviar un mensaje a la consola
#define D4 49 // El pin 49 controla el cátodo común del dígito de las unidades (D4)
#define D3 48 // El pin 48 controla el cátodo común del dígito de las decenas (D3)
#define D2 47 // El pin 47 controla el cátodo común del dígito de las centenas (D2)
#define D1 46 // El pin 46 controla el cátodo común del dígito de las unidades de millar (D1)
const int PinBuzzer = 37;
//asignamos los pines a los botones
const int pup = 34;
const int penter = 33;
const int pdown = 31;
const int pright = 30 ;
const int pleft = 32;
const int a = 22;
const int b = 23;
const int c = 24;
const int d = 25;
const int e = 26;
const int f = 27;
const int g = 28;
const int dp = 29;
//variables que almacenan el estado de los botones para realizar el método de antirebote
int presionado = 0; //Almacena si he apretado el botón pup
int presionado1 = 0; //Almacena si he apretado el botón pdown
int presionado2 = 0; //Almacena si he apretado el botón penter
int presionado3 = 0; //Almacena si he apretado el botón pright
int presionado4 = 0; //Almacena si he apretado el botón pleft
//variables que me ayudan a llevar el contador
int unidad = 0;
int decena = 0;
//variables donde almaceno los mensajes que se mostrarán en la consola.
String mensaje1 = "1.- Mostrar el contador en los dos dígitos inferiores del display (decenas-unidades)";
String mensaje2 = "2.- Mostrar el contador en los dos dígitos superiores del display (millares-centenas)";
String mensaje3 = "Elegir opción:";
//variable donde se guarda la opción escogida por el cliente
int numero;
volatile boolean estado1 = false;
void setup() {
// put your setup code here, to run once:
Serial.begin(9600); // inicialización del canal serie para comunicarnos con:
// PC --> "Herramientas/monitor serie" en la plataforma Arduino
// Proteus --> consola en Proteus (VIRTUAL TERMINAL)
//Programar PORTA de salida. Conexión a los segmentos a-b-c-d-e-f-g-dp del display 7-segmentos)
DDRA=0xFF; // También se puede expresar en binario con B11111111 (DDRA = B1111111;)
// Escritura en el PORTA --> Todos los segmentos a "1": encendidos
PORTA = 0xFF; // o también B11111111
// programación de las señales que controlan los cátodos comunes como de salida (OUTPUT o =1)
pinMode(D4,OUTPUT); //unidades
pinMode(D3,OUTPUT); //decenas
pinMode(D2,OUTPUT); //unidades
pinMode(D1,OUTPUT); //decenas
//Declaramos los botones con señales de entrada
pinMode(pup,INPUT);
pinMode(penter,INPUT);
pinMode(pdown,INPUT);
pinMode(pright,INPUT);
pinMode(pleft,INPUT);
//Declaramos los displays
pinMode(a,OUTPUT);
pinMode(b,OUTPUT);
pinMode(c,OUTPUT);
pinMode(d,OUTPUT);
pinMode(e,OUTPUT);
pinMode(f,OUTPUT);
pinMode(g,OUTPUT);
pinMode(dp,OUTPUT);
//declaramos la señal del zumbador
pinMode(PinBuzzer, OUTPUT);
//imprimimos los mensajes por pantalla
Serial.println(mensaje1);
Serial.println(mensaje2);
Serial.println(mensaje3);
//Las interrupciones??????????????????????????????????????????
// Habilitación de la interrupción INT2, flanco de subida (rising)
cli();
EICRA |= (1<<ISC21) | (1<<ISC20);
EIMSK |= (1<<INT2);
sei();
PORTL |=0x0F; // equivalente a PORTL = PORTL | B00001111 (cátodos D1D2D3D4 desactivados)
// se lee el puerto y se hace el "or" con la máscara B00001111 para poner los 4 bits
// menos significativos a "1". Los 4 bits superiores quedan como estaban: no se modifican
// Otra forma: pinMode(D4, OUTPUT); pinMode() para programar pin a pin (en este caso D4)
}
ISR (INT2_vect) {
//Rutina de servicio para la visualización entrelazada
estado1 = !estado1;
} //final
void loop() {
if(Serial.available() > 0){
numero = Serial.parseInt();
Serial.println(numero);
}
if(digitalRead(pright) == LOW) {
presionado3 = 1;
}
if(digitalRead(pright) == HIGH && presionado3 == 1){
if (digitalRead(pup) == LOW) //Pregunta si el pulsador está presionado
{
presionado = 1; //La variable cambia de valor
}
if (digitalRead(pup) == HIGH && presionado == 1)
{
if(unidad <= 9){
unidad = unidad + 2;
tone(PinBuzzer, 500); //Activamos el pitido
delay(50);
noTone(PinBuzzer); //desactivamos el pitido
}
if(unidad > 9) { //Si es mayor que nueve, reseteamos las unidades y sumamos 1 a las decenas.
if(unidad == 10){
unidad = 0;
}
if(unidad == 11){
unidad = 1;
}
decena++;
tone(PinBuzzer, 500); //Activamos el pitido
delay(50);
noTone(PinBuzzer); //desactivamos el pitido
if(decena > 9){ //Si es mayor que nueve, reseteamos las decenas
decena = 0;
tone(PinBuzzer, 500); //Activamos el pitido
delay(50);
noTone(PinBuzzer); //desactivamos el pitido
}
}
presionado = 0; //La variable vuelve a su valor original
}
if (digitalRead(pdown) == LOW) { //Pregunta si el pulsador está presionado
presionado1 = 1; //La variable cambia de valor
}
if (digitalRead(pdown) == HIGH && presionado1 == 1){
if (unidad >= 0) {
if (unidad < 0) {
unidad = 0;
tone(PinBuzzer, 500); //Activamos el pitido
delay(50);
noTone(PinBuzzer); //desactivamos el pitido
}
unidad = unidad-2;
tone(PinBuzzer, 500); //Activamos el pitido
delay(10);
noTone(PinBuzzer); //desactivamos el pitido
}
if(unidad < 0){
unidad = 8;
tone(PinBuzzer, 500); //Activamos el pitido
delay(50);
noTone(PinBuzzer); //desactivamos el pitido
if (decena < 0){
decena = 0;
tone(PinBuzzer, 500); //Activamos el pitido
delay(50);
noTone(PinBuzzer); //desactivamos el pitido
}
decena--;
tone(PinBuzzer, 500); //Activamos el pitido
delay(50);
noTone(PinBuzzer); //desactivamos el pitido
}
if (decena < 0){
tone(PinBuzzer, 500); //Activamos el pitido
delay(50);
noTone(PinBuzzer); //desactivamos el pitido
decena = 9;
}
presionado1 = 0; //La variable vuelve a su valor original
}
if (digitalRead(pleft) == LOW) { //Pregunta si el pulsador está presionado
presionado4 = 1; //La variable cambia de valor
}
if (digitalRead(pleft) == HIGH && presionado4 == 1){
presionado3 = 0;
presionado4 = 0; //La variable vuelve a su valor original
}
if (digitalRead(penter) == LOW) { //Pregunta si el pulsador está presionado
presionado2 = 1; //La variable cambia de valor
}
if (digitalRead(penter) == HIGH && presionado2 == 1){
unidad =0;
decena=0;
presionado2 = 0; //La variable vuelve a su valor original
}
}
if(presionado3 == 1 && digitalRead(pright) == LOW || presionado4 == 0){
if (digitalRead(pup) == LOW) //Pregunta si el pulsador está presionado
{
presionado = 1; //La variable cambia de valor
}
if (digitalRead(pup) == HIGH && presionado == 1)
{
if(unidad <= 9){
unidad++;
tone(PinBuzzer, 500); //Activamos el pitido
delay(50);
noTone(PinBuzzer); //desactivamos el pitido
}
if(unidad > 9) { //Si es mayor que nueve, reseteamos las unidades y sumamos 1 a las decenas.
unidad = 0;
decena++;
tone(PinBuzzer, 500); //Activamos el pitido
delay(50);
noTone(PinBuzzer); //desactivamos el pitido
if(decena > 9){ //Si es mayor que nueve, reseteamos las decenas
decena = 0;
tone(PinBuzzer, 500); //Activamos el pitido
delay(50);
noTone(PinBuzzer); //desactivamos el pitido
}
}
presionado = 0; //La variable vuelve a su valor original
}
if (digitalRead(pdown) == LOW) { //Pregunta si el pulsador está presionado
presionado1 = 1; //La variable cambia de valor
}
if (digitalRead(pdown) == HIGH && presionado1 == 1){
if (unidad >= 0) {
if (unidad < 0) {
unidad = 0;
tone(PinBuzzer, 500); //Activamos el pitido
delay(10);
noTone(PinBuzzer); //desactivamos el pitido
}
unidad--;
tone(PinBuzzer, 500); //Activamos el pitido
delay(10);
noTone(PinBuzzer); //desactivamos el pitido
}
if(unidad < 0){
unidad = 9;
tone(PinBuzzer, 500); //Activamos el pitido
delay(10);
noTone(PinBuzzer); //desactivamos el pitido
if (decena < 0){
decena = 0;
tone(PinBuzzer, 500); //Activamos el pitido
delay(10);
noTone(PinBuzzer); //desactivamos el pitido
}
decena--;
tone(PinBuzzer, 500); //Activamos el pitido
delay(10);
noTone(PinBuzzer); //desactivamos el pitido
}
if (decena < 0){
tone(PinBuzzer, 500); //Activamos el pitido
delay(10);
noTone(PinBuzzer); //desactivamos el pitido
decena = 9;
}
presionado1 = 0; //La variable vuelve a su valor original
}
if (digitalRead(penter) == LOW) { //Pregunta si el pulsador está presionado
presionado2 = 1; //La variable cambia de valor
}
if (digitalRead(penter) == HIGH && presionado2 == 1){
unidad =0;
decena=0;
presionado2 = 0; //La variable vuelve a su valor original
}
}
if(estado1){
if(numero == 0 || numero == 1){
digitalWrite(D3,HIGH); //APAGAMOS DECENAS
digitalWrite(D4,LOW); //ENCENDEMOS UNIDADES
digitalWrite(D2,HIGH); //APAGAMOS LAS CENTENAS
digitalWrite(D1,HIGH);//APAGAMOS LOS MILLARES
}else{
digitalWrite(D4,HIGH); //APAGAMOS UNIDADES
digitalWrite(D3,HIGH) ; //APAGAMOS LAS DECENAS
digitalWrite(D2,LOW); //ENCENDEMOS LAS CENTENAS
digitalWrite(D1,HIGH); //APAGAMOS LOS MILLARES
}
mostrar(unidad); //ENCIENDE LOS SEGMENTOS COMO DEBE
delay(10);
}else{
if(numero == 0 || numero == 1){
digitalWrite(D4,HIGH); //APAGO LAS UNIDADES
digitalWrite(D3,LOW); //ENCIENDO LAS DECENAS
digitalWrite(D2,HIGH); //APAGO LAS CENTENAS
digitalWrite(D1,HIGH); //APAGO LOS MILLARES
}else{
digitalWrite(D4,HIGH); //APAGAMOS UNIDADES
digitalWrite(D3,HIGH) ; //APAGAMOS LAS DECENAS
digitalWrite(D2,HIGH); //APAGAMOS LAS CENTENAS
digitalWrite(D1,LOW); //ENCENDEMOS LOS MILLARES
}
mostrar(decena);//ENCIENDE LOS SEGMENTOS COMO DEBE
delay(10);
}
}
void mostrar(int var){
switch (var){
case 0:
digitalWrite(a,HIGH);
digitalWrite(b,HIGH);
digitalWrite(c,HIGH);
digitalWrite(d,HIGH);
digitalWrite(e,HIGH);
digitalWrite(f,HIGH);
digitalWrite(g,LOW);
digitalWrite(dp, LOW);
break;
case 1:
digitalWrite(a,LOW);
digitalWrite(b,HIGH);
digitalWrite(c,HIGH);
digitalWrite(d,LOW);
digitalWrite(e,LOW);
digitalWrite(f,LOW);
digitalWrite(g,LOW);
digitalWrite(dp, LOW);
break;
case 2:
digitalWrite(a,HIGH);
digitalWrite(b,HIGH);
digitalWrite(c,LOW);
digitalWrite(d,HIGH);
digitalWrite(e,HIGH);
digitalWrite(f,LOW);
digitalWrite(g,HIGH);
digitalWrite(dp, LOW);
break;
case 3:
digitalWrite(a,HIGH);
digitalWrite(b,HIGH);
digitalWrite(c,HIGH);
digitalWrite(d,HIGH);
digitalWrite(e,LOW);
digitalWrite(f,LOW);
digitalWrite(g,HIGH);
digitalWrite(dp, LOW);
break;
case 4:
digitalWrite(a,LOW);
digitalWrite(b,HIGH);
digitalWrite(c,HIGH);
digitalWrite(d,LOW);
digitalWrite(e,LOW);
digitalWrite(f,HIGH);
digitalWrite(g,HIGH);
digitalWrite(dp, LOW);
break;
case 5:
digitalWrite(a,HIGH);
digitalWrite(b,LOW);
digitalWrite(c,HIGH);
digitalWrite(d,HIGH);
digitalWrite(e,LOW);
digitalWrite(f,HIGH);
digitalWrite(g,HIGH);
digitalWrite(dp, LOW);
break;
case 6:
digitalWrite(a,HIGH);
digitalWrite(b,LOW);
digitalWrite(c,HIGH);
digitalWrite(d,HIGH);
digitalWrite(e,HIGH);
digitalWrite(f,HIGH);
digitalWrite(g,HIGH);
digitalWrite(dp, LOW);
break;
case 7:
digitalWrite(a,HIGH);
digitalWrite(b,HIGH);
digitalWrite(c,HIGH);
digitalWrite(d,LOW);
digitalWrite(e,LOW);
digitalWrite(f,LOW);
digitalWrite(g,LOW);
digitalWrite(dp, LOW);
break;
case 8:
digitalWrite(a,HIGH);
digitalWrite(b,HIGH);
digitalWrite(c,HIGH);
digitalWrite(d,HIGH);
digitalWrite(e,HIGH);
digitalWrite(f,HIGH);
digitalWrite(g,HIGH);
digitalWrite(dp, LOW);
break;
case 9:
digitalWrite(a,HIGH);
digitalWrite(b,HIGH);
digitalWrite(c,HIGH);
digitalWrite(d,LOW);
digitalWrite(e,LOW);
digitalWrite(f,HIGH);
digitalWrite(g,HIGH);
digitalWrite(dp, LOW);
break;
}
}
What the issue may be remains to be seen. I'm a fan of do as little code processing in the interrupt service routine as possible. Thus, while the ISR may not be a problem, developing good code habits with these MCU's helps.
Which button is the 2?
You might add in some hardware switch de-bounce and software switch de-bounce code.
ill try to put the code in English if you want, let me a moment and ill post it
About button 2,
I consult in the terminal, which numbers my client wants if it a 1 I´ll glow the units and the tens,
if it 2, if he presses in the keyboard the number 2, it will glow the other things,
I put the result in a variable, called "Numero" which means the number my client put on the keyboard, and it will appear on the console.
OK so the 2 is from the keyboard entry.
The issue from the description and restated is after the 2 is pressed the code changes back to its default instead of latching the 2, correct? How long should the display hold the 2 press from the keyboard?
ill show u in a picture, how its meant to be.
Heres the code with comments in English
#define D4 49 // El pin 49 controla el cátodo común del dígito de las unidades (D4)
#define D3 48 // El pin 48 controla el cátodo común del dígito de las decenas (D3)
#define D2 47 // El pin 47 controla el cátodo común del dígito de las centenas (D2)
#define D1 46 // El pin 46 controla el cátodo común del dígito de las unidades de millar (D1)
const int PinBuzzer = 37;
//asignamos los pines a los botones
const int pup = 34;
const int penter = 33;
const int pdown = 31;
const int pright = 30 ;
const int pleft = 32;
const int a = 22;
const int b = 23;
const int c = 24;
const int d = 25;
const int e = 26;
const int f = 27;
const int g = 28;
const int dp = 29;
//variables que almacenan el estado de los botones para realizar el método de antirebote
int presionado = 0; //if pup is pressed
int presionado1 = 0; //iff pdown is pressed
int presionado2 = 0; //iff penter is pressed
int presionado3 = 0; //iff prigth is pressed
int presionado4 = 0; //iff pleft is pressed
//it helps me to know wich number do i have to put in the counter
int unidad = 0;
int decena = 0;
//messages i want to put on the console
String mensaje1 = "1.- show me the digits in the displays 4 and 3 (tens-units)";
String mensaje2 = "2.- show me the digits in the displays 2 and 1(millares-centenas)";
String mensaje3 = "Choose an option:";
//this is where i store the number i put on console (it maybe 1, 2 or 0)
int numero;
volatile boolean estado1 = true;
void setup() {
// put your setup code here, to run once:
Serial.begin(9600); // inicialización del canal serie para comunicarnos con:
// PC --> "Herramientas/monitor serie" en la plataforma Arduino
// Proteus --> consola en Proteus (VIRTUAL TERMINAL)
//Programar PORTA de salida. Conexión a los segmentos a-b-c-d-e-f-g-dp del display 7-segmentos)
DDRA=0xFF; // También se puede expresar en binario con B11111111 (DDRA = B1111111;)
// Escritura en el PORTA --> Todos los segmentos a "1": encendidos
PORTA = 0xFF; // o también B11111111
// programación de las señales que controlan los cátodos comunes como de salida (OUTPUT o =1)
pinMode(D4,OUTPUT); //units
pinMode(D3,OUTPUT); //tens
pinMode(D2,OUTPUT); //hundreds
pinMode(D1,OUTPUT); //thousands
//buttons
pinMode(pup,INPUT);
pinMode(penter,INPUT);
pinMode(pdown,INPUT);
pinMode(pright,INPUT);
pinMode(pleft,INPUT);
//Segments
pinMode(a,OUTPUT);
pinMode(b,OUTPUT);
pinMode(c,OUTPUT);
pinMode(d,OUTPUT);
pinMode(e,OUTPUT);
pinMode(f,OUTPUT);
pinMode(g,OUTPUT);
pinMode(dp,OUTPUT);
//buzzer
pinMode(PinBuzzer, OUTPUT);
//print messagges in console
Serial.println(mensaje1);
Serial.println(mensaje2);
Serial.println(mensaje3);
//interrupts
cli();
EICRA |= (1<<ISC21) | (1<<ISC20);
EIMSK |= (1<<INT2);
sei();
}
ISR (INT2_vect) {
estado1 = !estado1;
}
void loop() {
if(Serial.available() > 0){
numero = Serial.parseInt();
Serial.println(numero);
}
if(digitalRead(pright) == LOW) {
presionado3 = 1;
}
if(digitalRead(pright) == HIGH && presionado3 == 1){
if (digitalRead(pup) == LOW) //asks if it is pressed
{
presionado = 1; //i do this to avoid the switch de-bounce code
}
if (digitalRead(pup) == HIGH && presionado == 1)
{
if(unidad <= 9){
unidad = unidad + 2;
tone(PinBuzzer, 500);
delay(50);
noTone(PinBuzzer);
}
if(unidad > 9) {
if(unidad == 10){
unidad = 0;
}
if(unidad == 11){
unidad = 1;
}
decena++;
tone(PinBuzzer, 500);
delay(50);
noTone(PinBuzzer);
if(decena > 9){
decena = 0;
tone(PinBuzzer, 500);
delay(50);
noTone(PinBuzzer);
}
}
presionado = 0;
}
if (digitalRead(pdown) == LOW) {
presionado1 = 1;
}
if (digitalRead(pdown) == HIGH && presionado1 == 1){
if (unidad >= 0) {
if (unidad < 0) {
unidad = 0;
tone(PinBuzzer, 500);
delay(50);
noTone(PinBuzzer);
}
unidad = unidad-2;
tone(PinBuzzer, 500);
delay(10);
noTone(PinBuzzer);
}
if(unidad < 0){
unidad = 8;
tone(PinBuzzer, 500);
delay(50);
noTone(PinBuzzer);
if (decena < 0){
decena = 0;
tone(PinBuzzer, 500);
delay(50);
noTone(PinBuzzer);
}
decena--;
tone(PinBuzzer, 500);
delay(50);
noTone(PinBuzzer);
}
if (decena < 0){
tone(PinBuzzer, 500);
delay(50);
noTone(PinBuzzer);
decena = 9;
}
presionado1 = 0;
}
if (digitalRead(pleft) == LOW) {
presionado4 = 1;
}
if (digitalRead(pleft) == HIGH && presionado4 == 1){
presionado3 = 0;
presionado4 = 0;
}
if (digitalRead(penter) == LOW) {
presionado2 = 1;
}
if (digitalRead(penter) == HIGH && presionado2 == 1){
unidad =0;
decena=0;
presionado2 = 0;
}
}
if(presionado3 == 1 && digitalRead(pright) == LOW || presionado4 == 0){
if (digitalRead(pup) == LOW)
{
presionado = 1;
}
if (digitalRead(pup) == HIGH && presionado == 1)
{
if(unidad <= 9){
unidad++;
tone(PinBuzzer, 500);
delay(50);
noTone(PinBuzzer);
}
if(unidad > 9) {
unidad = 0;
decena++;
tone(PinBuzzer, 500);
delay(50);
noTone(PinBuzzer);
if(decena > 9){
decena = 0;
tone(PinBuzzer, 500);
delay(50);
noTone(PinBuzzer);
}
}
presionado = 0;
}
if (digitalRead(pdown) == LOW) {
presionado1 = 1;
}
if (digitalRead(pdown) == HIGH && presionado1 == 1){
if (unidad >= 0) {
if (unidad < 0) {
unidad = 0;
tone(PinBuzzer, 500);
delay(10);
noTone(PinBuzzer);
}
unidad--;
tone(PinBuzzer, 500);
delay(10);
noTone(PinBuzzer);
}
if(unidad < 0){
unidad = 9;
tone(PinBuzzer, 500);
delay(10);
noTone(PinBuzzer);
if (decena < 0){
decena = 0;
tone(PinBuzzer, 500);
delay(10);
noTone(PinBuzzer);
}
decena--;
tone(PinBuzzer, 500);
delay(10);
noTone(PinBuzzer);
}
if (decena < 0){
tone(PinBuzzer, 500);
delay(10);
noTone(PinBuzzer);
decena = 9;
}
presionado1 = 0;
}
if (digitalRead(penter) == LOW) {
presionado2 = 1;
}
if (digitalRead(penter) == HIGH && presionado2 == 1){
unidad =0;
decena=0;
presionado2 = 0;
}
}
if(estado1){
if(numero == 0 || numero == 1){
digitalWrite(D3,HIGH); //turn off tens
digitalWrite(D4,LOW);//turn on units
digitalWrite(D2,HIGH); //turn off hundreds
digitalWrite(D1,HIGH);///turn off thousands
}else{
digitalWrite(D4,HIGH); //turn off units
digitalWrite(D3,HIGH) ; //turn off tens
digitalWrite(D2,LOW); //turn on hundreds
digitalWrite(D1,HIGH); //turn off thousands
}
mostrar(unidad); //turn on segments
delay(10);
}else{
if(numero == 0 || numero == 1){
digitalWrite(D4,HIGH); //turn off units
digitalWrite(D3,LOW); //turn on tens
digitalWrite(D2,HIGH); //turn off hundreds
digitalWrite(D1,HIGH); //turn off thousands
}else{
digitalWrite(D4,HIGH);//turn off units
digitalWrite(D3,HIGH) ; //turn off tens
digitalWrite(D2,HIGH); //turn off hundreds
digitalWrite(D1,LOW); //turn on thousands
}
mostrar(decena); //turn up the segments
delay(10);
}
}
void mostrar(int var){
switch (var){
case 0:
digitalWrite(a,HIGH);
digitalWrite(b,HIGH);
digitalWrite(c,HIGH);
digitalWrite(d,HIGH);
digitalWrite(e,HIGH);
digitalWrite(f,HIGH);
digitalWrite(g,LOW);
digitalWrite(dp, LOW);
break;
case 1:
digitalWrite(a,LOW);
digitalWrite(b,HIGH);
digitalWrite(c,HIGH);
digitalWrite(d,LOW);
digitalWrite(e,LOW);
digitalWrite(f,LOW);
digitalWrite(g,LOW);
digitalWrite(dp, LOW);
break;
case 2:
digitalWrite(a,HIGH);
digitalWrite(b,HIGH);
digitalWrite(c,LOW);
digitalWrite(d,HIGH);
digitalWrite(e,HIGH);
digitalWrite(f,LOW);
digitalWrite(g,HIGH);
digitalWrite(dp, LOW);
break;
case 3:
digitalWrite(a,HIGH);
digitalWrite(b,HIGH);
digitalWrite(c,HIGH);
digitalWrite(d,HIGH);
digitalWrite(e,LOW);
digitalWrite(f,LOW);
digitalWrite(g,HIGH);
digitalWrite(dp, LOW);
break;
case 4:
digitalWrite(a,LOW);
digitalWrite(b,HIGH);
digitalWrite(c,HIGH);
digitalWrite(d,LOW);
digitalWrite(e,LOW);
digitalWrite(f,HIGH);
digitalWrite(g,HIGH);
digitalWrite(dp, LOW);
break;
case 5:
digitalWrite(a,HIGH);
digitalWrite(b,LOW);
digitalWrite(c,HIGH);
digitalWrite(d,HIGH);
digitalWrite(e,LOW);
digitalWrite(f,HIGH);
digitalWrite(g,HIGH);
digitalWrite(dp, LOW);
break;
case 6:
digitalWrite(a,HIGH);
digitalWrite(b,LOW);
digitalWrite(c,HIGH);
digitalWrite(d,HIGH);
digitalWrite(e,HIGH);
digitalWrite(f,HIGH);
digitalWrite(g,HIGH);
digitalWrite(dp, LOW);
break;
case 7:
digitalWrite(a,HIGH);
digitalWrite(b,HIGH);
digitalWrite(c,HIGH);
digitalWrite(d,LOW);
digitalWrite(e,LOW);
digitalWrite(f,LOW);
digitalWrite(g,LOW);
digitalWrite(dp, LOW);
break;
case 8:
digitalWrite(a,HIGH);
digitalWrite(b,HIGH);
digitalWrite(c,HIGH);
digitalWrite(d,HIGH);
digitalWrite(e,HIGH);
digitalWrite(f,HIGH);
digitalWrite(g,HIGH);
digitalWrite(dp, LOW);
break;
case 9:
digitalWrite(a,HIGH);
digitalWrite(b,HIGH);
digitalWrite(c,HIGH);
digitalWrite(d,LOW);
digitalWrite(e,LOW);
digitalWrite(f,HIGH);
digitalWrite(g,HIGH);
digitalWrite(dp, LOW);
break;
}
}
And heres its how it should be seen.
It is an interesting problem, I think the problems end in the frequency of things about the electronic devices I have there, the problem is, i didn't make the circuit it was made by my teachers, but they don't replay me for days, so that's why I'm here, my classmates obviously don't know how to fix this weird problem, so that's why I'm here, i post it in Spanish/English trying to find out, what is going on.
mate, I change the multiplexing thing about the digits for one I saw on a forum, and now it works!!!
Don't know what's wrong with my previous one,
just wanting to thank u very much for your help!!!!!
Thank you!
Why in the first place are you using an interrupt in a completely inappropriate situation?
Is this in fact the situation we see here from time to time of a teacher trying to teach you to use interrupts when the teacher has absolutely no idea what they are used for?
This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.