Advertisement
Guest User

PIC16F1827 EUSART communication

a guest
May 5th, 2018
209
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.06 KB | None | 0 0
  1. //****************************
  2. // EUSART Define
  3. //****************************
  4. // TXSTA, RCSTA, BAUDCON
  5. #define EUSART_MODETRANSMIT 0x00                // Transmit off, async, low speed
  6. #define EUSART_MODERECEIVE 0x80                 // SerialPort on, 8bit, receive off
  7. #define EUSART_MODEBAUDRATE 0x00                // Non-inverted data, 8-bit baud rate
  8.  
  9. // Baud rate generator (9600b/s)
  10. #define BRGHIGH 0x01                            // Baud rate generator High = 1h
  11. #define BRGLOW 25                               // Baud rate generator Low = 25d
  12.  
  13. // Transmission
  14. #define EUSART_INTTRANSMITFLAG PIR1bits.TXIF    // Flag TXREG empty/full
  15. #define EUSART_TSREGFLAG TXSTAbits.TRMT         // Flag transmit ready
  16.  
  17. // Reception
  18. #define EUSART_INTRECEIVE PIE1bits.RCIE         // Enable RCIF interruption
  19. #define EUSART_INTRECEIVEFLAG PIR1bits.RCIF     // Flag RCREG have new data
  20.  
  21. #define MSGMAXSIZE 0x08                         // Max size (in byte) RS-232 can save
  22.  
  23. // Register bits define
  24. #define EUSART_CREN RCSTAbits.CREN              // Enable continuous reception
  25. #define EUSART_OERR RCSTAbits.OERR              // Flag Overrun error
  26. #define EUSART_TXEN TXSTAbits.TXEN              // Enable transmission
  27. #define EUSART_SPEN RCSTAbits.SPEN              // Enable buffer
  28. #define EUSART_SCKP BAUDCONbits.SCKP            // Data inverted or non-inverted
  29.  
  30. // Pins
  31. #define EUSART_IOPINTX TRISBbits.TRISB5         // IO TX
  32. #define EUSART_IOPINRX TRISBbits.TRISB1         // IO RX
  33.  
  34. // Pins 2
  35. #define INITGIE INTCONbits.GIE                  // Enable General interuption
  36. #define INITPEIE INTCONbits.PEIE                // Enable Peripheral interrupt
  37.  
  38. //****************************
  39. // EUSART Initialization
  40. //****************************
  41. void EUSART_Initialize(void)                    // Initialisation de l'EUSART
  42. {
  43.     RCSTA = EUSART_MODERECEIVE;                 // Receive control register
  44.     TXSTA = EUSART_MODETRANSMIT;                // Transmit control register
  45.     BAUDCON = EUSART_MODEBAUDRATE;              // Baud rate generator control register
  46.     SPBRGH = BRGHIGH;                           // Baud rate generator register High
  47.     SPBRGL = BRGLOW;                            // Baud rate generator register Low
  48.     APFCON0bits.RXDTSEL = 0;                    // Pin des data = 0:RB1 , 1:RB2
  49.     APFCON1bits.TXCKSEL = 1;                    // Pin de la clock = 0:RB2 , 1:RB5
  50. }
  51.  
  52. //****************************
  53. // Ecoute les message en RS-232
  54. //****************************
  55. void Receive(void)                              // Reception de données
  56. {
  57.     EUSART_IOPINRX = 1;                         // Met la pin en entrée pour la reception
  58.     EUSART_INTRECEIVE = 1;                      // Enable Reception interruption
  59.     EUSART_CREN = 1;                            // Activate continuous reception
  60.    
  61.     while(!Flags1.ReceiveOFF)                   // Tant que données reçues < 8
  62.     {                                           // Blink LED @ 4Hz
  63.         __delay_ms(125);
  64.         PERIPHERAL_LED = (!PERIPHERAL_LED);
  65.        
  66.         if(EUSART_OERR)                         // Si Overrunn error
  67.         {
  68.             EUSART_CREN = 0;                    // CREN = 0
  69.             __delay_ms(1);
  70.             EUSART_CREN = 1;                    // CREN = 1
  71.         }
  72.     }
  73.    
  74.     PERIPHERAL_LED = 1;                         // Eteint la led
  75. }
  76.  
  77. //****************************
  78. // Transmet a Message
  79. //****************************
  80. void TransmitMsg(unsigned char Msg[])           // Transmet un message de taille ilimitée
  81. {
  82.     EUSART_IOPINTX = 0;                         // Pins en sortie
  83.     EUSART_TXEN = 1;                            // Enable transmission
  84.    
  85.     unsigned char Counter;
  86.     for (Counter = 0; Msg[Counter] != 0; Counter++) {
  87.         while(!EUSART_INTTRANSMITFLAG);         // Tant que TXREG est plein
  88.         __delay_ms(2);                          // Délai anti-parasites
  89.         TXREG = (Msg[Counter] ^ 0xFF);          // Transmet le caractère du tableau inversé
  90.     }
  91.     while(!EUSART_TSREGFLAG);                   // Attendre qu'une nouvelle transmission est prête
  92.    
  93.     EUSART_TXEN = 0;                            // Disable transmission
  94.     EUSART_IOPINTX = 1;                         // Pins en entrée
  95.     __delay_ms(5);                              // Délai anti-parasites
  96. }
  97.  
  98.  
  99. void interrupt ISR(void)
  100. {
  101. //****************************
  102. // Interruption a la reception de message
  103. //****************************
  104.     if(EUSART_INTRECEIVE && EUSART_INTRECEIVEFLAG)  // Interuption Data received
  105.     {
  106.         EUSART_INTRECEIVE = 0;                  // Reception interruption off
  107.         unsigned char Temp = RCREG;             // Copie les données reçues dans une variable temporaire
  108.         DataRECEIVED[DataCounter] = (Temp^0xFF);// Place les données reçues inversées dans un tableau
  109.        
  110.         if(DataRECEIVED[DataCounter] == 0x00)   // Test valeur reçue est nulle
  111.         {
  112.             DataCounter--;                      // Décrémente l'addresse du tableau pour supprimer cette donnée
  113.         } else {
  114.             Flags1.DataRC = 1;                  // Si data reçue pas nulle, set flag Data received
  115.         }
  116.        
  117.         DataCounter++;                          // Incrémente l'adresse du tableau de 1
  118.        
  119.                                                 // Test si c'est le tableau à 8 bytes et que une valeur n'est pas nulle
  120.         if((DataCounter >= 8) && Flags1.DataRC == 1)
  121.         {
  122.             EUSART_IOPINRX = 0;                 // Met la pin en sortie pour utiliser l'afficheur LCD
  123.             EUSART_SPEN = 0;                    // Désactive le buffer, et donc la réception
  124.             __delay_ms(10);                     // Délai pour éviter la transmission parasite au LCD
  125.             LCD_Clear();                        // Efface l'écran
  126.             LCD_WriteMessage(RECEIVED);         // Affiche message quand données reçues
  127.             LCD_SetEntry(1,0);                  // Se déplacer à la 2e ligne
  128.             LCD_WriteMessage(DataRECEIVED);     // Afficher le message reçu
  129.             Flags1.ReceiveOFF = 1;              // Termine la réception de données
  130.         }
  131.        
  132.         EUSART_INTRECEIVE = 1;                  // Reception interruption on
  133.     }
  134. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement