Pages: [1] 2   Go Down
Author Topic: Ayuda para el primer gran reto de un dummy  (Read 2024 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 1
Posts: 9
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hola a todos. Paso de los 40, apenas había programado algunas líneas en Basic con un spectrum 48k hace ya el tiempo que hace, y aunque desde tiempo atrás ya me interese por leer manuales de c++ nunca me había puesto manos a la obra. Ahora que ha llegado el momento aprovechando la accesibilidad de Arduino me encuentro que me va como me va.
El tema, si me podéis dedicar 5 minutos, es que me he puesto como reto (hablar de proyecto es muy presuntuoso todavía) el actuar sobre una salida llevándola a nivel alto durante un tiempo dentro de un periodo de tiempo ya definido: t= 30 segundos (  t_HIGH = segundos y décimas que yo decida , t_LOW = t-t_HIGH)y volver a empezar.
Un lcd visualiza los caracteres para la entrada, un pulsador para hacer pasar el valor y un segundo pulsador para fijarlo.
El código es incompleto, ya lo se. Al llegar al final y fijar el ultimo dígito si lo haces volver a empezar se “pierde”, también lo se, pero son cosas que afrontare en su momento. Después de repetir el código un millón de veces utilizando un millón de combinaciones diferentes de los mecanismos de control que existen, este es el que mejor actúa como yo esperaba.
Ahora el problema es el siguiente:
1-¿Como consigo que al fijar un dígito y pasar al siguiente este empiece por cero? He probado y probado hasta desesperarme y no doy con ello. La variable rept debería llegar a 9 y volver a 0, ser de 10 valores posibles, pero al no empezar a 0 me acaba ocupando 2 dígitos del lcd y sobrescribiendo otro valor.
2-   En el switch el valor de cada digito no me queda fijado a la variable tal como yo pretendo al hacer la asignación y por tanto no puedo calcular el tiempo.
Gracias a todos por vuestra atención, venga o no acompañada de sugerencias. Aquí esta el código

#include <LiquidCrystal.h>
 
LiquidCrystal lcd(7, 8, 9, 10, 11 , 12);

// Los 2 botones
int buttonPin = 2;
int buttonPin_2 = 4;

// para button state change de cada boton
int buttonPushCounter = 0; 
int buttonState = 0;         
int lastButtonState = 0;   

int buttonPushCounter_2 = 0;   
int buttonState_2 = 0;         
int lastButtonState_2 = 0;


int celda, rept; // para posición del dígito y valor que puede tener

int digit_01, digit_02, digit_03, digit_04; // El valor al que queda fijado cada dígito para calcular el tiempo

void setup() {
pinMode(buttonPin, INPUT); 
pinMode(buttonPin_2, INPUT);
lcd.begin(16, 2);
   
lcd.setCursor(0,0);
lcd.print("__'__");
}


void loop()
{
   buttonState = digitalRead(buttonPin);
   buttonState_2 = digitalRead(buttonPin_2);

  if (buttonState != lastButtonState) {
    if (buttonState == HIGH) {
      buttonPushCounter++;
    }
  }
  lastButtonState = buttonState;
 
   if (buttonState_2 != lastButtonState_2) {
    if (buttonState_2 == HIGH)  {
      buttonPushCounter_2++;
       }
  }
  lastButtonState_2 = buttonState_2;
 
// Esto es prescindible 100%, es control visual de la actuación de los botones
  lcd.setCursor(8,0);
  lcd.print(buttonPushCounter);
  lcd.setCursor(12,0);
  lcd.print(buttonPushCounter_2);
 

// Vamos al lio
  lcd.setCursor(celda,0);
  lcd.print(buttonPushCounter);
  if (buttonPushCounter == rept) {
  buttonPushCounter = 0;}
   
  switch (buttonPushCounter_2){

  case 0:
  celda = 0;
  rept = 3;
  break;
 
  case 1:
  digit_01 = buttonPushCounter;
  celda = 1;
  rept = 9;
  break;
 
  case 2:
  digit_02 = buttonPushCounter;
  celda = 3;
  rept = 9;
  break;
 
  case 3:
  digit_03 = buttonPushCounter;
  celda = 4;
  rept = 9;
  break;
 
  case 4:
  digit_04 = buttonPushCounter;
  buttonPushCounter_2 = 0;
  break;
 
  }}
Logged

Vilalba, Lugo, Spain
Offline Offline
Sr. Member
****
Karma: 23
Posts: 336
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

No tengo pantalla para probarlo, pero te puede dar una idea:

Code:
#include <LiquidCrystal.h>
 
LiquidCrystal lcd(7, 8, 9, 10, 11 , 12);

unsigned long T_High=0;            // Milesimas de estado high
unsigned long T_Ciclo=30000;       // Milesimas del ciclo
unsigned long Milis_Ciclo=0;       // Para controlar el temporizador del ciclo
unsigned long Milis_High=0;        // Para controlar el temporizador de activo

// Los 2 botones
byte buttonPin = 2;
byte buttonPin_2 = 4;
byte Salida = 5;

// para button state change de cada boton
bool BtnSumar=false;
bool BtnDigito=false;
bool AntSumar=false;
bool AntDigito=false;

byte Digito=0;
byte Valores[4]={0,0,0,0};

void setup()
{
  pinMode(buttonPin, INPUT); 
  pinMode(buttonPin_2, INPUT);
  pinMode(Salida, OUTPUT);
  digitalWrite(Salida, LOW);
 
  lcd.begin(16, 2);
  PintaTiempo();
}


void loop()
{
  if (millis() > Milis_Ciclo)            // Final ciclo, cargamos nuevo tiempo y activamos salida
  {
    Milis_Ciclo = millis() + T_Ciclo;   
    Milis_High = millis() + T_High;
    digitalWrite(Salida, HIGH);                 
  }
  if (millis() > Milis_High)            // Final salida high, desactivar salida
  {
    digitalWrite(Salida, LOW);;
  }
   
  BtnSumar=digitalRead(buttonPin);
  if (BtnSumar && AntSumar != BtnSumar)    // Boton añadir valor cambia a activo
  {
    Valores[Digito]++;
    if (Valores[Digito]>9) {Valores[Digito]=0;}
    PintaTiempo();
  }
  AntSumar=BtnSumar;
   
  BtnDigito=digitalRead(buttonPin_2);
  if (BtnDigito && AntDigito != BtnDigito)    // Boton digito cambia a activo
  {
    Digito++;                    // Pasamos a siguiente digito
    if (Digito>3) {Digito=0;}    // Del cuarto digito al primero
    T_High=Valores[3]*10 + Valores[2]*100 + Valores[1]*1000 + Valores[0]*10000;  // Almacenamos el nuevo tiempo
    if (T_High>T_Ciclo)          // Si el tiempo high es mayor que el del ciclo pasamos el tiempo a 0
    {
      Valores[0] = Valores[1] = Valores[2] = Valores[3] = 0;
      T_High=0;
    }
  }
  AntDigito=BtnDigito;
}
void PintaTiempo()
{
  lcd.setCursor(0,0);
  lcd.print(Valores[0]);
  lcd.setCursor(1,0);
  lcd.print(Valores[1]);
  lcd.setCursor(2,0);
  lcd.print(":");
  lcd.setCursor(3,0);
  lcd.print(Valores[2]);
  lcd.setCursor(4,0);
  lcd.print(Valores[3]);
}
Logged

Offline Offline
Newbie
*
Karma: 1
Posts: 9
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hola Marcial. Te agradezco la ayuda que me prestas y que tanto necesito de momento. Mi idea era ir corrigiendo el código que tenía escrito y ampliarlo paso a paso según las necesidades que tuviera que afrontar, pero viendo el que tu has escrito me queda claro que era una idea equivocada y que estaba condenada a estar fracasando durante mucho tiempo. Sería alzar una torre con naipes donde deberían estar cimientos y materiales de construcción.
No he tenido tiempo hasta ahora de probarlo y bien justo le he pegado un vistazo. No funciona como debería: fija el primer dígito, pasa al segundo y al pulsar lo hace avanzar de 0 a 1 al mismo tiempo que vuelve a poner a cero el primero. Después continua como se esperaba.
Continuo aceptando y agradeciendo ayuda si tu o alguien me la proporciona y me indica el fallo, pero aunque no tengo mucho tiempo entre trabajo y familia y este puente lo pasamos fuera de casa si me gustaría como reto personal mirar de entender tu sketch al punto de intentar solucionarlo. A falta de mirarlo con mas detenimiento me ha gustado mucho el utilizar el tipo de dato Byte para la asignación al pin (la primera vez que lo veo), el uso de una función y algunas cosillas mas por ahí. Eres un profesional. Gracias otra vez.
Logged

Vilalba, Lugo, Spain
Offline Offline
Sr. Member
****
Karma: 23
Posts: 336
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Buenas, disculpa el error, estaba tratando los dígitos al revés. Ya lo tienes corregido, creo que ira correcto.
Con respecto a tu código,  supongo que se podrá hacer trabajar, pero me da mas lío que hacerlo de nuevo.

Siguiente paso: Hacer que parpadee el dígito que estas editando en cada momento, te atreves?

Code:
#include <LiquidCrystal.h>
 
LiquidCrystal lcd(7, 8, 9, 10, 11 , 12);

unsigned long T_High=0;            // Milesimas de estado high
unsigned long T_Ciclo=30000;       // Milesimas del ciclo
unsigned long Milis_Ciclo=0;       // Para controlar el temporizador del ciclo
unsigned long Milis_High=0;        // Para controlar el temporizador de activo

// Los 2 botones
byte buttonPin = 2;
byte buttonPin_2 = 4;
byte Salida = 5;

// para button state change de cada boton
bool BtnSumar=false;
bool BtnDigito=false;
bool AntSumar=false;
bool AntDigito=false;

byte Digito=0;
byte Valores[4]={0,0,0,0};

void setup()
{
  Serial.begin(9600);
  pinMode(buttonPin, INPUT); 
  pinMode(buttonPin_2, INPUT);
  pinMode(Salida, OUTPUT);
  digitalWrite(Salida, LOW);
 
  lcd.begin(16, 2);
  PintaTiempo();
}


void loop()
{
  if (millis() > Milis_Ciclo)            // Final ciclo, cargamos nuevo tiempo y activamos salida
  {
    Milis_Ciclo = millis() + T_Ciclo;   
    Milis_High = millis() + T_High;
    digitalWrite(Salida, HIGH);                 
  }
  if (millis() > Milis_High)            // Final salida high, desactivar salida
  {
    digitalWrite(Salida, LOW);;
  }
   
  BtnSumar=digitalRead(buttonPin);
  if (BtnSumar && AntSumar != BtnSumar)    // Boton añadir valor cambia a activo
  {
    Serial.println("Pulsado boton aumentar valor");
    Valores[Digito]++;
    if (Valores[Digito]>9) {Valores[Digito]=0;}
    PintaTiempo();
  }
  AntSumar=BtnSumar;
   
  BtnDigito=digitalRead(buttonPin_2);
  if (BtnDigito && AntDigito != BtnDigito)    // Boton digito cambia a activo
  {
    Serial.println("Pulsado boton cambio digito");
    Digito++;                    // Pasamos a siguiente digito
    if (Digito>3) {Digito=0;}    // Del cuarto digito al primero
    T_High=Valores[0]*10 + Valores[1]*100 + Valores[2]*1000 + Valores[3]*10000;  // Almacenamos el nuevo tiempo
    if (T_High>T_Ciclo)          // Si el tiempo high es mayor que el del ciclo pasamos el tiempo a 0
    {
      Valores[0] = Valores[1] = Valores[2] = Valores[3] = 0;
      T_High=0;
    }
    PintaTiempo();
  }
  AntDigito=BtnDigito;
}
void PintaTiempo()
{
  lcd.setCursor(0,0);
  lcd.print(Valores[3]);
  lcd.setCursor(1,0);
  lcd.print(Valores[2]);
  lcd.setCursor(2,0);
  lcd.print(":");
  lcd.setCursor(3,0);
  lcd.print(Valores[1]);
  lcd.setCursor(4,0);
  lcd.print(Valores[0]);
 
  Serial.print(Valores[3]);
  Serial.print(Valores[2]);
  Serial.print(":");
  Serial.print(Valores[1]);
  Serial.print(Valores[0]);
  Serial.print( "    --->   ");
  Serial.println(T_High);
}

PD:
  Yo también hice mis pinitos con ZX81 jejeje, pero empece con uno de estos:   http://www.1000bit.it/scheda.asp?id=73 jejeje conocida en la oficina como la alfatron smiley-razz
Logged

Offline Offline
Newbie
*
Karma: 1
Posts: 9
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hola de nuevo Marcial. Esto si que es ayuda y buena voluntad, apenas he tenido tiempo de nada y ya tengo el problema solucionado. Ahora si que funciona la entrada por teclado como debería. Además lo he probado la salida con un led y también parece que es todo OK. Gracias.
Sobre el reto que me planteas, supongo que la solución pasa por controlar el tiempo y alternar el número con un espacio en blanco cada ¿500 ms? Digo de hacerlo así porque las funciones de la librería LiquidCrystal blink() y noBlink() creo que actúan solo sobre el cursor (creo).
Mas que esto me podías hacer el favor de aclararme otra cosa: he leído que resetear por software el arduino actuando sobre el pin reset con otro pin no es buena practica, por tanto inevitablemente con la función Millis() llegara un momento que la lectura mas tardía tenga un valor mas bajo que la lectura anterior, se habrá puesto a cero. ¿Qué pasara entonces? ¿Perderemos un ciclo de 30 seg y ya está o habrá más consecuencias?
Buena máquina esa para el momento en que existió. Así tú tienes solera y mucha con esto, porque ya dices que era a nivel profesional y no particular que tenías acceso a ella.
Venga, aquí me paro. Buen puente si lo hacéis y si no buen fin de semana. 
Logged

Vilalba, Lugo, Spain
Offline Offline
Sr. Member
****
Karma: 23
Posts: 336
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Yo jugando con arduino llevo muy poco tiempo (y en C lo mismo mas 15 días, jejeje). No te puedo decir nada sobre resetearlo, ni idea de lo mal que le pueda llegar a sentar, esperemos si algún compañero nos puede ilustrar al respecto.

Sobe blink() ... nunca use la librería   smiley-kiss pero es cuestión de ensayo y error .. si no funciona, yo intentaría lo que mencionas de controlar el tiempo e ir alternando el valor con un espacio, no se cuantos milis, pero otra vez ensayo y error  smiley-mr-green

 El tema que mencionas del desborde de milis(), hay otras soluciones.
 cuando desborda arranca en 0 de nuevo ... y hasta hay puedo leer  smiley-zipper
Logged

Barcelona
Offline Offline
Jr. Member
**
Karma: 0
Posts: 67
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hola rarito_forever Y Marcial.

Prueba con esta función que llama a la dirección de memoria 0 con lo que reinicializa el arduino, acuérdate de grabar las variables de alguna manera "EEPROM"

Code:
void(* resetFunc) (void) = 0;//función de reinicio
void setup()
{
  Serial.begin(9600);
   Serial.println("EMPEZAMOS  " );delay(300);
 
 }

void loop()
{
  Serial.println(millis());
  if(millis() > 1000)
  {
   Serial.println("RESET RESET  RESET  " );delay(300);
resetFunc(); 

}
 }


Espero que te sea de ayuda

saludos
Logged

Vilalba, Lugo, Spain
Offline Offline
Sr. Member
****
Karma: 23
Posts: 336
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Buenas pacoooh, desconocia que se pudiera hacer eso (la ignorancia provoca felicidad  smiley-mr-green).
Yo me referia a controlar el valor de millis() y cuando sea muy bajito esta claro que acaba de desbordar, que te parece algo asi:

Code:
#include <LiquidCrystal.h>
 
LiquidCrystal lcd(7, 8, 9, 10, 11 , 12);

unsigned long T_High=0;            // Milesimas de estado high
unsigned long T_Ciclo=30000;       // Milesimas del ciclo
unsigned long Milis_Ciclo=0;       // Para controlar el temporizador del ciclo
unsigned long Milis_High=0;        // Para controlar el temporizador de activo
unsigned long Ultimo_Milis=0;      // Para controlar el desborde millis()

// Los 2 botones
byte buttonPin = 2;
byte buttonPin_2 = 4;
byte Salida = 5;

// para button state change de cada boton
bool BtnSumar=false;
bool BtnDigito=false;
bool AntSumar=false;
bool AntDigito=false;

byte Digito=0;
byte Valores[4]={0,0,0,0};

void setup()
{
  Serial.begin(9600);
  pinMode(buttonPin, INPUT); 
  pinMode(buttonPin_2, INPUT);
  pinMode(Salida, OUTPUT);
  digitalWrite(Salida, LOW);
 
  lcd.begin(16, 2);
  PintaTiempo();
 
}


void loop()
{
  if (millis()<10)                      // millis() acaba de desbordar
  {
    Milis_Ciclo= Milis_Ciclo - Ultimo_Milis + millis();
    Milis_High = Milis_High - Ultimo_Milis + millis();
    delay(10-millis());
  }
  else
  {
    Ultimo_Milis=millis();
  }
 
  if (millis() > Milis_Ciclo)            // Final ciclo, cargamos nuevo tiempo y activamos salida
  {
    Milis_Ciclo = millis() + T_Ciclo;   
    Milis_High = millis() + T_High;
    digitalWrite(Salida, HIGH);                 
  }
  if (millis() > Milis_High)            // Final salida high, desactivar salida
  {
    digitalWrite(Salida, LOW);;
  }
   
  BtnSumar=digitalRead(buttonPin);
  if (BtnSumar && AntSumar != BtnSumar)    // Boton añadir valor cambia a activo
  {
    Serial.println("Pulsado boton aumentar valor");
    Valores[Digito]++;
    if (Valores[Digito]>9) {Valores[Digito]=0;}
    PintaTiempo();
  }
  AntSumar=BtnSumar;
   
  BtnDigito=digitalRead(buttonPin_2);
  if (BtnDigito && AntDigito != BtnDigito)    // Boton digito cambia a activo
  {
    Serial.println("Pulsado boton cambio digito");
    Digito++;                    // Pasamos a siguiente digito
    if (Digito>3) {Digito=0;}    // Del cuarto digito al primero
    T_High=Valores[0]*10 + Valores[1]*100 + Valores[2]*1000 + Valores[3]*10000;  // Almacenamos el nuevo tiempo
    if (T_High>T_Ciclo)          // Si el tiempo high es mayor que el del ciclo pasamos el tiempo a 0
    {
      Valores[0] = Valores[1] = Valores[2] = Valores[3] = 0;
      T_High=0;
    }
    PintaTiempo();
  }
  AntDigito=BtnDigito;
}
void PintaTiempo()
{
  lcd.setCursor(0,0);
  lcd.print(Valores[3]);
  lcd.setCursor(1,0);
  lcd.print(Valores[2]);
  lcd.setCursor(2,0);
  lcd.print(":");
  lcd.setCursor(3,0);
  lcd.print(Valores[1]);
  lcd.setCursor(4,0);
  lcd.print(Valores[0]);
 
  Serial.print(Valores[3]);
  Serial.print(Valores[2]);
  Serial.print(":");
  Serial.print(Valores[1]);
  Serial.print(Valores[0]);
  Serial.print( "    --->   ");
  Serial.println(T_High);
}
Logged

Barcelona
Offline Offline
Jr. Member
**
Karma: 0
Posts: 67
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hola Marcial, creo que te puede funcionar si la función PintaTiempo no dura mas de 10 ms
mira el tiempo que tarda en ejecutarse no vaya a ser que en el momento  que desborda no compruebe millis()<10, o incrementa 10 ms para que no pase

Code:
....
   Valores[0] = Valores[1] = Valores[2] = Valores[3] = 0;
      T_High=0;
    }
   long timer=micros();
  PintaTiempo();
