renebiemans.nl

Elektronica · 15 maart 2011

DMX met AVR in C

Dit is een werkende code voor een Atmega88 in C.

#include <avr/io.h>
#include <inttypes.h>
#include <stdbool.h> 
#include <avr/interrupt.h>
#define FOSC 20000000   // Clock Speed
#define BAUD 250000     //Baud rate for DMX
#define MYUBRR FOSC/16/BAUD-1

bool BREAK = false;
bool MAB = false;
char Status = 0;
int DMX_Data = 0;
int Counter = 0; 
int CH1 = 0;
int CH2 = 0;
int CH3 = 0;
int CH4 = 0;
int CH5 = 0;
//initialisation functions

//Instellen poorten
void InitPorts(void)
{
    DDRB = 0x00;    //PORT B input
    DDRC = 0xFF;    //PORT C output
}

//Instellen UART
void USART_Init( unsigned int ubrr)
{
    UBRR0H = (unsigned char)(ubrr>>8);
    UBRR0L = (unsigned char)ubrr;
    UCSR0B = (1<<RXEN0)|(1<<TXEN0)|(1<<RXCIE0); //enabel RX/TX & interrupt
    UCSR0C = (1<<USBS0)|(3<<UCSZ00);            //8bits 2stopbits
}

//main loop
int main()
{
    InitPorts();            //instellen poorten
    USART_Init ( MYUBRR );  //instellen uart
    sei();                  //enable interrupt
    for(;;) {               //oneindige loop
        PORTC = CH1;        //hier kan van alles nog ingevoegd worden
    }                       
    return 0;
}

//interrupt voor ontvangen van uart RX
ISR(USART_RX_vect){ 
    Status = UCSR0A;        //sla status register op
    DMX_Data = UDR0;        //sla inkomende data op
    if (Status & (1<<FE0)){ //test of er een framing error is geweest
        BREAK = true;       //zo ja: zet break op true
        MAB = false;        //en MAB of false zodat deze weer gecontroleerd word
    } else if(DMX_Data == 0 && MAB == false && BREAK == true) { //test of alles klopt
        MAB = true;         //als alles klopt: zet MAB op true
        Counter = 0;        //en counter op 0
    }
    if(BREAK == true && MAB == true && Counter == 1) {  //test of alles klopt en de gewenste waarde is behaald
        CH1 = DMX_Data; //schrijf data weg naar CH
    }  
    if(BREAK == true && MAB == true && Counter == 2) {  //test of alles klopt en de gewenste waarde is behaald
        CH2 = DMX_Data; //schrijf data weg naar CH
    }  
    if(BREAK == true && MAB == true && Counter == 3) {  //test of alles klopt en de gewenste waarde is behaald
        CH3 = DMX_Data; //schrijf data weg naar CH
    }  
    if(BREAK == true && MAB == true && Counter == 4) {  //test of alles klopt en de gewenste waarde is behaald
        CH4 = DMX_Data; //schrijf data weg naar CH
    }  
    if(BREAK == true && MAB == true && Counter == 5) {  //test of alles klopt en de gewenste waarde is behaald
        CH5 = DMX_Data; //schrijf data weg naar CH
    } 
    if(BREAK == true && MAB == true && Counter == 200) {    //test of alles klopt en de gewenste waarde is behaald
        BREAK = false;  
    }   
    Counter++;
}