Modifs micro

This commit is contained in:
manu 2014-05-04 17:58:57 +00:00
parent 3fe2d423eb
commit 6dcfbb7bd2

View file

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