Recevoir des trames DMX avec un PIC

Need english version ? it’s here

Introduction

Lorsque je modifie les fonctions d’un projecteur, j’utilise le bus DMX pour le piloter. Cet article vous présente le code en C que j’utilise pour décoder les données. Il est utilisé sur des microcontrolleur PIC de chez Microchip mais il est adaptable à d’autre hardware.

Présentation du bus

Avant de commencer, je vous encourage à lire l’article Wikipedia. Il est bien documenté et vous aidera à comprendre le protocole. Mais, voici quelques explications:

A l’arrêt, la ligne est à un niveau haut. Pour indiquer un début de trame il y a un « break ». Ce break dure entre 88µs et 100ms. Ensuite, on a le Mark After Break qui dure au moins 8µs.

La première données qui est envoyée c’est le « Start Code » comme l’indique la norme. En général le start code sera 0x00. Ce code permet de sélectionner tous les dimmers. D’autres codes existent et ils sont décrit par l’ESTA. Ensuite, on a les 511 octets correspondant aux 511 adresses (ou 512 si on compte à partir de 1). Les données sont toujours entourées d’un START et de deux STOP.

C’est un protocole relativement simple.

Comment récupérer les données?

Pour récupérer les données, on utilise l’UART du PIC. Pour ce faire, on va faire une machine à états.

  • L’état IDLE : C’est l’état par défaut.
  • Lorsque l’UART remonte un FRAME ERROR c’est que la ligne est restée trop longtemps à 0. On est donc dans le BREAK. Pendant cette période, on doit lire des 0x00 sur la ligne jusqu’à ce qu’un nouveau FRAME ERROR soit indiqué par l’UART. Cela correspond au MAB
  • On entre dans l’état START. Tant que on détecte des FRAME ERROR on est dans le MAB du bus DMX. Dès que la data vaut 0x00, c’est le signal du START CODE. On peut donc passer dans l’état DATA.
  • L’état DATA, c’est tout simplement la réception des 512 canaux. On n’enregistrera que les données qui nous intéressent. Ensuite quand le compteur sera à 513, on lève un FLAG et on attend la nouvelle trame.

Le code

Configuration de l’UART

L’UART doit être configuré en réception à la bonne vitesse de 250kbps. Personnellement, je fais un renommage des registres avec les #define.

Ensuite, dans la libraire DMX, il y a la fonction d’initialisation:

Quelques fonctions pour activer ou désactiver l’UART

Les interruptions

Pour faire fonctionner la machine à états, il nous faut des événements. Pour cela, on va utiliser les IT de l’UART.

La fonction de réception

N’oubliez pas de mettre dans le .h de la librairie la déclaration de l’énumérateur.

Et voici la fonction de réception

La structure des données

Vous avez certainement remarqué dans le code la présence de la variable DMXRx. C’est une structure qui contient l’adresse de départ, un tableau de la taille de nombre de canaux et d’un flag de nouvelle données.

Le timeout

Vous pouvez faire fonctionner le code sans timeout. Mais, s’il vous reste un compteur je vous conseille de le laisser. Le timeout est un simple compteur qui, quand il dépasse 100ms génère une IT qui reset toute la machine et l’UART.

Et après?

Et après… dans votre fonction main() vous pouvez traiter les données reçues pour générer une PWM, une valeur analogique, une sortie binaire etc etc. Dans mes applications, j’utilise le flag DMWRx.NEW_DATA pour détecter une nouvelle donnée et mettre à jour la sortie.

That’s all.