Bonjour,
J'ai une application avec un BP RAZ branché sur MCLR avec une résistance vers VDD.
Un appui court ne fait pas un bon RESET. Comment faire pour être sûr d'avoir à chaque fois une bonne remise à zéro ?
Merci pour vos idées.
-----
Bonjour,
J'ai une application avec un BP RAZ branché sur MCLR avec une résistance vers VDD.
Un appui court ne fait pas un bon RESET. Comment faire pour être sûr d'avoir à chaque fois une bonne remise à zéro ?
Merci pour vos idées.
une bon créneau bien raide , avec une bascule de schmitt (40106)
un monostable entre le BP et le reset
Ou mettre un condensateur en parallèle au bp.
La pulse nécessaire doit faire 2µs au minimum, difficile de faire moins avec un doigt sur un bouton...Je n'ai toujours mis qu'un simple BP sans capa juste une pull up et sans aucun souci...
Qu'entends tu par un "BON" reset ?
Ou alors appui d'au moins une seconde sur le bouton reset...
Leonardo était ingénieur "sans papier", et moi diplômé juste...technicien...
Je constate que toutes les sorties ne sont pas à 0. Elles sont commandées par des MCP23016.
Un 2e appui remet tout en ordre ou alors un appui plus long.
C'est ça que j'appelle un "bon reset".
BonsoirLe problème n'est donc pas un problème de RAZ du PIC, mais plutôt celui des MCP23016.
Vu qu'il n'y a pas d'entrée de reset sur les MCP23016, juste un circuit POR (Power On Reset) relié à l'alimentation VDD, il faudrait que tu nous précises comment tu réalises la réinitialisation de ces circuits via le bouton-poussoir de RAZ.
S'agit-il d'une coupure franche de l'alimentation des MCP23016, ou d'une séquence d'initialisation transmise par le bus I2C ? (... ou bien n'as-tu simplement pas prévu la RAZ de ces circuits ?)
Un appui sur le BP va redémarrer le PIC.
AU début du programme, je commence par initialiser les 23016 en sortie et je mets toutes les sorties à 0.
j'ai déjà eu des problèmes de reset, la cause en était l'interrupteur secteur qui crachouillait un max.
L'alime au départ faisait donc des "vagues".
Sur une trentaine de montage allumé en même temps certains plantaient aléatoirement au démarrage.
La solution économique a été de mettre des 100µf sur le reset avec des diodes en inverse sur la résistance de charge.
Mais la solution correcte aurait été des monostables avec une tempo de l'ordre de secondes.
bonjour,
J'ai eu un probleme similaire mais avec un MCP23017 (I2C au lieu de SPI)
alea des sorties à la mise sous tension ..
Il a fallu que je fasse le contraire
forcer TOUS LES BITS des latches AVANT de definir le sens
mise à 1 des registres OLATA et OLATB avant de definir le sens via les registres IODIRA et IODIRB
sachant que mes sorties sont des leds tirees au +5V
exemple d"init pour la version I2C
Code:void I2C_MCP23017_Init(Byte Adresse) { I2C_Start(); Tempo(100L); Ve=I2C_Write(Adresse); //envoi de l'adresse Ve=I2C_Ack(); Ve=I2C_Write(0x0A); //@0A IOCON avec BANK=0 Ve=I2C_Ack(); Ve=I2C_Write(0x00); //config_MCP23017 ); // 0x00 bank0 Ve=I2C_Ack(); I2C_Stop(); // rajout modif suite sugestion de Claudy Rouge 31/05/2011 I2C_Start(); Ve=I2C_Write(Adresse); //envoi de l'adresse Ve=I2C_Ack(); Ve=I2C_Write(0x14); // adresse OLATA Ve=I2C_Ack(); Ve=I2C_Write(0xFF); // tous les Bits forcés a 1 pour OLATA Ve=I2C_Ack(); Ve=I2C_Write(0xFF); // tous les Bits forcés a 1 pour OLATB Ve=I2C_Ack(); I2C_Stop(); I2C_Start(); Ve=I2C_Write(Adresse); //envoi de l'adresse Ve=I2C_Ack(); Ve=I2C_Write(0x00); //@00 adresse de depart = 00 Ve=I2C_Ack(); Ve=I2C_Write(0x00); //@00=IODIRA direction = 00 = output Ve=I2C_Ack(); Ve=I2C_Write(0xFF); //@01 IODIRB direction = FF = port B en entree Ve=I2C_Ack(); Ve=I2C_Write(0x00); //@02 IOPOLA polarite =FF sortie idem que pin Ve=I2C_Ack(); Ve=I2C_Write(0xFF); //@02 IOPOLB polarite =FF sortie idem que pin Ve=I2C_Ack(); I2C_Stop(); I2C_Start(); Ve=I2C_Write(Adresse); //envoi de l'adresse Ve=I2C_Ack(); Ve=I2C_Write(0x0D); // adresse GPPUB= 0D Ve=I2C_Ack(); Ve=I2C_Write(0xFF); //@16 = FF =PULL UP portB Enabled Ve=I2C_Ack(); I2C_Stop(); }
Les MCP23016 étant déjà sous tension, s'ils ne se réinitialisent pas quand le PIC le leur demande, alors c'est probable parce que les ordres qu'il leur transmet (ou tente de leur transmettre) sont incorrects ou mal interprétés, du fait par exemple d'un contenu incorrect des trames envoyées, de trames ou de séquences mal formées au regard du protocole I2C, ou bien de l'état dans lequel l'interface I2C a été placée durant la séquence de réinitialisation du PIC.
Comme le reset arrive n'importe quand, on ne peut pas savoir l'état du bus.
Je vais essayer ce que propose Paul avec les registre OLAT.
Je dirais ce que ça donne.
Pour limiter les effets de rebonds du bouton reset qui ferait que le pilotage des MCP serait incertain au démarrarge, le plus simple est de mettre une petite tempo de 0.5 seconde dans ton soft avant d'entreprendre une quelconque action
Oui, c'est le plus simple..
Un grand merci à tous, ça marche.
Ce que j'ai fait :
- une tempo juste avant la séquence d'init des 23016
- positionné les registres OLAT avant les registres IODIR.
J'ai fait pas mal d'essais et aucun raté.