diff --git a/dmx512_micro/Makefile b/dmx512_micro/Makefile index d9c9386..d3c19c3 100644 --- a/dmx512_micro/Makefile +++ b/dmx512_micro/Makefile @@ -45,10 +45,14 @@ # # $Id$ +#Bootloader Port PORT = /dev/serial/by-id/usb-Arduino_LLC_Arduino_Micro-if00 +#Device Port (for autoreset) RESETPORT = /dev/serial/by-id/usb-Loupiottes_DMXv3_Micro-if00 + + TARGET = dmx512_micro -SRC = lib/wiring.c lib/wiring_analog.c lib/wiring_digital.c +SRC = lib/wiring.c lib/wiring_digital.c CXXSRC = dmx512_micro.cpp lib/CDC.cpp lib/USBCore.cpp MCU = atmega32u4 F_CPU = 16000000L @@ -137,7 +141,8 @@ upload: $(TARGET).hex $(TARGET).eep python ./reset_and_wait.py $(RESETPORT) $(PORT) $(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) - +manualupload: $(TARGET).hex $(TARGET).eep + $(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) # Convert ELF to COFF for use in debugging / simulating in AVR Studio or VMLAB. diff --git a/dmx512_micro/dmx512_micro.cpp b/dmx512_micro/dmx512_micro.cpp index 5f0a154..70264bb 100644 --- a/dmx512_micro/dmx512_micro.cpp +++ b/dmx512_micro/dmx512_micro.cpp @@ -28,6 +28,7 @@ int main(void) #define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit)) #endif + // déclaration des tableaux de données 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 ; @@ -38,16 +39,19 @@ volatile int index_input_dmx=513; // entrée dmx volatile int index_output_dmx=0; //sortie dmx -2 en attente de fin de transmission; -1 break; 0 à 512 transmission 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; + +int tx1pin = 1; // pin DMX serial 1 int ledPin = 13; // led interne -int tx1pin = 1; // pin DMX serial 1 +unsigned int blkl = 0, blkcpt=0; +volatile bool dmx_rx=0; +volatile bool pc_rx=0; byte brk_timer_end=75; // def : 150us byte mab_timer_end=25; //def : 50us -int nb_circuits=512; +int nb_circuits=512; int flag_merge1=1; -volatile int emissionPc=0; +volatile bool emissionPc=0; // Fonctions @@ -55,12 +59,6 @@ void litUSB(char c); void ecritUSB(); void CDC_accept(); - -/* ------------ Gestion Liaison USB -------------- */ -/* On a surcharge tout ca pour optimiser les temps de transfert */ - - - // lancé par interruption USB sur reception d'un char <- Cette fonction nécessite une modif de la lib arduino // l'interet est de ne pas utiliser le buffer de la classe Serial, trop petit (64o) void CDC_accept() @@ -69,8 +67,6 @@ void CDC_accept() litUSB(c); } -/* ------------ Fin Gestion Liaison USB -------------- */ - // lecture d'un caractere sur USB void litUSB(char c) { @@ -120,7 +116,6 @@ void litUSB(char c) tab_input_dmx[517]=65; index_output_pc=517; // on init l'index d'emmission vers le pc ( uniquement etat : 65 'A' ) emissionPc=1; - } // si aucune commande n'est trouvée (toujours à 1) on repart à 0 @@ -133,11 +128,9 @@ void litUSB(char c) index_input_pc++; // si on arrive à 512 if (index_input_pc > 512) {// on se prépare à emmetre vers le pc + pc_rx=1; etat_input_pc=0; - digitalWrite(ledPin, HIGH); - - - } + } break; case 10: // 1er parametre : nb de circuits / 2 - 1 ( de 2 a 512 ) @@ -193,10 +186,11 @@ ISR(USART1_RX_vect) char c,r; r = UCSR1A; c = UDR1; - if (r & (1< break - if(index_output_dmx==-4) + if(index_output_dmx==-4){ index_output_dmx=-1; - + } } // vecteur : USART 1 transmission registre vide ISR(USART1_UDRE_vect) @@ -229,7 +223,7 @@ ISR(USART1_UDRE_vect) ISR(TIMER4_COMPA_vect) { if (index_output_dmx==-2 ) { - digitalWrite(tx1pin, HIGH); // on met la broche 18 à 1 pendant 10 µs + digitalWrite(tx1pin, HIGH); // on met la broche à 1 index_output_dmx=-3; OCR4A = mab_timer_end ; @@ -241,7 +235,6 @@ ISR(TIMER4_COMPA_vect) { sbi(UCSR1B, TXEN1); // on redémarre la transmission index_output_dmx=0; // on se prépare à émmettre à partir du stat code ( 513 octets ) sbi(UCSR1B, UDRIE1); // on réactive l'intéruption du registre - //digitalWrite(ledPin, HIGH); TIMSK4= 0 ; //desactivation intéruption A &B TCCR4B = 0; } @@ -289,19 +282,19 @@ void setup() { } void loop() { - // génération du break en tache principale - int cpt = 0; + // lancement du break if (index_output_dmx==-1 ) { index_output_dmx=-2; - pinMode(tx1pin, OUTPUT); // on met la broche 18 en mode sortie + pinMode(tx1pin, OUTPUT); // on met la broche en mode sortie cbi(UCSR1B, TXEN1); //on stop la transmission - digitalWrite(tx1pin, LOW); // on met la broche 18 à 0 + digitalWrite(tx1pin, LOW); // on met la broche à 0 OCR4A = brk_timer_end ; // val 120 µs TCNT4 = 0 ;// RAZ compteur timer TIFR4 = 0 ; //Clear Flags timer TIMSK4 = 64 ; //activation intéruption A &B - TCCR4B = 6; // 00000011 division par 32 de l'horloge base => 2µs - } // fin du break + TCCR4B = 6; // 00000110 division par 32 de l'horloge base => 2µs + dmx_rx=false; + } // octets d'état. Pour le moment, tous à 0 tab_input_dmx[513]= 0; @@ -314,11 +307,19 @@ void loop() { ecritUSB(); } } else { - // Si port fermé : on eteint la LED - digitalWrite(ledPin, LOW); - // et on réinitialise l'état d'entrée USB + pc_rx=0; etat_input_pc=0; } + + // Clignotement de la led a vitesse variable en fonction de l'etat + int blinkon = 15, blinkp=16; + if(pc_rx) blinkp=5, blinkon=4; + if(dmx_rx) blinkon=1; + + int m = millis()>>6; + if (m-blkl) { blkcpt++; blkl = m;} + if(blkcpt>=blinkon) { digitalWrite(ledPin, HIGH); } + if(blkcpt>=blinkp){ digitalWrite(ledPin, LOW); blkcpt=0; } } diff --git a/dmx512_micro/lib/CDC.cpp b/dmx512_micro/lib/CDC.cpp index 6491ff3..55f3090 100644 --- a/dmx512_micro/lib/CDC.cpp +++ b/dmx512_micro/lib/CDC.cpp @@ -50,7 +50,7 @@ typedef struct u8 lineState; } LineInfo; */ -extern LineInfo _usbLineInfo = { 57600, 0x00, 0x00, 0x00, 0x00 }; +LineInfo _usbLineInfo = { 57600, 0x00, 0x00, 0x00, 0x00 }; #define WEAK __attribute__ ((weak)) diff --git a/dmx512_micro/lib/USBCore.cpp b/dmx512_micro/lib/USBCore.cpp index 55ad7e1..6915dcc 100644 --- a/dmx512_micro/lib/USBCore.cpp +++ b/dmx512_micro/lib/USBCore.cpp @@ -32,6 +32,18 @@ /** Pulse generation counters to keep track of the number of milliseconds remaining for each pulse type */ #define TX_RX_LED_PULSE_MS 10 + +/* +#undef TXLED1 +#undef TXLED0 +#undef RXLED1 +#undef RXLED0 +#define TXLED1 +#define TXLED0 +#define RXLED1 +#define RXLED0 +*/ + volatile u8 TxLEDPulse; /**< Milliseconds remaining for data Tx LED pulse */ volatile u8 RxLEDPulse; /**< Milliseconds remaining for data Rx LED pulse */ @@ -51,20 +63,12 @@ const u16 STRING_LANGUAGE[2] = { const u16 STRING_IPRODUCT[13] = { (3<<8) | (2+2*12), -#if USB_PID == 0x8036 'D','M','X','v','3',' ','M','i','c','r','o' -#else - 'U','S','B',' ','I','O',' ','B','o','a','r','d',' ',' ',' ',' ' -#endif }; const u16 STRING_IMANUFACTURER[11] = { (3<<8) | (2+2*10), -#if USB_VID == 0x2341 'L','o','u','p','i','o','t','t','e','s' -#else - 'U','n','k','n','o','w','n',' ',' ',' ',' ' -#endif }; #ifdef CDC_ENABLED diff --git a/dmx512_micro/lib/wiring.c b/dmx512_micro/lib/wiring.c index ac8bb6f..acf569b 100644 --- a/dmx512_micro/lib/wiring.c +++ b/dmx512_micro/lib/wiring.c @@ -67,13 +67,13 @@ SIGNAL(TIMER0_OVF_vect) unsigned long millis() { unsigned long m; - uint8_t oldSREG = SREG; + //uint8_t oldSREG = SREG; // disable interrupts while we read timer0_millis or we might get an // inconsistent value (e.g. in the middle of a write to timer0_millis) - cli(); + //cli(); m = timer0_millis; - SREG = oldSREG; + //SREG = oldSREG; return m; }