1. #1
    Membre du Club
    Profil pro
    Inscrit en
    décembre 2006
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : décembre 2006
    Messages : 96
    Points : 43
    Points
    43

    Par défaut ATmega644 : problème avec SPI

    Bonsoir,


    Je n'arrive pas à faire communiquer mon Atmega par SPI en mode master. Après plusieurs heures à bloquer sur ce problème j'ai fini par réduire petit à petit le programme au maximum mais toujours rien.

    Information utile : Je programme en c (avec WINAVR) sur un ATmega644 cadencé à 20Mhz par un quartz externe. Le microcontrôleur est programmé physiquement par ICSP. J'utilise un oscilloscope pour visualiser le signal.

    Voici le programme :
    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
    #include <avr/io.h>
    
    
    #define F_CPU 20000000UL
    
    
    
    int main (void) 
    {
    	
        // make the MOSI, SCK, and SS pins outputs
        DDRB |= ( 1 << PB5 ) | ( 1 << PB7 ) | ( 1 << PB4 );
    	PORTB |= (1 << PB4); // SS high 
    	
        // make sure the MISO pin is input
        DDRB &= ~( 1 << PB6 );
     
        // set up the SPI module: SPI enabled, MSB first, master mode,
        //  clock polarity and phase = 0, F_osc/8
    	SPCR = 0b01010001;
        SPSR = 0b00000001;     // set double SPI speed for F_osc/8
     
    	//------------------------------------------------------------------------
    	PORTB &= ~( 1 << PB4); 	//PB4 low
    	SPDR = 10;                            
    	while ( ! ( SPSR & ( 1 << SPIF )));		
    	PORTB |= (1 << PB4); 		//PB4 high
    	
    	while (1) 
    	{ 	
    		
    		
    	}
    	return 1;
    }
    Sur l'oscillo, je n'observe que la broche PB4 passer de 1 à 0. Rien d'autre ne se produit... même pas d'horloge!
    J'ai vérifié la partie hardware à plusieurs reprise, elle est bel et bien correct.

    J'ai testé une variante de ce programme dans laquelle j'utilisais PA0 en tant que broche de sélection de l'esclave laissant PB4 à 1. Sans résultat non plus.

    Une idée ?

  2. #2
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Ancien développeur matériel électronique (Hard/Soft)
    Inscrit en
    avril 2002
    Messages
    1 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ancien développeur matériel électronique (Hard/Soft)
    Secteur : Service public

    Informations forums :
    Inscription : avril 2002
    Messages : 1 910
    Points : 6 041
    Points
    6 041

    Par défaut

    Salut,
    C'est très bizarre car j'ai regardé la datasheet et tes registres sont biens configurés.

    La seule question que je me pose c'est si ton compilateur reconnaît bien ce genre de format
    SPCR=0b01010001 ????

    Tu peux essayer avec la syntaxe normalisée :
    SPCR =(1<<SPE)|(1<<MSTR)|(1<<SPR0); et idem pour SPSR

    A+
    La science ne nous apprend rien : c'est l'expérience qui nous apprend quelque chose.
    Richard Feynman

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    décembre 2006
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : décembre 2006
    Messages : 96
    Points : 43
    Points
    43

    Par défaut

    Alors déjà merci de tenter de m'aider, ensuite pour ce qui est de la syntaxe j'ai tester les deux sans aucune différence de résultat. En tout cas mon compilateur reconnait bien ce format puisque c'est ainsi que je procède pour configurer d'autres registres (timers, I²C etc.) dans tout mes précédent programmes (qui eux fonctionnent ).

    Je me suis également demandé si ce n'était pas la présence de mon programmateur ICSP qui provoquait ça. Même en le déconnectant j'ai le même résultat. Vu la simplicité du montage et le peu de ligne de code c'est assez déconcertant.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    décembre 2006
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : décembre 2006
    Messages : 96
    Points : 43
    Points
    43

    Par défaut

    Je n'y croyais plus mais ça fonctionne enfin!

    J'ai réduit la fréquence d'horloge SPI et j'ai ajouté une tempo d'une milliseconde à la fin de la configuration des registre.

    Sur l'oscillo je lis bien les valeurs envoyées. Reste plus qu'a vérifier que je reçois bien les bonnes valeurs de l'esclave et il en sera fini de cette galère.

  5. #5
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Ancien développeur matériel électronique (Hard/Soft)
    Inscrit en
    avril 2002
    Messages
    1 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ancien développeur matériel électronique (Hard/Soft)
    Secteur : Service public

    Informations forums :
    Inscription : avril 2002
    Messages : 1 910
    Points : 6 041
    Points
    6 041

    Par défaut

    Tant mieux mais c'est très bizarre !
    Y a peut être un loup caché quelque part.

    Tu peux montrer ton code (le minimaliste) ? Comment as tu configuré SPCR ?

    C'est quoi ton programmateur ? ATMEL ICE ? Tu peux déboguer avec ou tu ne peux que programmer ?

    PB4 te servait à trigger SCK avec l'oscilloscope ?
    La science ne nous apprend rien : c'est l'expérience qui nous apprend quelque chose.
    Richard Feynman

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    décembre 2006
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : décembre 2006
    Messages : 96
    Points : 43
    Points
    43

    Par défaut

    Tu peux montrer ton code (le minimaliste) ? Comment as tu configuré SPCR ?
    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
    int main (void) 
    {
    	
        // make the MOSI, SCK, and SS pins outputs
        DDRB |= ( 1 << PB5 ) | ( 1 << PB7 ) | ( 1 << PB4 );
        PORTB |= (1 << PB4); // SS high 
    
        DDRA |= ( 1 << PA0 ); // Chip select n°1
        PORTA |= (1 << PA0); // Chip select high 
    	
        // make sure the MISO pin is input
        DDRB &= ~( 1 << PB6 );
     
        SPCR = 0b01010011; // SPI enabled, master mode, MSB first, clock polarity and phase = 0, F_osc/128 (156.25Khz)
        _delay_ms(1);
     
    	//------------------------------------------------------------------------
    	PORTA &= ~( 1 << PA0); 	//PA0 low
    	SPDR = 10;                            
    	while ( ! ( SPSR & ( 1 << SPIF )));		
    	PORTA |= (1 << PA0); 		//PA0 high
    	
    	while (1) 
    	{ 	
    		
    		
    	}
    	return 1;
    }
    C'est quoi ton programmateur ? ATMEL ICE ? Tu peux déboguer avec ou tu ne peux que programmer ?
    C'est une simple carte Arduino programmée avec le sketch "ArduinoISP".

    PB4 te servait à trigger SCK avec l'oscilloscope ?
    Oui c'est bien ça. Enfin maintenant c'est PA0.

    Je viens de remarquer que la broche PB4 (SS/) est commune avec une sortie PWM dont j'aurais besoin (OC0B). J'espère que ça va pas poser un second problème.

  7. #7
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Ancien développeur matériel électronique (Hard/Soft)
    Inscrit en
    avril 2002
    Messages
    1 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ancien développeur matériel électronique (Hard/Soft)
    Secteur : Service public

    Informations forums :
    Inscription : avril 2002
    Messages : 1 910
    Points : 6 041
    Points
    6 041

    Par défaut

    Ce problème m'intrigue !
    Tu as réduit la fréquence SPI + mis en tempo et ça a fonctionné.

    Si tu laisses la tempo et que tu remets le reste du code comme avant (fosc/8) ? Est ce que ça fonctionne ?

    Si tu retire la tempo et que réduit la fréquence SPI (fosc/128) ? Est ce que ça fonctionne ?

    Tu es sur que ce n'est pas problème avec l'oscillo ? C'est un analogique ? Si oui il faut envoyer la donnée en boucle sinon on trig mais pas le temps de rien voir.

    Code C : 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
    #include <avr/io.h>
    #define F_CPU 20000000UL
     
    int main (void) 
    {
     
        // make the MOSI, SCK, and SS pins outputs
        DDRB |= ( 1 << PB5 ) | ( 1 << PB7 ) | ( 1 << PB4 );
        PORTB |= (1 << PB4); // SS high 
     
        // make sure the MISO pin is input
        DDRB &= ~( 1 << PB6 );
     
        // set up the SPI module: SPI enabled, MSB first, master mode,
        //  clock polarity and phase = 0, F_osc/8
        SPCR = 0b01010001;
        SPSR = 0b00000001;     // set double SPI speed for F_osc/8
     
    	//------------------------------------------------------------------------
     
    	while (1) 
    	{ 	
    			PORTB &= ~( 1 << PB4); 	//PB4 low
    			SPDR = 10;                            
    			while ( ! ( SPSR & ( 1 << SPIF )));		
    			PORTB |= (1 << PB4); 		//PB4 high
    	}
    	return 1;
    }
    La science ne nous apprend rien : c'est l'expérience qui nous apprend quelque chose.
    Richard Feynman

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    décembre 2006
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : décembre 2006
    Messages : 96
    Points : 43
    Points
    43

    Par défaut

    J'ai reprogrammé mon circuit en ayant retiré la tempo et fait passer la fréquence SPI à (fosc/8) et ça fonctionne

    Il faut croire que j'ai merdouiller avec mon oscillo (pourtant mon circuit esclave ne répondait pas non plus).

    J'ai fait tellement d'essais et de modifications que retrouver la source de ce problème (si tant est qu'elle soit unique) serait très compliqué. Bon, l'hypothèse la plus probable c'est que la source principale se trouve entre la chaise et le clavier

  9. #9
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Ancien développeur matériel électronique (Hard/Soft)
    Inscrit en
    avril 2002
    Messages
    1 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ancien développeur matériel électronique (Hard/Soft)
    Secteur : Service public

    Informations forums :
    Inscription : avril 2002
    Messages : 1 910
    Points : 6 041
    Points
    6 041

    Par défaut

    Ok
    Bon tant mieux car c'était totalement inexplicable.

    Mais au moins là c'est cohérent au moins (ça marche et c'est normal)
    La science ne nous apprend rien : c'est l'expérience qui nous apprend quelque chose.
    Richard Feynman

Discussions similaires

  1. VC++ Direct3D8, problème avec LPD3DXFONT et LPD3DTEXTURE8
    Par Magus (Dave) dans le forum DirectX
    Réponses: 3
    Dernier message: 03/08/2002, 12h10
  2. Problème avec [b]struct[/b]
    Par Bouziane Abderraouf dans le forum CORBA
    Réponses: 2
    Dernier message: 17/07/2002, 11h25
  3. Problème avec le type 'Corba::Any_out'
    Par Steven dans le forum CORBA
    Réponses: 2
    Dernier message: 14/07/2002, 19h48
  4. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 17h10

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