Go Down

Topic: Attiny85 como desabilitar Reset y usar PB5 como I/O? (Read 404 times) previous topic - next topic

Turcobein

Estimados buen día, estoy con tratando de terminar un pequeño proyecto con Attiny85, necesito manejar 6 leds, y no necesito Reset, por ende necesito habilitar PB5 como I/O.

Todo lo que he leído me confunde más, explican como volver a Reset el pin 1 con un programador HV. Pero nadie dice como cambiarlo de Reset a I/O.

Estoy usando Arduino UNO como ISP, desde el IDE.

Attiny85, 1mhz

Si alguno puede guiarme en este, estaré muy agradecido.

Saludos!

Code: [Select]

//ATtiny85
int LED3=0; //Rojo
int LED4=1; //Rojo
int LED5=2; //Blanco
int LED6=3; //Blanco
int LED7=4;  //Rojo
int LED8=5; //Rojo

void setup()
{
  pinMode(LED3,OUTPUT);
  pinMode(LED4,OUTPUT);
  pinMode(LED5,OUTPUT);
  pinMode(LED6,OUTPUT);
  pinMode(LED7,OUTPUT);
  pinMode(LED8,OUTPUT);
}

void loop()
    {
   for(int i = 0; i<=4; i++){
   digitalWrite(LED3,HIGH);
   digitalWrite(LED4,HIGH);
   digitalWrite(LED5,HIGH);
   delay(50);
   digitalWrite(LED3,LOW);
   digitalWrite(LED4,LOW);
   digitalWrite(LED5,LOW);
   delay(50);
   digitalWrite(LED3,HIGH);
   digitalWrite(LED4,HIGH);
   digitalWrite(LED5,HIGH);
   delay(50);
   digitalWrite(LED3,LOW);
   digitalWrite(LED4,LOW);
   digitalWrite(LED5,LOW);
   delay(50);
   digitalWrite(LED3,HIGH);
   digitalWrite(LED4,HIGH);
   digitalWrite(LED5,HIGH);
   delay(50);
   digitalWrite(LED3,LOW);
   digitalWrite(LED4,LOW);
   digitalWrite(LED5,LOW);
   delay(50);
   //*********************3 times***************************************
   digitalWrite(LED6,HIGH); 
   digitalWrite(LED7,HIGH); 
   digitalWrite(LED8,HIGH);
   delay(50);
   digitalWrite(LED6,LOW); 
   digitalWrite(LED7,LOW); 
   digitalWrite(LED8,LOW);
   delay(50);
   digitalWrite(LED6,HIGH); 
   digitalWrite(LED7,HIGH); 
   digitalWrite(LED8,HIGH);
   delay(50);
   digitalWrite(LED6,LOW); 
   digitalWrite(LED7,LOW); 
   digitalWrite(LED8,LOW);
   delay(50);
   digitalWrite(LED6,HIGH); 
   digitalWrite(LED7,HIGH); 
   digitalWrite(LED8,HIGH);
   delay(50);
   digitalWrite(LED6,LOW); 
   digitalWrite(LED7,LOW); 
   digitalWrite(LED8,LOW);
   delay(50);
   }
   
}

Daniel_Arg

¿Realmente necesitas un sexto pin?.

Por las definiciones tienes solo dos colores (rojo y blanco) pero a contar por tu código los tres canales o pines hacen lo mismo.
Fíjate que tienes 30 o 40 líneas y un ciclo for de 4, que terminado este se vuelve se vuelve a repetir porque está en el loop.

El siguiente código hace lo mismo que el tuyo.

Code: [Select]
void loop(){
   digitalWrite(LED3,HIGH);
   digitalWrite(LED4,HIGH);
   digitalWrite(LED5,HIGH);
   delay(50);
   digitalWrite(LED3,LOW);
   digitalWrite(LED4,LOW);
   digitalWrite(LED5,LOW);
   delay(50);
}


Y como los tres pones hacen lo mismo podrías poner todos tus colores en la misma salida quedando el código como a continuación.

Code: [Select]
void loop(){
   digitalWrite(pinSalida,HIGH);
   delay(50);
   digitalWrite(pinSalida,LOW);
}


Alguna vez creí necesitar una tercera entrada para tres estados y no me daba cuenta que con dos entradas podía representar tres estados incluso 4 porque en binario sería 00, 01, 10, 11.

Mas tarde si necesitaba otra entrada que debía ser un simple contacto, entonces lo pude resolver haciendo un divisor de tensión en el pin de reset. Sin pulsar la entrada está en 5 voltios o sea que si pido el valor con analgRead(pinreset); de da 1023 y si pulso en botón me daba 700, sin llegar a la condición de reset del micro, por lo tanto con: if( analogRead(pinreset) < 900) fue suficiente para mi proyecto.

