DMX met AVR ATMEGA88 in C
Author : / Date : Tue-03-2011 23:24
View or add comments : ()
Average members rating : 0
Dit is een werkende code voor een Atmega88 in C.

Code:
#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++;
}