Autor Tema: Armar 16bits con Pines del puerto para escribir directamente  (Leído 1765 veces)

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

Desconectado Artifox

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 455
    • Quadbot
Armar 16bits con Pines del puerto para escribir directamente
« 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.
Video Quadbot
Saludos desde mi querido Perú.
Si realmente queremos que el mundo cambie debemos empezar por nosotros mismos... ;)

Desconectado kain589

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 324
Re: Armar 16bits con Pines del puerto para escribir directamente
« Respuesta #1 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
Saludos desde Córdoba, españa

Desconectado Artifox

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 455
    • Quadbot
Re: Armar 16bits con Pines del puerto para escribir directamente
« Respuesta #2 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...
Video Quadbot
Saludos desde mi querido Perú.
Si realmente queremos que el mundo cambie debemos empezar por nosotros mismos... ;)