Sin anular el reset del Attiny85 siempre puedo volver a programarlo usando arduino como isp.
Saludos

Turcobein

Gracias Daniel_Arg, realmente necesito el 6to pin, ya está probado el código con Arduino UNO y funciona perfecto.

Solamente quiero saber cómo deshabilitar el Reset.

Lo que puse es una parte del código a modo de ejemplo, el resto es un choclazo que no tiene sentido copiar.

Estoy manejando leds de 5w con sus drivers por eso necesito una salida adicional, poniendo 2 juntos se van a masa y no prenden, ya lo probé.

Daniel_Arg

¿Porque tanto misterio en decir que haces con los led's y en mostrar tu código? Hubieras dejado el loop vacío. 
¿Como podría yo adivinar que estas haciendo y si cometes el error de creer que con un solo pin no puedes manejar 5 driver?

A no ser que quieras regular la intensidad mediante PWM y el driver lo permita (generalmente no) el attiny85 tiene solo dos salidas PWM. Por lo tanto yo estoy seguro que estás encaprichado en creer que necesitas un sexto pin. Además en el encabezado de "tu código" tienes solo dos colores.

Si esa es una parte de tu código que no has puesto completo porque consideras que es un choclazo, pues solo esa parte es una cosa mal hecha.

Vamos de una vez, cuenta de que va tu proyecto, olvida el software y di que estás desarrollando.

Esfinterman

#4
Aug 11, 2018, 11:15 pm Last Edit: Aug 11, 2018, 11:16 pm by Esfinterman
Hola. El pin de RESET creo que se puede deshabilitar, si he entendido bien la hoja de especificaciones del pequeño Tiny. Busca la página 148 donde se habla de deshabilitar el RESET.

Hoja de especificaciones de ATtiny85

De todas formas, revisando tu código, tal y como lo tienes, con dos salidas digitales lo tienes solucionado, porque los LED 3, 4 y 5, así como el 6, 7 y 8 trabajan a la vez, por lo que te ahorras varios pines. Reconsidera esto porque puedes estar comiéndote la cabeza cuando realmente no te hacen falta tantos pines. ;)

