Autor Tema: Algoritmo 74HC164 Expansor I/O con MikroC  (Leído 5675 veces)

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

Desconectado jonathanPIC888

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 320
Algoritmo 74HC164 Expansor I/O con MikroC
« 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 !

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Algoritmo 74HC164 Expansor I/O con MikroC
« Respuesta #1 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. }
No contesto mensajes privados, las consultas en el foro

Desconectado jonathanPIC888

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 320
Re: Algoritmo 74HC164 Expansor I/O con MikroC
« Respuesta #2 en: 12 de Julio de 2009, 19:17:17 »
Muchisimas gracias Suki , funcionó perfectamente un abrazo.  :-/

Desconectado jonathanPIC888

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 320
Re: Algoritmo 74HC164 Expansor I/O con MikroC
« Respuesta #3 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

Desconectado jonathanPIC888

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 320
Re: Algoritmo 74HC164 Expansor I/O con MikroC
« Respuesta #4 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  :-/

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: Algoritmo 74HC164 Expansor I/O con MikroC
« Respuesta #5 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).
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado jonathanPIC888

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 320
Re: Algoritmo 74HC164 Expansor I/O con MikroC
« Respuesta #6 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  :)

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: Algoritmo 74HC164 Expansor I/O con MikroC
« Respuesta #7 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...
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Algoritmo 74HC164 Expansor I/O con MikroC
« Respuesta #8 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. }
No contesto mensajes privados, las consultas en el foro

Desconectado jonathanPIC888

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 320
Re: Algoritmo 74HC164 Expansor I/O con MikroC
« Respuesta #9 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:

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Algoritmo 74HC164 Expansor I/O con MikroC
« Respuesta #10 en: 13 de Julio de 2009, 16:39:43 »
En la última rutina me equivoque  :mrgreen: Se debe rotar ie

Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado jonathanPIC888

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 320
Re: Algoritmo 74HC164 Expansor I/O con MikroC
« Respuesta #11 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  :?

Desconectado jonathanPIC888

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 320
Re: Algoritmo 74HC164 Expansor I/O con MikroC
« Respuesta #12 en: 13 de Julio de 2009, 16:43:45 »
A ver voy a tratar de correjir y te digo como me quedó  :)

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Algoritmo 74HC164 Expansor I/O con MikroC
« Respuesta #13 en: 13 de Julio de 2009, 16:46:27 »
El return(ei) debe ir fuera del for...

Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado jonathanPIC888

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 320
Re: Algoritmo 74HC164 Expansor I/O con MikroC
« Respuesta #14 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.


 

anything