TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Artifox en 13 de Mayo de 2006, 03:32:02

Título: Armar 16bits con Pines del puerto para escribir directamente
Publicado por: Artifox en 13 de Mayo de 2006, 03:32:02
Hola, estoy tratando de manejar directamente 16 pines en una sola variable o estructura de manera que pueda hacer algo parecido a:
Código: CSS
  1. for (i=0; i<16;i++)
  2. {
  3. motor.i=1;
  4. }
  5. //donde cada uno de los bits sean
  6. motor.0 = pin_a0;
  7. motor.1 = pin_b0;
  8. motor.2 = pin_c0;
  9. motor.3 = pin_a1;
  10. motor.4 = pin_b1;
  11. motor.5 = pin_c1;
  12. motor.6 = pin_a2;
  13. motor.7 = pin_b2;
  14. motor.8 = pin_c2;
  15. motor.9 = pin_a3;
  16. motor.10 = pin_b3;
  17. motor.11 = pin_c3;
  18. motor.12 = pin_a4;
  19. motor.13 = pin_b4;
  20. motor.14 = pin_c4;
  21. motor.15 = pin_b5;

Es decir poder manejar cada bit independientemente, y poder tener diferente pines asignados. No se si es posible hacerlo... aun sigo rompiendome la cabeza para ver como hacerlo...

Cualquier ayuda es agradecida.
Título: Re: Armar 16bits con Pines del puerto para escribir directamente
Publicado por: kain589 en 13 de Mayo de 2006, 06:44:56
Si es posible yo lo hice asi, aunque solo para 6 bit, aunque es ampliable creo que sin problemas:
Código: C
  1. int8 m_estado;
  2. ::::::::::::::::::::
  3. #bit motor1e = m_estado.0//Habilita    1
  4. #bit motor1h = m_estado.1//Horario     1
  5. #bit motor1a = m_estado.2//Antihorario 1
  6. #bit motor2e = m_estado.3//Habilita    2
  7. #bit motor2h = m_estado.4//Horario     2
  8. #bit motor2a = m_estado.5//Antihorario 2
  9. :::::::::::::::::::::
  10. void uso_puente (void){
  11.       output_bit( PIN_A1, motor1h);
  12.       output_bit( PIN_A0, motor1a);
  13.       output_bit( PIN_C3, motor2h);
  14.       output_bit( PIN_C4, motor2a);
  15.       output_bit( PIN_A2, motor1e);
  16.       output_bit( PIN_C5, motor2e);
  17. }
  18. ::::::::::::::::::::::

No tiene estructura de bucle, pero puede sevir, ademas puede que el hecho de intentar hacerlo recorriendo todos los bits con un indice consuma mas potencia de calculo y memoria, no sé.
Yo trabajo con la variable m_estado como una variable de 8 bit asigandole los valores que quiero y llamo despues a la funcion uso_puente. A ver si te sirve
Título: Re: Armar 16bits con Pines del puerto para escribir directamente
Publicado por: Artifox en 14 de Mayo de 2006, 19:10:36
Hola... pues luego de pelear un poco con mi programa termine haciendolo en ASM. Para ello tuve que jugar con el PC (contador del programa) para que de un salto y ejecute la opcion que le envio...

Código: Text
  1. void motor_high(int n)
  2. {
  3.    n+=n;
  4.    #asm
  5.       MOVF  n,0
  6.       ADDWF 2,1
  7.       BSF   portb,0                                // PIN_B0 = 1
  8.       GOTO  SalidaH
  9.       BSF   portb,1                                // PIN_B1 = 1
  10.       GOTO  SalidaH
  11.       BSF   portb,2                                // PIN_B2 = 1
  12.       GOTO  SalidaH
  13.       BSF   portb,3                                // PIN_B3 = 1
  14.       GOTO  SalidaH
  15.       BSF   portb,4                                // PIN_B4 = 1
  16.       GOTO  SalidaH
  17.       BSF   portb,5                                // PIN_B5 = 1
  18.       GOTO  SalidaH
  19.       BSF   portb,6                                // PIN_B6 = 1
  20.       GOTO  SalidaH
  21.       BSF   portb,7                                // PIN_B7 = 1
  22.       GOTO  SalidaH
  23.       BSF   porta,0                                // PIN_A0 = 1
  24.       GOTO  SalidaH
  25.       BSF   porta,1                                // PIN_A1 = 1
  26.       GOTO  SalidaH
  27.       BSF   porta,2                                // PIN_A2 = 1
  28.       GOTO  SalidaH
  29.       BSF   porta,3                                // PIN_A3 = 1
  30.       GOTO  SalidaH
  31.       BSF   porta,4                                // PIN_A4 = 1
  32.       GOTO  SalidaH
  33.       BSF   porta,5                                // PIN_A5 = 1
  34.       GOTO  SalidaH
  35.       BSF   portc,0                                // PIN_C0 = 1
  36.       GOTO  SalidaH
  37.       BSF   portc,1                                // PIN_C1 = 1
  38. SalidaH:
  39.    #endasm
  40. }
  41.  
  42. void motor_low(int n)
  43. {
  44.    n+=n;
  45.    #asm
  46.       MOVF  n,0
  47.       ADDWF 2,1
  48.       BCF   portb,0                                // PIN_B0 = 0
  49.       GOTO  SalidaL
  50.       BCF   portb,1                                // PIN_B1 = 0
  51.       GOTO  SalidaL
  52.       BCF   portb,2                                // PIN_B2 = 0
  53.       GOTO  SalidaL
  54.       BCF   portb,3                                // PIN_B3 = 0
  55.       GOTO  SalidaL
  56.       BCF   portb,4                                // PIN_B4 = 0
  57.       GOTO  SalidaL
  58.       BCF   portb,5                                // PIN_B5 = 0
  59.       GOTO  SalidaL
  60.       BCF   portb,6                                // PIN_B6 = 0
  61.       GOTO  SalidaL
  62.       BCF   portb,7                                // PIN_B7 = 0
  63.       GOTO  SalidaL
  64.       BCF   porta,0                                // PIN_A0 = 0
  65.       GOTO  SalidaL
  66.       BCF   porta,1                                // PIN_A1 = 0
  67.       GOTO  SalidaL
  68.       BCF   porta,2                                // PIN_A2 = 0
  69.       GOTO  SalidaL
  70.       BCF   porta,3                                // PIN_A3 = 0
  71.       GOTO  SalidaL
  72.       BCF   porta,4                                // PIN_A4 = 0
  73.       GOTO  SalidaL
  74.       BCF   porta,5                                // PIN_A5 = 0
  75.       GOTO  SalidaL
  76.       BCF   portc,0                                // PIN_C0 = 0
  77.       GOTO  SalidaL
  78.       BCF   portc,1                                // PIN_C1 = 0
  79. SalidaL:
  80.    #endasm
  81. }

Con eso puedo poner en alto (motor_high) o en bajo (motor_low), indicando el numero de motor... de lo unico que debo tener en cuenta es que el codigo este en el Banco 0 para que pueda acceder a los registros del PORTA,PORTB y PORTC...

Por lo menos cumple mi cometido...