TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: jonathanPIC888 en 12 de Julio de 2009, 14:59:39

Título: Algoritmo 74HC164 Expansor I/O con MikroC
Publicado por: jonathanPIC888 en 12 de Julio de 2009, 14:59:39
Hola a todos.

Tengo la siguiente duda:

Con el compilador C de CCS estoy utilizando una librería para un expansor de salidas utilizando un 74HC164:
Código: C
  1. // Librería de control para el expansor de 8 salidas con 74HC164.
  2. // Programador: Moyano Jonathan
  3. // Versión: 1.0
  4. // Fecha: 21/03/09
  5.  
  6. // Funciones:
  7. // escribe_registro(); Muestra un valor de 0 a 255 en el puerto.
  8.  
  9. // Definiciones de los puertos utilizados en el PIC.
  10.  
  11. // Pines intercambiables según necesidades del usuario.
  12.  
  13. // Configuración de pines para PICUSB28.
  14. #define relog PIN_B4
  15. #define datos PIN_B5
  16. #define reset PIN_B3
  17.  
  18. void output_74HC164(int valor); // Definimos la función.
  19.  
  20. void output_74HC164(int valor) {
  21.  
  22. int contador; // Contador para escribir los datos al registro de desplazamiento.
  23.  
  24.   output_low(relog);
  25.   output_high(reset);
  26.   output_low(datos);
  27.  
  28.   for(contador=0;contador!=8;contador++) {  
  29.   output_bit(datos,bit_test(valor,contador));
  30.    output_high(relog);
  31.    delay_cycles(1);
  32.    output_low(relog);
  33.   }
  34. output_low(relog);
  35. delay_ms(1);
  36. }

Pero dicho código no se como adaptarlo a MikroC debido a que no conozco muy bien las funciones de control de bits y registros en este compilador.

Espero que puedan darme una mano  :shock:

Un saludo !
Título: Re: Algoritmo 74HC164 Expansor I/O con MikroC
Publicado por: Suky en 12 de Julio de 2009, 18:53:37
Creo que así deberia de funcionar:

Código: C
  1. #define reloj PORTB.F4
  2. #define datos PORTB.F5
  3. #define reset PORTB.F3
  4.  
  5. void output_74164(char valor){
  6.         char j;
  7.         reloj=0;
  8.         reset=1;
  9.         for(j=0;j<8,j++){
  10.                 datos=valor&0x01;
  11.                 valor>>1;
  12.                 reloj=1;
  13.                 Nop(); // <- o equivalente en mikroc
  14.                 reloj=0;
  15.         }
  16.         reset=0;
  17.         delay_ms(1);
  18.  
  19. }
Título: Re: Algoritmo 74HC164 Expansor I/O con MikroC
Publicado por: jonathanPIC888 en 12 de Julio de 2009, 19:17:17
Muchisimas gracias Suki , funcionó perfectamente un abrazo.  :-/
Título: Re: Algoritmo 74HC164 Expansor I/O con MikroC
Publicado por: jonathanPIC888 en 12 de Julio de 2009, 20:34:27
En este momento pongo otra librería que me está dando algunos problemas  :lol:

Código: C
  1. // Librería de control para el expansor de 8 entradas con 74HC165.
  2. // Programador: Moyano Jonathan
  3. // Versión: 1.0
  4. // Fecha: 12/07/09
  5.  
  6. // Funciones:
  7. // void lee_entradas(int *ei) // Devuelve un valor correspondiente al valor de las entradas.
  8.  
  9.  
  10. // Pines intercambiables según necesidades del usuario.
  11.  
  12. #define ena_ser   PORTA.F3
  13. #define ckl_ser   PORTA.F4
  14. #define dat_ser   PORTA.F5
  15.  
  16. void lee_entradas(int *ei);
  17.  
  18.  
  19. void lee_entradas(int *ei) {
  20.   char contador;
  21.  
  22.     ckl_ser = 1;
  23.     ena_ser = 0;      // Guarda el estado de las entradas.
  24.     ena_ser = 1;          
  25.  
  26.       for(contador=1;contador<=8;++contador) {  // Genera clock para hacer el corrimiento de bits de la estructura.
  27.  
  28.           shift_left(ei,1,input(dat_ser)); --> Función que hay que cambiar.
  29.  
  30.           ckl_ser = 0;
  31.           ckl_ser = 1;
  32.   }
  33.   ena_ser = 0;
  34. }

La librería está casi lista pero no se como se podría hacer para guardar el valor que entra por dat_ser. Espero no ser molesto con mis preguntas
Título: Re: Algoritmo 74HC164 Expansor I/O con MikroC
Publicado por: jonathanPIC888 en 13 de Julio de 2009, 02:38:55
En la segunda función no entiendo como hacer para que tome bit a bit los 8 bits que corresponden al dato de las 8 entradas y guardarlas en una variable.

La función me gustaría hacerla sin punteros, para que quede de esta manera: Por ejemp: Valor = lee_entradas();  :?

Desde ya muchas gracias por la ayuda  :-/
Título: Re: Algoritmo 74HC164 Expansor I/O con MikroC
Publicado por: MGLSOFT en 13 de Julio de 2009, 08:17:04
En este momento pongo otra librería que me está dando algunos problemas  :lol:

Código: C
  1. // Librería de control para el expansor de 8 entradas con 74HC165.
  2. // Programador: Moyano Jonathan
  3. // Versión: 1.0
  4. // Fecha: 12/07/09
  5.  
  6. // Funciones:
  7. // void lee_entradas(int *ei) // Devuelve un valor correspondiente al valor de las entradas.
  8.  
  9.  
  10. // Pines intercambiables según necesidades del usuario.
  11.  
  12. #define ena_ser   PORTA.F3
  13. #define ckl_ser   PORTA.F4
  14. #define dat_ser   PORTA.F5
  15.  
  16. void lee_entradas(int *ei);
  17.  
  18.  
  19. void lee_entradas(int *ei) {
  20.   char contador;
  21.  
  22.     ckl_ser = 1;
  23.     ena_ser = 0;      // Guarda el estado de las entradas.
  24.     ena_ser = 1;          
  25.  
  26.       for(contador=1;contador<=8;++contador) {  // Genera clock para hacer el corrimiento de bits de la estructura.
  27.  
  28.           shift_left(ei,1,input(dat_ser)); --> Función que hay que cambiar.
  29.  
  30.           ckl_ser = 0;
  31.           ckl_ser = 1;
  32.   }
  33.   ena_ser = 0;
  34. }

La librería está casi lista pero no se como se podría hacer para guardar el valor que entra por dat_ser. Espero no ser molesto con mis preguntas

Cambia el Void por Int, mas o menos de esta forma...

Código: C
  1. Int lee_entradas(int *ei) {
  2.   char contador;
  3.  
  4.     ckl_ser = 1;
  5.     ena_ser = 0;      // Guarda el estado de las entradas.
  6.     ena_ser = 1;          
  7.  
  8.       for(contador=1;contador<=8;++contador) {  // Genera clock para hacer el corrimiento de bits de la estructura.
  9.  
  10.           shift_left(ei,1,input(dat_ser)); --> Función que hay que cambiar.
  11.  
  12.           ckl_ser = 0;
  13.           ckl_ser = 1;
  14.   }
  15.   ena_ser = 0;
  16.  
  17. return ei;
  18. }

Luego tendras el valor de retorno en ei (debe ser una variable global).
Título: Re: Algoritmo 74HC164 Expansor I/O con MikroC
Publicado por: jonathanPIC888 en 13 de Julio de 2009, 13:09:47
Gracias por responder MGLSOFT, aunque mi problema en si radica en la siguiente función:
Código: C
  1. shift_left(ei,1,input(dat_ser)); --> Función que hay que cambiar.

La función shift_left, no está soportada por MikroC y necesito adaptar el código con algún algoritmo que lo reemplaze.

En la función anterior Suki definió la función:
Código: C
  1. output_bit(datos,bit_test(valor,contador));

y la cambió por esto otro que si es compatible con MikroC:

Código: C
  1. datos=valor&0x01;
  2. valor>>1;

Quería saber como hacer algo parecido con la otra función.

Desde ya muchas gracias  :)
Título: Re: Algoritmo 74HC164 Expansor I/O con MikroC
Publicado por: MGLSOFT en 13 de Julio de 2009, 15:35:26
Gracias por responder MGLSOFT, aunque mi problema en si radica en la siguiente función:
Código: C
  1. shift_left(ei,1,input(dat_ser)); --> Función que hay que cambiar.

La función shift_left, no está soportada por MikroC y necesito adaptar el código con algún algoritmo que lo reemplaze.

En la función anterior Suki definió la función:
Código: C
  1. output_bit(datos,bit_test(valor,contador));

y la cambió por esto otro que si es compatible con MikroC:

Código: C
  1. datos=valor&0x01;
  2. valor>>1;

Quería saber como hacer algo parecido con la otra función.

