je ne comprend rien a la datasheet apres plusieur essai je n'arrive toujour pas a ecrire sur les port du MCP23016
si quelqu'un a une idée
-----
je ne comprend rien a la datasheet apres plusieur essai je n'arrive toujour pas a ecrire sur les port du MCP23016
si quelqu'un a une idée
Bonjour
Il faut que tu accedes aux registres de config un par un, le code 67h n'existe pas dans le tableau 1.3, n'inventes pas des choses, un exemple, tu veux ecrire sur les ports:
1° tu envoies l'adresse du composant (0100) suivit de A2, A1 et A0 suivit de R/W=0
2° Tu envoies le COMMAND BYTE ici 6h pour IODIR0
3° Tu envoies 00000000 pour mettre le port0 en sortie
4° tu envoies un stop et tu recommences pour IODIR1
5° tu recommences pour acceder au registre GP0 code 0h avec R/W=0 (tu veux ecrire) et tu ecris la valeur que tu veux sur le port0 et ainsi de suite pour l'autre port.
En faite il n'y a pas grand chose à lire en anglais, il faut regarder l'image 1.3.
Gilles
Il y a aussi une partie hard à configurer pour l'adresse du composant, adresse qui sera reprise dans le dialogue soft.
merci
je n'avais pas compris comme les registre etait sur 4 bit je pensais que l'on enmettai 2 a la suite suivie de data 1 puis data2
sinon pour la partie adresse en hard pour la mttre a 0 pas de souci mais pour la mise a 1 faut il une resistance ou directement a VDD?
bye
Désolé, mais maintenant, c'est moi qui ne comprend pas.
Si tu mets une résistance vers VDD et un cavalier entre masse et la pin d'adresse :
cavalier mis : adr = 0
cavalier retiré : adr = 1
Avec 3 cavaliers (ou pas de cavalier) sur A0, A1 et A2, tu as le choix entre 8 adresses.
Bonjour
Ils aurraient pu ecrire 06h au lieu de 6h, mais dans la suite, on comprend que tu ne pourrais pas ecrire dans deux registres en même temps.
J'imagine que tu parles de A2, A1 et A0, dans ce cas, à mon avis, c'est directement à Vdd.sinon pour la partie adresse en hard pour la mttre a 0 pas de souci mais pour la mise a 1 faut il une resistance ou directement a VDD?
bye
J'espere que tu n'as pas oublié la resistance de 3.7K et le condo de 33pF pour l'entrée CLK (voir figure 1.1)
Gilles
Qu'est ce que tu ne comprends pas.
Ce soir j'ai écrit un mini prog pour ce CI (que je compte bientôt utiliser) et çà marche du 1er coup.
Je travaille en Basic.
Il n'y a que la partie du prog pour le 23016.Code:;************************************************************* ; PROGRAMME PRINCIPAL ;************************************************************* GoSub INIT_I2C LOOP: LOOP1: BusOut 01000000, 0,[255,255] DelayMS 500 BusOut 01000000, 0,[0,0] DelayMS 500 GoTo LOOP1 ;************************************************************* ; S/P INIT_I2C ;************************************************************* INIT_I2C: BusOut 01000000, 6,[0,0] ;1er 23016 en sortie DelayMS 10 Return
merci a vous j'essai demain et je vous tient au courant
merci a gedounet pour le clok je n'avait pas fais attention
merci a vous tous
je communique grace a vous avec mon mcp
je vais maintenant pouvoir passer a la suite
bonjour a tous
je n'ai toujours pas ajouté mes poussoir (3bouton, un +, un -,et un mode)
je pensais utiliser une interruption sur timer
a chaque interruption on scrute les bouton brancher sur le port B
et on agi en fonction ou non, suivant si bouton appuyé on non
pour le câblage je pense qu'il faut relier le pic a la masse par l'intermédiaire une résistance et au VDD par le bouton poussoir (dite moi si je me trompe ou si il y a plus simple)
après pour le programme je ne sait pas comment partir
il faut que lorsque l'on appuie sur le bouton +
le port 0 du premier mcp passe de 10101010 a 01010101
puis nouvelle appuie 11100010
puis nouvelle appuie 00110011
ansi de suite avec des valeur prédéfini (environ 20 valeur)
bien sur on revient a la précédente si appuie sur -
ensuite on appuie sur mode puis sur + (ou -) on passe a GP1 du mcp
appuie sur mode on le modifie avec les même valeur que précédemment
on ré appuie sur mode puis + (ou -) on passe au mcp suivant sur GP0(ou retour a GP0 du premier MCP) ainsi de suite
contrôle jusqu'à 8 mcp
merci de me guider je me suit perdu
Des idées ??
j'ai essayer de programer pour utiliser deux bouton tres simplement changement d'une variable pour le nombre de boucle d'un compteur pour une tempo qui fais clignoter une led
scrut a toute le interuptions du timer0 mes 2 bouton
si plus apuier 9 boucle si moins 1
et plus rien ne se passe la led ne clignote plus
Tu peux utiliser les interruptions sur changement d'état de port au lieu de scruter les BP.
peut tu developper STP
merci
oui sa j'ai vue
mais aurrait tu un exemple de code en asm tout simple qui gere sa ??
http://www.abcelectronique.com/bigonoff/, cours n°1.
c grâce a se cour que j'apprends
mais je n'arrive pas a gérer les interruption sur RB4/RB7
voila le codemerciCode:INTCONVAL EQU B'00001000' ;sauvegarder registres ;--------------------- org 0x004 ; adresse d'interruption movwf w_temp ; sauver registre W swapf STATUS,w ; swap status avec résultat dans w movwf status_temp ; sauver status swappé movf FSR , w ; charger FSR movwf FSR_temp ; sauvegarder FSR BANK0 ; passer en banque0 ; interruption RB4/RB7 ; -------------------- intsw2 btfsc INTCON,RBIE ; tester si interrupt RB4/7 autorisée btfss INTCON,RBIF ; oui, tester si interrupt RB4/7 en cours goto intsw3 ; non sauter call intrb4 ; oui, traiter interrupt RB4/7 bcf INTCON,RBIF ; effacer flag interupt RB4/7 goto restorereg ; et fin d'interrupt ;***************************************************************************** ; INTERRUPTION RB0/RB4 * ;***************************************************************************** intrb4 btfss PORTB,6 incf nombre,f ; incrémenter nombre btfss PORTB,5 decf nombre,f ; incrémenter nombre ; btfss PORTB,4 ; incf nombre,f call antirebond return ; fin d'interruption RB0/RB4 ; peut être remplacé par ; retlw pour retour code d'erreur ; autoriser interruptions (banque 0) ; ---------------------------------- clrf PIR1 ; effacer flags 1 bsf INTCON,GIE ; valider interruptions goto start ; programme principal
Qu'est ce que tu n'arrives pas ?
Bigo explique bien.
Bonjour
L'interruption sur RB4/RB7 est une interruption qui se declanche sur un changement d'etat de RB4/RB7, on dirait que tu n'attends que des fronts montants, il faut aussi traiter le cas des fronts descendants.
De plus une routine d'interruption doit être le plus court possible il faudrait peut être traiter en dehors de l'interruption le cas de l'antirebond, encore que dans ton cas, c'est à verifier.
P.S. Avec ton message, je viens de constater que j'ai fait une erreur sur le fichier maquette, dans l'intitulé de cette interruption, j'ai ecrit sur les fichiers maquettes "INTERRUPTION RB0/RB4" au lieu de "INTERRUPTION RB4/RB7" Je viens de corriger sur mon site: http://gedonet.free.fr/aide_pic/aide_pic.htm les fichiers maquettes pour les 16F628, 628A, 876A ,877A, 88, 767 , mais ils ne sont pas encore rectifié sur le site de Bigonoff, cela ne cause pas de probleme, mais pourrait induire en erreur un debutant.
Gilles
j'avais vue ton erreur mais j'ai regarder la datasheets et je me suis dit qued se devait etre une faute de frappe
sinon aurrai tu un exemple car je ne voie pas comment tu veux que je traite l'interuption
voie tu une erreur dans se que j'ai fait ??
merci pour tout
Bonjour
Il y a un truc qui ne va pas dans ta routine d'interruption, tu as un bouton +, un bouton - et un troisieme bouton mode qui fait je ne sais trop quoi.
Toi tu incrementes nombre avec le bouton sur RB6, tu décrementes avec RB5 et tu incrementes aussi avec RB4, il doit y avoir un probleme avec RB6 ou RB4.
Si je peux te donner un conseil, c'est d'oublier un instant la programmation du µC et d'ecrire sur un papier ce que tu veux faire avec des mots simples comme si tu voulais expliquer le deroulement de ton programme à un enfant pour qu'il le comprenne. Ensuite tu verras le but final sera plus clair dans ta tête et il sera plus simple d'ecrire ton programme.
C'est le defaut des debutants, moi le premier, de se lancer tête baissée sur le clavier pour ecrire des lignes de code sans connaitre exactement les etapes pour atteindre le but final.
Par exemple, les interruptions, c'est bien d'essayer, mais dans ton cas ou c'est un être humain qui doit appuyer sur les boutons, à mon avis, tu te compliques la vie pour rien, par exemple si tu appuies sur un bouton pendant une communication I2C, cela risque de poser de serieux problemes, avec une routine I2C soft, le µC ne ferra pas deux choses en même temps.
Gilles
pour RB4 et RB6 on pour le moment la meme fonction car je ne me suis pas encore attaquer au changement d'esclave
je fais deja la technique d'ecrire avec des mot simple c pour cela que pour chaque etape j'essaie de fair fonctionner mon montage losque il marche je valide et je passe a l'etape suivante
sinon comment veut tu que je fassse si les interuption ne sont pas la bonne metode ??
merci
Bonjour
Pour eviter les interruptions, tous le travail que tu fais dans la routine d'interruption, tu le fais au debut de ta boucle, c'est à dire que tu commences par lire l'etat des boutons, s'ils sont à 1 tu passes au bouton suivant, si l'un est à 0 alors tu traites, incf ou decf et apres avoir passé tout les boutons tu envoies la bonne valeur en I2C, ensuite une petite tempo de 10 ou 20 ms pour l'antirebond et tu reboucles sur la lecture des boutons.
Tu vois c'est tres simple et "plus c'est simple, moins c'est compliqué", il ne faut pas plus d'un quart d'heure pour ecrire le code.
Gilles
merci pour ta reponse
j'avais trouver la solution et sa marche
sinon j'ai fais un tableau comme explique bigonoff pour mes differente valeur se qui ma value beaucoup de bug (je pense que c'est a cause du include I2C en fin de programe qui se chargai sur les meme emplacement ) si tu connais une meilleur methode je suis preneur
encore merci a tous pour votre aide
Bonjour
Mplab est suffisement bien fait pour ne pas ecrire ton tableau au même endroit que la routine I2C (attention avec la derniere version de Mplab de choisir "Absolute"). Par contre si ton tableau est tres long, il peut être à cheval sur deux pages memoires dans se cas avant l'etiquette(le label) du tableau, tu places un org pour le placer en debut d'une page. Par exemple org H'800' pour un pic qui a plus de 2K de memoire flash et tu devra utiliser les macros de saut long de Bigonoff ou à la rigueur de Microchip. Si tu utilises un 16F84 ou 16F628, le probleme ne se pose évidement pas.
Gilles
merci pour la réponse cela fonctionne très bien j'arrive a faire se que je veut grâce a mes 3 boutons
mais j'ai encore une question
j'essaie de sauvegarder mes valeur en eeprom et de les charger des la mise sous tension mais mon programme plante?comme si le pic ne démarrai plus mes mcp affiche rien et je ne peut pas aller dans le menu mode (visualise led indiquant si l'on est dans le menu éteinte)
pour écrire et lire j'utilise les macro de gedounet trouver sur son site (pic16F628A)
et j'utilise l'adresse du mcp comme adresse dans l'eeprom pour sauvegarder le port 0 et adrmcp +1 pour le port 1
je n'arrive pas a trouver de solution
Bonjour
Mes macros, pour ecrire en EEprom, ont une particularité.
L'appel se fait avec
Il y a deux façons de passer l'adresse dans adeeprom,Code:REEPROM macro adeeprom ; lire eeprom (adresse dans adeeprom & résultat en w) movlw adeeprom ; charger adresse eeprom (passage de la valeur en litteral) ;movf adeeprom,w ; charger adresse eeprom (passage de la valeur par une variable)
-soit en litteral, on ecrit un nombre à la place de adeeprom, et on ne change rien
-soit en ecrivant le nom d'une variable, qui contient l'adresse, à la place de adeeprom et dans ce cas on met un point virgule devant la seconde ligne et on enleve celui qui debute la troisieme ligne.
Gilles
donc dans mon cas (l'adresse est dans une variable )
et pour l'appelerCode:REEPROM macro adeeprom ; lire eeprom (adresse dans adeeprom & résultat en w) ;movlw adeeprom ; charger adresse eeprom (passage de la valeur en litteral) movf adeeprom,w ; charger adresse eeprom (passage de la valeur
et on récupère la valeur dans wCode:REEPROM adr
Bonjour
S'il s'agit d'une question dans ton dernier post, la reponse est oui.
Gilles