Remplir un registre à décalage en C, manière économique ?
Répondre à la discussion
Affichage des résultats 1 à 19 sur 19

Remplir un registre à décalage en C, manière économique ?



  1. #1
    Canaillou2k5

    Remplir un registre à décalage en C, manière économique ?


    ------

    Bonjour, afin d'économiser quelques sorties de mon microcontrôleur, je voulais utiliser un registre à décalage, mais disons que ça pose un peut problème niveau programmation car ca prend un peut trop de mémoire...

    Le but est de commander des afficheurs 7 segments, sans le registre à décalage ça me prend 11 bits (4 adresse, 7 données), avec ca m'en que prend 6.

    Le code est un peut différent, il est adapté à Xcode (pour tester l'algo avant de le mettre dans le micro)

    Code:
    	
    	int tab_valeurs[]={1,3,6,4,8,9}; // les valeurs à transmettre en décimal.
    	
    	int i=0, y=0, j=0;
    
    	//fonctions
    
    	void interrupt() // interruption timer overflow (on envoi tout les x ms)
    	{
    			
    	int tab_chiffres[]={1,1,1,1,1,1,0,0,1,1,0,0,0,0,1,1,0,1,1,0,1,1,1,1,1,0,0,1,0,1,1,0,0,1,1,1,0,1,1,0,1,1,1,0,1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,1,1}; // chiffre de 0 à 10 codé pour afficheur 7 segments
    		
    		
    	PORTC=i;	
    				
    	switch (tab_valeurs[i]) //en fonction du chiffre décimal, on commence à un endroit précis du tab_chiffres pour avoir le code binaire.
    	{
    		case 0:j=0;  break; 
    		case 1:j=7;  break;
    		case 2:j=14; break;
    		case 3:j=21; break;
    		case 4:j=28; break;
    		case 5:j=35; break;
    		case 6:j=42; break;
    		case 7:j=49; break;
    		case 8:j=56; break;
    		default:j=63;break;
    	}
    		
    	y=j;
    	
    
    	do  {
    		
    		PORTC.4=tab_chiffres[j]; // on ecrit le bit
    		PORTC.5=1; // decalage du registre
    		delay_us(100);
    		PORTC.5=0;
    		j++; // on prend le chiffre suivant du tableau
    		
    		}
    	while (j<y+7); // on recommence 7 fois
    	
    	if(i<5)i++; // a chaque fois qu'on passe par l'interrupt on prend un autre chiffre.
    	else i=0;
    
    	}
    
    	
    int main (int argc, const char * argv[]) {	
    	
    	interrupt(); // on simule le compteur en appelant la fonction
    	interrupt();
    	interrupt();
    	interrupt();
    	interrupt();
    	interrupt();
        return 0;
    }
    Voici le code sans registre à décalage, c'est pour ça que je pense que je m'y prend mal...

    Code:
    int tab[]={1,1,2,8,0,0}; // variable globale, valeurs à envoyer.
    
    interrupt[7] void mux()
    {
    
    int val[]={126,48,109,121,51,91,95,112,127,123}; // chiffre de 0 à 10 codé pour afficheur 7 segments
    
    PORTB=val[tab[i]]; //on prend la valeur dans val correspondant au chiffre de tab
    PORTD=i << 3; // adresses
    
    if(i<6)i++; // a chaque fois qu'on passe par l'interrupt on prend un autre chiffre.
    else i=0;
    
    }
    Je cherche à partir des valeurs 126, 48, 109 etc de récupérer le code binaire correspondant accessible bit par bit, ca serai l'idéal.

    Merci de votre aide.

    -----

  2. #2
    Seb.26

    Re : Remplir un registre à décalage en C, manière économique ?



    utilise les bit-shift ( << et >> )

    NB: et arrêtes de mettre du int à tout va, t'es pas sur ton PC avec 4GB de ram ...

    PS: 100uS de timing pour le latch, c'est plus un registre à décalage, mais un marteau et un burin ... mets 2 ou 3 NOP et basta (voir la doc)
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  3. #3
    Canaillou2k5

    Re : Remplir un registre à décalage en C, manière économique ?

    Je n'avais pas pensé au << >> même si je l'utilise une ligne après...

    int? y'a quoi de plus économique ? - les chars je suppose...

    Le clock max pour le registre que j'ai trouver (http://www.datasheetcatalog.com/data.../74HC164.shtml) et entre 78Mhz et 61Mhz, 100us c'est plutôt lent non ?

    Voici mon code, je ne pense pas que ca fonctionne, quand je fait ça, "val[tab[i]] << i" il va prendre la valeur binaire?

    void interrupt()
    {

    int val[]={126,48,109,121,51,91,95,112, 127,123};

    PORTD=i << 3;

    do {

    PORTB.4=((val[tab[i]] << i ) && 100000000);

    i++;

    PORTC.5=1; // decalage du registre
    delay_us(100);
    PORTC.5=0;

    } while (i<6)


    if(i<5)i++;
    else i=0;

    }

  4. #4
    Seb.26

    Re : Remplir un registre à décalage en C, manière économique ?

    Citation Envoyé par Canaillou2k5 Voir le message
    int? y'a quoi de plus économique ? - les chars je suppose...
    utilise des unsigned char ... c'est un octet dans 99% des cas ... int c'est ??? octets (souvant 4 octets)
    (tu es sur quel uCPU ?)

    Citation Envoyé par Canaillou2k5 Voir le message
    Le clock max pour le registre que j'ai trouver (http://www.datasheetcatalog.com/data.../74HC164.shtml) et entre 78Mhz et 61Mhz, 100us c'est plutôt lent non ?
    C'est ce que je te disais ... tu mets juste un NOP ou deux et roule !

    Code:
    void interrupt()
    {
    ...
    }
    je comprends même pas ce que tu voulais faire ...

    L'algo est simple :
    > tu charge tes 8b de data dans un unsigned char
    > tu fais x fois :
    > > tu envois le bit de poids faible
    > > tu décale à droite d'un bit
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

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

    Re : Remplir un registre à décalage en C, manière économique ?

    Oki cet algo fonctionne:

    Code:
    interrupt[7] void mux()
    	{
    		
    		unsigned char val[]={126,48,109,121,51,91,95,112,127,123};
            		
    		unsigned char j=0;
    		
    		do {
    				
    			PORTB=((( (val[tab_valeurs[i]]) >> j ) & 0b00000001) | (i << 2));
                
    			j++;
    			
    			PORTB.1=1; // decalage du registre
    			PORTB.1=0;
    			
    			} while (j<7);		
    
    	if(i<5)i++;
    	else i=0;
    
    	}
    Merci pour l'aide.

    Je suppose que c'est ça le NOP ^^

    En effet j'utilise tout le temps les int, mauvaise habitude (ou mauvais prof) car j'ai toujours utiliser ça.

    La je bosse sur un Attiny2313.

    Sinon je pense même attaquer mes 6 broches par un autre registre, afin de commander mes 16 - 7 segements avec deux fils; à 16Mhz l'oeil n'y verra que du feu^^

  7. #6
    Seb.26

    Re : Remplir un registre à décalage en C, manière économique ?

    Citation Envoyé par Canaillou2k5 Voir le message
    Je suppose que c'est ça le NOP ^^
    Un NOP, c'est juste une operation qui ne fait rien (NOP = No OPeration) mais qui fait attendre le CPU quelques cycles ...

    dans ton cas, il faut mettre le Nop() entre le PORTB.1=1; et le PORTB.1=0;
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  8. #7
    Canaillou2k5

    Re : Remplir un registre à décalage en C, manière économique ?

    Très bien je savais pas.

    J'ai trouver un petit 74LS242 (BCD to 7 segements); du coup j'aurais que 8 pins sans registre à décalage et 2 avec pour commander mes digits...

  9. #8
    Canaillou2k5

    Re : Remplir un registre à décalage en C, manière économique ?

    [edit] mon compilateur ne connait pas Nop(); - je suis sous ATMEL....

  10. #9
    Seb.26

    Re : Remplir un registre à décalage en C, manière économique ?

    Citation Envoyé par Canaillou2k5 Voir le message
    [edit] mon compilateur ne connait pas Nop(); - je suis sous ATMEL....
    il faut peut être que tu fasse un #define du dtyle :
    Code:
    #define Nop() asm { nop }
    Cherche Nop avec le nom de ton compilo sur gogole ...
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  11. #10
    DAUDET78

    Re : Remplir un registre à décalage en C, manière économique ?

    Citation Envoyé par Canaillou2k5 Voir le message
    J'ai trouver un petit 74LS242 (BCD to 7 segements);
    ??????????????
    74xx247 peut être ?
    J'aime pas le Grec

  12. #11
    Seb.26

    Re : Remplir un registre à décalage en C, manière économique ?

    Citation Envoyé par DAUDET78 Voir le message
    ??????????????
    74xx247 peut être ?
    Trop fort Daudet ! ... et le pire c'est que je suis sûr que as dit ça de tête !!!
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  13. #12
    DAUDET78

    Re : Remplir un registre à décalage en C, manière économique ?

    Citation Envoyé par Seb.26 Voir le message
    ... et le pire c'est que je suis sûr que as dit ça de tête !!!
    Quand tu as utilisé des 74 pendant 40 ans, la base de donnée, elle est dans les neurones à 90% !
    J'aime pas le Grec

  14. #13
    Canaillou2k5

    Re : Remplir un registre à décalage en C, manière économique ?

    En effet c'est bien le 247 ^^

    Je cherche un inverseur 8e/s qui peut bouffer 20mA, ca existe ?

    La j'ai quitter XP, je vous tien au courant pour le nop.

    Au pire si c'est pour bouffer un cycle je met un delay de 125nS (8Mhz)...

  15. #14
    DAUDET78

    Re : Remplir un registre à décalage en C, manière économique ?

    74LS240 24mA au niveau bas
    ULN2803 200mA (?) au niveau bas
    J'aime pas le Grec

  16. #15
    Canaillou2k5

    Re : Remplir un registre à décalage en C, manière économique ?

    Bonjour, en fait j'aurai besoin de 20mA au niveau haut, je m'explique:

    J'utilise actuellement un BCD=>7 seg (74LS247)

    Le problème c'est que c'est un collecteur ouvert, j'utilise des résistances de pull-up entre le Vcc et ma Pin. Mais cela inverse ma sortie.

    Donc derrière j'ai un inverseur 74HC04 qui me sort 20mA pour alimenter directement mes segments mais il à que 6 inverseur, il m'en faut 7 donc ça me fait utiliser une puce en plus pour un inverseur utilisé.

    J'ai pensé aussi utiliser 7 NPN, mais ça fait moche^^

  17. #16
    Canaillou2k5

    Re : Remplir un registre à décalage en C, manière économique ?

    OK CD4511 et mon problème est résolu si je me trompe pas !

  18. #17
    Canaillou2k5

    Re : Remplir un registre à décalage en C, manière économique ?

    Autre question, sur le 74HC154 cette fois:

    IO output current −0.5 V < VO < VCC + 0.5 V [1] - ±25 mA

    Pourquoi quand je me branche dessus j'ai le doit qu'a 6mA, en ce moment je passe par un 74HC540 + UNL2003A et j'ai du 13mA pour mes segments qui ont une intensité correcte.

  19. #18
    Canaillou2k5

    Re : Remplir un registre à décalage en C, manière économique ?

    Tant pis pour le 154, j'ai vu que le 74LS240 existe en non inverseur...

    Donc voilà à quoi je suis arriver (montage en pièce jointe).
    Images attachées Images attachées  

  20. #19
    Canaillou2k5

    Re : Remplir un registre à décalage en C, manière économique ?

    Bonjour, j'ai une nouvelle question, je ne peut pas utiliser de registre à décalage, car les bits se décalent un à un, du coup entre deux codes correcte ca va afficher n'importe quoi.

    Mais je suppose qu'il y à des circuit logique qui permettent commander un état genre HI/passant sur 8 bits?

Discussions similaires

  1. registre de décalage
    Par invite55fae67a dans le forum Physique
    Réponses: 3
    Dernier message: 20/12/2010, 21h37
  2. Registre à décalage
    Par invite2ceddf9e dans le forum Électronique
    Réponses: 14
    Dernier message: 09/04/2010, 07h15
  3. Registre à décalage
    Par invite1a530f8d dans le forum Électronique
    Réponses: 6
    Dernier message: 26/06/2009, 10h50
  4. registre à décalage
    Par invite74efa975 dans le forum Électronique
    Réponses: 3
    Dernier message: 30/05/2009, 17h54
  5. Registre a decalage SN74HC595N
    Par hterrolle dans le forum Électronique
    Réponses: 5
    Dernier message: 26/03/2008, 13h45
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...