![]() |
Envoie des coordonnées GPS et de l'heure via bus CAN
Par Bayoumi Chaïmaa et Comte-Gaz Quentin (encadré par M. Pepin)
|
Le code présenté a été crée par Bayoumi Chaïmaa et Comte-Gaz Quentin.
Carte utilisée : Blackfin 537
Le projet consistait à :
Voici les différentes fonctions/interruptions liées à l'UART-DMA :
UART0_init(void) (Initialisation de l'UART 0 ainsi que le DMA (pour le gps))
UART0_read(void) (Lecture d'un octet via l'UART 0 (gps) sans attente)
UART0_send(char c) (Ecriture d'un octet via l'UART 0 (Hyperterminal du PC))
EX_INTERRUPT_HANDLER(Uart0_ISR) (Interruption de reception d'un char via l'UART 0 (GPS))
EX_INTERRUPT_HANDLER(Uart0_tx_DMA_ISR) (Interruption de transmission d'une trame via l'UART0-DMA9 (Hyperterminal du PC))
Init_Interrupts(void) (Fonction d'initialisation des interruptions CAN et UART0-DMA9 ainsi que leurs priorités associées)
Voici les différentes fonctions/interruptions liées au bus CAN :
init_CAN(void) (Initialisation du bus CAN ainsi que des mailboxes à utiliser)
preparation_mailbox(unsigned char *data, int taille_data, int mbID) (Préparation des mailbox d'envoie (uniquement l'heure et la position –> mailboxes 20 et 21))
EX_INTERRUPT_HANDLER(Can_tx_ISR) (Interruption de fin de transmission d'une trame CAN via le bus CAN)
EX_INTERRUPT_HANDLER(Can_rx_ISR) (Interruption de reception d'une demande CAN via le bus CAN)
Init_Interrupts(void) (Fonction d'initialisation des interruptions CAN et UART0-DMA9 ainsi que leurs priorités associées)
Voici les différentes variables globales utilisées :
buffer [100] (buffer pour l'UART)
buffer_can[100] (buffer pour le CAN)
buffer_can_ready (protection pour éviter d'envoyer une trame via CAN alors qu'elle est en cours d'édition via UART0)
flag_fin_can (flag de fin d'envoie CAN)
flag_irq_tx (flag de fin d'envoie UART0)
position_buffer (position du buffer de l'UART)
Pour plus d'informations sur ces variables, je vous conseille de consulter la page suivante :
Globals.html
Notre programme est fonctionnel. Cependant, pour avoir un projet ne contenant aucune faille, on pourrait utiliser un RTOS afin de protéger les ressources critiques (notre flag flag_fin_can ainsi que l'utilisation de pSIC_IMASK dans les interruptions ne sont que des substituts à des sémaphores).
Voici une liste des RTOS compatibles avec la carte Blackfin 537 :
https://en.wikipedia.org/wiki/Blackfin#Supported_operating_systems.2C_RTOSs_and_kernels
Voici également une capture d'écran montrant que le programme fonctionne correctement :