Go Down

Topic: Entradas y salidas. (Read 352 times) previous topic - next topic

luisesteban

Puede un pin ser entrada y salida en diferentes partes de un programa ?

surbyte

Si. Puedes en el loop usar pinMode(pin, OUTPUT o INPUT) y cambiarle la funcionalidad.

De hecho hay rutinas y librerías que lo hacen. Ejemplo: leer un DHT22 o un DS18B20 implica una comunicación bidirección por un solo pin. Ese pin pasa de modo Salida a modo entrada en diferentes fases del código. Lo mismo que estas consultando.


luisesteban

Muchas gracias por la aportación..... Puedo utilizar este mismo post, para realizar otra pregunta con otros matices, pero encaminada a la misma situación de entradas y salidas y la utilización de Port.
Gracias por tu tiempo y recibe un cordial saludo....

luisesteban

Hola Surbyte:

Perdona pero aun me cuesta utilizar el procedimiento correcto. Veras tengo medio port donde les aplico valores BCD 4bits. Desearía convertirlo en decimal y guardarlo en un variable. Como sería el procedimiento.
Muchas gracias y disculpa mi torpeza a la hora de reportar.

surbyte

Coloca el código de lo que tienes?

luisesteban

Ese es el problema, no tengo idea, pero te comento:

Mi intención es tomar los bytes más significativos del PORTB, extrayendo los valores de los pin 7,6,5 y 4.

1 problema no se como convertirlo en una variable byte de nombre " Bcddata".

Teniendo esa información, solo me quedaría pasarla a decimal. He visto la siguiente formula.....

byte Bcddata (byte val) {   no entiendo lo que esta en rojo ni porque se hace ási

return( (val/16*10) + (val%16) ); lo mismo no se que hace val%16.

Se supone que el valor extraido de los bits 7,6,5 y 4, con esta formula se convierte en decimal en la variable

Bcddata. Como puedes ver estoy re-aprendiendo después  de muchos años inactivo.


surbyte

Esto es una función a la que le pasas un valor de 8 bits o byte por eso esta definido de ese modo
byte val
byte es el tipo de variable de 0 a 255
val es la variable, podría haberse llamado como gustes.

Code: [Select]

    byte Bcddata (byte val) {   

    return( (val/16*10) + (val%16));
}


luego con ese valor la funcion hace esto

val/16*10
Supongamos que tu de algun modo lees 8 bits y pensando que fueran BCD cada bloque de 4 bits entonces veamos que pasaría.
Lo mejor es con un ejemplo.

supongamos que tienes
0111 = 7 decimal por un lado en el nibble (4 bits) mas significativo y tienes
1001 = 9 decimal en el nible menos significativo

o sea tiens 0111 1001 = 79 que es lo que tu quieres ver como BCD en dos grupos perooo  eso unido tiene otro valor

0111 1001 = 0x79 hexadecimal = 121 decimal

Asi que ese valor si lo pasas por la rutina hara

Dos operaciones
1. val/16*10 = 121/16*10 =
Recuerda que las operaciones son de enteros, no hay decimales
121/16=7 con resto 0
asi que 7 x 10 = 70 ese es un resultado parcial

2. val%16 = 121 % 16
Esta operacion % se llama módulo.
Módulo es el resto de la operacion que harias de dividior 121 / 16. En este caso es 0.56x16 = 9

Entonces el resultado es 9

Tienes 70 + 9 = 79

Recuperaste los valores BCD que en decimal lucen como 121




luisesteban

#7
Apr 12, 2018, 06:54 pm Last Edit: Apr 13, 2018, 05:51 pm by luisesteban
Hola Surbay:
Agradecerte la información, me ha aclarado muchos nuevos conceptos, a la vez que me has dado ideas de como solventarlo de otra manera más asequible a mis conocimientos.
La idea es tener un variable decimal, extrayendo la información de los 4 pines más significativos del PORT D. algo ási como tener el valor decimal de una entrada BCD, en los pines 7,6,5 y 4.

Code: [Select]


byte bcddata;                         
byte extrae = 0B11110000;               
                                 

void setup() {
  DDRD = B00000000;                   
}                     
 
void loop() {
  bcddata = PIND;                   
  bcddata = bcddata & extrae;   
   bcddata = bcddata/16;                                     
             
 } 




En general es usar un decodificador de teclado, para introducir la información mediante interrupción e utilizar esos mismos pines para testear sensores.....
Agradeciendo tu ayuda y tu tiempo, recibe un cordial saludo.....

Go Up