1 | #include <stdlib.h>
|
2 | #include <avr/io.h>
|
3 | #include "config.h"
|
4 | #include <util/delay.h>
|
5 | #include <avr/interrupt.h>
|
6 | #include "dmx_in.h"
|
7 |
|
8 | #define F_OSC 16000 //Oszillatorfrequenz in kHz (Arbeitet mit 8 und 16 Mhz)
|
9 | #define IBG 10 //IBG in ms
|
10 | #define DMX_Channels 512 //Anzahl der zu empfangenden DMX Kanäle
|
11 |
|
12 | //Variablen
|
13 | uint8_t DMX_State_RX; //DMX Empfangsstaus: 0=Leerlauf, 1=Break Empfangen, 2=Startbyte Empfangen, 3=Startadresse erreicht
|
14 | uint8_t DMX_Data[512]; //DMX Daten
|
15 | uint16_t DMX_Start_Address; //DMX Startadresse für DMX Empfang
|
16 | uint16_t DMX_RX_Bytecounter; //Variable für DMX Byte Counter (gezählt von Paket 1) für empfangen
|
17 |
|
18 | uint16_t DMX_Start_Address = 1; //DMX Startadresse für DMX Empfang
|
19 | uint8_t DMX_Data[512];
|
20 |
|
21 | //============================================================================================
|
22 | //DMX Inizialisierung
|
23 | //============================================================================================
|
24 | void init_DMX_RX(void)
|
25 | {
|
26 | UBRR0H = 0; //Baud Rate Register Higher Byte
|
27 | UBRR0L = ((F_OSC/4000)-1); //Baud Rate Register Lower Byte
|
28 | UCSR0C = (3<<UCSZ00)|(1<<USBS0); //250kBaud, 2 Stopbits
|
29 | UCSR0B = (1<<RXEN0)|(1<<RXCIE0); //Empfang und IRQ aktivieren
|
30 | DMX_State_RX = 0; //DMX Empfang startet mit "Leerlauf"
|
31 | }
|
32 |
|
33 | ISR (USART0_RX_vect)
|
34 | {
|
35 |
|
36 | uint8_t UART_Status = UCSR0A; //UART Status (Enthält auch das Flag für Frameerror)
|
37 | uint8_t UART_Byte = UDR0; //Daten vom UART laden
|
38 |
|
39 | //Prüfung auf DMX RESET/BREAK
|
40 | if (UART_Status &(1<<FE0)) //UART Status auf Frameerror prüfen (wenn JA => Break Empfangen)
|
41 | {
|
42 | UCSR0A &= ~(1<<FE0); //Frameerror Flag löschen
|
43 | DMX_RX_Bytecounter = DMX_Start_Address; //DMX Byte Counter auf >Startadresse<
|
44 | // DMX_RX_Bytecounter = DMX_get_startaddress(); //DMX Byte Counter auf >Startadresse<
|
45 | DMX_State_RX = 1; //DMX Status "Break Empfangen" (1)
|
46 | }
|
47 |
|
48 | //Prüfung auf Startbyte (und kein Frameerror war)
|
49 | else if (DMX_State_RX == 1) //DMX Status "Break Empfangen" (1) abfragen
|
50 | {
|
51 | if (UART_Byte == 0) //Wenn empfangenes Byte = 0 (=Startbyte)
|
52 | {DMX_State_RX = 2;} //DMX Status "Startbyte Empfangen" (2)
|
53 | else
|
54 | {DMX_State_RX = 0;} //ansonnsten DMX Status "Leerlauf" (0) (und wieder alles von vorne)
|
55 | }
|
56 |
|
57 | //Prüfung auf Startadresse erreicht
|
58 | else if (DMX_State_RX == 2) //DMX Status "Startbyte Empfangen" (2) abfragen
|
59 | {
|
60 | if (--DMX_RX_Bytecounter == 0) //DMX Byte Counter -1 (und hat er "0" erreicht?)
|
61 | {
|
62 | DMX_RX_Bytecounter = 1; //Bei Kanal 1 beginnen zu zählen...
|
63 | DMX_Data[0]= UART_Byte; //Wert des 1. DMX Kanals in Speicher "0" speichern
|
64 | DMX_State_RX = 3; //DMX Status "Startadresse erreicht" (3)
|
65 | }
|
66 | }
|
67 |
|
68 | //Weitere Kanäle speichern und abbrechen wenn alle Kanäle empfangen
|
69 | else if (DMX_State_RX == 3) //DMX Status "Startadresse erreicht" (3) abfragen
|
70 | {
|
71 | DMX_Data[DMX_RX_Bytecounter++]= UART_Byte; //Wert des X. DMX Kanals in Speicher "..." speichern
|
72 | if (DMX_RX_Bytecounter >= DMX_Channels) //Prüfen ob die korrekte Anzahl an Kanälen empfangen wurde
|
73 | {DMX_State_RX = 0;} //Wenn Ja: DMX Status "Leerlauf" (0)
|
74 | }
|
75 |
|
76 | }
|