Question idiote : Résistance Pull Down sur les sortie de l'atmega328p ...
Répondre à la discussion
Affichage des résultats 1 à 15 sur 15

Question idiote : Résistance Pull Down sur les sortie de l'atmega328p ...



  1. #1
    adrien4607

    Question idiote : Résistance Pull Down sur les sortie de l'atmega328p ...


    ------

    Bien le bonjour (heu ... bonsoir )
    Je suis entrain d’expérimenter les registres a décalage (74hc595) sur un atmega328p, n'ayant pas le matériel requis a ma disposition, je fait mon "laboratoire" en simulation sous Proteus ISIS et je me rend compte que quand les sorties doivent avoir un 0 logique, proteus affiche un état indéterminé .... l'erreur viens de proteus ou faut-il bien mettre des résistances pull-down ?

    Nom : res_pull_down.PNG
Affichages : 108
Taille : 30,4 Ko

    Merci d’avance

    -----

  2. #2
    invite037b2da2

    Re : Question idiote : Résistance Pull Down sur les sortie de l'atmega328p ...

    Bonsoir,
    L'état de tes sorties est fixé par ton Atmega => pas de Pull-downs!!!
    Ne te fie pas à la simulation.
    Concernant ton registre à décalage, je te propose de le commander en SPI en attendant la validation te ta PJ.

    Tiens moi au courant.

    Réda.

  3. #3
    adrien4607

    Re : Question idiote : Résistance Pull Down sur les sortie de l'atmega328p ...

    Merci de ta réponse
    Donc en simulation je vais devoir mettre des résistances pull-down allors que dans la vie réelle il n'y en a pas besoin ... un peux mal fait ... :/

    Pour se qui est du registre a décalage, je ne suis pas encore un pro de la programmation, il faut encore que je travail sur comment utiliser tous se qui est fonction interne de la bête. Je n'ai donc pas utilisé le SPI mais directement fait un code sans l'option de l'atmega qui gère le SPI et cela fonctionne bien pour l'instant

    Encore merci de ton aide

  4. #4
    invitee05a3fcc

    Re : Question idiote : Résistance Pull Down sur les sortie de l'atmega328p ...

    Citation Envoyé par adrien4607 Voir le message
    Donc en simulation je vais devoir mettre des résistances pull-down allors que dans la vie réelle il n'y en a pas besoin ... un peux mal fait ... :/
    Je suis très étonné de la réaction de ton simulateur .... Moi, je pencherais plus pour une erreur dans la programmation de la configuration de tes broches en sorties (elles repassent en Input ? )

  5. A voir en vidéo sur Futura
  6. #5
    adrien4607

    Re : Question idiote : Résistance Pull Down sur les sortie de l'atmega328p ...

    Je ne pense pas, a moins que je ne me sois trompé qu'elle que part ... ?

    Code:
    int main(void)
    {
        while(1)
        {
    		DDRB &= 0x01 << 1 | 0x01 << 0 | 0x01 << 2; //data, clk, stcp
    		for(int a = 0; a < 8 ; a++)
    		{
    			PORTB &= ~(0x01 << 0);																	
    			if(0x04 & (0x01 << a))			
    			     PORTB |= 0x01 << 1;
    			else
    			     PORTB &= ~(0x01 << 1);
    			PORTB |= 0x01 << 0;																	
    		}
    		PORTB |= 0x01 << 2;
    		PORTB &= ~(0x01 << 2);
        }
    }

  7. #6
    adrien4607

    Re : Question idiote : Résistance Pull Down sur les sortie de l'atmega328p ...

    heu ... je viens de voir qu'il y avais un truc qui clochais ... DDRB &= ....

    Je crois que ça devrais être DDRB |= ....

  8. #7
    adrien4607

    Re : Question idiote : Résistance Pull Down sur les sortie de l'atmega328p ...

    Effectivement ça va mieux

    Merci pour votre aide

  9. #8
    invitee05a3fcc

    Re : Question idiote : Résistance Pull Down sur les sortie de l'atmega328p ...

    Perso, je suis incapable de lire ton programme (surtout qu'il me semble qu'il y a des astuces d'écriture ... syntaxiquement correcte mais qui rendent la relecture pas évidente!)

    Mon idée de base, c'est que si le simulateur faisait ce genre d'erreur ...... ça se saurait et ça aurait été corrigé vite fait. Donc il y a un un os quelque part, dans ton programme.

  10. #9
    adrien4607

    Re : Question idiote : Résistance Pull Down sur les sortie de l'atmega328p ...

    Effectivement le soucis venais bien du coté programme, j'utilise des opérateur bit à bit, et la à la place d'utiliser un OU j'ai utiliser un ET donc mes "sortie" était configuré en entrée, c'était donc les résistance PULL-UP qui était activée ou non

    C'est quoi des astuce d'écriture ? Tous se que j'ai appris viens d'internet et les opération bit à bit, je l'es ais appris grâce a SKYWODD et personnellement je ne vois pas comment réécrire le code ... ou alors c'est beaucoup plus long et ça me parait plus compliqué ...

  11. #10
    invitee05a3fcc

    Re : Question idiote : Résistance Pull Down sur les sortie de l'atmega328p ...

    Citation Envoyé par adrien4607 Voir le message
    C'est quoi des astuce d'écriture ?
    J'en sais rien .... mais j'avais du mal à comprendre ton code (je suis nul en C )

    Par contre, question réflexion, je me défend encore bien !

  12. #11
    invite037b2da2

    Re : Question idiote : Résistance Pull Down sur les sortie de l'atmega328p ...

    Bonjour,
    Effectivement comme le dit DAUDET78, ton programme m'a l'air bizarre.
    1/ pourquoi tu définis le mode de tes pins I/O dans ta boucle sans fin ????
    2/ en ce qui concerne tes opérations logiques tu compliques la chose.

    Je te posterai un bout de code une fois devant un PC, sur un téléphone ce n'est pas évident.

    Réda.

  13. #12
    invite29971eb1

    Re : Question idiote : Résistance Pull Down sur les sortie de l'atmega328p ...

    Code:
    // Code non testé
    #include <delay.h>
    
    #define REG_DATA  1<<1
    #define REG_CLK     1<<0
    #define REG_STCP   1<<2
    
    #define Setb(port, pin) port|=pin
    #define Clrb(port, pin)  port&=~pin
    
    int main(void)
    {
    DDRB= REG_DATA | REG_CLK | REG_STCP;
        
    while(1)
        {
    		unsigned char consigne=0x04;
                    for(int a = 0; a < 8 ; a++)
    		{
    			Clrb(PORTB,REG_CLK);
    			
                            if(consigne & (0x01 << a))			
    			     Setb(PORTB,REG_DATA);
    			else
    			     Clrb(PORTB,REG_DATA);
                            
                            Delay_us(1);			
                            Setb(PORTB,REG_CLK);
    		}
                            Setb(PORTB,REG_STCP);
                            Delay_us(1);
                            Clrb(PORTB,REG_STCP);
    	
        }
    }
    C'est déjà plus clair, non?

    les delay sont là pour que, par optimisation, ton micro ne regroupe les accès consécutifs au port et donc annule leur synchro (voire même les supprime dans le cas de STCP). Pas sur qu'ils soient nécessaires ou éventuellement remplaçables par une directive de compliation.

    Avant même d'utiliser le SPI, on peut faire plus optimisé avec 2-3 lignes d'assembleur. On décale à droite l'octet de donnée, on teste la Carry et on active ou non la broche data. C'est du code simplifié mais l'idée est là

    Code:
    CBI PORTB,PIN_CLK  // clock à 0
    LSR data  // on décale à droite la donnée, Carry récupère la valeur du bit le plus à droite avant décalage
    BRCS Mise_a_1  // si Carry est à 1 on va mettre à 1 la broche de sortie
    CBI PORTB,PIN_DATA // sinon on clear la broche de sortie
    RJMP Fin                    // et on va à la fin de la fonction
    Mise_a_1:
    SBI PORTB,PIN_DATA // on met à 1 la broche de sortie
    SBI PORTB,PIN_CLK   // clock à 1 
    Fin:
    RET
    Si le compilateur n'est pas trop bête, ton programme C traduit en assembleur devrait ressembler à ça de toutes façons.

  14. #13
    invite037b2da2

    Re : Question idiote : Résistance Pull Down sur les sortie de l'atmega328p ...

    Citation Envoyé par ftorama Voir le message
    Avant même d'utiliser le SPI, on peut faire plus optimisé avec 2-3 lignes d'assembleur
    Effectivement, on peut réaliser son propre SPI, j'ai déjà fait ça à la fac, ça ne marche pas à 100% en mode esclave ( ex : carte SD ) le maître impose son horloge et le micro ne suit pas forcement.....

    Citation Envoyé par reda-21 Voir le message
    Je te posterai un bout de code une fois devant un PC, sur un téléphone ce n'est pas évident.

    Réda.
    Code:
    void Init_Ports() {                                         // Petite Fonction d'initialisation :)
    DDRB = 0x07;                                                // 0x07 = 0000 0111 => PB0, PB1, PB2 à 1 
    }
    void main() {
    Init_Ports();
    while (1) {
                 PORTB &= ~ (1 << k);                      // Mettre à 0 le bit "k" de l'octet PORTB
                 PORTB |= (1 << k);                        // Mettre à 1 ------------------------
                 }
    }

    Réda.

  15. #14
    invite037b2da2

    Re : Question idiote : Résistance Pull Down sur les sortie de l'atmega328p ...

    Citation Envoyé par adrien4607 Voir le message
    Je crois que ça devrais être DDRB |= ....
    Non DDRB |= sert à modifier un ou plusieurs bits dans un octet Sans toucher aux autres, le | ( différent du || ) correspond à une somme bit à bit.

    ex : mettre uniquement PB4 en en sortie ==> DDRB |= 0x1F
    ex1 : DDRB vaut 0xFF ==> Le PortB est configuré en sortie, si je veux mettre [PB4 -> PB7] en entré sans toucher aux autres bits ([PB0 -> PB3]) j'utilise ton fameux DDRB &= 0x0F;

    Réda.

  16. #15
    adrien4607

    Re : Question idiote : Résistance Pull Down sur les sortie de l'atmega328p ...

    Citation Envoyé par reda-21 Voir le message
    1/ pourquoi tu définis le mode de tes pins I/O dans ta boucle sans fin ????
    je dois dire que j'ai coder le code vite fait, et je n'est pas penssé a sortir la configuration des pins de la boucle sans fin

    @ftorama : c'est la première fois que je vois ça :
    Code:
    #define Setb(port, pin) port|=pin
    #define Clrb(port, pin)  port&=~pin
    Je suppose que Setb permet de mettre une sortie à 1 et Clrb à 0 mais le reste je sèche ...
    Pourquoi mettre un "unsigned char" alors qu'on envoi un octect donc un "uint8_t" ?
    Le langage ASM est encore pour moi du chinois ...

    Citation Envoyé par reda-21 Voir le message
    Non DDRB |= sert à modifier un ou plusieurs bits dans un octet Sans toucher aux autres, le | ( différent du || ) correspond à une somme bit à bit.

    ex : mettre uniquement PB4 en en sortie ==> DDRB |= 0x1F
    ex1 : DDRB vaut 0xFF ==> Le PortB est configuré en sortie, si je veux mettre [PB4 -> PB7] en entré sans toucher aux autres bits ([PB0 -> PB3]) j'utilise ton fameux DDRB &= 0x0F;

    Réda.
    C'est bien se que je veux faire et ce que je fais ..., je veux modifier un ou plusieurs bits dans un octet sans touchez aux autre. Je ne vois pas ou se que tu veux en venir ?


    Merci a tous de votre aide

Discussions similaires

  1. Pull down sur PWM et sortie de mon pic
    Par bypbop dans le forum Électronique
    Réponses: 1
    Dernier message: 10/11/2010, 16h25
  2. résistance pull up/pull down?
    Par invite4b61c3b1 dans le forum Électronique
    Réponses: 3
    Dernier message: 31/10/2008, 14h47
  3. Réseau R-C en sortie Push-Pull
    Par invitea3c675f3 dans le forum Électronique
    Réponses: 11
    Dernier message: 19/04/2008, 23h59
  4. Résistance de Pull-Up
    Par invitee2756343 dans le forum Électronique
    Réponses: 12
    Dernier message: 20/03/2007, 17h24
  5. sortie push-pull, liaison RS422, RS485
    Par invite0936b3b8 dans le forum Électronique
    Réponses: 1
    Dernier message: 30/01/2007, 11h27
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...