Autor Tema: Servormotores para brazo y comunicacion por bluetooth  (Leído 124 veces)

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

Desconectado Sebas1010

  • PIC10
  • *
  • Mensajes: 9
Servormotores para brazo y comunicacion por bluetooth
« en: 18 de Mayo de 2020, 15:26:33 »
Buenas, les consulto porque estamos con mi amigo trabados, queremos manejar un brazo el problema que tenemos es que cuando pulsamos y se envía el dato para el otro lado el servo se va al extremo la idea es que cada vez que se manda un caracter se mueva de apoco. Realizamos una prueba con pulsadores sin la comunicación y los servos responden bien, por eso creemos que es un tema la comunicación, ahora en la simulación esta con dos pic pero la idea es después comunicarlo por una aplicación del celular.
La programación esta hecha en mplab xc8 y los pic 18f4620.
Desde ya muchas gracias.   

TX
Código: C
  1. // CONFIG1H
  2. #pragma config OSC = HS   // Oscillator Selection bits (XT oscillator)
  3. #pragma config FCMEN = ON       // Fail-Safe Clock Monitor Enable bit (Fail-Safe Clock Monitor enabled)
  4. #pragma config IESO = OFF       // Internal/External Oscillator Switchover bit (Oscillator Switchover mode disabled)
  5.  
  6. // CONFIG2L
  7. #pragma config PWRT = ON       // Power-up Timer Enable bit (PWRT disabled)
  8. #pragma config BOREN = OFF      // Brown-out Reset Enable bits (Brown-out Reset disabled in hardware and software)
  9. #pragma config BORV = 3         // Brown Out Reset Voltage bits (Minimum setting)
  10.  
  11. // CONFIG2H
  12. #pragma config WDT = OFF        // Watchdog Timer Enable bit (WDT disabled (control is placed on the SWDTEN bit))
  13. #pragma config WDTPS = 32768    // Watchdog Timer Postscale Select bits (1:32768)
  14.  
  15. // CONFIG3H
  16. #pragma config CCP2MX = PORTC   // CCP2 MUX bit (CCP2 input/output is multiplexed with RC1)
  17. #pragma config PBADEN = OFF     // PORTB A/D Enable bit (PORTB<4:0> pins are configured as digital I/O on Reset)
  18. #pragma config LPT1OSC = OFF    // Low-Power Timer1 Oscillator Enable bit (Timer1 configured for higher power operation)
  19. #pragma config MCLRE = ON       // MCLR Pin Enable bit (MCLR pin enabled; RE3 input pin disabled)
  20.  
  21. // CONFIG4L
  22. #pragma config STVREN = OFF     // Stack Full/Underflow Reset Enable bit (Stack full/underflow will not cause Reset)
  23. #pragma config LVP = OFF        // Single-Supply ICSP Enable bit (Single-Supply ICSP disabled)
  24. #pragma config XINST = OFF      // Extended Instruction Set Enable bit (Instruction set extension and Indexed Addressing mode disabled (Legacy mode))
  25.  
  26. // CONFIG5L
  27. #pragma config CP0 = OFF        // Code Protection bit (Block 0 (000800-003FFFh) not code-protected)
  28. #pragma config CP1 = OFF        // Code Protection bit (Block 1 (004000-007FFFh) not code-protected)
  29. #pragma config CP2 = OFF        // Code Protection bit (Block 2 (008000-00BFFFh) not code-protected)
  30. #pragma config CP3 = OFF        // Code Protection bit (Block 3 (00C000-00FFFFh) not code-protected)
  31.  
  32. // CONFIG5H
  33. #pragma config CPB = OFF        // Boot Block Code Protection bit (Boot block (000000-0007FFh) not code-protected)
  34. #pragma config CPD = OFF        // Data EEPROM Code Protection bit (Data EEPROM not code-protected)
  35.  
  36. // CONFIG6L
  37. #pragma config WRT0 = OFF       // Write Protection bit (Block 0 (000800-003FFFh) not write-protected)
  38. #pragma config WRT1 = OFF       // Write Protection bit (Block 1 (004000-007FFFh) not write-protected)
  39. #pragma config WRT2 = OFF       // Write Protection bit (Block 2 (008000-00BFFFh) not write-protected)
  40. #pragma config WRT3 = OFF       // Write Protection bit (Block 3 (00C000-00FFFFh) not write-protected)
  41.  
  42. // CONFIG6H
  43. #pragma config WRTC = OFF       // Configuration Register Write Protection bit (Configuration registers (300000-3000FFh) not write-protected)
  44. #pragma config WRTB = OFF       // Boot Block Write Protection bit (Boot Block (000000-0007FFh) not write-protected)
  45. #pragma config WRTD = OFF       // Data EEPROM Write Protection bit (Data EEPROM not write-protected)
  46.  
  47. // CONFIG7L
  48. #pragma config EBTR0 = OFF      // Table Read Protection bit (Block 0 (000800-003FFFh) not protected from table reads executed in other blocks)
  49. #pragma config EBTR1 = OFF      // Table Read Protection bit (Block 1 (004000-007FFFh) not protected from table reads executed in other blocks)
  50. #pragma config EBTR2 = OFF      // Table Read Protection bit (Block 2 (008000-00BFFFh) not protected from table reads executed in other blocks)
  51. #pragma config EBTR3 = OFF      // Table Read Protection bit (Block 3 (00C000-00FFFFh) not protected from table reads executed in other blocks)
  52.  
  53. // CONFIG7H
  54. #pragma config EBTRB = OFF      // Boot Block Table Read Protection bit (Boot Block (000000-0007FFh) not protected from table reads executed in other blocks)
  55.  
  56. // #pragma config statements should precede project file includes.
  57. // Use project enums instead of #define for ON and OFF.
  58.  
  59. #include <xc.h>
  60. #include <stdio.h>
  61. #include <stdlib.h>
  62. #include <conio.h>
  63. #include <string.h>
  64. #include <math.h>
  65. #define _XTAL_FREQ 20000000
  66. #include "Usart.h"
  67.  
  68. #define pulsador1 PORTDbits.RD0
  69. #define pulsador1_tris TRISDbits.TRISD0
  70. #define pulsador2 PORTDbits.RD1
  71. #define pulsador2_tris TRISDbits.TRISD1
  72. #define pulsador3 PORTDbits.RD2
  73. #define pulsador3_tris TRISDbits.TRISD2
  74. #define pulsador4 PORTDbits.RD3
  75. #define pulsador4_tris TRISDbits.TRISD3
  76. #define pulsador5 PORTDbits.RD4
  77. #define pulsador5_tris TRISDbits.TRISD4
  78. #define pulsador6 PORTDbits.RD5
  79. #define pulsador6_tris TRISDbits.TRISD5
  80. #define pulsador7 PORTDbits.RD6
  81. #define pulsador7_tris TRISDbits.TRISD6
  82. #define pulsador8 PORTDbits.RD7
  83. #define pulsador8_tris TRISDbits.TRISD7
  84.  
  85. void main(void)
  86. {
  87. int i = 0;
  88. int estado;
  89. pulsador1_tris = 1;
  90. pulsador2_tris = 1;
  91. pulsador3_tris = 1;
  92. pulsador4_tris = 1;
  93. pulsador5_tris = 1;
  94. pulsador6_tris = 1;
  95. pulsador7_tris = 1;
  96. pulsador8_tris = 1;
  97.  
  98. /*Inicializacion de comunicacion USART*/  
  99. Usart_int();
  100.  
  101. do
  102. {
  103.    
  104.     if(pulsador1 == 1)
  105.     {
  106.         __delay_ms(100);
  107.         Usart_sent_character('A');
  108.     }
  109.     if(pulsador2 == 1)
  110.     {
  111.         __delay_ms(100);
  112.         Usart_sent_character('B');
  113.     }
  114.    
  115.     if(pulsador3 == 1)
  116.     {
  117.         __delay_ms(100);
  118.         Usart_sent_character('E');
  119.     }
  120.     if(pulsador4 == 1)
  121.     {
  122.         __delay_ms(100);
  123.         Usart_sent_character('F');
  124.  
  125.     }
  126.     if(pulsador5 == 1)
  127.     {
  128.         __delay_ms(100);
  129.         Usart_sent_character('C');
  130.     }
  131.     if(pulsador6 == 1)
  132.     {
  133.         __delay_ms(100);
  134.         Usart_sent_character('D');
  135.     }
  136.     if(pulsador7 == 1)
  137.     {
  138.         __delay_ms(100);
  139.         Usart_sent_character('G');
  140.  
  141.     }
  142.     if(pulsador8 == 1)
  143.     {
  144.         __delay_ms(100);
  145.         Usart_sent_character('H');
  146.  
  147.     }
  148.    
  149. }while(1);
  150.  
  151. }
  152.  
  153. #ifndef USART_H
  154. #define USART_H
  155.  
  156. void Usart_int();//función para iniciar el USART PIC asíncron, 8 bits, 9600 baudios
  157. unsigned char Usart_read();//función para la recepción de caracteres
  158. void Usart_sent_character(unsigned char);//función para la transmisión de caracteres
  159. void Usart_sent_string(char*);//función para la transmisión de cadenas de caracteres
  160.  
  161. /*
  162. Inicialización del módulo USART PIC modo asíncrono
  163. en una función, a 8bits,a 9600 baudios */
  164. void Usart_int()
  165. {
  166.      TRISCbits.TRISC7=1;//pin RX como una entrada digital
  167.      TRISCbits.TRISC6=0;//pin TX como una salida digital
  168.      TXSTAbits.CSRC = 0;//modo asincronico
  169.      TXSTAbits.TX9 = 0;//selecion modo de transimicion 8bit.
  170.      TXSTAbits.TXEN = 1;//se habilita la transimcion
  171.      TXSTAbits.SYNC = 0;//la transmicion sera asincronica
  172.      TXSTAbits.SENDB = 0;//no habilito el control por hardware
  173.      TXSTAbits.BRGH = 1;//modo de transmicion de alta velocidad
  174.      TXSTAbits.TRMT = 1;//se lo pondrá a 1 porque se está iniciando y tendría que estar vacío.
  175.      TXSTAbits.TX9D = 0;//el bit de paridad en la transmisión a 8 bits no influye y se lo pondrá a 0.
  176.      RCSTAbits.SPEN = 1;//se pondrá a 1 para habilitar el uso del módulo USART PIC.
  177.      RCSTAbits.RX9 = 0;//la recepción para que sea a 8 bits.
  178.      RCSTAbits.SREN = 0;//modo asincronico
  179.      RCSTAbits.CREN = 1;//se habilita la recepcion
  180.      RCSTAbits.ADDEN = 0;//recepción será a 8 bit.
  181.      RCSTAbits.FERR = 0;//este bit trabaja automáticamente cuando se pone a 1 indica que se ha recibido un dato no válido.
  182.      RCSTAbits.OERR = 0;//este bit trabaja automáticamente cuando se pone a 1 indica que se ha producido un error por sobreescritura de algún dato recibido
  183.      RCSTAbits.RX9D = 0;////el bit de paridad en la transmisión a 8 bits no influye y se lo pondrá a 0.
  184.      SPBRG = 129;//para una velocidad de 9600baudios con un oscilador de 20Mhz*/
  185. }
  186.  
  187. /*
  188. Recepción de datos del módulo USART PIC modo asíncrono
  189. */
  190. unsigned char Usart_read()
  191. {
  192.     if(PIR1bits.RCIF == 1)//si el bit5 del registro PIR1 se ha puesto a 1
  193.     {
  194.     return RCREG;//devuelve el dato almacenado en el registro RCREG
  195.     }
  196.     else
  197.     {
  198.         return 0;
  199.     }
  200.    
  201. }
  202.  
  203. /*
  204. Transmisión de datos del módulo USART PIC modo asíncrono
  205. */
  206. void Usart_sent_character(unsigned char chtr)
  207. {
  208.     while(TXSTAbits.TRMT == 0);// mientras el registro TSR esté lleno espera
  209.         TXREG = chtr;//cuando el el registro TSR está vacio se envia el caracter
  210. }
  211.  
  212.  
  213. /*
  214. Transmisión de cadenas de caracteres con el módulo USART PIC modo asíncrono
  215. */
  216. void Usart_sent_string(char* cadena)//cadena de caracteres de tipo char
  217. {
  218.     while(*cadena != 0x00)//mientras el último valor de la cadena sea diferente de el caracter nulo
  219.     {                    
  220.     Usart_sent_character(*cadena);//transmite los caracteres de cadena
  221.     cadena++;//incrementa la ubicación de los caracteres en cadena para enviar el siguiente caracter de cadena
  222.     }
  223. }    
  224.  
  225. #endif  /* USART_H */
  226.  