Desde ya muchas gracias  :)

Prueba con rlf y conservar el carry bit...
Título: Re: Algoritmo 74HC164 Expansor I/O con MikroC
Publicado por: Suky en 13 de Julio de 2009, 16:00:02
Primero debes cambiar void por char.

Despues esto:
Código: C
  1. for(contador=1;contador<=8;++contador) {
  2.           shift_left(ei,1,input(dat_ser));
  3.  
  4.           ckl_ser = 0;
  5.           ckl_ser = 1;
  6. }

Se puede reemplazar por:
Código: C
  1. ei=0;
  2. for(contador=0;contador<8;contador++){
  3.           if(dat_ser==1){ei+=1;}
  4.           if(contador<7){dat_ser<<1;} // Para que en el último bit no rote.-
  5.  
  6.           ckl_ser = 0;
  7.           ckl_ser = 1;
  8. }
Título: Re: Algoritmo 74HC164 Expansor I/O con MikroC
Publicado por: jonathanPIC888 en 13 de Julio de 2009, 16:20:56
Ahi lo puede resolver (me compiló bien) como quería pero queda ver el resultado  en el simulador y luego en la entrenadora  :-/

Muchas gracias Suki y MGLSOFT !!  :mrgreen:
Título: Re: Algoritmo 74HC164 Expansor I/O con MikroC
Publicado por: Suky en 13 de Julio de 2009, 16:39:43
En la última rutina me equivoque  :mrgreen: Se debe rotar ie

Saludos!
Título: Re: Algoritmo 74HC164 Expansor I/O con MikroC
Publicado por: jonathanPIC888 en 13 de Julio de 2009, 16:42:11
Para mi sorpresa el código no funcionó   :lol:

Esta es la librería que quedó:

Código: C
  1. // Pines intercambiables según necesidades del usuario.
  2.  
  3. #define ena_ser   PORTA.F3      // Pin HABILITACIÓN.
  4. #define ckl_ser   PORTA.F4      // Pin RELOG.
  5. #define dat_ser   PORTA.F5      // Pin DATOS.
  6.  
  7. // Declaramos la función.
  8. char lee_entradas();
  9.  
  10. char lee_entradas() {
  11.   char contador;
  12.   char ei;
  13.   char resultado;
  14.    
  15.     ckl_ser = 1;       // Pone el pin de ckl a nivel bajo.
  16.     ena_ser = 0;      // Guarda el estado de las entradas.
  17.     ena_ser = 1;      // Habilita al 74165 para recibir nuevos datos.
  18.     ei = 0;
  19.      
  20.           for(contador=1;contador<=8;++contador) {  // Genera clock para hacer el corrimiento de bits de la estructura.
  21.  
  22.          if(dat_ser==1){ei+=1;}
  23.          if(contador<7){dat_ser<<1;} // Para que en el último bit no rote.-
  24.  
  25.         ckl_ser = 0;    // Pone a nivel bajo el pin de ckl.
  26.         ckl_ser = 1;    // Pone a nivel alto el pin de ckl.
  27.          
  28.            resultado = ei;
  29.            return(ei);
  30.   }
  31.  
  32.   ena_ser = 0;
  33. }

Y en el main:

Código: C
  1. void main() {
  2. TRISA = 0b100000;
  3. RISB = 0x00;
  4.  
  5.   PORTB = lee_entradas();
  6. }

Cuando le pongo simular en el proteus no me funciona, se queda sin hacer nada presiono los botones conectados al registro de dezplazamiento y no muestra nada
en el puerto B , además de que no veo actividad en el puerto A que donde está conectado el registro.

A todo esto estoy utilzando un PIC18F2550 corriendo a 4Mhz sin PLL  :?
Título: Re: Algoritmo 74HC164 Expansor I/O con MikroC
Publicado por: jonathanPIC888 en 13 de Julio de 2009, 16:43:45
A ver voy a tratar de correjir y te digo como me quedó  :)
Título: Re: Algoritmo 74HC164 Expansor I/O con MikroC
Publicado por: Suky en 13 de Julio de 2009, 16:46:27
El return(ei) debe ir fuera del for...

