demande d'aide pour démarrer en c ou asm [PIC] - Nano-ordinateur, microcontrôleurs, FPGA - Electronique, domotique, DIY
Marsh Posté le 22-08-2022 à 16:06:55
C'est un exercice scolaire?
Tu as quel problème/... exactement?
Marsh Posté le 22-08-2022 à 23:54:48
C'est en théorie tout simple :
Je souhaite faire avec le µC un compteur 3 digits avec boutons +/- et enregistrer 2 valeurs (High et Low) dans la mémoire non volatile, et rappeler ensuite ces 2 valeurs en fonction d'un bouton (Hi/Lo).
Mais je ne sais même pas comment démarrer correctement avec MPLABX, dès que j'essaye de compiler il y a toujours un problème avec des fichiers qu'on récupère un peu partout sur le net qui ne sont plus mis à jour pour d'anciennes versions de MPLab et j'avoue ça me décourage pas mal.
Marsh Posté le 23-08-2022 à 01:49:39
Je ne connais pas MPLABX, mais je pense que ton problème est plutôt là:
iosys99 a écrit : un problème avec des fichiers qu'on récupère un peu partout sur le net |
On ne récupère pas des fichiers n'importe où mais - en supposant que tu parles des header pour ton PIC - directement chez le fabriquant du CI ou du compilateur/IDE/... Donc dans ton cas quelque part là bas je suppose: https://www.microchip.com/en-us/too [...] plab-x-ide
Et puis il faudrait être plus précis: Quel(s) fichier(s) récupéré(s) où exactement Quel problème exactement? ...
Marsh Posté le 06-11-2022 à 16:08:48
J'y suis finalement arrivé.
J'ai commencé par installer une ancienne version de MPLABxIDE et suivi quelques tutoriels.
Et j'étais assez embeté avec un kit PICKIT v2 qui semble abandonné par tout le monde..
J'ai acheté un PICKIT v4 pour programmer en live mon montage, puis suivi quelques tutos plus récents.
J'ai finalement abouti à un programme complet qui fait presque ce que je veux mais j'en suis fier ^^
J'ai d'ailleurs découvert qu'il y a des fonctions intégrées dans le code qui évitent d'en coder et débuguer soi même par exemple pour stocker en RAM une variable on la déclare simplement, puis on l'utilise en faisant attention à la criticité de la rapidité du code (interruptions pendant un enregistrement en EEPROM), mais le compilateur gère ça tout seul apparemment :
// Variables declarations stored on EEPROM
unsigned char __eeprom iEEUnitsHi;
unsigned char __eeprom iEETensHi;
unsigned char __eeprom iEEHundredsHi;
unsigned char __eeprom iEEUnitsLo;
unsigned char __eeprom iEETensLo;
unsigned char __eeprom iEEHundredsLo;
Marsh Posté le 06-11-2022 à 16:14:32
Code :
|
J'ai supprimé le le bouton STO inutile en fait et pas eu à gérer le code pour enregistrer en EEPROM le compilateur l'a fait pour moi
J'ai pour objectif de faire un speed display screen facile à programmer pour remplacer ceux des vieux PC années 80.
https://www.minuszerodegrees.net/le [...] isplay.htm
Edit : J'ai oublié, j'ai un bug à résoudre, ça ne restore pas les zéros quand on boot le programme après extinction du courant...
Je fais une petite vidéo.
Edit : Optimisation de la gestion de l'appui du bouton, bug de la restauration des chiffres résolu, code mis à jour... Je vais refaire une vidéo de présentation non buguée ^^
Video : https://streamable.com/38pc2b
Marsh Posté le 06-11-2022 à 17:48:31
Bravo pour ta tenacité.
Quelque commentaires si tu veux bien:
-Il est très important d'avoir des résistances de tirage (pullup/down) sur les entrées, par contre il ne faut pas en mettre en série avec les boutons car tu fabriques un pont diviseur de tension. Selon les valeurs et les caractéristiques des entrées du PIC un appui risque de ne pas être enregistré (correctement). Aussi dans les AVR il y a des pullup intégrés qu'on peut activer, pour les PIC je ne sais pas.
-Tu devrais faire attention à la mise en page de ton code, ça évite les erreurs ou fait qu'on les trouve plus facilement et c'est plus facile à lire aussi.
-Le délai dans l'ISR c'est très moche, autant modifier la configuration du timer qui génère cette interruption.
-Tes variables globales ne sont pas _modifiés_ dans l'ISR, sinon il faudrait les déclarer "volatile".
-Pour l'EEPROM il faudrait voir si le code généré par le compilateur est suffisamment "intelligent" pour écrire l'EEPROM que quand une valeur change, car ce type de mémoire à un nombre de cycles limité.
A part ça le code est plutôt propre pour un débutant (ou pas débutant??). Après on peut toujours optimiser, genre utiliser switch() au lieu de tout ces if(), mais ce genre de choses c'est largement une question de goût aussi.
Marsh Posté le 06-11-2022 à 19:27:50
J'ai fait de l'assembleur il y a 25 ans (HP 48 / Saturn) mais peu de C, et pas mal de Visual basic 6 debut 2000 (oui ça fait un grand écart !).
Pas totalement débutant mais après 20 ans, on va dire que pas loin du noob... !
en revanche certaines de tes explications sont un poil trop techniques pour moi ^^
- Les résistances pull-up/down :
La je ne sais pas trop, j'ai des notions d'électronique (thevenin, norton, mailles, noeuds etc lol)
- Mise en page : alors là, je me base surtout sur l'indentation, si tu as un document sur la mise ne page de code... je prends
- Le délai dans l'ISR, là, totaly noob : J'ai pris un code à interrruption existant pour afficher un chiffre nombre sur un 3 segment LED Digit avec la persistance de la vision humaine ^^.
- Les variables alors j'ai de la chance, je ne les modifie pas dans l'interrruption... Mais je ne vois pas ce que signifie volatile dans un code C comme ça.
- Là je vais me renseigner chez microchip puisque j'utilise toute leur chaine de codage jusqu'au programmeur
Mais vraiment merci pour ta contribution !
Marsh Posté le 08-11-2022 à 19:25:50
Je ne connais pas les PIC, mais si j'interprête bien ce tableau il y a des pullup que sur le port B, or tes boutons sont branchés ailleurs. Pour quelque résistances autant laisser comme ça...
Pour l'indentation justement elle n'est pas cohérente dans ton code, mais c'est peut-être un soucis avec le forum. Il y a différents "styles" (et beaucoup de débats autour ), regarde simplement chez Wikipédia. Il y a des outils ("beautifier" ) pour automatiquement formater un code existant.
Le délai dans l'ISR: Comme je disais il faudrait modifier la configuration du Timer, mais je ne connais pas les PIC... Je laisse ma place à quelqu'un d'autre. De manière générale les interruption c'est pour des trucs critiques au niveau temps/délai/réactivité et on essaye de faire des interruptions les plus courtes possibles pour ne pas "bloquer" le processeur trop longtemps (sachant que l'interruption peut intervenir à n'importe quel moment et parfois - genre pour un timer - très souvent). Donc du délai dans une ISR c'est pas interdit et dans ton cas simple ça ne pose (probablement) pas de problème, mais c'est moche.
Pour le "volatile", tu peux demander à ton moteur de recherche préféré . En bref ce mot clé indique au compilateur que la variable peut changer de valeur à n'importe quel moment (dans une ISR justement), du coup il faut récupérer la valeur "réelle" à chaque fois et ne pas utiliser une "copie" qu'on aurait stocké quelque part dans un registre du processeur ou similaire. Dans ce contexte il faut aussi faire attention au "atomic access" pour les variables >1 octet, je te laisse te renseigner si tu veux.
Marsh Posté le 08-11-2022 à 20:51:26
Je vais potasser tout cela car tu as a quand même des notions de coding bien avancées pour moi, mais comme je prends tout conseil et je me renseigne par la suite.
Tu me montres le chemin, c'est à moi qu'il appartient de le suivre
Merci beaucoup pour ton aide en tout cas !
Marsh Posté le 22-08-2022 à 13:58:48
Bonjour,
Je cherche de l'aide pour démarrer un projet en c ou assembleur, tous les tutos que je trouve sont pour des vieilles versions de mplab..
Pour un 16f88
---------------
Ce n'est pas parce que vous avez des certitudes que vous avez raison