IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Problème Interrupt Atmega


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2011
    Messages : 13
    Par défaut Problème Interrupt Atmega
    Bonjour,

    En programmant un microprocesseur Atmega644P avec AVR Studio 4, je rencontre un bug qui me donne du fil à retordre, voilà pourquoi je viens à vous.

    Je démarre une conversation I2C (i2c_start) puis j'attends qu'il génère une interrupt pour dire qu'il a bien effectué le start. Cette interruption remet la variable I2C_Etat à 0 tout simplement, et pour le programme principal, j'ai

    I2C_Etat = 10;
    i2c_start();

    while(I2C_Etat != 0); //tourne en boucle en attendant qu'il ait terminé

    Mais voilà, le programme semble se perdre, il ne tourne même pas dans la boucle, ni dans la routine d'interruption ! Donc je ne comprends pas..

    Voici le code complet :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
     
    #include <stdlib.h>
    #include <string.h>
    #include <avr/io.h>
    #include <avr/pgmspace.h>
    #include <avr/interrupt.h>
    #include <avr/eeprom.h>
    #include <avr/boot.h>
    #include <avr/wdt.h>
     
     
    #define SCL_CLOCK  200000L
    #define SYSCLK  20000000L
     
    //Lampe rouge
    #define ROT_ON   	PORTB &=~0x01
    #define ROT_OFF    	PORTB |= 0x01
     
    //Lampe verte
    #define GRN_ON  	PORTB &=~0x02
    #define GRN_OFF    	PORTB |= 0x02
     
    unsigned char I2C_Etat;
     
     
     
    void I2C_Init(void)
    {
      TWSR = 0;
      TWBR = ((SYSCLK/SCL_CLOCK)-16)/2; 
     
    	I2C_Etat = 0;
     
    }
     
    void i2c_start(void) 
     
    {
        TWCR = 0xA5 ;//10100101
    }
     
     
    void i2c_stop(void)
     
    {
        TWCR = 0x95; //10010101
    }
     
     
    ISR (TWI_vect)
    {
    	I2C_Etat = 0;//Remet à 0
    	TWCR |= 0x80;
    }
     
    int main()
    {
    	// 1 = out, 0 = IN
    	DDRC  = 0xC3;
    	DDRB  = 0x1B;
    	DDRD  = 0xFE;
     
        PORTC = 0xFF; // Pullup SDA
        PORTB = 0x01; // LED_Rot
        PORTD = 0x77; // LED
     
     
    	//disable watchdog
    	MCUSR &=~(1<<WDRF);
    	WDTCSR = 0;
     
    	I2C_Init();
    	sei();
     
    		ROT_OFF;//Eteint les lampes
    		GRN_OFF;
    		while (I2C_Etat != 0);
     
    		I2C_Etat = 10;
    		i2c_start();
    		ROT_ON;//Allume la rouge
     
    		while (I2C_Etat != 0);
     
    		while(1)
    		{
    			GRN_ON;//Allume la verte
    			//En fait, la verte ne s'allumera jamais
    			//Pourquoi ??
    		}
     
    	return 0;
    }
    Donc la lampe rouge sera allumée et la verte éteinte, et si on met GRN_ON; à l'intérieur de la boucle, pareil.. Une idée ??

    En vous remerciant beaucoup (très beaucoup!) pour votre attention,

    Flavien G.

  2. #2
    Membre émérite Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Par défaut
    Il me semble que tu as inversé les _ON _OFF:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    //Lampe rouge
    #define ROT_OFF   	PORTB &=~0x01
    #define ROT_ON    	PORTB |= 0x01
     
    //Lampe verte
    #define GRN_OFF  	PORTB &=~0x02
    #define GRN_ON    	PORTB |= 0x02

  3. #3
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 461
    Par défaut
    Citation Envoyé par ssmario2 Voir le message
    Il me semble que tu as inversé les _ON _OFF:
    [code]//Lampe rouge
    Pas nécessairement. En polarisation inverse, la LED est montée à l'envers. Mettre un bit de sortie à 1 bloque alors le passage du courant. C'est assez fréquent.

  4. #4
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Je ne connais pas le compilateur utilisé, mais ne faudrait-il pas utiliser le qualificatif volatile sur I2C_Etat pour éviter des optimisations intempestives sur les boucles while (I2C_Etat != 0); ?

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2011
    Messages : 13
    Par défaut
    ça marche !!!! C'était bien le mot-clef volatile qui manquait !

    Merci infiniment !!!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 18/03/2015, 08h53
  2. Problème d'activation d'interruption avec MCC18
    Par marc02110 dans le forum MPLAB
    Réponses: 0
    Dernier message: 19/08/2009, 13h13
  3. [PIC 18F2525][Débutant] Problème d'interruption
    Par Haox85 dans le forum MPLAB
    Réponses: 7
    Dernier message: 30/05/2009, 10h12
  4. [LabView 8.5] Problème d'interruption d'une boucle
    Par yoann23 dans le forum LabVIEW
    Réponses: 4
    Dernier message: 26/03/2008, 11h27
  5. [NASM] Problème avec l'appel des interruptions
    Par homeostasie dans le forum Assembleur
    Réponses: 3
    Dernier message: 23/01/2007, 16h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo