Bonjour à tous,
Je suis actuellement confronté à un problème de programmation avec les timers du PIC de Microship lors de la conception d'une trame DMX 512, et j'espère que vous pourrez m'aider à le résoudre.
J'ai pour objectif de mettre en œuvre un système de contrôle d'éclairage basé sur le protocole DMX 512. J'ai choisi le microcontrôleur PIC16 pour cette application. Cependant, j'ai rencontré des difficultés lors de la gestion des timers pour générer les délais précis requis par le protocole DMX 512.
Ma difficulté réside dans la programmation des timers pour générer ces délais précis avec une inversion . J'ai essayé d'utiliser le Timer0 du PIC16 avec une interruption d'overflow, mais je n'arrive pas à obtenir des délais (voir pas du tout) aussi précis que nécessaires.
Voici un extrait du code :
Avez-vous des suggestions sur la façon de configurer les timers du PIC16 de manière à obtenir des délais plus précis pour la trame DMX 512 ? Ou existe-t-il une autre approche que je pourrais envisager pour résoudre ce problème ?Code:#define DMX_TX_TIMER_100US TMR0H = 0xC7; TMR0L = 0x00 //Set timer to trigger in 100uS #define DMX_TX_TIMER_8US TMR0H = 0xF; TMR0L = 0x00 //Set timer to trigger in 8uS #define DMX_TX_UART_IRQ_ENABLE_BIT(state) PIE3bits.TX2IE = state #define DMX_TX_UART_IRQ_FLAG_BIT(state) PIR3bits.TX2IF = state void TMR0_ISR(void) { PIR0bits.TMR0IF = 0; PORTCbits.RC3 = ~PORTCbits.RC3; if(TMR0_InterruptHandler) { TMR0_InterruptHandler(); } } void __interrupt() INTERRUPT_DMX (void) { // interrupt handler if(PIE0bits.TMR0IE == 1 && PIR0bits.TMR0IF == 1) { TMR0_ISR(); } } switch (DMX_TX_STATE) { case DMX_TX_BREAK: DMX_TX_TIMER_100US; while ( PIR0bits.TMR0IF == 0); DMX_TX_STATE = DMX_TX_MAB; break; case DMX_TX_MAB: DMX_TX_TIMER_8US; while ( PIR0bits.TMR0IF == 0); DMX_TX_STATE = DMX_TX_BREAK; break; /* other code */ default: break; } }
Merci de votre aide
-----