diff --git a/dmx512_micro_ino/dmx512_micro_ino.ino b/dmx512_micro_ino/dmx512_micro_ino.ino index e3d92d2..049f559 100644 --- a/dmx512_micro_ino/dmx512_micro_ino.ino +++ b/dmx512_micro_ino/dmx512_micro_ino.ino @@ -9,8 +9,8 @@ #endif // déclaration des tableaux de données -byte tab_input_pc[1026]; // venant du pc -byte tab_input_dmx[534]; // données venant de l'extérieur : les 512 premiers DMX; les 20 suivant 4x8 bp + 16 analogique 8bits ; 1 octet d'etat +byte tab_input_pc[514]; // venant du pc +byte tab_input_dmx[518]; // données venant de l'extérieur : les 512 premiers DMX; les 4 suivant 4x8 bp ; // reception volatile int index_input_pc=0; // entrée serial 0 volatile int index_output_pc=0; // sortie serial 0 @@ -20,32 +20,27 @@ volatile int index_output_dmx2=0; //sortie dmx -2 en attente de fin de transmiss volatile int etat_input_pc=0; // 0 raz ; 1 esc reçu ; 2 D reçu : pret à recevoir ; 3 prèt à emmetre volatile int start_code_rec=-1; char key; // caractère reçu serial 0 -int cpt_ana = 0; int ledPin = 13; // led interne -int tx1pin = 0; // pin DMX serial 1 -int tx2pin = 16; // pin DMX serial 2 +int tx1pin = 1; // pin DMX serial 1 byte brk_timer_end=75; // def : 150us byte mab_timer_end=25; //def : 50us int nb_circuits=512; int flag_merge1=1; -int flag_merge2=1; +int emissionPc=1; - - -// vecteur d'inéruption pour reception pc -/* -ISR(USART0_RX_vect) +// lecture d'un caractere sur USB +void litSerial() { - char c,r; + char c; byte *pb, *pe; - r = UCSR0A; - c = UDR0; + + c = Serial.read(); switch (etat_input_pc) { case 0: // on attend un 'esc' pour commencer - if (c==27) { etat_input_pc=1; digitalWrite(ledPin, LOW);break;} + if (c==27) { etat_input_pc=1; break;} break; @@ -54,23 +49,23 @@ ISR(USART0_RX_vect) if (c==68) { etat_input_pc=2; index_input_pc=1; - tab_input_dmx[533]=68; + tab_input_dmx[517]=68; index_output_pc=1; // on init l'index d'emmission vers le pc ( le 0 n'est pas emit => start code) - sbi(UCSR0B, UDRIE0); // activation de l'intéruption registre emmission + emissionPc=1; // activation de l'intéruption registre emmission } // Esc 'C' réinit if (c==67) { etat_input_pc=0; - pe=tab_input_pc+1026; + pe=tab_input_pc+514; for(pb=tab_input_pc;pb 1024) {// on se prépare à emmetre vers le pc + // si on arrive à 512 + if (index_input_pc > 512) {// on se prépare à emmetre vers le pc etat_input_pc=0; digitalWrite(ledPin, HIGH); @@ -118,11 +114,11 @@ ISR(USART0_RX_vect) case 13: // 4eme parametre : merge etat_input_pc=0; flag_merge1 = c & 1; - flag_merge2 = c/2 & 1; + // on a tout recu, on reponds - tab_input_dmx[533]=66; - index_output_pc=533; // on init l'index d'emmission vers le pc ( uniquement etat : 66 'B' ) - sbi(UCSR0B, UDRIE0); + tab_input_dmx[517]=66; + index_output_pc=517; // on init l'index d'emmission vers le pc ( uniquement etat : 66 'B' ) + emissionPc=1; break; default: @@ -131,7 +127,7 @@ ISR(USART0_RX_vect) } } -*/ + // vecteur d'intéruption pour reception dmx ISR(USART1_RX_vect) @@ -173,18 +169,19 @@ ISR(USART1_UDRE_vect) } -/* + // vecteur d'intéruption pour transmission vers le pc sur serial 0 // vecteur registre de transmission -ISR(USART0_UDRE_vect) +void ecritSerial() { //caratère suivant - UDR0 = tab_input_dmx[index_output_pc]; + Serial.write(tab_input_dmx[index_output_pc]); index_output_pc++; - if (index_output_pc>532) { - cbi(UCSR0B, UDRIE0); + if (index_output_pc>516) { + digitalWrite(ledPin, LOW); + emissionPc=0; } -}*/ +} ISR(TIMER4_COMPA_vect) { if (index_output_dmx==-2 ) { @@ -192,7 +189,7 @@ ISR(TIMER4_COMPA_vect) { index_output_dmx=-3; index_output_dmx2=-3; - OCR4A = 10 ; + OCR4A = mab_timer_end ; TCNT4 = 0 ;// RAZ compteur timer TIFR4 = 0 ; //Clear Flags timer return; @@ -211,15 +208,14 @@ ISR(TIMER4_COMPA_vect) { void setup() { // initialisation du stat code à 0 tab_input_pc[0]=0; - /* - // initialisation de la liaison série pc à 0,5MB/s - //Serial.begin(460800); - UCSR0A = 1 << U2X0; - UBRR0H=0; - UBRR0L = 3; - UCSR0C = 6;*/ - + + // init pin led interne en sortie + pinMode(ledPin, OUTPUT); + + Serial.begin(9600); +/* + digitalWrite(ledPin, LOW); // initialisation à 250k de serial 1 // baudrate UCSR1A = 1 << U2X1; @@ -237,11 +233,7 @@ void setup() { sbi(UCSR1B, RXCIE1); //Interruption sur reception sbi(UCSR1B, TXCIE1); //Interruption pour fin de transmission -/* - - sbi(UCSR0B, RXEN0); //Reception - sbi(UCSR0B, RXCIE0); //Interruption sur reception - sbi(UCSR0B, TXEN0); //Transmission*/ + // init timer break @@ -254,34 +246,32 @@ void setup() { TC4H=0; sei(); - // init pin led interne en sortie - pinMode(ledPin, OUTPUT); - digitalWrite(ledPin, LOW); + // préparation du premier break index_output_dmx=-1; - index_output_dmx2=-1; // PORTA = 255; // DDRA = 0; // PORTC = 255; // DDRC = 0; tab_input_dmx[533]=0; + + */ } void loop() { - -// génération du break en tache principale + /* Serial.write(65); + delay(300);*/ +/* + // génération du break en tache principale int cpt = 0; - if (index_output_dmx==-1 && index_output_dmx2==-1 ) { + if (index_output_dmx==-1 ) { index_output_dmx=-2; - index_output_dmx2=-2; pinMode(tx1pin, OUTPUT); // on met la broche 18 en mode sortie -// pinMode(tx2pin, OUTPUT); // on met la broche 16 en mode sortie cbi(UCSR1B, TXEN1); //on stop la transmission digitalWrite(tx1pin, LOW); // on met la broche 18 à 0 - digitalWrite(ledPin, LOW); // on met la broche 16 à 0 - OCR4A = 60 ; // val 120 µs + OCR4A = brk_timer_end ; // val 120 µs TCNT4 = 0 ;// RAZ compteur timer TIFR4 = 0 ; //Clear Flags timer TIMSK4 = 64 ; //activation intéruption A &B @@ -293,6 +283,16 @@ void loop() { tab_input_dmx[514]= 0; tab_input_dmx[515]=0; tab_input_dmx[516]=0; + + */ + if(Serial.available()){ + + litSerial(); + } + + if(emissionPc==1) { + ecritSerial(); + } }