DMX Empfang mit dem 8051, C und Assembler


Hier ein Codebeispiel, welches mit SDCC compiliert werden kann. Die Parameter für den Compiler sind im Code zu finden.
Das Beispiel sollte auf jedem 8051 Mikrocontroller funktionieren. Da der 8051 keine direkte Framing Error Detection besitzt, wird das serielle Interface in den Serial port Mode 2 versetzt und das 9. Bit abgefragt um einen Break zu erkennen.

Das Tesprogramm empfängt 8 Kanäle und schaltet bei einem DMX Wert >127 die zugehörigen Bits des externen XMEM-Interfaces an der Adresse 0x0000h.

Download Beispiel für SDCC
Download Beispiel für Keil

Beispiel ("C" SDCC):
  1. /***************************************************************************
  2. Copyright: Manuel Steins
  3. known Problems: none
  4. Description: 512 Ch. DMX Empfang
  5. MCU: 8051
  6. CLK: 16MHz
  7. Compiler: SDCC
  8. Parameter:
  9. --code-loc 0x0000 --stack-auto --vc --iram-size 128 -8051-
  10. --code-loc 0x0000 --stack-auto --vc --iram-size 256 -8052-
  11. ***************************************************************************/
  12.  
  13. #include "8051.h"
  14.  
  15. #define channels 8 // Kanäle
  16. #define startadresse 2 // Startadresse
  17.  
  18. __idata volatile unsigned char dmx_data[channels]; // Array mit Werten
  19.  
  20. volatile unsigned int addr;
  21.  
  22. unsigned char a; // Testprog
  23. __xdata __at 0x0000 unsigned char b; // Testprog extern Ram 0x0000
  24.  
  25.  
  26. //---------------------- UART Interrupt -----------------------------------
  27.  
  28. void serial0 (void) __interrupt 4{
  29. static signed int rx_count; // signed!!!
  30. static __bit dmx_valid; // Startbit
  31. static __bit dmx_break; // Break
  32. static unsigned char temp;
  33.  
  34. temp = SBUF;
  35. RI = 0; // Interrupt Flag
  36.  
  37. if (RB8 == 1){ // Brauchbare Daten empfangen
  38. if (dmx_break == 1){
  39. if (dmx_valid == 0){ // 1. Byte nach break
  40. if (temp == 0x00){ // Freigabe
  41. dmx_valid = 1;
  42. }
  43. else { // kein Startbit
  44. dmx_break = 0;
  45. }
  46. }
  47. else{
  48. rx_count++;
  49. if (rx_count == channels){ // alle Kanäle empfangen?
  50. dmx_break = 0; // Pause
  51. }
  52. else if (rx_count >= 0){ // Startadresse erreicht?
  53. dmx_data[rx_count] = temp;
  54. }
  55. }
  56. }
  57. }
  58. else{
  59. dmx_valid = 0;
  60. dmx_break = 1;
  61. rx_count = -addr;
  62. }
  63. }
  64.  
  65. //-------------------------- Main Programm -------------------------------
  66.  
  67. void main (void){
  68.  
  69. PCON = 0x00; // 64tclk 250 Baud 16MHz
  70. SCON = 0x98; // Serial Port Mode 2 10011000
  71. IE |= 0x90; // Enable RX I
  72. addr = startadresse; // Startadresse einlesen
  73.  
  74. while(1){
  75. a = ((0x80&dmx_data[0])>>7);
  76. a |= ((0x80&dmx_data[1])>>6);
  77. a |= ((0x80&dmx_data[2])>>5);
  78. a |= ((0x80&dmx_data[3])>>4);
  79. a |= ((0x80&dmx_data[4])>>3);
  80. a |= ((0x80&dmx_data[5])>>2);
  81. a |= ((0x80&dmx_data[6])>>1);
  82. a |= ((0x80&dmx_data[7]));
  83. b = a;
  84. }
  85. }
  86.  




[nach oben]