Saludos!
Título: Re: Algoritmo 74HC164 Expansor I/O con MikroC
Publicado por: jonathanPIC888 en 13 de Julio de 2009, 17:08:27
Sigue sin funcionar el código de la librería me está quedando así hasta el momento:
Código: C
  1. #include "C:\Librerias MikroC\74164_MikroC.h"
  2.  
  3. // Pines intercambiables según necesidades del usuario.
  4. #define ena_ser   PORTA.F3      // Pin HABILITACIÓN.
  5. #define ckl_ser   PORTA.F4      // Pin RELOG.
  6. #define dat_ser   PORTA.F5      // Pin DATOS.
  7.  
  8. // Declaramos la función.
  9. char lee_entradas();
  10.  
  11. char lee_entradas() {
  12.   char contador,ei,resultado;
  13.  
  14.     ckl_ser = 1;       // Pone el pin de ckl a nivel bajo.
  15.     ena_ser = 0;      // Guarda el estado de las entradas.
  16.     ena_ser = 1;      // Habilita al 74165 para recibir nuevos datos.
  17.      
  18.       ei = 0;
  19.       for(contador=1;contador<=8;++contador) {  // Genera clock para hacer el corrimiento de bits de la estructura.
  20.  
  21.                 if(dat_ser==1){ei+=1;}
  22.                
  23.                 ei<<1;
  24.  
  25.            ckl_ser = 0;    // Pone a nivel bajo el pin de ckl.
  26.            ckl_ser = 1;    // Pone a nivel alto el pin de ckl.      
  27.   }
  28.   resultado = ei;
  29.   return(ei);
  30.   ena_ser = 0;
  31. }
  32.  
  33. void main() {
  34.               int i;
  35.   TRISA = 0b10000;
  36.   TRISB = 0x00;
  37.  while(1) {
  38.   i = lee_entradas();
  39.   output_74164(i);
  40.       }
  41.  
  42.    }

Como lo estoy probando con la entrenadora , utilizo la librería de las salidas que había hecho antes.

Si hay algún error en el código decime.
Título: Re: Algoritmo 74HC164 Expansor I/O con MikroC
Publicado por: jonathanPIC888 en 13 de Julio de 2009, 18:25:49
Ahi el circuito dió sus primeras señales de vida pero no hace lo que el código dice, la verdad ya no se que más modificar:
Código: C
  1. // Pines intercambiables según necesidades del usuario.
  2. #define ena_ser   PORTA.F3      // Pin HABILITACIÓN.
  3. #define ckl_ser   PORTA.F4      // Pin RELOG.
  4. #define dat_ser   PORTA.F5      // Pin DATOS.
  5.  
  6. // Declaramos la función.
  7. char lee_entradas();
  8.  
  9. char lee_entradas() {
  10.   char contador,ei,resultado;
  11.  
  12.     ckl_ser = 1;       // Pone el pin de ckl a nivel alto.
  13.     ena_ser = 0;      // Guarda el estado de las entradas.
  14.     ena_ser = 1;      // Habilita al 74165 para recibir nuevos datos.
  15.      
  16.       ei = 0;
  17.       for(contador=1;contador<=8;++contador) {  // Genera clock para hacer el corrimiento de bits de la estructura.
  18.  
  19.         if(dat_ser=1){ei+=1;}
  20.         ei<<1;
  21.  
  22.            ckl_ser = 0;    // Pone a nivel bajo el pin de ckl.
  23.            ckl_ser = 1;    // Pone a nivel alto el pin de ckl.
  24.            resultado = ei;
  25.   }
  26.  
  27.   return(ei);
  28.   ena_ser = 0;
  29. }
  30.  
  31. void main()     {
  32.   int i;
  33.   TRISA.F5 = 0x01;
  34.   TRISA.F4 = 0x00;
  35.   TRISA.F3 = 0x00;
  36.  
  37.   TRISB = 0x00;
  38.  while(1) {
  39.   i = lee_entradas();
  40.   PORTB = i;
  41.       }
  42.  
  43.    }

PD: Adjunto el esquemático del isis junto con el archivo para simularlo.
Título: Re: Algoritmo 74HC164 Expansor I/O con MikroC
Publicado por: Suky en 13 de Julio de 2009, 23:18:07
Prueba de esta manera:
Código: C
  1. // Pines intercambiables según necesidades del usuario.
  2. #define ena_ser   PORTA.F3      // Pin HABILITACIÓN.
  3. #define ckl_ser   PORTA.F4      // Pin RELOG.
  4. #define dat_ser   PORTA.F5      // Pin DATOS.
  5.  
  6. char lee_entradas() {
  7.   char contador,ei,resultado;
  8.  
  9.     ckl_ser = 1;       // Pone el pin de ckl a nivel alto.
  10.     ena_ser = 0;      // Guarda el estado de las entradas.
  11.     ena_ser = 1;      // Habilita al 74165 para recibir nuevos datos.
  12.      
  13.       ei = 0;
  14.       for(contador=1;contador<=8;++contador) {  // Genera clock para hacer el corrimiento de bits de la estructura.
  15.         if(dat_ser=1){ei+=1;}
  16.         if(contador<8){ei<<1;}
  17.  
  18.            ckl_ser = 0;    // Pone a nivel bajo el pin de ckl.
  19.            ckl_ser = 1;    // Pone a nivel alto el pin de ckl.
  20.   }
  21.   ena_ser = 0;
  22.   return(ei);
  23. }

