dimanche 21 octobre 2012

Le diable se cachait encore dans les détails

Hier j'ai passé la journée à travailler sur un projet utilisant un PIC10LF322. Ça implique que je devais lire les 200 pages du datasheet. J'ai fais le montage final avant de débuter la programmation et ensuite en lisant la doc j'ai créé un fichier de macros pour cacher les détails.

Je programme le PIC, je test, ça ne fonctionne pas. Qu'est-ce qui ne va pas au juste? J'essaie de déboger en utilisant le PicKit 3 mais MPLABX1 affiche une erreur d'application lorsque je veux démarrer la session de débogage. Je dois donc travailler autrement. Y a-t-il une erreur dans mon montage? Pour le savoir je programme un autre MCU hors montage. Ça ne fonctionne pas plus. Je fais tourner le programme dans le simulateur et tout se déroule normalement. Finalement j'allume! Le MCU est configuré comme ceci.

__CONFIG  _CP_OFF & _MCLRE_OFF

Ça signifit qu'il utilise un oscillateur externe il aurait fallu que j'utilise la directive suivante:

__CONFIG   _CP_OFF & _MCLRE_OFF & _FOSC_INTOSC
Ca fonctionnait dans le simulateur car celui-ci présume qu'il y a un oscillateur externe en fonction.

Je corrige et je fait un autre essai. Le projet utilise RA0,RA1 et RA3 comme entrée numérique et RA2 comme sortie numérique. Problème, l'entrée RA3 ne fonctionne pas... On dirait que le MCU réinitialise lorsque la broche est mise à zéro. Pourtant comme la config le mentionne bien le master clear est désactivé: _MCLRE_OFF. Le MCU est-il défectueux? Y a-t-il une erreur dans le montage? Encore une fois je fais un test sur un MCU non monté, même problème. Je me replonge dans la documentation et je trouve au paragraphe 3.1 config word le bit no. 8 LVP: Low Voltage Programming enable bit. Ce bit et activé par défaut et s'il est activé l'état du bit 6 MCLRE: ~MCLR/Vpp pin function select bit est ignoré. Ce qui revient à dire que si on ne veut pas utiliser la fonction Master clear sur RA3 on doit-utiliser la directive:

__CONFIG   _CP_OFF & _MCLRE_OFF & _LVP_OFF & _FOSC_INTOSC

Pour désactiver le master clear il faut utiliser les 2 paramètres ensembles.

Mais je n'étais pas au bout de mes peines. j'avais activés les résistances PULLUP dans le registre WPUA mais le MCU se comportait comme si les pullup n'était pas activés. Refouille la documentation, figure 16-1 le registre OPTION_REG bit 7 ~WPUEN est à 1 par défaut mais doit-être à zéro pour que les pullup puissent être activés. L'utilité de ce bit me laisse perplexe.


Imaginez le PIC10LF322 est un des plus simple MCU offert par Microchip et le datasheet en format PDF fait plus de 200 pages. Pour des MCU plus complexes le PDF peut faire 400 ou 500 pages. Et Il faut lire tous les paragraphes pour être certain de ne rien manquer si on ne veut pas perdre son temps sur de faux problèmes. Il faut aussi faire attention aux priorités d'accès au broches d'entrées/sortie. Les entrées/sorties numérique ont toujours la plus faible priorité donc si un périphérique spécial est configuré par défaut pour utiliser une broche même si on configure le registre TRIS pour utiliser cet E/S en numérique ça ne fonctionnera pas. Il d'abord désactiver tous les périphériques qui l'utilise avec une priorité supérieure. Et c'est là l'une des utilités importantes des fichiers de macros, cacher ces détails dans des macros plus simple d'utilisation.

;; bonne configuration pour désactiver le master clear
;; utilisation: __CONFIG   _CP_OFF & _FOSC_INTOSC & _MCLRE_REALLY_OFF
;;
#define _MCLRE_REALLY_OFF ( _MCLRE_OFF & _LVP_OFF )

;;
;; macro pour activer tous les pullup
;;
enable_all_pullup macro
movlw 0xF
movwf WPUA
bcf OPTION_REG, NOT_WPUEN
endm


NOTES:
1) MPLABX est plein de bogues, vive le vieux MPLAP.

Aucun commentaire:

Enregistrer un commentaire