Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Based on Hendrik Hoelschers dmx code from http://www.hoelscher-hi.de/hendrik/
- // Optimized for Arduino Nano
- #include <avr/io.h>
- #include <stdint.h>
- #include <avr/interrupt.h>
- // ********************* local definitions *********************
- #define DMX_CHANNELS (6) //Define the number of DMX values to store
- enum {IDLE, BREAK, STARTB, STARTADR}; //DMX states
- uint8_t gDmxState;
- uint8_t *gDmxPnt;
- uint16_t DmxCount;
- int addr1dummy;
- int addr1;
- int addr2;
- int addr3;
- int addr4;
- int addr5;
- int addr6;
- int addr7;
- int addr8;
- int addr9;
- bool bStartDone;
- uint8_t DmxField[DMX_CHANNELS]; //array of DMX vals (raw)
- uint16_t DmxAddress; //start address
- int chOut1 = 3;
- int chOut2 = 5;
- int chOut3 = 6;
- int chOut4 = 9;
- int chOut5 = 10;
- int chOut6 = 11;
- int addrPin1 = A0;
- int addrPin2 = A1;
- int addrPin3 = A2;
- int addrPin4 = A3;
- int addrPin5 = A4;
- int addrPin6 = A5;
- int addrPin7 = 7;
- int addrPin8 = 8;
- int addrPin9 = 12;
- void setup() // run once, when the sketch starts
- {
- // Die Pins 3, 5, 6, 9, 10 und 11 können PWM ausgeben, diese werden als Outputs verwendet.
- pinMode(chOut1, OUTPUT);
- pinMode(chOut2, OUTPUT);
- pinMode(chOut3, OUTPUT);
- pinMode(chOut4, OUTPUT);
- pinMode(chOut5, OUTPUT);
- pinMode(chOut6, OUTPUT);
- // Nachfolgende Pins werden für die DIP-Switches verwendet.
- pinMode(A0, INPUT);
- pinMode(A1, INPUT);
- pinMode(A2, INPUT);
- pinMode(A3, INPUT);
- pinMode(A4, INPUT);
- pinMode(A5, INPUT);
- pinMode(7, INPUT);
- pinMode(8, INPUT);
- pinMode(12, INPUT);
- // Pullups setzen auf den DIP-Switch-Inputs.
- digitalWrite(A0, HIGH);
- digitalWrite(A1, HIGH);
- digitalWrite(A2, HIGH);
- digitalWrite(A3, HIGH);
- digitalWrite(A4, HIGH);
- digitalWrite(A5, HIGH);
- digitalWrite(7, HIGH);
- digitalWrite(8, HIGH);
- digitalWrite(12, HIGH);
- // Disable interrupts
- cli();
- // 250kbps baud - only works for 16MHz clock frequency. See the ATMega8 datasheet if you are using a different clock speed
- UBRR0H = 0;
- UBRR0L = 3;
- // enable rx and interrupt on complete reception of a byte
- UCSR0B = (1<<RXEN0)|(1<<RXCIE0);
- UCSR0C = (1<<UMSEL01)|(3<<UCSZ00)|(1<<USBS0);
- // Enable interrupts
- sei();
- gDmxState= IDLE;
- uint8_t i;
- for (i=0; i<DMX_CHANNELS; i++)
- {
- DmxField[i]= 0;
- }
- delay(2000);
- bStartDone = 1;
- }
- void loop() // run over and over again
- {
- if (bStartDone == 1) // Programm erst nach 2 Sekunden ausführen (Delay in Setup-Routine vorgegeben), um Flicker beim Einschalten zu vermeiden
- {
- if (digitalRead(addrPin1) == 0) {addr1 = 1;} else {addr1 = 0;}
- if (digitalRead(addrPin2) == 0) {addr2 = 2;} else {addr2 = 0;}
- if (digitalRead(addrPin3) == 0) {addr3 = 4;} else {addr3 = 0;}
- if (digitalRead(addrPin4) == 0) {addr4 = 8;} else {addr4 = 0;}
- if (digitalRead(addrPin5) == 0) {addr5 = 16;} else {addr5 = 0;}
- if (digitalRead(addrPin6) == 0) {addr6 = 32;} else {addr6 = 0;}
- if (digitalRead(addrPin7) == 0) {addr7 = 64;} else {addr7 = 0;}
- if (digitalRead(addrPin8) == 0) {addr8 = 128;} else {addr8 = 0;}
- if (digitalRead(addrPin9) == 0) {addr9 = 256;} else {addr9 = 0;}
- if ((addr1 + addr2 + addr3 + addr4 + addr5 + addr6 + addr7 + addr8 + addr9) == 0) {addr1dummy = 1;} else {addr1dummy = 0;} // Wenn kein DIP-Schalter auf ON steht, ist die Adresse 1.
- DmxAddress= (addr1dummy + addr1 + addr2 + addr3 + addr4 + addr5 + addr6 + addr7 + addr8 + addr9); //DMX-Adresse setzen
- analogWrite(chOut1, DmxField[0]);
- analogWrite(chOut2, DmxField[1]);
- analogWrite(chOut3, DmxField[2]);
- analogWrite(chOut4, DmxField[3]);
- analogWrite(chOut5, DmxField[4]);
- analogWrite(chOut6, DmxField[5]);
- }
- }
- // *************** DMX Reception ISR ****************
- SIGNAL(USART_RX_vect)
- {
- uint8_t USARTstate= UCSR0A; //get state
- uint8_t DmxByte= UDR0; //get data
- uint8_t DmxState= gDmxState; //just get once from SRAM!!!
- if (USARTstate &(1<<FE0)) //check for break
- {
- UCSR0A &= ~(1<<FE0); //reset flag
- DmxCount= DmxAddress; //reset frame counter
- gDmxState= BREAK;
- }
- else if (DmxState == BREAK)
- {
- if (DmxByte == 0)
- {
- gDmxState= STARTB; //normal start code detected
- gDmxPnt= ((uint8_t*)DmxField +1);
- }
- else gDmxState= IDLE;
- }
- else if (DmxState == STARTB)
- {
- if (--DmxCount == 0) //start address reached?
- {
- gDmxState= STARTADR;
- DmxField[0]= DmxByte;
- }
- }
- else if (DmxState == STARTADR)
- {
- uint8_t *DmxPnt;
- DmxPnt= gDmxPnt;
- *DmxPnt= DmxByte;
- if (++DmxPnt >= (DmxField +DMX_CHANNELS)) //all ch received?
- {
- gDmxState= IDLE;
- }
- else gDmxPnt= DmxPnt;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement