dmx_slave.c 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248
  1. /*********************************************************************
  2. *
  3. * DMX library for Fraise pic18f device
  4. *
  5. *********************************************************************
  6. * Author Date Comment
  7. *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  8. * Antoine Rousseau may 2012 Original.
  9. ********************************************************************/
  10. /*
  11. # This program is free software; you can redistribute it and/or
  12. # modify it under the terms of the GNU General Public License
  13. # as published by the Free Software Foundation; either version 2
  14. # of the License, or (at your option) any later version.
  15. #
  16. # This program is distributed in the hope that it will be useful,
  17. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  18. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  19. # GNU General Public License for more details.
  20. # You should have received a copy of the GNU General Public License
  21. # along with this program; if not, write to the Free Software
  22. # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
  23. # MA 02110-1301, USA.
  24. */
  25. #include <string.h>
  26. #include <config.h>
  27. #include <core.h>
  28. #include <dmx_slave.h>
  29. //serial port:
  30. #if DMX_SLAVE_UART_PORT==1
  31. #define SPBRGx SPBRG1
  32. #define SPBRGHx SPBRGH1
  33. #define BAUDCONx BAUDCON1
  34. #define BAUDCONxbits BAUDCON1bits
  35. #define RCREGx RCREG1
  36. #define RCSTAx RCSTA1
  37. #define RCSTAxbits RCSTA1bits
  38. #define TXREGx TXREG1
  39. #define TXSTAx TXSTA1
  40. #define TXSTAxbits TXSTA1bits
  41. #define RCxIF PIR1bits.RC1IF
  42. #define TXxIF PIR1bits.TX1IF
  43. #define RCxIE PIE1bits.RC1IE
  44. #define TXxIE PIE1bits.TX1IE
  45. #define RCxIP IPR1bits.RC1IP
  46. #define TXxIP IPR1bits.TX1IP
  47. #else
  48. #define SPBRGx SPBRG2
  49. #define SPBRGHx SPBRGH2
  50. #define BAUDCONx BAUDCON2
  51. #define BAUDCONxbits BAUDCON2bits
  52. #define RCREGx RCREG2
  53. #define RCSTAx RCSTA2
  54. #define RCSTAxbits RCSTA2bits
  55. #define TXREGx TXREG2
  56. #define TXSTAx TXSTA2
  57. #define TXSTAxbits TXSTA2bits
  58. #define RCxIF PIR3bits.RC2IF
  59. #define TXxIF PIR3bits.TX2IF
  60. #define RCxIE PIE3bits.RC2IE
  61. #define TXxIE PIE3bits.TX2IE
  62. #define RCxIP IPR3bits.RC2IP
  63. #define TXxIP IPR3bits.TX2IP
  64. #endif
  65. //(1 port equ)
  66. #ifndef BAUDCON1
  67. #define SPBRG1 SPBRG
  68. #define SPBRGH1 SPBRGH
  69. #define BAUDCON1 BAUDCON
  70. #define BAUDCON1bits BAUDCONbits
  71. #define RCREG1 RCREG
  72. #define RCSTA1 RCSTA
  73. #define RCSTA1bits RCSTAbits
  74. #define TXREG1 TXREG
  75. #define TXSTA1 TXSTA
  76. #define TXSTA1bits TXSTAbits
  77. #define RC1IF RCIF
  78. #define TX1IF TXIF
  79. #define RC1IE RCIE
  80. #define TX1IE TXIE
  81. #define RC1IP RCIP
  82. #define TX1IP TXIP
  83. #endif
  84. static unsigned char DMXRegisters[DMX_SLAVE_NBCHAN];
  85. #define STATE_NONE -1
  86. #define STATE_BREAKRCVD 0
  87. #define STATE_DMX 1
  88. static char State = STATE_NONE;
  89. static unsigned int DMXPointer = 0;
  90. static unsigned int MaxReceivedChannel;
  91. char DMXSlaveHadInterrupt = 0;
  92. void Set250kB(void)
  93. {
  94. //baud rate : br=FOSC/[4 (n+1)] : n=FOSC/(4*br)-1 : br=250kHz, n=FOSC/1000000 - 1
  95. #define BRGHL (FOSC/1000000 - 1)
  96. SPBRGHx=BRGHL/256;
  97. SPBRGx=BRGHL%256;
  98. }
  99. /*void Set96kB(void)
  100. {
  101. //baud rate : br=FOSC/[4 (n+1)] : n=FOSC/(4*br)-1 : br=96kHz, n=FOSC/384000 - 1
  102. #define BRGHL96 (FOSC/384000 - 1)
  103. SPBRGHx=BRGHL96/256;
  104. SPBRGx=BRGHL96%256;
  105. }*/
  106. static void Serial_Init_Receiver() {
  107. WREG=RCREGx;
  108. __asm nop __endasm ;
  109. WREG=RCREGx;
  110. RCSTAxbits.CREN = 0;
  111. RCSTAxbits.CREN = 1;
  112. RCSTAxbits.ADDEN = 0;
  113. RCxIE = 1;
  114. TXxIE = 0;
  115. }
  116. void DMXSlaveInit(void)
  117. {
  118. int i;
  119. for(i=0;i<DMX_SLAVE_NBCHAN;i++) DMXRegisters[i]=0; //clear all channels
  120. //DigitalSet(DMX_UART_PIN);
  121. //SetPinDigiOut(DMX_UART_PIN);
  122. BAUDCONxbits.BRG16=1;
  123. Set250kB();
  124. Serial_Init_Receiver();
  125. TXSTAxbits.TXEN=1;
  126. TXSTAxbits.BRGH=1;
  127. RCSTAxbits.RX9 = 1;
  128. RCxIP = 0; // low interrupt priority
  129. RCSTAxbits.SPEN=1;
  130. }
  131. unsigned char DMXSlaveGet(unsigned int channel)
  132. {
  133. if(channel==0) return 0;
  134. return DMXRegisters[channel];
  135. }
  136. void DMXSlaveISR()
  137. {
  138. unsigned char Byte;
  139. if(!RCxIF) return;
  140. /* WREG=RCREGx;
  141. __asm nop __endasm ;
  142. WREG=RCREGx;
  143. RCSTAxbits.SPEN=0;
  144. RCSTAxbits.SPEN=1;*/
  145. /*RCxIE = 0;
  146. return;*/
  147. if(RCSTAxbits.OERR){ // overrun error
  148. State=STATE_NONE;
  149. //Byte=RCREG;Byte=RCREG;
  150. WREG=RCREGx;
  151. __asm nop __endasm ;
  152. WREG=RCREGx;
  153. RCSTAxbits.CREN=0;
  154. RCSTAxbits.CREN=1;
  155. return;
  156. }
  157. if(RCSTAxbits.FERR){ // framing error -> interpreted as a break
  158. /*if(State==STATE_BREAKRCVD) {
  159. DMXSlaveHadInterrupt = 1;
  160. if(TXxIF) TXREGx = 0b01010101;
  161. }*/
  162. State=STATE_BREAKRCVD;
  163. WREG=RCREGx;
  164. //RCSTAxbits.CREN=0;
  165. while(!DMX_SLAVE_UART_PIN);
  166. //RCSTAxbits.CREN=1;
  167. if(TXxIF) TXREGx = 0;
  168. WREG=RCREGx;
  169. /*WREG=RCREGx;
  170. __asm nop __endasm ;
  171. WREG=RCREGx;*/
  172. /*RCSTAxbits.CREN=0;
  173. RCSTAxbits.SPEN=0;
  174. RCSTAxbits.SPEN=1;
  175. RCSTAxbits.CREN=1;*/
  176. /*WREG=RCREGx;
  177. __asm nop __endasm ;
  178. WREG=RCREGx;
  179. RCSTAxbits.CREN=0;
  180. RCSTAxbits.CREN=1;*/
  181. return;
  182. }
  183. if(!RCSTAxbits.RX9D){
  184. State=STATE_NONE;
  185. WREG=RCREGx;
  186. return;
  187. }
  188. Byte = RCREGx;
  189. if(State==STATE_BREAKRCVD){
  190. if(Byte==0){
  191. State=STATE_DMX;
  192. DMXPointer=0;
  193. if(TXxIF) TXREGx = 1;
  194. DMXSlaveHadInterrupt = 1;
  195. }
  196. else {
  197. State=STATE_NONE;
  198. if(TXxIF) TXREGx = 255;
  199. }
  200. return;
  201. }
  202. if(State==STATE_DMX){
  203. if(TXxIF) TXREGx = 2;
  204. DMXPointer++;
  205. if(MaxReceivedChannel < DMXPointer) MaxReceivedChannel = DMXPointer;
  206. if(DMXPointer < DMX_SLAVE_NBCHAN) DMXRegisters[DMXPointer] = Byte;
  207. }
  208. //DMXSlaveHadInterrupt = 1;
  209. }
  210. unsigned int DMXSlaveGetMaxReceivedChannel()
  211. {
  212. unsigned int tmp = MaxReceivedChannel;
  213. RCxIE = 0; //disable RX interrupt
  214. MaxReceivedChannel = 0;
  215. RCxIE = 1;//enable RX interrupt
  216. return tmp;
  217. }