Comment câbler un microcontrôleur PIC?

8

Je suis complètement nouveau dans le monde des microcontrôleurs PIC et de l'électrotechnique, alors allez-y doucement :)

Quoi qu'il en soit, j'ai réussi à programmer mon PIC 16f627 pour allumer trois LED lorsque le bouton-poussoir (bouton de déclenchement) est enfoncé et démarrer une séquence d'arrêt (fondamentalement, chaque LED s'éteint l'une après l'autre avec un délai de 5 secondes entre les deux) lorsqu'un autre bouton-poussoir est enfoncée (bouton de réinitialisation). J'ai testé cela sur une carte de programmation / expérimentation PIC Velleman K8048. Les broches RA0 et RA2 sont respectivement les entrées des boutons-poussoirs de déclenchement et de réinitialisation, tandis que les broches RB0, RB1 et RB2 sont les broches de sortie des DEL.

Travailler avec la carte d'expérimentation est génial, mais je veux déplacer cela vers un circuit réel. Le problème est que je ne sais pas par où commencer. J'ai acheté 3 LED (3,3 Volts chacune), des boutons poussoirs et du fil et j'ai construit le circuit suivant:

Circuit

(désolé pour le schéma horrible)

Dans le circuit que j'ai construit, j'ai d'abord testé pour voir si les LED fonctionneraient avec 3 piles AA de 1,5 Volt et elles fonctionnaient bien, donc j'ai pensé que des résistances ne seraient pas nécessaires.

Cela ne fonctionne pas, cependant, et je suis totalement perdu. Pour référence, voici mon code pour le PIC. Son écrit en C en utilisant MikroC. Cela fonctionne sur le plateau d'expérimentation donc je ne pense pas que ce soit un problème

void main() {
    TRISB.RB0 = 0;
    TRISB.RB1 = 0;
    TRISB.RB2 = 0;
    PORTB.RB0 = 0;
    PORTB.RB1 = 0;
    PORTB.RB2 = 0;
    CMCON = 0x07;
    TRISA = 255;

    for(;;){
            if(PORTA.RA0 == 1 && PORTB.RB0 == 1 && PORTB.RB1 == 1 && PORTB.RB2 == 1){
                         delay_ms(5000);
                         PORTB.RB0 = 0;
                         delay_ms(5000);
                         PORTB.RB1 = 0;
                         delay_ms(5000);
                         PORTB.RB2 = 0;
            }
            if(PORTA.RA2 == 1){
                         PORTB.RB0 = 1;
                         PORTB.RB1 = 1;
                         PORTB.RB2 = 1;
            }
    }
}

Toute aide serait grandement appréciée. Merci!

Shahmeer Navid
la source
3
S'il vous plaît, veuillez utiliser Fritzing . C'est gratuit, fait 90% du travail pour vous, et aide vos diagrammes schématiques à lire plus facilement.
Ignacio Vazquez-Abrams
1
Veuillez lire electronics.stackexchange.com/a/28255/4512 .
Olin Lathrop
7
Je pense qu'avoir un compte pendant 10 jours et que ce soit la première question de Shahmeer est une excuse pour "jeter de la merde comme ça sur nous". Certes, l'approche d'Ignacio consistant à demander gentiment est plus susceptible d'obtenir une réponse positive que de réprimander le nouveau gars ... à moins que votre objectif ne soit d'empêcher de nouvelles personnes de rester.
ajs410
5
@ ajs410 - nous savons tous que c'est la bête noire d'Olin, et bien que je ne sois pas toujours d'accord avec sa formulation, je suis d'accord avec son principe. Le fait que OP s'excuse pour l'horrible (ses propres mots) "schématique" signifie qu'il sait bien que ce n'est pas OK. Alors pourquoi publie-t-il toujours cette chose? Pour moi, il n'a pas besoin d'être créé par EDA, je pense que je préférerais voir un dessin au crayon et au crayon.
stevenvh
2
Il est nouveau, comme beaucoup d'autres nouveaux membres ici (moi y compris). Donnez-lui une pause. Shahmeer, essayez Fritzing. Il est agréable et facile à utiliser et vous aidera à mieux expliquer votre question. Sur une autre note, je m'oppose fermement au choix des mots d'Ignacio.
capcom

Réponses:

11
  1. Tout d'abord, vous avez toujours besoin de résistances en série avec les LED lorsqu'elles sont alimentées par une source de tension (par exemple, batterie, alimentation CC, etc.)
    En effet, les LED ont une courbe IV non linéaire, qui ressemble à une haute impédance jusqu'à la tension de seuil du La LED augmente ensuite très fortement, ce qui signifie qu'avec un très léger changement de tension, le courant change beaucoup, ce qui rend presque impossible de régler le courant à une valeur stable de cette manière.
    En utilisant les résistances de série de valeur correcte, vous vous assurez que le courant ne peut pas monter suffisamment pour endommager la LED.
    Pour calculer la valeur de la résistance, vous devez connaître la tension directe de la LED (Vf), puis soustraire Vf de la tension d'alimentation et diviser par le courant souhaité, par exemple pour une alimentation 5V, 2V Vf et 15mA:

    (5V - 2V) / 0.020A = 200Ω (La valeur standard de 220Ω fera l'affaire - si vous ne l'avez pas, visez quelque chose entre 150Ω et 600Ω pour une plage de 20mA à 5mA)
    Cela suppose une LED typique de 5mm ou 3mm de courant de fonctionnement max 20mA.

  2. Bien qu'il indique "3 x 1.5V Battery in Series" dans votre schéma, les batteries semblent être connectées en parallèle. Pour confirmer, les batteries doivent être connectées bout à bout comme le schéma du bas dans cette image:

    Connexions parallèle et série

  3. Vous avez besoin de condensateurs de découplage présents entre le microcontrôleur Vdd et la masse. Je n'entrerai pas dans les détails (cherchez ici, il y a beaucoup de bonnes réponses à ce sujet) mais elles visent essentiellement à fournir au microcontrôleur une réserve d'énergie locale de faible impédance pour une demande de courant haute fréquence, à laquelle l'alimentation ne peut pas répondre rapidement suffisant.
    Idéalement, vous devez en placer un (la céramique 100 nF ou 1 uF est assez standard) à travers les broches d'alimentation et de terre, aussi près que possible des broches.

  4. Assurez-vous que vous utilisez l'oscillateur interne si vous n'avez pas de cristal présent. Votre code n'affiche pas les paramètres de bits de configuration, si vous les avez omis, vous devez les ajouter pour vous assurer que le microcontrôleur est correctement configuré. Le manuel CCS devrait vous expliquer comment procéder. Toujours dans les bits de configuration, assurez-vous que la minuterie du chien de garde est désactivée, sinon votre micro se réinitialisera continuellement (sauf si vous appelez régulièrement la commande WDT clear)

  5. Assurez-vous d'avoir les LED dans le bon sens.

  6. Assurez-vous que la broche MCLR est attachée haut, sinon votre PIC sera maintenu en réinitialisation (sauf si vous désactivez MCLR dans les bits de configuration). Cela se fait généralement avec une résistance à Vdd, d'une valeur d'environ 10kΩ. La fiche technique en aura un exemple dans la section de réinitialisation. (merci à ajs410 de l'avoir mentionné)

Oli Glaser
la source
Merci beaucoup pour les commentaires, ils ont été très utiles. Cependant, aurais-je dû connecter le PIC d'une autre manière ou les ajouts que vous avez répertoriés sont-ils tout ce dont j'ai besoin?
Shahmeer Navid
2
Une autre chose est que vous avez probablement besoin de résistances déroulantes sur les broches de votre bouton, pour vous assurer que la broche est à un niveau logique bas lorsque le bouton n'est pas enfoncé (sauf si vous avez des pulldowns internes, mais je pense que PIC n'aura que des pullups disponibles). difficile d'être sûr des choses avec le schéma tel qu'il est (par exemple, symboles non standard, pas de numéros / noms de broches, etc.) Je me procurerais un logiciel de capture de PCB / schéma (par exemple Eagle [populaire / gratuit pour non commercial], Kicad [populaire / gratuit], Diptrace [pas cher], Altium [££££ 's, etc.) et l'utiliser à l'avenir.
Oli Glaser
1
6. N'oubliez pas une résistance de rappel sur la broche MCLR. Ou définissez le bit de configuration qui utilise le pull-up interne, si disponible.
ajs410
2

Je recommande fortement le livre de la série O'Reilly "Designing Embedded Systems" de John Catsoulis pour quelqu'un dans votre position. Il y a un chapitre "Electronics 101" qui vous amènera à la vitesse fonctionnelle assez rapidement, et d'autres sur la construction pratique.

Scott Seidman
la source
2
  1. Ne dépassez pas 5V, votre PIC pourrait se brûler au-dessus du niveau de tension de 5V. Vous pouvez utiliser des piles 9V ou un adaptateur AC / DC avec un régulateur de tension linéaire comme LM7805 pour produire 5V pour votre circuit. Comment câbler:

    http://stuff.nekhbet.ro/2006/06/18/how-to-build-a-5v-regulator-using-78l05-7805.html

  2. Comme la plupart d'entre eux l'ont dit: n'oubliez pas de fournir une broche MCLR avec une résistance série. Vous pouvez utiliser la configuration pull-up pour réinitialiser votre PIC. Voici le lien pour le schéma: http://www.mcuexamples.com/push-buttons-and-switch-debouncing-with-PIC.php

  3. Utilisez toujours une résistance série avant une LED. Cela évitera que la led ne soit brûlée et réduira la consommation d'énergie. Pour des leds 3,3V, 220 ou 330 ohms seraient bien.

Marteaux
la source
2

La fonction des boutons est simple. Lorsque nous appuyons sur un bouton, deux contacts sont réunis et la connexion est établie. Pourtant, ce n'est pas si simple. Le problème réside dans la nature de la tension en tant que dimension électrique et dans l'imperfection des contacts mécaniques. C'est-à-dire qu'avant que le contact ne soit établi ou coupé, il y a un court laps de temps où des vibrations (oscillations) peuvent se produire en raison de l'inégalité des contacts mécaniques, ou en raison de la vitesse différente en appuyant sur un bouton (cela dépend sur une personne qui appuie sur le bouton). Le terme donné à ce phénomène s'appelle SWITCH (CONTACT) DEBOUNCE. Si cela est ignoré lors de l'écriture du programme, une erreur peut se produire ou le programme peut produire plus d'une impulsion de sortie pour une seule pression sur un bouton. Afin d'éviter cela, nous pouvons introduire un petit retard lorsque nous détectons la fermeture d'un contact. Cela garantira que la pression d'un bouton est interprétée comme une seule impulsion. Le délai anti-rebond est produit dans le logiciel et la durée du délai dépend du bouton et de la fonction du bouton. Le problème peut être partiellement résolu en ajoutant un condensateur sur le bouton, mais un programme bien conçu est une bien meilleure réponse. Le programme peut être ajusté jusqu'à ce que la fausse détection soit complètement éliminée. L'image ci-dessous montre ce qui se passe réellement lorsque le bouton est enfoncé. Le programme peut être ajusté jusqu'à ce que la fausse détection soit complètement éliminée. L'image ci-dessous montre ce qui se passe réellement lorsque le bouton est enfoncé. Le programme peut être ajusté jusqu'à ce que la fausse détection soit complètement éliminée. L'image ci-dessous montre ce qui se passe réellement lorsque le bouton est enfoncé.

En savoir plus: http://romux.com/tutorials/pic-tutorial/push-buttons#ixzz43cAbVcWR

John
la source
1

En plus de ce que les autres ont écrit: ne pas attribuer à des broches de sortie PIC individuelles, comme par exemple "PORTB.RB0 = 1;". Au lieu de cela, effectuez le changement de bit dans une variable de taille octet, puis écrivez cette variable sur le port.

Vous pouvez soit

  • croyez-moi,
  • lire sur le problème "lecture-modification-écriture", ou
  • subir les conséquences
Wouter van Ooijen
la source