Hola a todos,
.....
Hola amigos,
despues del primier asalto con el tema del asunto teclado expansor i2c y salir casi cao.
Me he propuesto aplicar el divide y venceras, asi que manos a la obra.
1.- Problema encontrado.
Necesito un modulo de pulsadores que me consuman pocas pines en mis proyectos .
2.- Posible solución.
utilizar un teclado matricial de 4x4, el famoso keypad.
Con esta solucion solo gasto 8 pines y dispongo de 16 teclas,
pero si lo quiero usar con pic de pocas patas .
me quedo sin pines.
3.- Mejorar la solucion.
A este teclado conectarlo a un bus, yo elijo el bus i2c, para ello utilizamos un chip
que nos expande el bus, existen algunos como PCF8574, PCF8574A, PCA9554, PCA9554A,
seguro que hay otros.
yo en mi caso usare el PCF8574x, es elque tengo a mano.
Con este chip he reducido el numero de pines, el del bus i2c 2 pines y el de interrupcion
en total 3 pines si le sumamos la vcc y la masa son 5 pines no esta mal.
de cara al pic seria usar el bus i2c y la interrupcion.
4.- Puesta en practica
Con el proteus colocamos un teclado 4x4 , un bus expansor de i2c( PCF8574A) y un pic el 16f877A.
5.- Configuracion del circuito.
el expansor lo pondremos de formar que 4 pines sean de entrada y los otros 4 salida entre medio
pondremos los pulsadores.Para evitar que se contocircuiten las entradas con las salidas
colocaremos resistencias en la mitad del puerto su valor sera de 330 ohmios.
ahora en el pic pondremos la pata de la interupcion externa con la del bus expansor.
El pin del pic lo configuraremos como entrada de interupcion externa.
6.- Primera prueba:
Probar que el pic responde a la interupcion externa.
en el puerto d4y d3 le coloaremos dos led.
el pin de interupcion le colocamos una resistencia y
lo podemos poner a un estado alto a bajo, en este caso lo ponemos a alto.
1.- pulsaremos a la simulacion de proteus.
2.- se ve el led de PIN_D3 encendido y el estado de la interrupcion en rojo
3.- pulsamos sobre el boton P4 para producir cambio de estado.
4.- se apagara el del de PIN_d3 y se encendera el led pin_d2
5.- Despuesde un tiempo sea pagara el led de pin_d2 y se encendera pin_D3
7.- codigo del programa
#include <16F877A.h>
#device adc=8
#FUSES NOWDT //No Watch Dog Timer
#FUSES HS //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES NOPUT //No Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection
#FUSES NOWRT //Program memory not write protected
#FUSES RESERVED //Used to set the reserved FUSE bits
#use delay(clock=20000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
#use i2c(Master,Fast,sda=PIN_C4,scl=PIN_C3)
// si se produce interrupcion hara...
#int_EXT
void EXT_isr(void){
output_low(PIN_D3); //apago led
output_high(PIN_D2); //enciendo led
delay_ms(2000);
output_low(PIN_D2); //apago led
output_high(PIN_D3); //enciendo led
}
void main()
{
set_tris_b(0b00000001); //configuramos pin_b0 como entrada
output_high(PIN_D3);
enable_interrupts(INT_EXT);
enable_interrupts(GLOBAL);
printf("\r hola"); //por terminalvirtualnos mostrara hola
while(true){ //se metera en un bucle del que lo sacara la interupción
}
}