Autor Tema: Crear un byte desde 8 entradas independientes  (Leído 953 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Fer_TACA

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4069
Crear un byte desde 8 entradas independientes
« en: 30 de Septiembre de 2022, 18:05:59 »
Hola,

Me gustaría saber si se puede realizar lo siguiente:

Tengo 6 entradas digitales, una a cada pin de entrada y a partir de ahí generar un byte según el valor de cada una de las entradas. Es decir:

La entrada 6 llevarla al bit 5 del byte a crear
La entrada 5 llevarla al bit 4 del byte a crear
La entrada 4 llevarla al bit 3 del byte a crear
La entrada 3 llevarla al bit 2 del byte a crear
La entrada 2 llevarla al bit 1 del byte a crear
La entrada 1 llevarla al bit 0 del byte a crear

De esta manera dispondría de un numero (decimal//hexadecimal/binario) y según su valor realizar una acción determinada.
Esta situación es como si se leyera un puerto entero en un microcontrolador pic por ejemplo.
¿Hay alguna forma de realizar esto en Arduino(leer el estado de varios pines a la vez y guardar los estados de cada uno de ellos en un byte?

Gracias de antemano por las respuestas.

F.
Todos los días se aprende algo nuevo.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re:Crear un byte desde 8 entradas independientes
« Respuesta #1 en: 01 de Octubre de 2022, 02:30:15 »
Seguramente habrá una forma más elegante de hacerlo, pero lo primero que se me ocurre sería lo siguiente:

Código: C
  1. byte = digitalRead(pin7)<<7 + digitalRead(pin6)<<6 + digitalRead(pin5)<<5 + digitalRead(pin4)<<4 + digitalRead(pin3)<<3 + digitalRead(pin2)<<2 + digitalRead(pin1)<<1 + digitalRead(pin0)

Desconectado Fer_TACA

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4069
Re:Crear un byte desde 8 entradas independientes
« Respuesta #2 en: 01 de Octubre de 2022, 02:39:55 »
Gracias Manolo por la respuesta.
Estoy investigando y creo que con la instrucion:

PINx se lee todo el puerto a la vez, siendo la x=el nombre del puerto a leer.

A lo largo de hoy veré de hacer las pruebas a ver qué sale.
Todos los días se aprende algo nuevo.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re:Crear un byte desde 8 entradas independientes
« Respuesta #3 en: 01 de Octubre de 2022, 02:50:56 »
Ah, claro, si los pines están en el mismo puerto, leyendo su registro ya lo tienes.

Es que pensé que las entradas no estaban todas juntas.

Desconectado Eduardo2

  • PIC24F
  • *****
  • Mensajes: 965
Re:Crear un byte desde 8 entradas independientes
« Respuesta #4 en: 01 de Octubre de 2022, 08:41:55 »
...
Estoy investigando y creo que con la instrucion:
PINx se lee todo el puerto a la vez, siendo la x=el nombre del puerto a leer.
...

Ojo que con PINx lees el puerto con la nomenclatura del ATmega328p , que no se corresponde directamente con los pines de Arduino (salvo el D).
 

* nano4.jpg
(103.97 kB, 743x504 - visto 128 veces)


En tu caso, como son bits consecutivos es hacer:   
uint8_t byte = (PIND>>1)&0x3F  ;

Desconectado Fer_TACA

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4069
Re:Crear un byte desde 8 entradas independientes
« Respuesta #5 en: 01 de Octubre de 2022, 09:03:19 »
He realizado una primera prueba muy simple y me parece que funciona.
Esta tarde seguiré investigando.
Adjunto el fichero de Arduino y el de simulación de Proteus.
Todos los días se aprende algo nuevo.

Desconectado Fer_TACA

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4069
Re:Crear un byte desde 8 entradas independientes
« Respuesta #6 en: 01 de Octubre de 2022, 18:43:32 »
Bueno he realizado pruebas y ya consigo leer perfectamente el puerto entero.
Como estoy utilizando el Arduino Mega he utilizado como entrada el puerto F.

Ahora bien una vez realizada la lectura quiero presentar un texto en una pantalla LCD de 16x2 estandar. Para ello incluyo la correspondiete libreria .h:
#include <LiquidCrystal.h>  //Se incluye la libreria de control del LCD

y asigno los pines a cada uno de los pines a usar RS,E,d4,d5,d6,d7

Si utilizo como asignación de pines de la forma:
LiquidCrystal lcd(13, 12, 39, 40 41, 42); //Asignación de pines al LCD (RS, E, D4,D5, D6, D7)

Al compilar me da el error:
expected ')' before numeric constant

y me marca la linea donde esta el error:
LiquidCrystal lcd(13, 12, 39, 40 41, 42); //Asignacion de pines al LCD (RS, E, D4,D5, D6, D7)

Pero sin embargo selecciono como pines:
LiquidCrystal lcd(10, 8, 5, 4, 3, 2); //Asignacion de pines al LCD (RS, E, D4,D5, D6, D7)

Ya no da ningun error.

Como soy muy principiante. Alguien me puede ayudar y decir que esta pasando
Gracias de antemano

F.



Todos los días se aprende algo nuevo.

Desconectado Fer_TACA

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4069
Re:Crear un byte desde 8 entradas independientes
« Respuesta #7 en: 01 de Octubre de 2022, 18:47:38 »
Me respondo a mi mismo.

ERROR DE PRINCIPIANTE :mrgreen: :mrgreen: :mrgreen:

en la linea:
LiquidCrystal lcd(13, 12, 39, 40 41, 42); //Asignación de pines al LCD (RS, E, D4,D5, D6, D7)

Falta una " , " entre el 40 y el 41

F.


Todos los días se aprende algo nuevo.

Desconectado Fer_TACA

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4069
Re:Crear un byte desde 8 entradas independientes
« Respuesta #8 en: 01 de Octubre de 2022, 18:53:11 »
Una cosa mas:
Si quiero utilizar una función, su declaración debe ser:

void prueba ();

El sitio de colocar esas instrucciones debe ir antes del setup dentro de el.

y por ultimo:
las instrucciones que se ejecuten cuando sea llamada dentro del loop, donde se deben e colocar despues del } de fin del loop o antes del setup

¿algun ejemplo sencillo de como usar ese tipo de funciones?

Gracias
F.

Todos los días se aprende algo nuevo.

Desconectado Eduardo2

  • PIC24F
  • *****
  • Mensajes: 965
Re:Crear un byte desde 8 entradas independientes
« Respuesta #9 en: 01 de Octubre de 2022, 20:53:17 »
...Si quiero utilizar una función, su declaración debe ser:

void prueba ();

El sitio de colocar esas instrucciones debe ir antes del setup dentro de el.
Dentro del setup no.   En C normalmente se debe definir la función antes de la línea de llamada o al menos declararla (generalmente en un include) y escribir la función en cualquier parte.

Pero cuando se compila desde el IDE de Arduino no es neceasario declararla antes porque el IDE hace primero una compilación sin salida donde saltan todas la funciones no declaradas. Genera un archivo temporal que incluye las declaraciones faltantes y ahora sí compila.

Citar
y por ultimo:
las instrucciones que se ejecuten cuando sea llamada dentro del loop, donde se deben e colocar despues del } de fin del loop o antes del setup
¿algun ejemplo sencillo de como usar ese tipo de funciones?
Desde el IDE de Arduino puede ir en cualquier parte:
Código: [Seleccionar]
void prueba_OFF(){
  digitalWrite(LED_BUILTIN, LOW);   
  delay(250);                       
}

void setup() {
  pinMode(LED_BUILTIN, OUTPUT);
}

void loop() {
  prueba_ON() ;
  prueba_OFF() ;
}

void prueba_ON(){
  digitalWrite(LED_BUILTIN, HIGH);   
  delay(250);                       
}




Desconectado Fer_TACA

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4069
Re:Crear un byte desde 8 entradas independientes
« Respuesta #10 en: 02 de Octubre de 2022, 02:18:21 »
Gracias por la respuesta Eduardo.
Me ha quedado claro.

F.
« Última modificación: 02 de Octubre de 2022, 09:00:28 por Fer_TACA »
Todos los días se aprende algo nuevo.


 

anything