/***************************************************************************
Copyright: Manuel Steins
known Problems: none
Description: 512 Ch. DMX Empfang
MCU: 8051
CLK: 16MHz
Compiler: SDCC
Parameter:
--code-loc 0x0000 --stack-auto --vc --iram-size 128 -8051-
--code-loc 0x0000 --stack-auto --vc --iram-size 256 -8052-
***************************************************************************/
#include "8051.h"
#define channels 8 // Kanäle
#define startadresse 2 // Startadresse
__idata volatile unsigned char dmx_data[channels]; // Array mit Werten
volatile unsigned int addr;
unsigned char a; // Testprog
__xdata __at 0x0000 unsigned char b; // Testprog extern Ram 0x0000
//---------------------- UART Interrupt -----------------------------------
void serial0 (void) __interrupt 4{
static signed int rx_count; // signed!!!
static __bit dmx_valid; // Startbit
static __bit dmx_break; // Break
static unsigned char temp;
temp = SBUF;
RI = 0; // Interrupt Flag
if (RB8 == 1){ // Brauchbare Daten empfangen
if (dmx_break == 1){
if (dmx_valid == 0){ // 1. Byte nach break
if (temp == 0x00){ // Freigabe
dmx_valid = 1;
}
else { // kein Startbit
dmx_break = 0;
}
}
else{
rx_count++;
if (rx_count == channels){ // alle Kanäle empfangen?
dmx_break = 0; // Pause
}
else if (rx_count >= 0){ // Startadresse erreicht?
dmx_data[rx_count] = temp;
}
}
}
}
else{
dmx_valid = 0;
dmx_break = 1;
rx_count = -addr;
}
}
//-------------------------- Main Programm -------------------------------
void main (void){
PCON = 0x00; // 64tclk 250 Baud 16MHz
SCON = 0x98; // Serial Port Mode 2 10011000
IE |= 0x90; // Enable RX I
addr = startadresse; // Startadresse einlesen
while(1){
a = ((0x80&dmx_data[0])>>7);
a |= ((0x80&dmx_data[1])>>6);
a |= ((0x80&dmx_data[2])>>5);
a |= ((0x80&dmx_data[3])>>4);
a |= ((0x80&dmx_data[4])>>3);
a |= ((0x80&dmx_data[5])>>2);
a |= ((0x80&dmx_data[6])>>1);
a |= ((0x80&dmx_data[7]));
b = a;
}
}