Serial.println(micros()-timer);
  }
 AntDigito=BtnDigito;
}....


mira también el tiempo total de loop

hace poco me encontré con este post para controlar el valor de millis() pero no me funciona con la ide 1.0.5 no se...
http://forum.arduino.cc/index.php?PHPSESSID=6nscr46kg15gv6p8bgurcoh6v7&topic=44844.15
« Last Edit: May 02, 2014, 11:42:03 am by pacoooh » Logged

Logroño - Spain
Offline Offline
Sr. Member
****
Karma: 4
Posts: 309
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hola,

Echo en falta una descripción algo más detallada de:

1.- Lo que quieres hacer.

2.- Qué tienes encima de la mesa (además del Arduino: pulsadores, Pantalla LCD, . . .)

Lo mejor es que expliques algo más detalladamente esto; después entramos en el problema concreto del software.

Saludos
Logged

Barcelona
Offline Offline
Jr. Member
**
Karma: 0
Posts: 67
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hola de nuevo, pues probando, probando....

encontré la manera de cambiar el valor de millis(), alterando el valor de una de las variables de la función
prueba este código:

Code:
extern volatile unsigned long timer0_millis  ;

 void setup()
{
  Serial.begin(9600);
   Serial.println("EMPEZAMOS  " );delay(300);

  timer0_millis=10000;// cambiamos valor de millis


 }

