[atmega8]Pourquoi mon code est aussi lourd ?
Répondre à la discussion
Affichage des résultats 1 à 4 sur 4

[atmega8]Pourquoi mon code est aussi lourd ?



  1. #1
    adrien4607

    Angry [atmega8]Pourquoi mon code est aussi lourd ?


    ------

    Bonjour(bonsoir ) tous le monde,
    Aujourd'hui(ou plus tôt hier), j'ai programmer mon petit atmega8 pour qu'il communique avec un LCD 16*2 qui est connecter à un PCF8754 (Port 1/0 8bits I²C), mon code fonctionne bien mais ... pèse très lourd, 6244 bytes et mon pauvre petit µC en à 8Kb, mais je dois insérer cette "bibliothèque" dans un projet qui risque de dépasser 1.8Kb
    J'ai donc regarder ou sa pausait problème, et c'est la gestion du LCD, plus exactement l'initialisation et je ne vois pas pour-quoi cette partie est plus grosse que les autres (quant je l'enlève ma compilation donne 1194 bytes)

    Auriez-vous donc une idée de pour-quoi cette partie est aussi grosse et y-a-t-il moyen de l'optimiser ?

    Code:
    /*
     * PCF8574.h
     *
     * Created: 9/07/2013 15:45:10
     *  Author: Adrien
     *
     * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 2.0 Belgium License.
     *
     *
     */ 
    
    
    #ifndef PCF8574_H_
    #define PCF8574_H_
    
    class PCF8574
    {
    	private:
    		static uint8_t const adresse = 0x40;
    	public:
    		static uint8_t send(uint8_t data, int read, int A0, int A1, int A2)
    		{
    			//SCK Config (27.77Khz)
    			TWBR = 0x0A;								//Bit rate division à 10
    			TWSR = (TWSR & ~((1<<TWPS0) & (1<<TWPS1)));				//TWPS à 0
    			
    			//I2C Init
    			TWCR = (1<<TWEN);							//Active l'I2C
    			TWCR = (1<<TWEN)|(1<<TWSTA)|(1<<TWINT);					//Envoi la condiont de démarage
    			while(!(TWCR&(1<<TWINT)))						//Attente de l'envoi
    			;
    			
    			//DS1307 adresse write
    			TWDR = adresse|(A0<<1)|(A1<<2)|(A2<<3)|read	;			//Inscrit l'adresse, Mode 
    			TWCR = (1<<TWEN)|(1<<TWINT);						//Envoi l'adresse
    			while(!(TWCR&(1<<TWINT)))						//Attente de l'envoi
    			;
    			
    		
    			//Data send
    			if(!read)
    				TWDR = data;								//Inscrit les donnée
    			TWCR = (1<<TWEN)|(1<<TWINT);							//Envoi les donnée
    			while(!(TWCR&(1<<TWINT)))							//Attente de l'envoi
    			;
    			
    			//Stop condition
    			TWCR = (1<<TWEN)|(1<<TWINT)|(1<<TWSTO);
    			while((TWCR&(1<<TWSTO)))
    			;
    			
    			_delay_ms(1);
    			TWCR &= (~(1<<TWEN));
    			if(read)
    				return TWDR;
    		}
    };
    class LCD
    {
    	private:
    		static int const RS =4, RW =5, E = 6, D4 = 3, D5 = 2, D6 = 1, D7 = 0;
    	public:
    		static void send(uint8_t data)
    		{
    			PCF8574::send(0x00, 0, 0, 0, 0);
    			PCF8574::send(data, 0, 0, 0, 0);							//Ecris les données
    			data |= (1<<E);
    			PCF8574::send(data, 0, 0, 0, 0);							//Confirme les données
    			_delay_us(500);
    			data &= ~(1<<E);
    			PCF8574::send(data, 0, 0, 0, 0);
    			_delay_ms(1);
    		}
    		static void display_init()									//PArtie qui pose problème
    		{
    			send(0x00);send(0x01);send(0x00);send(0x00);send(0x01);
    			send(0x03);send(0x03);send(0x03);
    			send(0x02);
    			send(0x02);send(0x08);
    			send(0x00);send(0x0C);
    			send(0x00);send(0x06);
    			send(0x00);send(0x01);
    		}
    		static void send_lettre(uint8_t lettre)
    		{
    			uint8_t data = (1<<RS)|(lettre>>4);
    			send(data);
    			data = (1<<RS)|(lettre&0b00001111);
    			send(data);
    		}
    };
    
    #endif /* PCF8574_H_ */

    J'ai été chercher un petit tuto sur les LCD car avant, je ne connaissait pas la méthode de communication, et le datasheet ma un tous petit peux aider, mais n'a pas réussi à me faire comprendre le "protocole" :/



    Merci d'avance

    -----

  2. #2
    adrien4607

    Re : [atmega8]Pourquoi mon code est aussi lourd ?

    Alors ... J'ai mis mon compilateur en mode release et ... y me sort un fichier elf de ~400 bytes mais sans .hex, j'ai donc encore chipoter dans atmel studio et maintenant y me sort un .hex de 462 bytes, je fais un hello worl et il me le compile sans erreur (en mode debug y me fessais comprendre que c'était trop gros)

    Quelle qu’un peux m'expliquer la différence entre release et debug et pour-quoi cette différence de poids?

  3. #3
    invite3c199cf9

    Re : [atmega8]Pourquoi mon code est aussi lourd ?

    Bonjour,

    Je ne connais pas ton compilateur, mais je programme souvent en Delphi, qui a deux modes de compilation: debug et release.
    Le mode debug, comme son nom l'indique, est utilisé pendant la phase de développement (points d'arrêt, interrogation des variables, etc...).
    Le mode release est utilisé lorsque le projet est terminé. Le compilateur optimise alors le code, qui réduit de volume.
    Je suppose que ton compilateur fonctionne sur ce principe.

  4. #4
    adrien4607

    Re : [atmega8]Pourquoi mon code est aussi lourd ?

    Merci pour la réponse
    Personnellement, je trouve sa un peux mal fait, car à partir d'un certain moment on ne pourrais plus déboguer le code vus la grosse différence de taille ...
    Puis ... je sais que je ne code pas comme un grand développeur ... c'est donc surement pour sa que je ne vois aucune différence (à part le gain de taille qui est énorme) entre les 2 modes

  5. A voir en vidéo sur Futura

Discussions similaires

  1. Pourquoi le spectre de l'azote est-il aussi complet ?
    Par inviteda5f7764 dans le forum Chimie
    Réponses: 2
    Dernier message: 18/05/2006, 18h18
  2. Pourquoi le spectre de l'azote est-il aussi complet ?
    Par inviteda5f7764 dans le forum Physique
    Réponses: 2
    Dernier message: 18/05/2006, 15h26
  3. pourquoi le montage dean stark est-il aussi rare ?
    Par acx01b dans le forum Chimie
    Réponses: 4
    Dernier message: 21/09/2005, 20h59
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...