Les PICs
Le but est d'essayer de regrouper les quelques astuces dont on peut avoir le souvenir ....
Tous les développements ont été effectués sur des PIC 16F877 4MHz ou 20MHz. Les ruses ne seront pas forcément valables pour tous les PIC. Toutes les ruses sont issue de la lecture de la documentation et/ou d'expériences diverses. Il ne sagit pas d'une documentation, mais plutot d'un condensé de 'ce qui peut servir', ou 'ce qu'il est bon de savoir'.
On peut aussi apparenter ça à une FAQLorsqu'on réalise une carte à base de PIC, se pose toujours un certain nombres de questions, surtout celle qui est : 'pourquoi ça marche pas ?'
Qu'est-ce qui peut faire qu'un PIC ne se flashe pas ?
Pour flasher un PIC, il faut que :
- Celui-ci soit alimenté (avec un bon multimètre ça doit pouvoir se vérifier ..)
- Le flasheur soit en état de marche et alimenté.
Ce sont les 2 seuls points indispensables. Tout le reste n'influe pas. En résumé les broches suivantes doivent être gérées :
- +VCC (2 broches sur un 877) par l'alim
- Masse (2 broches sur un 877) par l'alim
- RB6 géré par le flasheur
- RB7 géré par le flasheur
- MCLR géré par le flasheur
Il n'y a pas besoin d'avoir de quartz de monté et fonctionnel pour flasher le PIC, pas besoin de s'occuper des autres broches.
Le PIC est flashé, qu'est-ce qui peut faire qu'il ne démarre pas ?
Là, beaucoup de possibilités. La première chose à vérifier est si le quartz oscille.
Une fois flashé, le quartz n'oscille pas.
Pour voir si le quartz oscille, on peut utiliser soit un oscilloscope (là on est fixé), soit un multimètre. Avec un multimètre, on doit trouver environ VCC/2 sur chaque broche du quartz. On n'est pas sûr que le quartz oscille. Par contre si on ne trouve pas environ VCC/2 il y'a de fortes chances que le quartz n'oscille pas.
Si on trouve 0V, il peut y avoir un cours-jus avec la masse, Si on trouve +5V, il peut y avoir un cours-jus avec le VCC.
Le quartz peut ne pas osciller pour plusieurs raisons :
- Erreur dans les bits de config du PIC. Erreur de loin la plus fréquente. Ces bits sont situés dans une zone spéciale et ne peuvent être écrit qu'au moment du flashage. On les détermine, soit dans le code C, soit dans le soft servant à flahser (dans ce cas, c'est le soft servant à flasher qui a e dernier mot). Il faut donc faire attention à bien voir quelles sont les bits REELLEMENT écrit dans le PIC. (notamment MPLAB, permet de les modifier/s'octroie le droit de les modifier lui même).
Sous PCW ces bits sont déterminés par :
#fuses
ex : #fuses HS,PUT,NOWDT,NOLVP,NOBROWNOUT,NOPROTECT,NOWRT
Celui correspondant à l'horloge est : HS. En fonction du type d'horloge (quartz rapide, quartz lent, réseau RC, etc,etc), il faut changer cette valeur par autre chose (cf datasheet du PIC).- PIC en reset permanent (broche MCLR en permanence à 0, ou du moins pas à 5V) (a vérfier au multimètre)
- PIC en mode programmation haut voltage (broche MCLR > 13V)(mais bon là faut pas abuser, au pire du à un flasheur qui déconne)
- PIC en mode programmation bas voltage, chose plus fourbe, contrôlée sur un 877 par la patte RB3. Si cette patte RB3 est à 1, le PIC est en programmation bas voltage et l'horloge arrêtée ,et le code ne s'execute pas. Donc soit :
- mettre un pull down sur cette broche.
- désactiver dans les bits de configuration, la programmation bas voltage.
- Le quartz a bien démarré mais s'est arrêté par ce que le code a executé une instruction arrêtant le quartz. C'est subtile certes, mais il faut bien vérifier dans ce cas, que le code n'execute pas ce genre d'instruction, notamment involontairement, si on ne réalise pas une boucle dans le programme principal (le PIC peut sortir de la fonction main() et aller se prommener n'importe où en mémoire et rencontrer cette fameuse instruction).
- Le problème peut aussi être matériel, avec un mauvais contact entre le quartz et le PIC et ou les 2 capas autour du quartz. Un cours-jus sur une des 2 broches du quartz. Dans tous les cas ce genre de problème peut se voir en testant soit la continuité avec l'alim (enfin la non continuité,etc etc)
- Problème avec la valeur des capas autour du quartz.
- Quartz défectueux. Très rare.
Une fois flashé, le quartz oscille, mais le programme ne marche pas.
Est-ce la plus simple des actions que l'on peut effectuer ?(mettre une sortie à 0 ou a 1) pour savoir si il y'a un problème ou pas.
Les autres problèmes
- compilateur (pas le bon type de PIC sélectionné -- attention PIC14 bits)
- le code qui ne contiendrait pas forcément les bons éléments (ex pas de boucle infinie à la fin du programme)
- Les #fuse (dans PCW ou sur le PIC start, ou ,etc ) qui ne seraient pas corrects
- L'utilisation/ou non/ou etc de l'ICD. Attention lors de l'utilisation de l'ICD un cotet est rajouté en tête du programme et empechera tout fonctionnement correct si l'ICD n'est pas activé !!!
Quelques ruses matérielles :
- Toujours vérifier que l'on peut effectivement faire ce que l'on souhaite faire. Un certain nombre de PIN sont multiplexées. On aura pas forcément toutes les 'E/S' désirée, où il ne sera pas possible de tout activer à la fois.
- Il n'est pas possible d'avoir toutes les configurations possibles et imaginables pour les entrées analogiques. (port A)
Seules les configs de ce tableau sont possibles- Un certain nombre des E/S analogiques ont d'autres fonctions voire des fonctions de référence (vref +, vref -)
- La sortie RA4 est en collecteur ouvert.
- RB3 ne peut être utilisée en I/O standard QUE si la programmation bas voltage est désactivée (dans les options du PIC). Si la programmation bas voltage est activée (état par défaut), le PIC passera en programmation dès que cette pin passe à 1 (c'est à dire n'importe quand si elle est flottante)
- RB6/RB7 sont utilisée pour le flashage. Ces pins peuvent ou non être utilisées dans l'application, en fonction de la métohde de flashage, de ce qui est connecté sur ces pins (demande du courant, n'est pas suceptible au fait de recevoir des 0 et des 1 intempsetifs,etc,etc)
- Attention à la pin de reset MCLR, si un flashage 'in situ' est utilisé. Il y'a une tension >13V appliquée sur cette pin. Le PIC lui est concu pour, mais d'autres composant ayant un reset commun pourraient ne pas apprécier ...
- Ne pas oublier non plus l'état que les pattes auront au reset/pendant le reset. S'assurer que ce qui est derrière (moteur, relais,etc,etc) ne va pas folayer à ce moment.
Quelques ruses logicielles :(en particulier pour PCW)
- L'install de ce truc n'est pas toujours évidente. Lorsqu'il demande une license lui indiquer le fichier (qui n'apparait pas forcément dans la liste des fichiers) à la main.
- L'interface de PCW est .... ce qu'elle est (buguée et platouillarde -- notemment lorsque l'on effectue des copier/coller, en sélectionnant la zone à copier de bas en haut avec la souris - no comment)
- Un élément en particulier peut faire perdre des heures :
Ici est indiqué le type de PIC utilisé. Un 16F877 est un PIC 14 bits ! L'éditeur de code de PCW peut être remplacé par Wedit (de LCC), de la même façon que pour les outils TI. La démarche est la même que celle indiquée dans l'asservissement. Une fois créé un projet dans LCC, et qu'on a ouvert la boite de configuration (enclenchement de Verrun Num puis lancement d'une compilation). On chosit comme type de projet : CCSC (à la place de TI-DSP TMS320 dans l'autres cas). La boite de configuration va ressembler ce coup ci à :
Configuration de Make-TI pour un projet CCSC compilateur de PCW
La boite est nettement plus simple que celle nécessaire pour le DSP. Elle illustre la 'simplicité' et les limitation de PCW. Il n'est pas possible d'utiliser plus d'un seul fichier source C. (on peut séparer physiquement en plusieurs fichiers, mais le code sera OBLIGATOIREMENT inclus dans le fichier principal du projet. Seul ce fichier principal doit être déclaré dans le rpojet de LCC).
On renseigne ici :
Le chemin principal qui est le répertoire de PCW.- Le nom de l'executable du compilateur (il s'agit de CCSC.exe)
- Les options, +FM et +A sont nécessaires pour effectuer une compilation standard.
- Aide permet de donner une liste des options de CCSC, glannées dans le fichier d'aide.
- Aide PCW permet de lancer le fichier d'aide de PCW, (sans avoir besoin de le déterer sous 3 couches d'icones ..) qui contient un certain nombre de doc sur le 'C CCSC'
Voilà la configuration est terminée. La compilation va donc appeler CCSC qui va faire la compil, les erreurs seront affichées directement dans Wedit, de façon standard.
Au niveau code ....
- Penser que la pile n'a que 8 niveaux, c'est à dire qu'on ne peut pas imbriquer plus de 8 fonctions. Cette limitation est encore plus présente dans le cas d'utilisation des interruptions.
- Un certain nombre d'"options" propres à PCW sont indiquée par l'utilisation de #qqchose
- #use delay(clock=20000000), sert à indiquer à PCW la vitesse du quartz branché sur le PIC, pour pouvoir générer des délais corrects avec les instructions delay (delay_ms(10) par ex), elle n'est abosulement pas indispensable sinon.
- Pour accéder à un port d'E/S (ou un seul bit, ou une case mémoire du PIC, ou un seul bit de cette case), on peut utiliser
#byte nom_de_la_variable = @du registre/pinIO
Ex : #byte led = 6 , 6 correspond au PORTB.
On peut ensuite directement utiliser led=16, ce qui va mettre à 0 RB0,RB1,RB2,RB4,RB5,RB6,RB7 et mettre RB3 à 1.
On peut aussi définir une structure qui permettera d'accéder bit à bit aux sorties.
struct ld_map { //
boolean res0; //
boolean led1; // led 1
boolean led2; // led 2
boolean res1; //
boolean led3; // led 3
boolean led4; // led 4
boolean res3; //
boolean res4; //
} led;
#byte led = 6
En faisant : led.led1=1, on met juste RB1 à 1.- On peut aussi indiquer #byte mavar = 90.5, mavar reprséente le bit 5 de l'@ 90
- Pour déclarer une routine d'IT (sauce PCW), il faut indiquer :
#int_ext
ext_isr() {
}- Il est IMPERATIF que #int_typ_d_it soit JUSTE sur la ligne d'AVANT
- ATTENTION à l'utilisation ou non des directives #FASTIO. Dans certains cas, ces directives peuvent empeche une IT externe d'être prise en compte par exemple (quand FASTIO n'est pas utilisé)
- un grand nombre de fonctions sont définies dans PCW, ex ext_int_edge, qui sert à indiquer si l'IT RB0/INT à lieu sur un front montant ou descendant. Trouver le nom de ces fonction n'est pas toujours evident ..et compter sur l'aide est assez illusoire.(il vaut mieux perdre un peu de temps à la parcourir, pour avoir une idée du nom des fonctions disponibles)
- Ne pas oublier qu'il y'a 2 niveaux pour activer les interruptions :
- Pour chaque interruption, il y'a un registre disant si elle est activée ou non (commandé par enable_interrupts(INT_xxx); et disable_interrupts(INT_xxx);)
- Il y'a un registre GLOBAL : enable_interrupts(global);
- Le sens des E/S est défini en C par l'instruction set_tris_x(). Se méfier comme de la peste, cette instruction fait plus ou moins n'importe quoi et de temps en temps change le sens de n'importe quoi. Ce qui peut provoquer quelques blagues. Il est toujours utile de vérifier effectivement ce qui se passe sur les E/S (savoir si un entrée est vraiment en entrée -- peut on y imposer une tension ?)
- Il est possible d'inlure directement de l'ASM par
#asm
movwf 0x1F
#endasm- Ce qui peut être extrêmement pratique lorsque l'on commence à en avoir marre des fonction zarbi de PCW ...
- Il est aussi possible d'étudier l'ASM pondu par PCW (c'est neurologiquement déconseillé, certes mais bon ... y'a tjrs des cas où...)
- Le PIC inline la pluspart des fonctions mathématiques (notamment sur les flottants -- déconseillés sur un PIC par ailleurs). Une focntion inliné, au lieu d'être appelée comme une fonction standard, est copiée dans le code directement à chaque fois qu'on y fait appel (ce qui permet de gagner le temps nécessaire pour faire l'appel de fonction), par contre on perd autant de place qu'il faut répéter de fois la fonction ...