void loop()
{
 Serial.println(millis());
  if(millis() > 18000)
  {
 timer0_millis=0;
  }
  
 
 
  
 }

esta variable se encuentra en el archivo wiring.c
http://github.com/arduino/Arduino/blob/master/hardware/arduino/cores/arduino/wiring.c
desconozco si puede alterar el funcionamiento de arduino con tanto cambio

saludos
« Last Edit: May 02, 2014, 02:40:40 pm by pacoooh » Logged

Vilalba, Lugo, Spain
Offline Offline
Sr. Member
****
Karma: 23
Posts: 336
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

 smiley-eek-blue

Estas hecho un fenomeno
Logged

Palencia, Spain
Offline Offline
God Member
*****
Karma: 25
Posts: 542
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hola. Perdón por terciar en vuestra conversación, pero creo que no sería muy complicado medir los millis transcurridos incluso con desbordamiento de por medio.
Lo primero que hay que tener en cuenta es que el desbordamiento se produce cada casi 50 días, y en muchas aplicaciones el arduino no va a estar encendido tanto tiempo.
Si, pese a todo, queremos controlar la medida de un intervalo de tiempo incluso en el momento del desbordamiento, creo que mejor que resetear el timer cada dos por tres, es más efectivo (sobre todo si hubiera que controlar varios timers independientes y simultáneos) detectar y corregir el desbordamiento. Para detectar el desbordamiento, en lugar de controlar si es muy bajito (lo de los 10 milisegundos que proponía Marcial) es tan sencillo como controlar sencillamente si es menor que la última medida. Algo así:
Code:
// para establecer el punto en el que se cumple el timer
milisinicio=millis();
milisiguiente=milisinicio + milisamedir;

// para comprobar si se ha alcanzado el timer
miliactual=millis();
if (milisiguiente < milisinicio) {// el cálculo del siguiente timer causa desbordamiento
    if (milisactual < milisinicio && milisactual >= milisiguiente); // cumplido timer desbordado
} else {
    if (milisactual >=milisiguiente); // cumplido timer normal sin desbordar
}

Otra opción es calcular en cada iteración el tiempo transcurrido:

transcurrido=millis()-millisanterior;

¿La fórmula daría resultado correcto incluso con desbordamiento de por medio?. No estoy seguro, pero intentando recordar un poco sobre complementos a dos y demás creo que sí.
Saludos.
« Last Edit: May 02, 2014, 05:53:48 pm by noter » Logged

Vilalba, Lugo, Spain
Offline Offline
Sr. Member
****
Karma: 23
Posts: 336
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Noter, como sueles hacer, has encontrado la solución ideal.
Logged

Palencia, Spain
Offline Offline
God Member
*****
Karma: 25
Posts: 542
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

 smiley smiley smiley
Supongo que como tú (que se te ve muy desenvuelto en programación), más sabe el diablo por viejo...
Mi primera experiencia comenzó con uno de estos allá por el año 1982 de nuestro señor.
Logged

Pages: [1] 2   Go Up
Jump to: