Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
DMX.cpp
00001 #include "DMX.h" 00002 00003 DMX::DMX (PinName p_tx, PinName p_rx) : _dmx(p_tx, p_rx) 00004 { 00005 uint32_t I32_Teller; 00006 00007 for (I32_Teller = 0; I32_Teller < 512; I32_Teller++) 00008 { 00009 I8_Data[I32_Teller] = 0; 00010 } 00011 00012 ZendStatus = STOP; 00013 if (p_tx == p9) 00014 { 00015 _uart = LPC_UART3; 00016 NVIC_SetPriority(UART3_IRQn, 1); 00017 } 00018 else if (p_tx == p13) 00019 { 00020 _uart = (LPC_UART_TypeDef*)LPC_UART1; 00021 NVIC_SetPriority(UART1_IRQn, 1); 00022 } 00023 else if (p_tx == p28) 00024 { 00025 _uart = LPC_UART2; 00026 NVIC_SetPriority(UART2_IRQn, 1); 00027 } 00028 _dmx.baud(250000); 00029 _dmx.format(8, Serial::None, 2); // 8 databits, 2 stopbits 00030 00031 } 00032 00033 void DMX::V_PutData (int addr, int data) { 00034 if ((addr < 0) or (addr >= 512)) 00035 { 00036 return; 00037 } 00038 I8_Data[addr] = data; 00039 } 00040 00041 void DMX::V_InitTimer() 00042 { 00043 switch (ZendStatus) 00044 { 00045 case BEGIN: 00046 { 00047 T_Timer.detach(); 00048 _uart->LCR |= (1 << 6); 00049 ZendStatus = BREAK; 00050 T_Timer.attach_us(this, &DMX::V_InitTimer, BREAK); 00051 break; 00052 } 00053 00054 case BREAK: 00055 { 00056 T_Timer.detach(); 00057 _uart->LCR &= ~(1 << 6); 00058 ZendStatus = MAB; 00059 T_Timer.attach_us(this, &DMX::V_InitTimer, MAB); 00060 break; 00061 } 00062 case MAB: 00063 { 00064 T_Timer.detach(); 00065 I32_m_Addr = 0; 00066 ZendStatus = DATA; 00067 _dmx.attach(this, &DMX::V_InitSend, Serial::TxIrq); 00068 while(!(_uart->LSR & (1<<5))); 00069 _uart->THR = 0; //startcode 0 => Algemene startcode voor dimmer (eigenlijk alles dus wat gewone dmx betreft) 00070 break; 00071 } 00072 default: 00073 { 00074 printf("Error: DMX StATUS NIET GEKEND"); 00075 break; 00076 } 00077 } 00078 } 00079 00080 void DMX::V_InitSend() 00081 { 00082 if (ZendStatus == DATA) 00083 { 00084 if (I32_m_Addr < 512) 00085 { 00086 _uart->THR = I8_Data[I32_m_Addr]; 00087 I32_m_Addr++; 00088 } 00089 else 00090 { 00091 _dmx.attach(0, Serial::TxIrq); //TxIrq Interrupt zetten om serieel te verzenden :) 00092 ZendStatus = BEGIN; 00093 T_Timer.attach_us(this, &DMX::V_InitTimer, 10); 00094 } 00095 } 00096 } 00097 00098 void DMX::V_Start() 00099 { 00100 if (ZendStatus == STOP) 00101 { 00102 ZendStatus = BEGIN; 00103 T_Timer.attach_us(this, &DMX::V_InitTimer, 10); 00104 } 00105 } 00106 00107 void DMX::V_Stop () 00108 { 00109 _dmx.attach(NULL, Serial::TxIrq); //dmx stoppen doorinterrupt te laten verwijzen naar NULL-pointer 00110 T_Timer.detach(); 00111 ZendStatus = STOP; 00112 }
Generated on Thu Jul 21 2022 22:01:42 by
1.7.2