| PICOS18 > Tutorial > Drivers |
|
Vous souhaitez faire communiquer votre application au travers du port série ou bien du port CAN ? A présent que vous savez écrire des interruptions et des tâches, et que vous maîtrisez la gestion des évènements et des alarmes, il vous sera facile d'utiliser ou d'écrire un véritable driver pour PICos18. |
![]() |
| > Principe d'un driver |
Un driver est souvent comparé à une librairie, ce sont pourtant 2 choses bien distinctes. Une librairie est un ensemble de fonctions écrites dans un langage (comme le langage C par exemple) et destiné à simplifier la vie du développeur. Dans le cas d'une communication RS232, une librairie proposerait par exemple des fonctions d'ouverture et de fermeture du port série, de réception et de transmission de données…
Un driver est une couche logicielle destinée à la prise en charge complète d'un périphérique. Son but n'est donc pas d'offrir une série de fonctions propres à utiliser ce périphérique puisque c'est le driver lui seul qui peut manipuler le périphérique...

Un driver est en fait constitué d'une ISR (Interrupt Service Routine) et d'une tâche. Nous avons vu les ISR dans le châpitre précédent, c'est-à-dire les fonctions ajoutées à la fonction InterruptVectorL() ou InterruptVectorH().
L'ISR est en charge d'intercepter les interruptions (IT) et d'informer la tâche du driver que cette interruption vient de se produire. C'est donc à la tâche que revient d'effectuer les traitments nécessaire à la gestion de l'IT.
| > Utilsation des briques logicielles |
PICos18 est livré avec le noyau seul ainsi que ce tutorial. Toutefois sur la page DOWNLOAD du site web vous trouverez aussi des drivers ou des librairies disponibles gratuitement. Le but est de permettre un développement modulaire avec lequel il suffirait d'intégrer des briques logicielles pour réaliser une application.
Nous allons voir ici comment utiliser une brique logicielle. Plus précisément nous allons utiliser le driver RS232 de PICos18 pour pouvoir afficher notre horloge avec les variables "hour", "min", et "sec".
Télécharger le driver RS232 sur la page DOWNLOAD de PICos18 :

Le package possède un fichier texte (lien TXT) qui indique comment inclure le driver dans votre application, comment paramétrer le driver (baudrate dans le cas d'un driver RS232) et aussi comment le mettre en oeuvre.
______________________________________________________________________ > < > RS232 driver v1.02 < > for < > PICos18 release 2.00 (beta 10 or upper) < > < > PICos18 - Real-time kernel for PIC18 family < > < > < > www.picos18.com www.pragmatec.net < >______________________________________________________________________ ...
Maintenant que vous savez insérer des tâches au projet, que vous savez écrire des ISR, paramétrer votre application dans le fichier "taskdesc.c", suivez pas-à-pas les indications du fichier texte pour insérer le driver dans votre application.
Vous n'avez pas besoin d'ajouter les références
à la tâche "Example" comme l'alarme de la structure Alarm_list
(paragraphe IV du fichier texte) ou encore EXAMPLE_ID du fichier define.h. Ne
dépassez pas le paragraphe VI, celui-ci est abordé spécifiquement
ci-après.
| > Utilisation du driver |
Afin d'utiliser le driver créez une nouvelle tâche "TASK4" en lieu et place de la tâche "Example" du fichier texte du driver RS232. N'oubliez pas d'ajouter l'alarme ALARM_TASK4 dans le fichier "taskdesc.c".
Voici à quoi doit ressembler la nouvelle tâche :
#include "define.h" #include "drv_rs.h" #includeSetRelAlarm(ALARM_TSK4, 1000, 1000); Printf(" ______________________________________________________________________ \r\n"); Printf("> <\r\n"); Printf("> PICos18 Tutorial <\r\n"); Printf("> <\r\n"); Printf("> <\r\n"); Printf("> PICos18 - Real-time kernel for PIC18 family <\r\n"); Printf("> <\r\n"); Printf("> <\r\n"); Printf("> www.picos18.com www.pragmatec.net <\r\n"); Printf(">______________________________________________________________________<\r\n"); Printf(" \r\n"); Printf(" \r\n"); while(1) { WaitEvent(ALARM_EVENT); ClearEvent(ALARM_EVENT); Printf("%02d : %02d : %02d\r", (int)hour, (int)min, (int)sec); } } /********************************************************************** * Function in charge of structure registration and buffer transmission. * * @param string IN const string send to the USART port * @return void **********************************************************************/ int Printf (const rom char *fmt, ...) { va_list ap; int n; RS_enqMsg(&RS_msg, buffer, 0); va_start (ap, fmt); n = vfprintf (_H_USER, fmt, ap); va_end (ap); SetEvent(RS_DRV_ID, RS_NEW_MSG); WaitEvent(RS_QUEUE_EMPTY); ClearEvent(RS_QUEUE_EMPTY); return n; } <stdio.h> #include <string.h> #define ALARM_TSK4 1 int Printf (const rom char *fmt, ...); extern unsigned char hour; extern unsigned char min; extern unsigned char sec; /********************************************************************** * Definition dedicated to the local functions. **********************************************************************/ RS_message_t RS_msg; unsigned char buffer[80]; /********************************************************************** * ------------------------------ TASK4 ------------------------------- * * Fifth task of the tutorial. * **********************************************************************/ TASK(TASK4) {
La première partie du code correspond aux inclusions des headers propres à l'utilisation du driver RS232 et aux fonctions "printf". Ensuite il faut déclarer ALARM_TASK4 et aussi déclarer comme "extern" les variables externes "hour", "min" et "sec" pour signifier au compiler C18 que les définitions de ces variables ne se trouvent pas dans ce fichier.
En RAM on déclare 2 types de variables :
Enfin vous découvrez le coeur de la tâche TASK4,
qui arme une alarme qui réagit toutes les 1000ms soit toutes les secondes.
La fonction "Printf" est appelée pour pouvoir poster des chaînes
constantes, convertir des variables,... Tous les formats de variables sont gérés
par C18 sauf les floatants...!
La fonction "Printf" nécessite "\r\n" en fin de chaîne
si vous souhaitez un retour chariot (chargement d'une nouvelle ligne), le "\r"
servant au retour en début de ligne, et le "\n" au chargement
d'une nouvelle ligne à proprement parler.
Pour afficher le banner nous utilisons donc "\r\n" et pour afficher l'heure en surimpression, nous utilisons juste "\r".
Au final vous devez obtenir l'affichage suivant sous HyperTerminal :
| > Paramétrage d'HyperTeminal |
Attention au paramétrage de la COM série sous HyperTerminal, elle doit être à 11500 bits/sec et sans contrôle de flux :
![]() |
![]() |