En Arduino UNO r3 quiero cambiar las entradas analógicas com entrada o salida digital cuando quiera o al menos dejar solo una entrada analógico. Muchas veces uso un LCD y me quita 7 digitales. Me quedan otras 7 para usar pulsadores o Led.
¿Existe la forma de cambiar esas entradas analógicas en ditales?
¿Hay que tocar el IDE 1.0.5 en su interior para lograrlo?
Yo trato de buscar dispositivos I2C precisamente para evitar este problema, aunque lei una solucion (que no he probado) que mediante multiplexores solucionaban el tema de las salidas,
Pensé en el I2C y SPI, precisamente es lo que no quiero usar mucho. Tampoco me quiero complicar la vida manejando esos protocolos exceptuando que no me queda otra según proyectos.
El tema de multiplexores lo he probado con PIC y funciona muy bien. Ningún problema. Hast en ensambaldor se hace fácil.
Tablas:
; Implementar una tabla de la verdad mediante el manejo de tablas grabadas en ROM. Por
; ejemplo, la tabla será de 3 entradas y 6 salidas:
;
; C B A | S5 S4 S3 S2 S1 S0
; -----------|---------------------------
; 0 0 0 | 0 0 1 0 1 0 ; (Configuración 0).
; 0 0 1 | 0 0 1 0 0 1 ; (Configuración 1).
; 0 1 0 | 1 0 0 0 1 1 ; (Configuración 2).
; 0 1 1 | 0 0 1 1 1 1 ; (Configuración 3).
; 1 0 0 | 1 0 0 0 0 0 ; (Configuración 4).
; 1 0 1 | 0 0 0 1 1 1 ; (Configuración 5).
; 1 1 0 | 0 1 0 1 1 1 ; (Configuración 6).
; 1 1 1 | 1 1 1 1 1 1 ; (Configuración 7).
;
; Las entradas C, B, A se conectarán a las líneas del puerto A: RA2 (C), RA1 (B) y RA0 (A).
; Las salidas se obtendrán del puerto B: RB5 (S5), RB4 (S4), RB3 (S3), RB2 (S2), RB1 (S1)
; y RB0 (S0).
;
; ZONA DE DATOS **********************************************************************
LIST P=16F84A
INCLUDE <P16F84A.INC>
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
; ZONA DE CÓDIGOS ********************************************************************
ORG 0 ; El programa comienza en la dirección 0.
Inicio
bsf STATUS,RP0 ; Acceso al Banco 1.
clrf TRISB ; Las líneas del Puerto B se configuran como salida.
movlw b'00011111' ; Las 5 líneas del Puerto A se configuran como entrada.
movwf TRISA
bcf STATUS,RP0 ; Acceso al Banco 0.
Principal
movf PORTA,W ; Lee el valor de las variables de entrada.
andlw b'00000111' ; Se queda con los tres bits bajos de entrada.
call TablaVerdad ; Obtiene la configuración de salida.
movwf PORTB ; Se visualiza por el puerto de salida.
goto Principal
; Subrutina "TablaVerdad" ---------------------------------------------------------------
;
TablaVerdad
addwf PCL,F
retlw b'00001010' ; (Configuración 0).
retlw b'00001001' ; (Configuración 1).
retlw b'00100011' ; (Configuración 2).
retlw b'00001111' ; (Configuración 3).
retlw b'00100000' ; (Configuración 4).
retlw b'00000111' ; (Configuración 5).
retlw b'00010111' ; (Configuración 6).
retlw b'00111111' ; (Configuración 7).
END
Indexado:
; Controla el nivel de un depósito de líquido. Utiliza (entre paréntesis las líneas del
; microcontrolador a la que se han conectado):
; - Tres sondas detectoras: SV, Sonda de Vacío (RA0); SLL, Sonda de LLenado (RA1);
; SR, Sonda de Rebose (RA2).
; - Dos bombas de agua: B1 (RB5), B2 (RB6).
; - Cinco indicadores: Vacio (RB0), Llenandose (RB1), Lleno (RB2), Rebose (RB3),
; Alarma (RB4).
;
; Su funcionamiento:
; - Cuando ninguna de las sondas está mojada se entiende que el depósito está vacío y
; se accionarán las dos bombas. El indicador "Vacio" se iluminará .
; - Cuando el nivel del líquido toque la sonda de vacío "SV" seguirá llenándose el
; depósito con las dos bombas. El indicador "Llenandose" se ilumina.
; - Cuando el nivel del líquido toca la sonda de llenado "SLL", para la bomba B2, quedando
; B1 activada en modo mantenimiento. El indicador "Lleno" se ilumina.
; - Si el nivel del líquido moja la sonda de rebose "SR" se apaga también la bomba B1,
; quedando las dos bombas fuera de servicio. El indicador "Rebose" se enciende.
; - Cuando se produce un fallo o mal funcionamiento en las sondas de entrada (por
; ejemplo que se active la sonda de rebose y no active la de vacío) se paran
; las dos bombas. El indicador "Alarma" se ilumina.
;
; Según el enunciado del problema, teniendo en cuenta las conexiones citadas y poniendo la
; salida no utilizada (RB7) siempre a cero, la tabla de verdad resultante es:
;
; RA2.. RA0 | RB7 ... ... RB0
; ------------|--------------------------------
; 0 0 0 | 0 1 1 0 0 0 0 1 (Configuración 0. Estado "Vacio").
; 0 0 1 | 0 1 1 0 0 0 1 0 (Configuración 1. Estado "Llenandose").
; 0 1 0 | 0 0 0 1 0 0 0 0 (Configuración 2. Estado "Alarma").
; 0 1 1 | 0 0 1 0 0 1 0 0 (Configuración 3. Estado "Lleno").
; 1 0 0 | 0 0 0 1 0 0 0 0 (Configuración 4. Estado "Alarma").
; 1 0 1 | 0 0 0 1 0 0 0 0 (Configuración 5. Estado "Alarma").
; 1 1 0 | 0 0 0 1 0 0 0 0 (Configuración 6. Estado "Alarma").
; 1 1 1 | 0 0 0 0 1 0 0 0 (Configuración 7. Estado "Rebose").
;
; ZONA DE DATOS **********************************************************************
LIST P=16F84A
INCLUDE <P16F84A.INC>
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
; ZONA DE CÓDIGOS ********************************************************************
ORG 0 ; El programa comienza en la dirección 0.
Inicio
clrf PORTB ; Debe estar a cero cuando el puerto se configure como salida.
bsf STATUS,RP0 ; Acceso al Banco 1.
clrf TRISB ; Las líneas del Puerto B se configuran como salida.
movlw b'00011111' ; Las 5 líneas del Puerto A se configuran como entrada.
movwf TRISA
bcf STATUS,RP0 ; Acceso al Banco 0.
Principal
movf PORTA,W ; Lee los sensores.
andlw b'00000111' ; Máscara para quedarse con el valor de los sensores.
addwf PCL,F ; Salta a la configuración adecuada.
goto Configuracion0
goto Configuracion1
goto Configuracion2
goto Configuracion3
goto Configuracion4
goto Configuracion5
goto Configuracion6
goto Configuracion7
Configuracion0
movlw b'01100001' ; Estado "Vacio" (configuración 0).
goto ActivaSalida
Configuracion1
movlw b'01100010' ; Estado "Llenándose" (configuración 1).
goto ActivaSalida
Configuracion2
movlw b'00010000' ; Estado "Alarma" (configuración 2).
goto ActivaSalida
Configuracion3
movlw b'00100100' ; Estado "Lleno" (configuración 3).
goto ActivaSalida
Configuracion4
movlw b'00010000' ; Estado "Alarma" (configuración 4).
goto ActivaSalida
Configuracion5
movlw b'00010000' ; Estado "Alarma" (configuración 5).
goto ActivaSalida
Configuracion6
movlw b'00010000' ; Estado "Alarma" (configuración 6).
goto ActivaSalida
Configuracion7
movlw b'00001000' ; Estado "Rebose" (configuración 7).
ActivaSalida
movwf PORTB ; Visualiza por el puerto de salida.
goto Principal
END
Lo mejor de todo, no tienes que simplificar nada de nada, solo loprogramas directamente y ya está,esloque mesorprendió en su día.
Yo lo que he llegado a ver ha sido hallar tablas de verdad y simplicacion bien por Karnaugh o bien por Algebra de Boole y diseñar el circuito mediante puertas logicas, pero no he llegado a implementar ninguno.
Lo bueno del asm en PIC, qu epuedes hacer la tabla de la verdad como desees y on tardas nada en entenderlo, ejjejejee.
El de arriba es para el PIC16F84A, si quieres hacerlo en otro PIC diferente, solo tienes que cambiar los registros para adaptarlo al PIC correspondiente. Por ahora, PIC de la firma de Microchip.com es el más usado en todas partes y en asm, luego en C, Arduino se extá impulsado, hasta con el AVR. AVR parece ser que lo ha dejado un poco de lado, no tiene el apoyo al 100 % con Arduino, ahora Arduino, le está dando por ARM, el mejor microcontrolador recomendado, al menos la marca. Está así, para que hagan libros de ARM en español, porque PIC hay de sobre y siguen haciéndolo, Arduino tiene muchos también en poco tiempo y habrá más y en español, solo en AVR no hay ninguno en español, una lástima.
Hay otros ejemploe en asm y en C de CCS para PIC16F886.
Ejemplo en ASM:
;Entradas/salidas digitales: Programa combinacional
;
;Según el estado de los interruptores E0 y E1 conectados en RA0 y RA1,
;activar los leds S0-S7 conectados a la puerta B, según la siguiente tabla de la verdad:
;
; RA1 RA0 RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0
; -- -- -- -- -- -- -- -- -- --
; 0 0 1 0 1 0 1 0 1 0
; 0 1 0 1 0 1 0 1 0 1
; 1 0 0 0 0 0 1 1 1 1
; 1 1 1 1 1 1 0 0 0 0
List p=16F886 ;Tipo de procesador
include "P16F886.INC" ;Definiciones de registros internos
;Ajusta los valores de las palabras de configuración durante el ensamblado.Los bits no empleados
;adquieren el valor por defecto.Estos y otros valores se pueden modificar según las necesidades
__config _CONFIG1, _LVP_OFF&_PWRTE_ON&_WDT_OFF&_EC_OSC&_FCMEN_OFF&_BOR_OFF ;Palabra 1 de configuración
__config _CONFIG2, _WRT_OFF ;Palabra 2 de configuración
Temp equ 0x20 ;Variable temporal
org 0x00
goto Inicio ;Vector de reset
org 0x05
Inicio clrf PORTB ;Borra los latch de salida
bsf STATUS,RP0
bsf STATUS,RP1 ;Selecciona banco 3
clrf ANSEL ;Puerta A digital
clrf ANSELH ;Puerta B digital
bcf STATUS,RP1 ;Selecciona banco 1
clrf TRISB ;RB7:RB0 se configuran como salida
movlw b'00111111'
movwf TRISA ;RA5:RA0 se configuran como entrada
bcf STATUS,RP0 ;Selecciona banco 0
Loop: movf PORTA,W ;Leer el puerto de entrada
andlw b'00000011' ;Máscara para las líneas RA0 y RA1
btfsc STATUS,Z ;Están a 00 ?
goto Valen_00 ;Si
movwf Temp ;Almacena el resultado
movlw b'00000001'
subwf Temp,W
btfsc STATUS,Z ;Están a 01 ?
goto Valen_01
movlw b'00000010'
subwf Temp,W
btfsc STATUS,Z ;Están a 10 ?
goto Valen_10
Valen_11 movlw b'11110000'
movwf PORTB ;Salida de 11110000
goto Loop
Valen_00 movlw b'10101010'
movwf PORTB ;Salida de 10101010
goto Loop
Valen_01 movlw b'01010101'
movwf PORTB ;Salida de 01010101
goto Loop
Valen_10 movlw b'00001111'
movwf PORTB ;Salida de 00001111
goto Loop
end ;Fin del programa fuente
Ejemplo en C:
/*
Entradas/salidas digitales: Programa combinacional
Programa combinacional. Según el estado de los interruptores RA0 y RA1, activar
los leds RB0-RB7 conectados a la puerta B, conforme a la siguiente tabla de
la verdad:
RA1 RA0 RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0
--- --- --- --- --- --- --- --- --- ---
0 0 1 0 1 0 1 0 1 0
0 1 0 1 0 1 0 1 0 1
1 0 0 0 0 0 1 1 1 1
1 1 1 1 1 1 0 0 0 0
*/
#include <16f886.h>
/* Ajusta los valores de las palabras de configuración durante el ensamblado.Los bits no empleados
adquieren el valor por defecto.Estos y otros valores se pueden modificar según las necesidades */
#fuses NOLVP,PUT,NOWDT,EC_IO,NOFCMEN,NOBROWNOUT //Palabra 1 de configuración
#fuses NOWRT,BORV40 //Palabra 2 de configuración
/* Con estas directivas las funciones "input" y "output_bit" no reprograman
el pin de la puerta cada vez que son utilizadas. Si no se indica el
modo fast_io se asume por defecto standard_io el cual reprograma el pin
siempre antes de ser utilizadas estas funciones. */
#use fast_io (A)
#use fast_io (B)
main()
{
output_b(0x0); //Borra las salidas
setup_adc_ports(NO_ANALOGS); //Puertas A y B digitales
set_tris_a(0x3F); //Puerta A entrada
set_tris_b(0x00); //Puerta B salida
while(1)
{
switch(input_a() & 0b00000011)// Máscara para RA0 y RA1
{
case 0: output_b(0b10101010); break;
case 1: output_b(0b01010101); break;
case 2: output_b(0b00001111); break;
case 3: output_b(0b11110000); break;
default:;
}
}
}
Adaptar estos ejemplos en Arduino no es complicado.
Un saludo.
Edito:
Preguntaba los temas digitales y dejar una entrada analógica, ya que esta es para ajustar las revoluciones RPM del centrifugado de una lavadora. Tiene un potenciómetro.
Estoy en primera fase en buscar muchos ejemplos sobre controlar velocidad del motor y cosas así con Arduino, que ya he encontrado por cierto. Le dejo la Web aquí para tener más información y los que quieran aportar ideas al proyecto.
Por otro lado estoy haciendo un simulador de lavadoras para hacer pruebas mediante códigos con Visual Studio .net. Por ahora tengo hecho esto.
Haré un dibujo que se parezca una lavadora con sus Led y botones con el tiempo.