Hola a todos , tengo el siguiente programa y funciona pero de manera errática:
// Incluimos las librerías utilizadas.
#include "C:\Librerias MikroC\74165_MikroC.h"
void main() {
char resultado;
// Configuración de puertos.
ADCON0 = 0x00; // Modulo AD desactivado.
ADCON1 = 0x0F; // I/O Digital en el puerto A.
TRISA.F5 = 0X01;
TRISA.F4 = 0X00;
TRISA.F3 = 0X00;
TRISB = 0X00;
while(1) {
resultado = lee_entradas();
PORTB = resultado;
}
}
El problema aparece cuando conecto el registro al puerto A como aparece en el circuito que adjunto.
Lo más raro es que conectando el registro por ejemplo al puerto C funciona bien.
No se que puede pasar por que la librería funciona bien.
// Librería de control para el expansor de 8 entradas con 74HC165.
// Versión: 1.0
// Fecha: 14/07/09
// Ejemplo de uso de la función:
// i = lee_entradas();
// Pines intercambiables según necesidades del usuario.
#define ena_ser PORTA.F3 // Pin HABILITACIÓN.
#define ckl_ser PORTA.F4 // Pin RELOG.
#define dat_ser PORTA.F5 // Pin DATOS.
// Los pines del puerto deben ser configurados de esta manera:
/*
TRISA.F5 = 0x01;
TRISA.F4 = 0x00;
TRISA.F3 = 0x00;
*/
// Declaramos la función.
char lee_entradas(); // Devuelve una variable con el contenido del registro de desplazamiento.
char lee_entradas() {
char contador,ei;
ckl_ser = 1; // Pone el pin de ckl a nivel alto.
ena_ser = 0; // Guarda el estado de las entradas.
ena_ser = 1; // Habilita al 74165 para recibir nuevos datos.
ei = 0; // Pone a 0 la variable que va a contener el dato del registro.
for(contador=1;contador<=8;++contador) { // Genera clock para hacer el corrimiento de bits de la estructura.
if(dat_ser==1) { ei = ei + 1;} // Si se recibe un 1 lo guarda en la variable.
if(contador<8){ei<<=1;} // Desplaza un bit de la variable para poder almacenar el proximo dato.
ckl_ser = 0; // Pone a nivel bajo el pin de ckl.
ckl_ser = 1; // Pone a nivel alto el pin de ckl.
}
ena_ser = 0;
return(ei); // Retorna con el valor de la función.
}
También lo he conectado a otros micros y funciona bien siempre y cuando no lo conecte al puerto A.
Otra cosa lo he conectado al puerto A de un PIC16F84A que no tiene puerto A/D y funciona perfecto.........
La verdad no se que puede llegar a estar pasando.