Por cierto, hace más de una semana debió llegarme este pequeño Tiny para cacharrear con él y aún lo sigo esperando para poder hacer un tutorial. >:(

surbyte

En un foro público existe la premisa de presentar la información sea choclazo o no SIEMPE, porque no importa tu motivo al ingresar al foro debes respetar sus normas.

El que viene al foro a pedir ayuda eres tu, por lo tanto debes leerlas y presentar siempre la información de la mayor y mas detallada forma posible.

Recuerda. FORO PUBLICO => sujeto a normas del foro => presentar SIEMPRE TODO el código.

Y cuando alguien con buen tino lo solicita no viene otro y da la solución desvaneciendo el pedido anterior

Los que respondemos mas que nadie debemos seguir dichas normas dando el ejemplo.


Solo para responderte tu pedido de eliminar el RESET no tiene sentido tal como lo presentas.

Usar un ATtiny85 de 6 pines I/O útiles para colocar 6 leds que en realidad se encienden como si fueran 2, no necesita mas pines. Necesita que el interesado se de cuenta que todo se puede simplificar y no hace falta complicarse.
Si la respuesta es que un pin no puede manejar la corriente de 3 leds, la siguiente respuesta es que uses un transistor.

La decisión es tuya.

Turcobein

#6
Aug 13, 2018, 02:31 am Last Edit: Aug 13, 2018, 02:46 am by Turcobein
Gracias a todos!

No me crucifiquéis, soy tan solo un ser humano y puedo equivocarme.

No hay ningún misterio en poner el código y lo que estoy haciendo, solo consideré, y por lo visto ese fue mi error, que era una pregunta sobre el funcionamiento del Attiny y no sobre el código.


@Esfinterman gracias por el dato, es justamente lo que buscaba, ahora estoy viendo la manera de realizarlo.

@Surbyte gracias por tus consejo como siempre, y disculpa por haber pasado por alto las normas y recordarmelas

@Daniel_Arg he aquí el código completo y el esquemático que estoy utilizando, son luces para señalización de una unidad de emergencia, simil a las de la policía.

En Arduino Uno/Nano, funciona a la perfección, consideré que no era necesario tamaña placa para este simple diseño, por eso la intención de utilizar el Attiny85, un regulador LM7805, par de condesadores y unas resistencias. Una vez que quede grabado no es necesario regrabarlo, ya queda montado y no se tocaría más...

https://www.inventable.eu/2012/08/06/driver-para-leds-de-alta-potencia/



El código es mayor a los 9000 carácteres permitidos, lo adjunto en txt.

Daniel_Arg

#7
Aug 13, 2018, 03:03 am Last Edit: Aug 13, 2018, 03:12 am by Daniel_Arg
Eso que estas tratando de hacer yo ya lo tengo instalado en mi motocicleta

Video en Youtube

Solo uso PBO y PB1 que son las dos salidas con posibilidad pwm.

Un pin de entrada con un pulsador para con un click encender y con otro apagar. Con dobleclik cambiar los efectos.

Vas por mal camino con ese esquema para controlar los led's..    

El gate del mosfet se alimentan con 12 por lo cual el pin CTRL está a 12 v lo es incompatible para arduino.

surbyte también te lo ha dicho, no necesitas el pin del reset.



Turcobein

@Daniel_Arg Muchas gracias por el ejemplo, me gustó, lo tendré en cuenta para próximos proyectos.

Logré deshabilitar el fusible de Reset utilizando Arduino UNO como ISP en el programa AVRDUDESS, y está funcionando perfectamente.
http://blog.zakkemble.co.uk/avrdudess-a-gui-for-avrdude/

El mismo es muy intuitivo y fácil de utilizar, exactamente como @Esfinterman indicó, hay que modificar el bit de RSTDISBL que indica la página 148 de la hoja de datos de Attiny85.



Imagen solo a modo de ejemplo..

Se debe cambiar dicho Bit en "Bit selector" en la sección "Fuses & locks Bits", cambiando el estado de 1 a 0, luego donde dice Write escribe el "Fuse". Poner donde dice Flash y EEprom, en Read, por las dudas.
Todo esto con el Sketch cargado previamente.

Muchas gracias a todos por el tiempo y las explicaciones.

Daniel_Arg

@Daniel_Arg Logré deshabilitar el fusible de Reset utilizando Arduino UNO como ISP en el programa AVRDUDESS
Es el que yo uso para grabar mis productos.

Esfinterman

#10
Aug 13, 2018, 07:57 pm Last Edit: Aug 13, 2018, 07:58 pm by Esfinterman
El código es mayor a los 9000 carácteres permitidos, lo adjunto en txt.
De nada!! :D

Olvidé revisar el código que adjuntaste. Ocupa 9178 bytes y el pequeño Tiny solo tiene capacidad para 8k, por lo que no podrás subirlo, contando con que no cargarás el bootloader.

También he leído el código y permíteme recomendarte que lo revises, porque tienes 1096 líneas de delay y digitalWrite que puedes condensar, líneas repetidas con bucles FOR que repiten más veces la línea. Esto...

Code: [Select]
for(int i = 0; i<=4; i++){
   digitalWrite(LED3,HIGH);
   digitalWrite(LED4,HIGH);
   digitalWrite(LED5,HIGH);
   delay(50);
   digitalWrite(LED3,LOW);
   digitalWrite(LED4,LOW);
   digitalWrite(LED5,LOW);
   delay(50);
   digitalWrite(LED3,HIGH);
   digitalWrite(LED4,HIGH);
   digitalWrite(LED5,HIGH);
   delay(50);
   digitalWrite(LED3,LOW);
   digitalWrite(LED4,LOW);
   digitalWrite(LED5,LOW);
   delay(50);
   digitalWrite(LED3,HIGH);
   digitalWrite(LED4,HIGH);
   digitalWrite(LED5,HIGH);
   delay(50);
   digitalWrite(LED3,LOW);
   digitalWrite(LED4,LOW);
   digitalWrite(LED5,LOW);
   delay(50);


puedes transformarlo en esto...

Code: [Select]
for(int i = 0; i<=15; i++){
   digitalWrite(LED3,HIGH);
   digitalWrite(LED4,HIGH);
   digitalWrite(LED5,HIGH);
   delay(50);
   digitalWrite(LED3,LOW);
   digitalWrite(LED4,LOW);
   digitalWrite(LED5,LOW);
   delay(50);


...y te ocupará menos, y tendrás el programa más ordenado. Sinceramente, échale un vistazo porque casi 1100 líneas de este código es una locura. ;)

Turcobein

@Esfinterman muchas gracias por el consejo, ya lo estoy modificando, si ciertamente se me estaba haciendo engorroso tanto código.
7156 bytes en total el sketch, el 87% del pequeño Attiny.

@Surbyte está resuelto el hilo, puedes cerrarlo como Solucionado, muchas gracias!

Go Up