Si no se coloca la linea if(contador<8){ei<<1;} el último bit leído provoca que se rote ei, perdiendo el bit7 e introduciendo un 0 en bit0, corrompiendo el byte recibido.
Título: Re: Algoritmo 74HC164 Expansor I/O con MikroC
Publicado por: jonathanPIC888 en 14 de Julio de 2009, 00:25:44
Sigue sin funcionar tanto en el simulador como en la práctica la verdad es rarísimo........... :shock: :shock: :shock: :lol:
Título: Re: Algoritmo 74HC164 Expansor I/O con MikroC
Publicado por: jonathanPIC888 en 14 de Julio de 2009, 00:33:21
Según como has detallado la función tiene que funcionar sin ningún drama , pero el tema es que no me muestra nada por el puerto B del micro no se que puede llegar a estar mal.
Título: Re: Algoritmo 74HC164 Expansor I/O con MikroC
Publicado por: jonathanPIC888 en 14 de Julio de 2009, 13:56:29
Puede ser que la función no me esté devolviendo el valor de ei ??? ya es la única que se me ocurre.  :(
Título: Re: Algoritmo 74HC164 Expansor I/O con MikroC
Publicado por: Suky en 14 de Julio de 2009, 15:55:31
Faltaban un = en el if  :mrgreen:

El ejemplo que probé en un 16F84A:
Código: C
  1. // Pines intercambiables según necesidades del usuario.
  2. #define ena_ser   PORTA.F2      // Pin HABILITACIÓN.
  3. #define ckl_ser   PORTA.F0      // Pin RELOG.
  4. #define dat_ser   PORTA.F1      // Pin DATOS.
  5.  
  6. char lee_entradas() {
  7.   char contador,ei;
  8.  
  9.     ckl_ser = 1;       // Pone el pin de ckl a nivel alto.
  10.     ena_ser = 0;      // Guarda el estado de las entradas.
  11.     ena_ser = 1;      // Habilita al 74165 para recibir nuevos datos.
  12.  
  13.       ei = 0;
  14.       for(contador=1;contador<=8;++contador) {  // Genera clock para hacer el corrimiento de bits de la estructura.
  15.         if(dat_ser==1){ei+=1;}
  16.         if(contador<8){ei<<=1;}
  17.  
  18.            ckl_ser = 0;    // Pone a nivel bajo el pin de ckl.
  19.            ckl_ser = 1;    // Pone a nivel alto el pin de ckl.
  20.   }
  21.   ena_ser = 0;
  22.   return(ei);
  23. }
  24.  
  25.  
  26. void main(){
  27.      char lectura;
  28.      TRISA.F1=1;
  29.      TRISA.F0=0;
  30.      TRISA.F2=0;
  31.      
  32.      TRISB=0;
  33.      
  34.      while(1){
  35.      delay_ms(100);
  36.      lectura=lee_entradas();
  37.      PORTB=lectura;
  38.      }
  39. }


Adjunto imagen del circuito.
Saludos!
Título: Re: Algoritmo 74HC164 Expansor I/O con MikroC
Publicado por: jonathanPIC888 en 14 de Julio de 2009, 16:44:05
Grandeeeeeeeeeeeeeeeeeeeeeeeeee Suki  :-/ :-/ :-/ :-/ :-/ :-/ :-/

Funcionó perfecto la librería !!!!!!!!!!!!!!  8)

Ahora el tema con el PIC18F2550 no funciona y estoy seguro que es por una mala configuración de los fuses.

Gracias por tu paciencia para ayudarme te estoy muy agradecido  :o
Título: Re: Algoritmo 74HC164 Expansor I/O con MikroC
Publicado por: jonathanPIC888 en 14 de Julio de 2009, 22:08:23
La librería no se como hacerla funcionar con el puerto A que bronca ...........funciona con los otros puertos.

Para colmo en mi entrenadora el 74HC165 está conectado al puerto A y no se como hacer. :lol: