cool , gracias me quedo a la espera de los que usan los integrados.
Ese ya funciona, porque no lo pruebas?
si ese lo se usar pero es sin multiplexear o shift register y para lo k necesito hacer, necesito salvar muchos pins...
este k tengo lo limpie un poco y funciona en un 90% lo unico es k blink una minima cosa.. lo subire a proteus y lo puedes ver, pero recuerda k al proteus no estar a la velocidad real se ben como separados pero en realidad se ven 90% estables...
arduino en proteus doble digitos 00.zip (19.1 KB)
el codigo es este ...
const int latchPin= A1;
const int clockPin = A2; ///// shift register 74HC595
const int dataPin = A0;
#define CA1 4 //// digito 1
#define CA2 5 //// digito 2
#define CA3 6 //// digito 3
#define CA4 7 //// digito 4
int botonUp = 3; ///// boton acender
int botonDown = 2; //// boton bajar
int cambio = 0;
int botonPress ;
int boton_No_Press ;
int botonPress2 ;
int boton_No_Press2 ;
const int energisarTiempo = 10;
boolean energisar ( int pin ){
boolean contador = 0;
boolean Press;
boolean NoPress;
do {
Press =digitalRead ( pin);
if ( Press != NoPress) {
contador = 0;
NoPress = Press;
}
else
{
contador = contador + 1;
}
delay (1);
}
while ( contador < energisarTiempo);
return Press;
}
void actualizar ()
{
switch ( cambio ) {
case 10: ////////////////// ( 50 )/////////////////
for (int numberToDisplay = 0; numberToDisplay < 100; numberToDisplay++) {
digitalWrite(latchPin,HIGH);
shiftOut(dataPin, clockPin, MSBFIRST, B11011010 );
digitalWrite(CA3, LOW);
digitalWrite(CA4, HIGH);
numberToDisplay%10;
digitalWrite(latchPin, LOW);
}
for (int numberToDisplay = 0; numberToDisplay < 100; numberToDisplay++) {
digitalWrite(latchPin, HIGH);
shiftOut(dataPin, clockPin, MSBFIRST, B01111110);
digitalWrite(CA3, HIGH);
digitalWrite(CA4, LOW);
numberToDisplay/10%10;
digitalWrite(latchPin, LOW);
}
break;
case 9: ////////////////// ( 45 )/////////////////
for (int numberToDisplay = 0; numberToDisplay < 100; numberToDisplay++) {
digitalWrite(latchPin,HIGH);
shiftOut(dataPin, clockPin, MSBFIRST, B11001100);
digitalWrite(CA3, LOW);
digitalWrite(CA4, HIGH);
numberToDisplay%10;
digitalWrite(latchPin, LOW);
}
for (int numberToDisplay = 0; numberToDisplay < 100; numberToDisplay++) {
digitalWrite(latchPin, HIGH);
shiftOut(dataPin, clockPin, MSBFIRST, B11011010);
digitalWrite(CA3, HIGH);
digitalWrite(CA4, LOW);
numberToDisplay/10%10;
digitalWrite(latchPin, LOW);
}
break;
case 8: ////////////////// ( 40 )/////////////////
for (int numberToDisplay = 0; numberToDisplay < 100; numberToDisplay++) {
digitalWrite(latchPin,HIGH);
shiftOut(dataPin, clockPin, MSBFIRST, B11001100);
digitalWrite(CA3, LOW);
digitalWrite(CA4, HIGH);
numberToDisplay%10;
digitalWrite(latchPin, LOW);
}
for (int numberToDisplay = 0; numberToDisplay < 100; numberToDisplay++) {
digitalWrite(latchPin, HIGH);
shiftOut(dataPin, clockPin, MSBFIRST, B01111110);
digitalWrite(CA3, HIGH);
digitalWrite(CA4, LOW);
numberToDisplay/10%10;
digitalWrite(latchPin, LOW);
}
break;
case 7: ////////////////// ( 35 )/////////////////
for (int numberToDisplay = 0; numberToDisplay < 100; numberToDisplay++) {
digitalWrite(latchPin,HIGH);
shiftOut(dataPin, clockPin, MSBFIRST, B10011110);
digitalWrite(CA3, LOW);
digitalWrite(CA4, HIGH);
numberToDisplay%10;
digitalWrite(latchPin, LOW);
}
for (int numberToDisplay = 0; numberToDisplay < 100; numberToDisplay++) {
digitalWrite(latchPin, HIGH);
shiftOut(dataPin, clockPin, MSBFIRST, B11011010);
digitalWrite(CA3, HIGH);
digitalWrite(CA4, LOW);
numberToDisplay/10%10;
digitalWrite(latchPin, LOW);
}
break;
case 6: ////////////////// ( 30 )/////////////////
for (int numberToDisplay = 0; numberToDisplay < 100; numberToDisplay++) {
digitalWrite(latchPin, HIGH);
shiftOut(dataPin, clockPin, MSBFIRST, B10011110);
//take the latch pin high so the LEDs will light up:
digitalWrite(CA3, LOW);
digitalWrite(CA4, HIGH);
numberToDisplay%10;
digitalWrite(latchPin, LOW);
}
for (int numberToDisplay = 0; numberToDisplay < 100; numberToDisplay++) {
digitalWrite(latchPin, HIGH);
shiftOut(dataPin, clockPin, MSBFIRST, B01111110);
//take the latch pin high so the LEDs will light up:
digitalWrite(CA3, HIGH);
digitalWrite(CA4, LOW);
numberToDisplay/10%10;
digitalWrite(latchPin, LOW);
}
break;
case 5: ////////////////// ( 25 )/////////////////
for (int numberToDisplay = 0; numberToDisplay < 100; numberToDisplay++) {
digitalWrite(latchPin, HIGH);
shiftOut(dataPin, clockPin, MSBFIRST, B10110110);
digitalWrite(CA3, LOW);
digitalWrite(CA4, HIGH);
numberToDisplay%10;
digitalWrite(latchPin, LOW);
}
for (int numberToDisplay = 0; numberToDisplay < 100; numberToDisplay++) {
digitalWrite(latchPin, HIGH);
shiftOut(dataPin, clockPin, MSBFIRST, B11011010);
digitalWrite(CA3, HIGH);
digitalWrite(CA4, LOW);
numberToDisplay/10%10;
digitalWrite(latchPin, LOW);
}
break;
case 4: ////////////////// ( 20 )/////////////////
for (int numberToDisplay = 0; numberToDisplay < 100; numberToDisplay++) {
digitalWrite(latchPin,HIGH);
shiftOut(dataPin, clockPin, MSBFIRST, B10110110);
digitalWrite(CA3, LOW);
digitalWrite(CA4, HIGH);
numberToDisplay%10;
digitalWrite(latchPin, LOW);
}
for (int numberToDisplay = 0; numberToDisplay < 100; numberToDisplay++) {
digitalWrite(latchPin, HIGH);
shiftOut(dataPin, clockPin, MSBFIRST, B01111110);
digitalWrite(CA3, HIGH);
digitalWrite(CA4, LOW);
numberToDisplay/10%10;
digitalWrite(latchPin, LOW);
}
break;
case 3: ////////////////// ( 15 )/////////////////
for (int numberToDisplay = 0; numberToDisplay < 100; numberToDisplay++) {
digitalWrite(latchPin,HIGH);
shiftOut(dataPin, clockPin, MSBFIRST, B00001100);
digitalWrite(CA3, LOW);
digitalWrite(CA4, HIGH);
numberToDisplay%10;
digitalWrite(latchPin, LOW);
}
for (int numberToDisplay = 0; numberToDisplay < 100; numberToDisplay++) {
digitalWrite(latchPin, HIGH);
shiftOut(dataPin, clockPin, MSBFIRST, B11011010);
digitalWrite(CA3, HIGH);
digitalWrite(CA4, LOW);
numberToDisplay/10%10;
digitalWrite(latchPin, LOW);
}
break;
case 2: ////////////////// ( 10 )/////////////////
for (int numberToDisplay = 0; numberToDisplay < 100; numberToDisplay++) {
digitalWrite(latchPin, HIGH);
shiftOut(dataPin, clockPin, MSBFIRST, B00001100);
//take the latch pin high so the LEDs will light up:
digitalWrite(CA3, LOW);
digitalWrite(CA4, HIGH);
numberToDisplay%10;
digitalWrite(latchPin, LOW);
}
for (int numberToDisplay = 0; numberToDisplay < 100; numberToDisplay++) {
digitalWrite(latchPin, HIGH);
shiftOut(dataPin, clockPin, MSBFIRST, B01111110);
digitalWrite(CA3, HIGH);
digitalWrite(CA4, LOW);
numberToDisplay/10%10;
digitalWrite(latchPin, LOW);
}
break;
case 1: ////////////////// ( 05 )/////////////////
for (int numberToDisplay = 0; numberToDisplay < 100; numberToDisplay++) {
digitalWrite(latchPin, HIGH);
shiftOut(dataPin, clockPin, MSBFIRST, B01111110);
digitalWrite(CA3, LOW);
digitalWrite(CA4, HIGH);
numberToDisplay%10;
digitalWrite(latchPin, LOW);
}
for (int numberToDisplay = 0; numberToDisplay < 100; numberToDisplay++) {
digitalWrite(latchPin, HIGH);
shiftOut(dataPin, clockPin, MSBFIRST, B11011010);
//take the latch pin high so the LEDs will light up:
digitalWrite(CA3, HIGH);
digitalWrite(CA4, LOW);
numberToDisplay/10%10;
digitalWrite(latchPin, LOW);
}
break;
case 0: ////////////////// ( 00 )/////////////////
for (int numberToDisplay = 0; numberToDisplay < 100; numberToDisplay++) {
digitalWrite(latchPin, HIGH);
shiftOut(dataPin, clockPin, MSBFIRST, B01111110);
digitalWrite(CA1, HIGH);
digitalWrite(CA2, HIGH);
digitalWrite(CA3, LOW);
digitalWrite(CA4, LOW);
digitalWrite(latchPin, LOW);
}
break;
}
}
void setup ()
{
Serial.begin ( 9600);
pinMode ( botonUp, INPUT);
pinMode ( botonDown, INPUT);
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
pinMode(CA1, OUTPUT);
pinMode(CA2, OUTPUT);
pinMode(CA3, OUTPUT);
pinMode(CA4, OUTPUT);
}
void loop ()
{
botonPress = digitalRead ( botonUp );
if ( botonPress != boton_No_Press) {
if ( energisar ( botonUp) ){
cambio ++;
if ( cambio > 10 ) {
cambio = 10;
}
}
}
boton_No_Press = botonPress;
////////////////////////////////////////////////
botonPress2 = digitalRead ( botonDown );
if ( botonPress2 != boton_No_Press2) {
if ( energisar ( botonDown) ){
cambio --;
if ( cambio < 0 ) {
cambio = 0;
}
}
}
boton_No_Press2 = botonPress2;
actualizar ();
}
Que te parece usar dos 595 y no consumir 4 pines mas para comandar los LED?
O sea con 3 pines comandas todo?
Te queda todo el Arduino para lo que gustes?
Ahora te lo dibujo y te lo posteo en Proteus.
Y k codigo usaria el mismo k tengo o como..
Bueno acá esta el segundo caso.
Ya que Hcorniel requiere mínimo uso de pines esta versión también de Nick Gammon me pareció muy interesante.
Simulaicón y sketch adjuntados
falta agregar los dos pulsadores y eliminar la parte del código que actua como contador de segundos que para Hcorniel no tienes sentido.
Es igual al caso anterior respetando lo que aquí esta.
A ver si puedes con la tarea.
Explico algo del programa.
Todo el trabajo lo hace la rutina del timer.
Solo debes actuar sobre now que es la variable que luego el programa presenta en los 4 LEDs
Si pones los 2 pulsadores y haces que now suba o baje tienes lo que quieres
595.zip (22.8 KB)
tengo un problema los archivos no se abren , cuando lo intento abrir en proteus sale bien pero cuando le doy a iniciar me da este error
y el codigo tambien me da este error.
lo de proteus no es muy importante lo puedo hacer yo, pero necesito conocer el codigo.
gracias.
Pero debes recompilar el archivo Arduino, y poner la ruta en el Arduino UNO del Proteus, por eso te da error. Es obvio que mi ruta no es la tuya.
Si pero no pueso abrir el codigo no se abre para recopilarlo
Como no se abre, edita el nombre y ponlo sin espacios. Ponle el nombre que gustes.
const int dataPin = A0;
const int latchPin = A1;
const int clockPin = A2; ///// shift register 74HC595
int botonUp = 3; ///// boton acender
int botonDown = 2; //// boton bajar
int cambio = 0;
int botonPress ;
int boton_No_Press ;
int botonPress2 ;
int boton_No_Press2 ;
const int energisarTiempo = 10;
boolean energisar ( int pin ){
boolean contador = 0;
boolean Press;
boolean NoPress;
do {
Press =digitalRead ( pin);
if ( Press != NoPress) {
contador = 0;
NoPress = Press;
}
else
{
contador = contador + 1;
}
delay (1);
}
while ( contador < energisarTiempo);
return Press;
}
void actualizar ()
{
switch ( cambio ) {
case 10: ////////////////// ( 50 )/////////////////
digitalWrite ( latchPin, HIGH );
shiftOut ( dataPin,clockPin,MSBFIRST,0b11110111 );
shiftOut ( dataPin,clockPin,MSBFIRST,0b11011010 );
digitalWrite ( latchPin,LOW);
delay (10);
digitalWrite ( latchPin, HIGH);
shiftOut ( dataPin,clockPin,MSBFIRST,0b11101111 );
shiftOut ( dataPin,clockPin,MSBFIRST,0b01111110 );
digitalWrite ( latchPin,LOW);
delay (10);
break;
case 9: ////////////////// ( 45 )/////////////////
digitalWrite ( latchPin, HIGH );
shiftOut ( dataPin,clockPin,MSBFIRST,0b11110111 );
shiftOut ( dataPin,clockPin,MSBFIRST,0b11001100 );
digitalWrite ( latchPin,LOW);
delay (10);
digitalWrite ( latchPin, HIGH);
shiftOut ( dataPin,clockPin,MSBFIRST,0b11101111 );
shiftOut ( dataPin,clockPin,MSBFIRST,0b11011010 );
digitalWrite ( latchPin,LOW);
delay (10);
break;
case 8: ////////////////// ( 40 )/////////////////
digitalWrite ( latchPin, HIGH );
shiftOut ( dataPin,clockPin,MSBFIRST,0b11110111 );
shiftOut ( dataPin,clockPin,MSBFIRST,0b11001100 );
digitalWrite ( latchPin,LOW);
delay (10);
digitalWrite ( latchPin, HIGH);
shiftOut ( dataPin,clockPin,MSBFIRST,0b11101111 );
shiftOut ( dataPin,clockPin,MSBFIRST,0b01111110 );
digitalWrite ( latchPin,LOW);
delay (10);
break;
case 7: ////////////////// ( 35 )/////////////////
digitalWrite ( latchPin, HIGH );
shiftOut ( dataPin,clockPin,MSBFIRST,0b11110111 );
shiftOut ( dataPin,clockPin,MSBFIRST,0b10011110 );
digitalWrite ( latchPin,LOW);
delay (10);
digitalWrite ( latchPin, HIGH);
shiftOut ( dataPin,clockPin,MSBFIRST,0b11101111 );
shiftOut ( dataPin,clockPin,MSBFIRST,0b11011010 );
digitalWrite ( latchPin,LOW);
delay (10);
break;
case 6: ////////////////// ( 30 )/////////////////
digitalWrite ( latchPin, HIGH );
shiftOut ( dataPin,clockPin,MSBFIRST,0b11110111 );
shiftOut ( dataPin,clockPin,MSBFIRST,0b10011110 );
digitalWrite ( latchPin,LOW);
delay (10);
digitalWrite ( latchPin, HIGH);
shiftOut ( dataPin,clockPin,MSBFIRST,0b11101111 );
shiftOut ( dataPin,clockPin,MSBFIRST,0b01111110 );
digitalWrite ( latchPin,LOW);
delay (10);
break;
case 5: ////////////////// ( 25 )/////////////////
digitalWrite ( latchPin, HIGH );
shiftOut ( dataPin,clockPin,MSBFIRST,0b11110111 );
shiftOut ( dataPin,clockPin,MSBFIRST,0b10110110 );
digitalWrite ( latchPin,LOW);
delay (10);
digitalWrite ( latchPin, HIGH);
shiftOut ( dataPin,clockPin,MSBFIRST,0b11101111 );
shiftOut ( dataPin,clockPin,MSBFIRST,0b11011010 );
digitalWrite ( latchPin,LOW);
delay (10);
break;
case 4: ////////////////// ( 20 )/////////////////
digitalWrite ( latchPin, HIGH );
shiftOut ( dataPin,clockPin,MSBFIRST,0b11110111 );
shiftOut ( dataPin,clockPin,MSBFIRST,0b10110110 );
digitalWrite ( latchPin,LOW);
delay (10);
digitalWrite ( latchPin, HIGH);
shiftOut ( dataPin,clockPin,MSBFIRST,0b11101111 );
shiftOut ( dataPin,clockPin,MSBFIRST,0b01111110 );
digitalWrite ( latchPin,LOW);
delay (10);
break;
case 3: ////////////////// ( 15 )/////////////////
digitalWrite ( latchPin, HIGH );
shiftOut ( dataPin,clockPin,MSBFIRST,0b11110111 );
shiftOut ( dataPin,clockPin,MSBFIRST,0b00001100 );
digitalWrite ( latchPin,LOW);
delay (10);
digitalWrite ( latchPin, HIGH);
shiftOut ( dataPin,clockPin,MSBFIRST,0b11101111 );
shiftOut ( dataPin,clockPin,MSBFIRST,0b11011010 );
digitalWrite ( latchPin,LOW);
delay (10);
break;
case 2: ////////////////// ( 10 )/////////////////
digitalWrite ( latchPin, HIGH );
shiftOut ( dataPin,clockPin,MSBFIRST,0b11110111 );
shiftOut ( dataPin,clockPin,MSBFIRST,0b00001100 );
digitalWrite ( latchPin,LOW);
delay (10);
digitalWrite ( latchPin, HIGH);
shiftOut ( dataPin,clockPin,MSBFIRST,0b11101111 );
shiftOut ( dataPin,clockPin,MSBFIRST,0b01111110 );
digitalWrite ( latchPin,LOW);
delay (10);
break;
case 1: ////////////////// ( 05 )/////////////////
digitalWrite ( latchPin, HIGH );
shiftOut ( dataPin,clockPin,MSBFIRST,0b11110111 );
shiftOut ( dataPin,clockPin,MSBFIRST,0b01111110 );
digitalWrite ( latchPin,LOW);
delay (10);
digitalWrite ( latchPin, HIGH);
shiftOut ( dataPin,clockPin,MSBFIRST,0b11101111 );
shiftOut ( dataPin,clockPin,MSBFIRST,0b11011010 );
digitalWrite ( latchPin,LOW);
delay (10);
break;
case 0: ////////////////// ( 00 )/////////////////
digitalWrite ( latchPin, HIGH );
shiftOut ( dataPin,clockPin,MSBFIRST,0b11110111 );
shiftOut ( dataPin,clockPin,MSBFIRST,0b01111110 );
digitalWrite ( latchPin,LOW);
delay (10);
digitalWrite ( latchPin, HIGH);
shiftOut ( dataPin,clockPin,MSBFIRST,0b11101111 );
shiftOut ( dataPin,clockPin,MSBFIRST,0b01111110 );
digitalWrite ( latchPin,LOW);
delay (10);
break;
}
}
void setup ()
{
Serial.begin ( 9600);
pinMode ( botonUp, INPUT);
pinMode ( botonDown, INPUT);
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
}
void loop ()
{
botonPress = digitalRead ( botonUp );
if ( botonPress != boton_No_Press) {
if ( energisar ( botonUp) ){
cambio ++;
if ( cambio > 10 ) {
cambio = 10;
}
}
}
boton_No_Press = botonPress;
////////////////////////////////////////////////
botonPress2 = digitalRead ( botonDown );
if ( botonPress2 != boton_No_Press2) {
if ( energisar ( botonDown) ){
cambio --;
if ( cambio < 0 ) {
cambio = 0;
}
}
}
boton_No_Press2 = botonPress2;
actualizar ();
}
ya lo pude hacer con 2 shift register y solo use los 3 pines , no se si esta muy organizado, quizas si se pueda acortar seria perfecto pero al menos funciona bien..si pueden limpiarlo mejor seria perfecto...
NOTA
muy importante no se porque, si me pueden explicar... por alguna razon que desconozco .. si se fijan en esto para shiftOut los digitos tuve que cambiarlo a como si fueran de anodo, osea tuve que poner que encendieran cuando estaban en ( 0 ) y apagado en ( 1 ).. no se porque me di cuenta experimentando que al ponerlo en 1 no hacia nada y no se porque lo puse en 0 y funciono jejejeee como dice por errores se descubren cosas..
shiftOut ( dataPin,clockPin,MSBFIRST,0b11110111 ); // digitos
shiftOut ( dataPin,clockPin,MSBFIRST,0b01111110 ); // numeros
Y lo que te pase yo que?
Gracias Survyte.
Pero no eh podido abrir el codigo le eh cambiado el nombre y nada no me deja hacer nada. Si pudieras poner el codigo seria perfecto ..
Acabo de bajarlos y les cambie el nombre a 595 .ino y .pdsprj y funcionan perfectos.
No entiendo que problema tienes.
Los subo de nuevo.
#include <SPI.h>
const byte LATCH = 10; // latch Pin
const byte MAX_DIGITS = 4;
const byte TIME_BETWEEN_DIGITS = 8; // Periodo de blanqueo entre digitos en mseg
// Mascara de cada pin para que el LED se ponga ON
const unsigned int DIG1 = 0x0200; // Q1 de segundo IC
const unsigned int DIG2 = 0x1000; // Q4 de segundo IC
const unsigned int DIG3 = 0x2000; // Q5 de segundo IC
const unsigned int DIG4 = 0x0002; // Q1 de primer IC
const unsigned int SEGA = 0x0400; // Q2 de segundo IC
const unsigned int SEGB = 0x4000; // Q6 de segundo IC
const unsigned int SEGC = 0x0008; // Q3 de primer IC
const unsigned int SEGD = 0x0020; // Q5 de primer IC
const unsigned int SEGE = 0x0040; // Q6 de primer IC
const unsigned int SEGF = 0x0800; // Q3 de segundo IC
const unsigned int SEGG = 0x0004; // Q2 de primer IC
const unsigned int SEGDP = 0x0010; // Q4 de primer IC
// que segmento se ilumina de cada digito
const unsigned int digitPatterns [15] = {
SEGA | SEGB | SEGC | SEGD | SEGE | SEGF, // 0
SEGB | SEGC, // 1
SEGA | SEGB | SEGD | SEGE | SEGG, // 2
SEGA | SEGB | SEGC | SEGD | SEGG, // 3
SEGB | SEGC | SEGF | SEGG, // 4
SEGA | SEGC | SEGD | SEGF | SEGG, // 5
SEGA | SEGC | SEGD | SEGE | SEGF | SEGG, // 6
SEGA | SEGB | SEGC, // 7
SEGA | SEGB | SEGC | SEGD | SEGE | SEGF | SEGG, // 8
SEGA | SEGB | SEGC | SEGD | SEGF | SEGG, // 9
0, // space
SEGG, // hyphen
SEGA | SEGB | SEGC| SEGE | SEGF | SEGG, // A
SEGA | SEGE | SEGF | SEGG, // F
SEGD | SEGE | SEGF, // L
};
// cuanto tiempo dejo el dígito ON
const byte digitOnTimes [15] = { 3, 1, 3, 3, 2, 3, 3, 2, 3, 3, 0, 0, 3, 3, 2 };
// index into digits
const unsigned int digits [4] = { DIG1, DIG2, DIG3, DIG4 };
// 0 to 9 are themselves in the patterns array
// there are the other entries:
#define PAT_SPACE 10
#define PAT_HYPHEN 11
#define PAT_A 12
#define PAT_F 13
#define PAT_L 14
// que voy a mostrar (0 ao 15, mas 0x10 para encender el punto decimal)
// mirar arriba (ej. 1 muestra 1)
volatile byte ledOutput [MAX_DIGITS];
// variables globales usadas por la interrupcion ISR
unsigned int countdown;
byte digit;
//******************************************************************
// Timer2 Interrupt Service es invocada por el hardware cada 1ms = 1000 Hz
// 16Mhz / 128 / 125 = 1000 Hz
// prescaler 128
// OCR2A = 124; recordar que es 0 relativo o sea si quiero 125 comparo con 124+0=125
ISR (TIMER2_COMPA_vect)
{
// sigo haciendo lo que estaba haciendo antes
if (countdown-- > 0)
return;
if (digit >= MAX_DIGITS) {
digit = 0;
countdown = TIME_BETWEEN_DIGITS;
// período de blanqueo para permitir que el chip y los LED se apaguen
digitalWrite (LATCH, LOW);
SPI.transfer (0);
SPI.transfer (0);
digitalWrite (LATCH, HIGH);
return;
} // terminé con todos los dígitos
// Pongo todo los dígitos en 1
unsigned int output = DIG1 | DIG2 | DIG3 | DIG4;
// Pongo en LOW el digito deseado.
output &= ~digits [digit];
// Activo los segmentos deseados
output |= digitPatterns [ledOutput [digit] & 0xF];
// agrego el punto decimal si es necesario
if (ledOutput [digit] & 0x10)
output |= SEGDP;
// envio el resultado a los 595 1 y 2
digitalWrite (LATCH, LOW);
SPI.transfer (highByte (output));
SPI.transfer (lowByte (output));
digitalWrite (LATCH, HIGH);
// ajusto el tiempo para permitir los diferentes números de segmentos
countdown = digitOnTimes [ledOutput [digit] & 0xF] ;
// paso al próximo digito
digit++;
} // fin del vector TIMER2_COMPA_vect
void setup () {
SPI.begin ();
// configuro Timer 2
// Timer 2 - nos da 1 mS de intervalo de conteo
// 16 MHz clock (62.5 nS per tick) - presescalado por 128
// incremento del contador cada 8 uS = 62.5nseg x 128 = 8000 nseg = 8 useg
// si contamos 125 veces 8 us nos da exactamente 1000 uS (1 mS)
TCCR2A = 0; // paro el timer 2
TCCR2B = 0;
TCCR2A = _BV (WGM21) ; // CTC mode
OCR2A = 124; // cuenta ascendente hasta 125 (cero relativo!)
TIMSK2 = _BV (OCIE2A); // habilito la interrupción Timer2 Interrupt (cada 1 mS)
TCNT2 = 0; // reseteo contador
TCCR2B = _BV (CS20) | _BV (CS22) ; // arranco el timer con un prescaler de 128
} // fin del setup
void loop ()
{
unsigned long now = millis () / 100;
noInterrupts ();
for (int i = 0; i < 4; i++) {
ledOutput [3 - i] = now % 10;
now /= 10;
}
// turn leading zeroes into spaces
for (int i = 0; i < 4; i++) {
if (ledOutput [i] == 0)
ledOutput [i] = PAT_SPACE;
else
break;
}
// punto decimal cada 1 decima de segundo
ledOutput [2] |= 0x10;
interrupts ();
delay (10);
} // end of loop
Aca te pongo el codigo pero en el .zip estan el código y el proyecto en Proteus
595.zip (22.7 KB)
tendras el codigo Hcorniel
No revivas hilos viejos.
Crea tu propio hilo o usa lo que esta disponible.
Lee las normas del foro por favor!!