Envoie des coordonnées GPS et de l'heure via bus CAN
Par Bayoumi Chaïmaa et Comte-Gaz Quentin (encadré par M. Pepin)
 Tout Fichiers Fonctions Variables Pages
Fonctions | Variables
Référence du fichier ISR.c

Fichier contenant les interruptions de l'UART0/DMA ainsi que du bus CAN ainsi que la fonction permettant de les initialiser. Plus de détails...

Graphe des dépendances par inclusion de ISR.c:

Fonctions

 EX_INTERRUPT_HANDLER (Uart0_ISR)
 Interruption de reception d'un char via l'UART 0 (GPS) Plus de détails...
 
 EX_INTERRUPT_HANDLER (Uart0_tx_DMA_ISR)
 Interruption de transmission d'une trame via l'UART0-DMA9 (Hyperterminal du PC) Plus de détails...
 
 EX_INTERRUPT_HANDLER (Can_rx_ISR)
 Interruption de reception d'une demande CAN via le bus CAN. Plus de détails...
 
void Init_Interrupts (void)
 Fonction d'initialisation des interruptions CAN et UART0-DMA9 ainsi que leurs priorités associées. Plus de détails...
 

Variables

unsigned char buffer [100]
 Buffer contenant la trame GPS en cours de réception via l'UART0.
 
unsigned char buffer_can [100]
 Buffer édité par l'UART uniquement quand la trame est valide et est utilisé par le CAN.
 
int buffer_can_ready
 Protection évitant que l'UART édite le buffer_can[100] quand on remplie les mailboxes CAN. Plus de détails...
 
int position_buffer =0
 Correspond à la position dans buffer[100] (ie : au nombre d'élements+1 dans le buffer[100])
 
int flag_irq_tx =0
 Flag pour l'envoie d'une trame via UART0 par le biais du DMA9.
 
int flag_fin_can =1
 Si CAN est fini d'être utilisé =>1, sinon 0
Ce flag permet de ne pas envoyer "en même temps" 2 mêmes trames via bus CAN.
 

Description détaillée

Fichier contenant les interruptions de l'UART0/DMA ainsi que du bus CAN ainsi que la fonction permettant de les initialiser.

Vous trouverez ici les interruptions EX_INTERRUPT_HANDLER(Uart0_ISR), EX_INTERRUPT_HANDLER(Uart0_tx_DMA_ISR), EX_INTERRUPT_HANDLER(Can_rx_ISR) ainsi que la fonction d'initialisation des interruptions : Init_Interrupts().

Avertissement
Pour activer les interruptions, il faut à la fois avoir lancé les fonctions Init_Interrupts(), UART0_init() et init_CAN().
Auteur
Bayoumi Chaïmaa et Comte-Gaz Quentin
Date
Novembre 2013
Version
1.0

Documentation des fonctions

EX_INTERRUPT_HANDLER ( Uart0_ISR  )

Interruption de reception d'un char via l'UART 0 (GPS)

Cette interruption récupère les char via l'UART 0, les enregistrent dans buffer[100] Lorsqu'un caractère de fin de trame est détecté, on verifie que la trame soit bien celle que l'on souhaite, on l'enregistre dans buffer_can[100] puis on active l'envoie via UART 0. Le fait d'enregistrer la trame dans buffer_can[100] permet d'envoyer celle ci via CAN lorsqu'une demande CAN sera lancée.

EX_INTERRUPT_HANDLER ( Uart0_tx_DMA_ISR  )

Interruption de transmission d'une trame via l'UART0-DMA9 (Hyperterminal du PC)

Cette interruption se produit lorsque l'on a envoyé le premier char de la trame via l'UART0. Il reste donc à envoyer les autres éléments grâce au DMA (ce que l'on fait ici).

EX_INTERRUPT_HANDLER ( Can_rx_ISR  )

Interruption de reception d'une demande CAN via le bus CAN.

Cette interruption se lance uniquement quand un des utilisateurs du bus CAN demande l'heure (id 20) ou la position GPS (id 21). Si tel est le cas, on lui répond en lui envoyant l'heure (id 20) ou la position GPS(id 21). L'heure UTC est transmise sous forme ASCII : ab heure cd min ef sec -> abcdef(ASCII). La position GPS a quand à elle sous forme binaire : ab°cd'ef.gh" N/S i°jk'lm.nop" E/W -> données transmises via CAN 0xabcdefijklm0+K (K ayant pour LSB 0 si Nord ou 1 si Sud et pour 2eme LSB 0 si Ouest ou 1 si Est).

Voici le graphe d'appel pour cette fonction :

void Init_Interrupts ( void  )

Fonction d'initialisation des interruptions CAN et UART0-DMA9 ainsi que leurs priorités associées.

Activation des interruptions : UART0-TX(DMA9), UART0-RX (GPS), CAN-RX (Demande), CAN-TX (fin d'envoie d'une trame CAN). Ordre de priorité (du plus prioritaire au moins prioritaire) : UART0-TX > UART0-RX > CAN-TX > CAN-RX Grâce à cette ordre de priorité, il n'est pas possible d'envoyer une trame non valide via le bus CAN (sans compter la protection via le flag buffer_can_ready).

Voici le graphe des appelants de cette fonction :

Documentation des variables

int buffer_can_ready

Protection évitant que l'UART édite le buffer_can[100] quand on remplie les mailboxes CAN.

En théorie, cette variable est inutile car on a joué sur la priorité des interruptions pour garantir que le buffer sera valide lors d'une interruption CAN.