RX

Código: C
  1. // CONFIG1H
  2. #pragma config OSC = HS   // Oscillator Selection bits (XT oscillator)
  3. #pragma config FCMEN = ON       // Fail-Safe Clock Monitor Enable bit (Fail-Safe Clock Monitor enabled)
  4. #pragma config IESO = OFF       // Internal/External Oscillator Switchover bit (Oscillator Switchover mode disabled)
  5.  
  6. // CONFIG2L
  7. #pragma config PWRT = ON       // Power-up Timer Enable bit (PWRT disabled)
  8. #pragma config BOREN = OFF      // Brown-out Reset Enable bits (Brown-out Reset disabled in hardware and software)
  9. #pragma config BORV = 3         // Brown Out Reset Voltage bits (Minimum setting)
  10.  
  11. // CONFIG2H
  12. #pragma config WDT = OFF        // Watchdog Timer Enable bit (WDT disabled (control is placed on the SWDTEN bit))
  13. #pragma config WDTPS = 32768    // Watchdog Timer Postscale Select bits (1:32768)
  14.  
  15. // CONFIG3H
  16. #pragma config CCP2MX = PORTC   // CCP2 MUX bit (CCP2 input/output is multiplexed with RC1)
  17. #pragma config PBADEN = OFF     // PORTB A/D Enable bit (PORTB<4:0> pins are configured as digital I/O on Reset)
  18. #pragma config LPT1OSC = OFF    // Low-Power Timer1 Oscillator Enable bit (Timer1 configured for higher power operation)
  19. #pragma config MCLRE = ON       // MCLR Pin Enable bit (MCLR pin enabled; RE3 input pin disabled)
  20.  
  21. // CONFIG4L
  22. #pragma config STVREN = OFF     // Stack Full/Underflow Reset Enable bit (Stack full/underflow will not cause Reset)
  23. #pragma config LVP = OFF        // Single-Supply ICSP Enable bit (Single-Supply ICSP disabled)
  24. #pragma config XINST = OFF      // Extended Instruction Set Enable bit (Instruction set extension and Indexed Addressing mode disabled (Legacy mode))
  25.  
  26. // CONFIG5L
  27. #pragma config CP0 = OFF        // Code Protection bit (Block 0 (000800-003FFFh) not code-protected)
  28. #pragma config CP1 = OFF        // Code Protection bit (Block 1 (004000-007FFFh) not code-protected)
  29. #pragma config CP2 = OFF        // Code Protection bit (Block 2 (008000-00BFFFh) not code-protected)
  30. #pragma config CP3 = OFF        // Code Protection bit (Block 3 (00C000-00FFFFh) not code-protected)
  31.  
  32. // CONFIG5H
  33. #pragma config CPB = OFF        // Boot Block Code Protection bit (Boot block (000000-0007FFh) not code-protected)
  34. #pragma config CPD = OFF        // Data EEPROM Code Protection bit (Data EEPROM not code-protected)
  35.  
  36. // CONFIG6L
  37. #pragma config WRT0 = OFF       // Write Protection bit (Block 0 (000800-003FFFh) not write-protected)
  38. #pragma config WRT1 = OFF       // Write Protection bit (Block 1 (004000-007FFFh) not write-protected)
  39. #pragma config WRT2 = OFF       // Write Protection bit (Block 2 (008000-00BFFFh) not write-protected)
  40. #pragma config WRT3 = OFF       // Write Protection bit (Block 3 (00C000-00FFFFh) not write-protected)
  41.  
  42. // CONFIG6H
  43. #pragma config WRTC = OFF       // Configuration Register Write Protection bit (Configuration registers (300000-3000FFh) not write-protected)
  44. #pragma config WRTB = OFF       // Boot Block Write Protection bit (Boot Block (000000-0007FFh) not write-protected)
  45. #pragma config WRTD = OFF       // Data EEPROM Write Protection bit (Data EEPROM not write-protected)
  46.  
  47. // CONFIG7L
  48. #pragma config EBTR0 = OFF      // Table Read Protection bit (Block 0 (000800-003FFFh) not protected from table reads executed in other blocks)
  49. #pragma config EBTR1 = OFF      // Table Read Protection bit (Block 1 (004000-007FFFh) not protected from table reads executed in other blocks)
  50. #pragma config EBTR2 = OFF      // Table Read Protection bit (Block 2 (008000-00BFFFh) not protected from table reads executed in other blocks)
  51. #pragma config EBTR3 = OFF      // Table Read Protection bit (Block 3 (00C000-00FFFFh) not protected from table reads executed in other blocks)
  52.  
  53. // CONFIG7H
  54. #pragma config EBTRB = OFF      // Boot Block Table Read Protection bit (Boot Block (000000-0007FFh) not protected from table reads executed in other blocks)
  55.  
  56. // #pragma config statements should precede project file includes.
  57. // Use project enums instead of #define for ON and OFF.
  58.  
  59. #include <xc.h>
  60. #include <stdio.h>
  61. #include <stdlib.h>
  62. #include <conio.h>
  63. #include <string.h>
  64. #include <math.h>
  65.  
  66. #define _XTAL_FREQ 20000000
  67.  
  68. #include "Usart.h"
  69.  
  70. /*Definicion de pines a utilizar*/
  71. #define servo1 LATBbits.LB0
  72. #define servo1_tris TRISBbits.TRISB0
  73. #define servo2 LATBbits.LB1
  74. #define servo2_tris TRISBbits.TRISB1
  75. #define servo3 LATBbits.LB2
  76. #define servo3_tris TRISBbits.TRISB2
  77. #define servo4 LATBbits.LB3
  78. #define servo4_tris TRISBbits.TRISB3
  79.  
  80.  
  81. #define pulsador1 PORTDbits.RD0
  82. #define pulsador1_tris TRISDbits.TRISD0
  83. #define pulsador2 PORTDbits.RD1
  84. #define pulsador2_tris TRISDbits.TRISD1
  85. #define pulsador3 PORTDbits.RD2
  86. #define pulsador3_tris TRISDbits.TRISD2
  87. #define pulsador4 PORTDbits.RD3
  88. #define pulsador4_tris TRISDbits.TRISD3
  89. #define pulsador5 PORTDbits.RD4
  90. #define pulsador5_tris TRISDbits.TRISD4
  91. #define pulsador6 PORTDbits.RD5
  92. #define pulsador6_tris TRISDbits.TRISD5
  93. #define pulsador7 PORTDbits.RD6
  94. #define pulsador7_tris TRISDbits.TRISD6
  95. #define pulsador8 PORTDbits.RD7
  96. #define pulsador8_tris TRISDbits.TRISD7
  97.  
  98.  
  99.  
  100.  
  101. /*Declaracion de variables a utilizar para el manejo de 4 servomotores de 0° a 180°*/
  102. unsigned char dato;
  103. unsigned char dato2;
  104. int servo;
  105. unsigned int pulsos_servo1 = 624;
  106. unsigned int pulsos_servo2 = 624;
  107. unsigned int pulsos_servo3 = 624;
  108. unsigned int pulsos_servo4 = 624;
  109. int i = 0;
  110.  
  111. void __interrupt(high_priority) usart(void)
  112. {
  113.     if(PIR1bits.RCIF == 1)//si la bandera se pone a 1
  114.     {
  115.         PIR1bits.RCIF = 0;
  116.         dato = RCREG;//a dato se le asigna el caracter recibido
  117.     }
  118. }
  119.  
  120.  
  121. /*Funcion de interrpcion para el timer 1 */
  122.  
  123.  
  124. void __interrupt(low_priority) servos(void)
  125. {
  126.     if (PIR1bits.TMR1IF)
  127.     {
  128.         switch (servo)
  129.         {
  130.             case 0: servo1 = 1 - servo1;
  131.                     if (servo1)
  132.                     {
  133.                         TMR1 = 65535 - pulsos_servo1;                  
  134.                     }
  135.                     else
  136.                     {
  137.                        TMR1 = 65535 - ((24999/4) - pulsos_servo1);
  138.                        servo++;
  139.                     }  
  140.             break;
  141.             case 1: servo2 = 1 - servo2;
  142.                     if(servo2)
  143.                     {
  144.                         TMR1 = 65535 - pulsos_servo2;
  145.                     }
  146.                     else
  147.                     {
  148.                        TMR1 = 65535 - ((24999/4) - pulsos_servo2);
  149.                        servo++;
  150.                     }
  151.             break;
  152.             case 2: servo3 = 1 - servo3;
  153.                     if(servo3)
  154.                     {
  155.                         TMR1 = 65535 - pulsos_servo3;
  156.                     }
  157.                     else
  158.                     {
  159.                         TMR1 = 65535 - ((24999/4) - pulsos_servo3);
  160.                         servo++;
  161.                     }
  162.             break;
  163.             case 3: servo4 = 1 - servo4;
  164.                     if(servo4)
  165.                     {
  166.                         TMR1 = 65535 - pulsos_servo4;
  167.                     }
  168.                     else
  169.                     {
  170.                         TMR1 = 65535 - ((24999/4) - pulsos_servo4);
  171.                         servo = 0;
  172.                     }
  173.             break;
  174.         }
  175.       }  
  176.    
  177.      PIR1bits.TMR1IF=0;      
  178. }
  179.  
  180. void main(void)
  181. {
  182. int i = 0;    
  183.  servo1_tris = 0;
  184.  servo2_tris = 0;
  185.  servo3_tris = 0;
  186.  servo4_tris = 0;
  187.  
  188. /*Inicializacion de comunicacion USART*/  
  189. Usart_int();
  190.  
  191.     //Configuracion interrupcion
  192.      
  193.     INTCONbits.GIE = 1; // Interrupcion Global
  194.     INTCONbits.PEIE = 1; // Interrupcion por periferico
  195.     RCONbits.IPEN = 1;     //habilito interrupcion de alta y baja prioridad
  196.     //Configurar timer
  197.      
  198.     T1CONbits.T1CKPS = 0b10; // Divisor 4
  199.     T1CONbits.TMR1CS = 0b00;// Fosc /4
  200.     T1CONbits.T1OSCEN = 0; // Oscilador LP deshabilitao
  201.     T1CONbits.nT1SYNC = 1; // No sinconia  
  202.     T1CONbits.TMR1ON = 1; // Encender el timer
  203.    
  204.     PIE1bits.TMR1IE = 1; //Hanilita la interrupcion por timer
  205.     PIR1bits.TMR1IF = 0; //Limpia la bandera del timer 1
  206.     IPR1bits.TMR1IP = 0;   //timer1 baja prioridad
  207.    
  208.     /*Configuracion de las interrupciones para la recepcion de la Usart*/
  209.  
  210.     PIE1bits.RCIE = 1;
  211.     IPR1bits.RCIP = 1;
  212.      
  213.     do
  214.     {
  215.        
  216.       /* if(servo == 0)
  217.         {
  218.            if(pulsador1 == 1)
  219.            {
  220.                __delay_ms(20);
  221.             if(pulsos_servo1 < 2499)
  222.                 {
  223.                     pulsos_servo1 = pulsos_servo1 + 25;
  224.                 }
  225.            }          
  226.            if(pulsador2 == 1)
  227.            {
  228.                __delay_ms(20);
  229.                 if(pulsos_servo1 > 624)
  230.                 {
  231.                     pulsos_servo1 = pulsos_servo1 - 25;
  232.                 }
  233.            }
  234.        }
  235.         if(servo == 1)
  236.         {
  237.             if(pulsador3 == 1)
  238.             {  
  239.                 __delay_ms(20);
  240.                 if(pulsos_servo2 < 2499)
  241.                 {
  242.                  pulsos_servo2 = pulsos_servo2 + 25;
  243.                 }
  244.                
  245.             }
  246.             if(pulsador4 == 1)
  247.             {
  248.                 __delay_ms(20);
  249.                 if(pulsos_servo2 > 624)
  250.                 {
  251.                 pulsos_servo2 = pulsos_servo2 - 25;  
  252.                 }
  253.             }
  254.         }
  255.         if(servo == 2)
  256.         {
  257.             if(pulsador5 == 1)
  258.             {
  259.                 __delay_ms(20);
  260.                 if(pulsos_servo3 < 2499)
  261.                 {
  262.                  pulsos_servo3 = pulsos_servo3 + 25;
  263.                 }
  264.             }
  265.             if(pulsador6 == 1)
  266.             {
  267.                 __delay_ms(20);
  268.                 if(pulsos_servo3 > 624)
  269.                 {
  270.                 pulsos_servo3 = pulsos_servo3 - 25;  
  271.                 }
  272.             }
  273.         }
  274.         if(servo == 3)
  275.         {
  276.             if(pulsador7 == 1)
  277.             {
  278.                 __delay_ms(20);
  279.                 if(pulsos_servo4 < 2499)
  280.                 {
  281.                  pulsos_servo4 = pulsos_servo4 + 25;
  282.                 }
  283.             }
  284.             if(pulsador8 == 1)
  285.             {
  286.                 __delay_ms(20);
  287.                 if(pulsos_servo4 > 624)
  288.                 {
  289.                 pulsos_servo4 = pulsos_servo4 - 25;  
  290.                 }    
  291.             }
  292.         }  
  293.         */
  294.        if(servo == 0)
  295.         {
  296.            if(dato == 'A')
  297.            {
  298.                 if(pulsos_servo1 < 2499)
  299.                 {
  300.                     pulsos_servo1 = pulsos_servo1 + 25;
  301.                 }  
  302.            }
  303.            if(dato == 'B')
  304.            {              
  305.                 if(pulsos_servo1 > 624)
  306.                 {
  307.                     pulsos_servo1 = pulsos_servo1 - 25;
  308.                 }
  309.            }
  310.        }
  311.         if(servo == 1)
  312.         {
  313.             if(dato == 'E')
  314.             {
  315.                 if(pulsos_servo2 < 2499)
  316.                 {
  317.                  pulsos_servo2 = pulsos_servo2 + 25;
  318.                 }
  319.             }
  320.             if(dato == 'F')
  321.             {                
  322.                 if(pulsos_servo2 > 624)
  323.                 {
  324.                 pulsos_servo2 = pulsos_servo2 - 25;  
  325.                 }                              
  326.             }
  327.         }
  328.         if(servo == 2)
  329.         {
  330.             if(dato == 'C')
  331.             {                
  332.                 if(pulsos_servo3 < 2499)
  333.                 {
  334.                  pulsos_servo3 = pulsos_servo3 + 25;
  335.                 }
  336.                
  337.             }
  338.             if(dato == 'D')
  339.             {              
  340.                 if(pulsos_servo3 > 624)
  341.                 {
  342.                 pulsos_servo3 = pulsos_servo3 - 25;  
  343.                 }                
  344.             }
  345.         }
  346.         if(servo == 3)
  347.         {
  348.             if(dato == 'G')
  349.             {                
  350.                 if(pulsos_servo4 < 2499)
  351.                 {
  352.                  pulsos_servo4 = pulsos_servo4 + 25;
  353.                 }              
  354.             }
  355.             if(dato == 'H')
  356.             {                
  357.                 if(pulsos_servo4 > 624)
  358.                 {
  359.                 pulsos_servo4 = pulsos_servo4 - 25;  
  360.                 }                  
  361.             }
  362.         }  
  363.      
  364.     }while(1);
  365. }
  366.  
  367. #ifndef USART_H
  368. #define USART_H
  369.  
  370. void Usart_int();//función para iniciar el USART PIC asíncron, 8 bits, 9600 baudios
  371. unsigned char Usart_read();//función para la recepción de caracteres
  372. void Usart_sent_character(unsigned char);//función para la transmisión de caracteres
  373. void Usart_sent_string(char*);//función para la transmisión de cadenas de caracteres
  374.  
  375. /*
  376. Inicialización del módulo USART PIC modo asíncrono
  377. en una función, a 8bits,a 9600 baudios */
  378. void Usart_int()
  379. {
  380.      TRISCbits.TRISC7 = 1;//pin RX como una entrada digital
  381.      TRISCbits.TRISC6 = 0;//pin TX como una salida digital
  382.      TXSTAbits.CSRC = 0;//modo asincronico
  383.      TXSTAbits.TX9 = 0;//selecion modo de transimicion 8bit.
  384.      TXSTAbits.TXEN = 1;//se habilita la transimcion
  385.      TXSTAbits.SYNC = 0;//la transmicion sera asincronica
  386.      TXSTAbits.SENDB = 0;//no habilito el control por hardware
  387.      TXSTAbits.BRGH = 1;//modo de transmicion de alta velocidad en 1
  388.      TXSTAbits.TRMT = 1;//se lo pondrá a 1 porque se está iniciando y tendría que estar vacío.
  389.      TXSTAbits.TX9D = 0;//el bit de paridad en la transmisión a 8 bits no influye y se lo pondrá a 0.
  390.      RCSTAbits.SPEN = 1;//se pondrá a 1 para habilitar el uso del módulo USART PIC.
  391.      RCSTAbits.RX9 = 0;//la recepción para que sea a 8 bits.
  392.      RCSTAbits.SREN = 0;//modo asincronico
  393.      RCSTAbits.CREN = 1;//se habilita la recepcion
  394.      RCSTAbits.ADDEN = 0;//recepción será a 8 bit.
  395.      RCSTAbits.FERR = 0;//este bit trabaja automáticamente cuando se pone a 1 indica que se ha recibido un dato no válido.
  396.      RCSTAbits.OERR = 0;//este bit trabaja automáticamente cuando se pone a 1 indica que se ha producido un error por sobreescritura de algún dato recibido
  397.      RCSTAbits.RX9D = 0;////el bit de paridad en la transmisión a 8 bits no influye y se lo pondrá a 0.
  398.      SPBRG = 129;//para una velocidad de 9600baudios con un oscilador de 20Mhz*/
  399. }
  400.  
  401. /*
  402. Recepción de datos del módulo USART PIC modo asíncrono
  403.  
  404. unsigned char Usart_read()
  405. {
  406.     if(PIR1bits.RCIF == 1)//si el bit5 del registro PIR1 se ha puesto a 1
  407.     {
  408.     return RCREG;//devuelve el dato almacenado en el registro RCREG
  409.     }
  410.     else
  411.     {
  412.         return 0;
  413.     }
  414. }*/
  415.  
  416. /*
  417. Transmisión de datos del módulo USART PIC modo asíncrono
  418. */
  419. void Usart_sent_character(unsigned char chtr)
  420. {
  421.     while(TXSTAbits.TRMT == 0);// mientras el registro TSR esté lleno espera
  422.         TXREG = chtr;//cuando el el registro TSR está vacio se envia el caracter
  423. }
  424.  
  425.  
  426. /*
  427. Transmisión de cadenas de caracteres con el módulo USART PIC modo asíncrono
  428. */
  429. void Usart_sent_string(char* cadena)//cadena de caracteres de tipo char
  430. {
  431.     while(*cadena !=0x00)//mientras el último valor de la cadena sea diferente de el caracter nulo
  432.     {                    
  433.     Usart_sent_character(*cadena);//transmite los caracteres de cadena
  434.     cadena++;//incrementa la ubicación de los caracteres en cadena para enviar el siguiente caracter de cadena
  435.     }
  436. }    
  437.  
  438. #endif  /* USART_H */
  439.  
  440.