Παράθεση:
#include <16F877A.h>
#fuses HS,NOWDT,PUT,NOBROWNOUT
#use delay (clock=20M)
//#use rs232(baud=9600,parity=N,xmit=PIN_c6,rcv=PIN_c7,st ream=spiros,bits=8)
#use fast_io(B)
#use fast_io(D)
#byte PORTB=0x06 //ορισμός buttons/variables/array/dmx
#byte PORTD=0x08
#bit SWITCH1=PORTB.0
#bit SWITCH2=PORTB.1
#bit SWITCH3=PORTB.2
#bit SWITCH4=PORTB.3
#bit SWITCH5=PORTB.4
#bit SWITCH_0_5=PORTB.5
#bit RESET_DATA=PORTB.6
#bit DMX=PORTD.0
#bit CH1_5=PORTD.1
int dmx_data=0;
#bit dmx_data1=dmx_data.0
#bit dmx_data2=dmx_data.1
#bit dmx_data3=dmx_data.2
#bit dmx_data4=dmx_data.3
#bit dmx_data5=dmx_data.4
#bit dmx_data6=dmx_data.5
#bit dmx_data7=dmx_data.6
#bit dmx_data8=dmx_data.7
int i;
int dmx_cd[10]={0,0,0,0,0, //οριστικοποιήση των channel data
0,0,0,0,0};
void send_sc();
void send_cd();
void main()
{
int count;
port_b_pullups(true);
setup_adc(adc_clock_div_64);
setup_adc_ports(AN0);
set_adc_channel(0);// adc conversion απο ποτεσιόμετρο
set_tris_B(0xFF);
set_tris_D(0x0);
portd=1;
while(1)
{
if(switch_0_5) //αν είναι H ή δεν έχει κλήσει τότε
{
switch (~PORTB) //bitwise not στην portb (για να είναι ποιο εύκολο λόγο pullups)
{
case 1: {delay_us(100); dmx_cd[0]=read_adc();}//αν πατηθεί ο πρώτος γραψε τα
break; //περιεχόμενα, του adc στο πρώτο channel data (dmx_cd[10])
case 2: {delay_us(100); dmx_cd[1]=read_adc();}//δευτερο cd
break;
case 4: {delay_us(100); dmx_cd[2]=read_adc();}//3
break;
case 8: {delay_us(100); dmx_cd[3]=read_adc();}//4
break;
case 16: {delay_us(100); dmx_cd[4]=read_adc();}//5
break;
default: break;
}
ch1_5=1;//άναψε το led channel 1_5
}
if(!switch_0_5)//(logical not) αν είναι L ή τον κλείσουμε τότε
{
switch (~PORTB)//bitwise not στην portb
{
case 33: {delay_us(100); dmx_cd[5]=read_adc();}//αν πατηθεί ο πρώτος γραψε τα
break; //περιεχόμενα του adc στο έκτο cd
case 34: {delay_us(100); dmx_cd[6]=read_adc();}//7
break;
case 36: {delay_us(100); dmx_cd[7]=read_adc();}//8
break;
case 40: {delay_us(100); dmx_cd[8]=read_adc();}//9
break;
case 48: {delay_us(100); dmx_cd[9]=read_adc();}//10
break;
default: break;
}
ch1_5=1;//σβήσε το led channel 1_5
} //αν πατηθεί ο reset_data μηδένισε όλα τα cd (channel data)
if(!reset_data) {for(count=0;count<10;count++) dmx_cd[count]=0;}
send_sc();
send_cd();
}
}
void send_sc()//SC αποστολή του start code
{
dmx=1;
delay_ms(1);//MTBP τελικά το έβαλα στο 1msec
dmx=0;
delay_us(176);//BREAK 176usec
dmx=1;
delay_us(12);//MAB 12usec
dmx=0;
delay_us(36);//1 start bit 4usec + και 8 data bit 32usec
dmx=1;
delay_us(18);//2 stop bit 8usec + MTBF 10usec
}
void send_cd()//CD αποστολή των channel data
{ //εδώ είναι που χρειαζόμαστε ταχύτητα
for (i=0;i<10;i++)
{
/*dmx=0;
delay_us(4);//start bit //Με αυτόν τον τρόπο και
for (k=0;k<8;k++) //με αρκετούς άλλους
{ //οι χρόνοι βγαίναν
dmx=bit_test(dmx_cd[i],k); //αρκετά εκτός, από 4usec
delay_us(4); //και μειώνοντας το delay έχανες σε ακρίβεια
}
dmx=1;
delay_us(18);//2 x stop bit 8usec + MTBF 10usec
*/
dmx_data=dmx_cd[i];//αυτός είχε την μικρότερη απόκλιση
dmx=0;
delay_cycles(16);//και μετάτρεψα το delay σε cycles για να έχω ακρίβεια
dmx=dmx_data1;// (1/20Mh)*4=200nsec,
delay_cycles(16);//από τις εξομείωσεις με το proteus
dmx=dmx_data2; //είδα ότι έπρεπε να αφιαρέσω 800nsec 800/200(instruction set)=16
delay_cycles(16);
dmx=dmx_data3;
delay_cycles(16);
dmx=dmx_data4;
delay_cycles(16);
dmx=dmx_data5;
delay_cycles(16);
dmx=dmx_data6;
delay_cycles(16);
dmx=dmx_data7;
delay_cycles(16);
dmx=dmx_data8;
delay_cycles(16);
dmx=1;
delay_us(18);// δεν μας ενδιαφέρει η ακρίβεια σε αυτό το σημείο γιατί ακολουθεί το MTBF σε H
}
}