Reglas del Foro
Aquí solo tienen cabida proyectos de hardware que incluyan siempre al menos sus esquemáticos para poder reproducirlos si llevan componentes electrónicos, y si es posible los ficheros del programa en que se hacen, los diseños de las placas, los gerber, etc. Si llevan algún tipo de software asociado debe estar diponible el código fuente
Para los que no cumplen estas condiciones se debe postear en el foro de proyectos generales.
Popopo escribió: ↑19 Ago 2020, 11:47
cómo la protegerías?
Estoy haciendome ya la placa de pruebas para la serie 4164 y diseñando el software, me gustaría saber como la proteges.
He dicho que hay que tenerlo en cuenta, no que sepa como hacerlo
Buscaría algún tipo de chip regulador que tenga ese tipo de protección, aunque, bueno, la mayoría la tienen
Se puede controlar con un sensor de corriente (una resistencia) y si sube mucho cortar la alimentación por ejemplo.
Yo el principal problema que le veo es que no va a haber pines suficientes para todo con un Arduino. Recuerdo que había un problema con eso. Esas memorias necesitan refresco. Normalmente el hecho de leer/escribir toda la memoria sirve de refresco, pero si se lee/escribe a base de cambiar pines individualmente el Arduino es muy lento y no se cumplen los timings necesarios para el refresco, había que usar un método que cambia grupos de pines a la vez y en ese caso no hay tantos pines como parece.
Popopo escribió: ↑19 Ago 2020, 11:47
cómo la protegerías?
Estoy haciendome ya la placa de pruebas para la serie 4164 y diseñando el software, me gustaría saber como la proteges.
He dicho que hay que tenerlo en cuenta, no que sepa como hacerlo
Buscaría algún tipo de chip regulador que tenga ese tipo de protección, aunque, bueno, la mayoría la tienen
Se puede controlar con un sensor de corriente (una resistencia) y si sube mucho cortar la alimentación por ejemplo.
Yo el principal problema que le veo es que no va a haber pines suficientes para todo con un Arduino. Recuerdo que había un problema con eso. Esas memorias necesitan refresco. Normalmente el hecho de leer/escribir toda la memoria sirve de refresco, pero si se lee/escribe a base de cambiar pines individualmente el Arduino es muy lento y no se cumplen los timings necesarios para el refresco, había que usar un método que cambia grupos de pines a la vez y en ese caso no hay tantos pines como parece.
no es la idea, quiero decir cambiar pines continuamente. La configuración de pines es variable y a la vez estática. No será un problema. Me han dicho que puedo configurar los pines análogicos como digitales, eso me da mucha vida, ahora lo que debo de saber es que pines no puedo usar porque son dedicados a algo, por ejemplo D0 y D1 se que no puedo usarlos porque son para la comunicación serie.
Ahora andaba indagando donde poner los pulsadores para cual quiera de las dos configuraciones iniciales que pretendo en la primera etapa, la del 4116 y 4164, así como dos pines más para los dos diodos que sustituyen a la pantalla.
dandare escribió: ↑19 Ago 2020, 16:44La manera trivial (y efectiva) de controlar la corriente maxima de una fuente es poner una resistencia en serie.
Es justo lo que me ha recomendado Llopis, me ha surgido por tanto una duda... la alimentación máx que me da el Arduino nano son 5v, la tensión para un 4164 son 5v, si a cada pin de conexión le meto una resistencia... ¿no cae la tensión demasiado para que de fallos de comunicación?.
Por otro lado, tendría que estar controlando en cada N ciclos que la tensión es adecuada, ¿no? en caso de corto la tensión cae a 0 y la que tendría es la de la resistencia, tendría que estar escaneando cada puerto analógico (y no se si tengo suficientes (no, no tengo suficientes) para detectarla, así como el problema del refresco. No sé si ando muy desencaminado, pero por ello andaba pensando en quizás usar un buffer o Mosfet.
¿Qué opinas?
Normalmente, la impedancia de entrada de los chips es muy alta, por lo que la resistencia en serie no provoca caídas de tensión significativas.
No hace falta comprobar nada analógicamente, si limitas la corriente a menos del maximo IO de un pin de arduino, lo más que circulara será eso. Digamos unos 5mA. Para eso necesitarás resistencias de 1K
No hace falta controlar todos los pines, basta con poner la resistencia en serie con la alimentación. Es una resistencia pequeña, de unos pocos ohmios, que a un consumo normal de unos pocos mA el voltaje que cae en la R es un 0 lógico y si hay un corto entonces sube la tensión hasta dar un nivel lógico alto que puedes detectar y en ese caso apagar la fuente.
Hoy he tenido algo de tiempo, y he hecho lo que seria la "concept proof" del software del tester.
Yo para estas cosas uso un Arduino uno, que tengo montado junto a unas placas de estas de pruebas.
He grabado un video del funcionamiento y lo he enviado al grupo de telegram, Luego miro de subirlo aquí.
de momento aquí esta el fuente para cargarlo en un Arduino y probar.
No esta afinado, ni depurado ya que no tenia demasiado tiempo, y necesitaba hacer el menú.
Mide unos 4 Kb, mas los 3 de cada test de memoria en bruto, serian unos 12 -13 Kb, o sea, por memoria todavía nos cabe,
Enlace al video;
Y el codigo:
#include <Wire.h> // Library for I2C communication
#include <LiquidCrystal_I2C.h> // Library for LCD
LiquidCrystal_I2C lcd = LiquidCrystal_I2C(0x27, 20, 4);
const int buttonPin = 2; // Pin asignado al pulsador, es el primero despues de RX y TX
//const int ledPin = 13; // Pin asignado al led de test de desarrollo,
// Al ser el por defecto y tener un led instalado no necesitamos cablear nada durante el desarrollo
// variables Globales,
int buttonState = 0; // para leer el pulsador
int contadormenu = 0; // Para cargar el valor seleccionado
int action = 0; // Vamos incializando variables
int OKMenu = 0; // esta es para la cuando damos pulsacion larga y convertimos en OK
char mostrar[5]; // Para mostrar valores en pantalla
#define MAXMENU 4 // Numeo Maximo de opciones de menu
unsigned long Tinicio; //Momento en que se pulsa el pulsador
unsigned long Tfin; //Momento en que se libera el pulsador
unsigned long Tpulsacion; //Diferencia Tfin-Tinicio
long Retardopulsacion = 500; //Tiempo pulsacion larga,
//Hay que afinar este tiempo, ya que parece no cuadran los milisegundos leidos con tiempo real
void setup() {
lcd.init();
lcd.backlight();
// initialize the LED pin as an output:
// pinMode(ledPin, OUTPUT);
// initialize the pushbutton pin as an input:
pinMode(buttonPin, INPUT);
}
void menuread()
{
Tinicio= millis();
buttonState = digitalRead(buttonPin);
// check if the pushbutton is pressed. If it is, the buttonState is HIGH:
if (buttonState == HIGH)
{
do {
buttonState = digitalRead(buttonPin);
Tfin = millis();
} while (buttonState == HIGH);
Tpulsacion = (Tfin-Tinicio);
if (Tpulsacion > Retardopulsacion)
{
// significa pulsacion larga, No hay que incrementar opcion de menu y activar OK
OKMenu=1; //Asignamos 1 como OK
} else {
// Enciende LED
// digitalWrite(ledPin, HIGH); // Para control visual de bonton pulsado, luqego quitar
OKMenu=0; //Asignamos 0 como no OK
++contadormenu;
if (contadormenu > MAXMENU ) contadormenu=1;
}
} else {
// turn LED off:
// digitalWrite(ledPin, LOW);
}
}
void ramtest()
{
// Aqui vendra la rutina de testear memoria;
// de momento ponemos una espera de unos cuantos segundos, y un contador para que sea mas visual
int espera=1000;
lcd.setCursor(12,2);
lcd.print(" 0%");
delay(espera);
lcd.setCursor(12,2);
lcd.print("10%");
delay(espera);
lcd.setCursor(12,2);
lcd.print("30%");
delay(espera);
lcd.setCursor(12,2);
lcd.print("50%");
delay(espera);
lcd.setCursor(12,2);
lcd.print("70%");
delay(espera);
lcd.setCursor(12,2);
lcd.print("90%");
delay(espera);
lcd.setCursor(11,2);
lcd.print("100%");
OKMenu=0;
action=0;
lcd.setCursor(0,3);
lcd.print("RAM OK, Press.....");
do
{
buttonState = digitalRead(buttonPin);
Tfin = millis();
} while (buttonState == LOW); //Esperamos hasta que se pulse el boton
// Inicializamos y volvemos al Inicio.
delay(1000);
contadormenu=0; // Si no inicializamos, permacera activo la ultima seleccionada
}
// Bucle donde controlamos el menu
do
{
menuread();
switch (contadormenu)
{
case 1:
lcd.setCursor(0,1);
lcd.print(" 4464 ");
break;
case 2:
lcd.setCursor(0,1);
lcd.print(" 4116 ");
break;
case 3:
lcd.setCursor(0,1);
lcd.print(" 4164 ");
break;
case 4:
lcd.setCursor(0,1);
lcd.print("41464 ");
break;
}
if (OKMenu==1 && contadormenu != 0 ) action=1; //Validando contadormenu nos aseguramos que no se lanza un test sin opcion.
Buena prueba de concepto, no sabia yo que ese tipo de pantallas se podian gobernar con dos pines solo, ¿tienes el esquema de conexionado del circuito, aunque sea escrito a mano?, salu2.
No me hago responsable de mis post pues estan escritos bajo la influencia del alcohol y drogas psicotropicas, por la esquizofrenia paranoide. (C)1982-2024,42añosdeZXSpectrum. http://www.va-de-retro.com/ un foro "diferente".
Hoy he tenido algo de tiempo, y he hecho lo que seria la "concept proof" del software del tester.
Yo para estas cosas uso un Arduino uno, que tengo montado junto a unas placas de estas de pruebas.
He grabado un video del funcionamiento y lo he enviado al grupo de telegram, Luego miro de subirlo aquí.
de momento aquí esta el fuente para cargarlo en un Arduino y probar.
No esta afinado, ni depurado ya que no tenia demasiado tiempo, y necesitaba hacer el menú.
Mide unos 4 Kb, mas los 3 de cada test de memoria en bruto, serian unos 12 -13 Kb, o sea, por memoria todavía nos cabe,
Enlace al video;
Y el codigo:
#include <Wire.h> // Library for I2C communication
#include <LiquidCrystal_I2C.h> // Library for LCD
LiquidCrystal_I2C lcd = LiquidCrystal_I2C(0x27, 20, 4);
const int buttonPin = 2; // Pin asignado al pulsador, es el primero despues de RX y TX
//const int ledPin = 13; // Pin asignado al led de test de desarrollo,
// Al ser el por defecto y tener un led instalado no necesitamos cablear nada durante el desarrollo
// variables Globales,
int buttonState = 0; // para leer el pulsador
int contadormenu = 0; // Para cargar el valor seleccionado
int action = 0; // Vamos incializando variables
int OKMenu = 0; // esta es para la cuando damos pulsacion larga y convertimos en OK
char mostrar[5]; // Para mostrar valores en pantalla
#define MAXMENU 4 // Numeo Maximo de opciones de menu
unsigned long Tinicio; //Momento en que se pulsa el pulsador
unsigned long Tfin; //Momento en que se libera el pulsador
unsigned long Tpulsacion; //Diferencia Tfin-Tinicio
long Retardopulsacion = 500; //Tiempo pulsacion larga,
//Hay que afinar este tiempo, ya que parece no cuadran los milisegundos leidos con tiempo real
void setup() {
lcd.init();
lcd.backlight();
// initialize the LED pin as an output:
// pinMode(ledPin, OUTPUT);
// initialize the pushbutton pin as an input:
pinMode(buttonPin, INPUT);
}
void menuread()
{
Tinicio= millis();
buttonState = digitalRead(buttonPin);
// check if the pushbutton is pressed. If it is, the buttonState is HIGH:
if (buttonState == HIGH)
{
do {
buttonState = digitalRead(buttonPin);
Tfin = millis();
} while (buttonState == HIGH);
Tpulsacion = (Tfin-Tinicio);
if (Tpulsacion > Retardopulsacion)
{
// significa pulsacion larga, No hay que incrementar opcion de menu y activar OK
OKMenu=1; //Asignamos 1 como OK
} else {
// Enciende LED
// digitalWrite(ledPin, HIGH); // Para control visual de bonton pulsado, luqego quitar
OKMenu=0; //Asignamos 0 como no OK
++contadormenu;
if (contadormenu > MAXMENU ) contadormenu=1;
}
} else {
// turn LED off:
// digitalWrite(ledPin, LOW);
}
}
void ramtest()
{
// Aqui vendra la rutina de testear memoria;
// de momento ponemos una espera de unos cuantos segundos, y un contador para que sea mas visual
int espera=1000;
lcd.setCursor(12,2);
lcd.print(" 0%");
delay(espera);
lcd.setCursor(12,2);
lcd.print("10%");
delay(espera);
lcd.setCursor(12,2);
lcd.print("30%");
delay(espera);
lcd.setCursor(12,2);
lcd.print("50%");
delay(espera);
lcd.setCursor(12,2);
lcd.print("70%");
delay(espera);
lcd.setCursor(12,2);
lcd.print("90%");
delay(espera);
lcd.setCursor(11,2);
lcd.print("100%");
OKMenu=0;
action=0;
lcd.setCursor(0,3);
lcd.print("RAM OK, Press.....");
do
{
buttonState = digitalRead(buttonPin);
Tfin = millis();
} while (buttonState == LOW); //Esperamos hasta que se pulse el boton
// Inicializamos y volvemos al Inicio.
delay(1000);
contadormenu=0; // Si no inicializamos, permacera activo la ultima seleccionada
}
// Bucle donde controlamos el menu
do
{
menuread();
switch (contadormenu)
{
case 1:
lcd.setCursor(0,1);
lcd.print(" 4464 ");
break;
case 2:
lcd.setCursor(0,1);
lcd.print(" 4116 ");
break;
case 3:
lcd.setCursor(0,1);
lcd.print(" 4164 ");
break;
case 4:
lcd.setCursor(0,1);
lcd.print("41464 ");
break;
}
if (OKMenu==1 && contadormenu != 0 ) action=1; //Validando contadormenu nos aseguramos que no se lanza un test sin opcion.
Muchas gracias papanillu, estaba haciendo el menú a base de LEDs y escribiendo la estructura en los huecos, en caso de que no tuvieras el tiempo para hacerlo que se que andas bastante liado.
Gracias
PD: veo que finalmente has optado por usar un solo pulsador esta muy bien, la mía tira a usar dos, pero claramente si al final no tengo pines suficientes haré como habíamos hablado y como has hecho tu... 1 solo pulsador para gobernarlos a todos