Répondre à la discussion
Affichage des résultats 1 à 18 sur 18

Liaison UART non fonctionnelle sur un microcontrôleur ?



  1. #1
    Yoruk

    Liaison UART non fonctionnelle sur un microcontrôleur ?


    ------

    Bonjour à tous,

    Mes déboires avec le ATMEGA8535 continuent... Je ne parviens pas à faire fonctionner la liaison UART, dans le sens micro-> PC.

    J'ai tenté 2 codes, le premier tiré de la datasheet :


    Code:
    #define F_CPU 8000000UL
    
    #include <util/delay.h>
    
    
    #include <avr/interrupt.h>
    
    //fuses, page 235 sde la DS.
    
    
    #define FOSC 8000000// Clock Speed 
    #define BAUD 9600 
    #define MYUBRR FOSC/16/BAUD-1 
    
    
    //code atmel :
    
    void USART_Init( unsigned int baud )
    {
    	// Set baud rate 
    	UBRRH = (unsigned char)(baud>>8);
    	UBRRL = (unsigned char)baud;
    	// Enable receiver and transmitter 
    	UCSRB = (1<<RXEN)|(1<<TXEN);
    	// Set frame format: 8data, 2stop bit 
    	UCSRC = (1<<USBS)|(3<<UCSZ0);
    }
    
    
    void USART_Transmit( unsigned char data )
    {
    	// Wait for empty transmit buffer
    	while ( !( UCSRA & (1<<UDRE)) )	;
    	//Put data into buffer, sends the data 
    	UDR = data;
    }
    
    
    unsigned char USART_Receive( void )
    {
    	// Wait for data to be received 
    	while ( !(UCSRA & (1<<RXC)) )	;
    	// Get and return received data from buffer 
    	return UDR;
    }
    
    
    
    int main(void)
    {
      
    	//setup
    
    	init_IO();
    
    
    	//USART_Init(MYUBRR); //init liaison série
    
    
    	while(1) { //la loop
      
    
    //essai serial
    
    	USART_Transmit('b');
    	USART_Transmit('o');
    	USART_Transmit('n');
    	USART_Transmit('j');
    	USART_Transmit('o');
    	USART_Transmit('u');
    	USART_Transmit('r');
    
    
    
    
    _delay_ms(4000);  
    
    }
    }

    Le second, tiré de cette page :



    Code:
    
    #include <avr/io.h>
    
    
    #define F_CPU 8000000UL
    
    #include <util/delay.h>
    
    
    #include <avr/interrupt.h>
    
    //uses, page 235 de la DS.
    
    
    //This function is used to initialize the USART
    //at a given UBRR value
    void USARTInit(uint16_t ubrr_value)
    {
    
       //Set Baud rate
    
       UBRRL = ubrr_value;
       UBRRH = (ubrr_value>>8);
    
       /*Set Frame Format
    
    
       >> Asynchronous mode
       >> No Parity
       >> 1 StopBit
    
       >> char size 8
    
       */
    
       UCSRC=(1<<URSEL)|(3<<UCSZ0);
    
    
       //Enable The receiver and transmitter
    
       UCSRB=(1<<RXEN)|(1<<TXEN);
    
    
    }
    
    
    //This function is used to read the available data
    //from USART. This function will wait untill data is
    //available.
    char USARTReadChar()
    {
       //Wait untill a data is available
    
       while(!(UCSRA & (1<<RXC)))
       {
          //Do nothing
       }
    
       //Now USART has got data from host
       //and is available is buffer
    
       return UDR;
    }
    
    
    //This fuction writes the given "data" to
    //the USART which then transmit it via TX line
    void USARTWriteChar(char data)
    {
       //Wait untill the transmitter is ready
    
       while(!(UCSRA & (1<<UDRE)))
       {
          //Do nothing
       }
    
       //Now write the data to USART buffer
    
       UDR=data;
    }
    
    
    void init_IO()
    {
    
    	[...]
    
        //serial config:
    
    	DDRD = 0<<PD0;  //RX
    	DDRD = 1<<PD1;  //TX
    
    }
    
    
    
    int main(void)
    {
      
    	//setup
    
    	init_IO();
    
    
    USARTInit(51);    //UBRR = 51
    
    	//couché le chien
    	WDTCR  = 0b00000000;
    
    
    	while(1) { //la loop
      
    
    
    USARTWriteChar('b');
    USARTWriteChar('o');
    USARTWriteChar('n');
    USARTWriteChar('j');
    USARTWriteChar('o');
    USARTWriteChar('u');
    USARTWriteChar('r');
    
    
    
    _delay_ms(4000); 
    
    	MiseAJourAfficheurs();
    
    	}
    
      return 1;
    }

    Coté hard, j'ai un montage à base de MAX232 pour branchement sur un port série physique, et un module USB-série. J'observe bien toutes les 4 secondes la led de RX qui s'illumine sur les modules (plus rapide dans le second cas, la vitesse étant plus rapide). J'ai à chaque fois configuré hyperterminal aux vitesses et configurations spécifiées, mais rien n'apparait sur l'écran. Je ne comprends pas... Même résultat avec les 2 convertisseurs. Ces derniers fonctionnent correctement en boucle fermée (quand je ponte TX et RX). Je n'ai pas encore testé les fonctions de réception sur le micro, uniquement la transmission. Mon micro fonctionne avec un quartz de 8MHz.

    Pour info, voici les fuses que j'utilise : high fuse : 0b11011001 low fuse : 0b11111111 J'ai juste (je pense) modifié le type d'oscillateur pour passer sur l'externe. Les autres bits étant les valeurs par défaut.

    Des idées ?

    Merci d'avance !

    EDIT : Pardon pour la faute de frappe dans le titre, mais je n'arrive pas à la modifier...

    -----
    Dernière modification par Yoruk ; 14/09/2014 à 12h34.
    La robotique, c'est fantastique !

  2. Publicité
  3. #2
    zibuth27

    Re : Liaisin UART non fonctionnelle sur un micro-controleur

    hello,


    Comprends-je correctement ? tu relies ton µC via un MAX232 au module USB-série

    si c'est le cas c'est une explication
    le module USB-série demande des signaux TTL mais en protocole RS232 dit "TTL" : tous signaux inversés

    tu aurais donc fait une inversion logique de trop et tu comptes sur la solidité des clampings TTL du module d'interface en lui envoyant des niveaux RS232

    à suivre pour d'éventuelles autres investigations



    saluts

  4. #3
    DAUDET78

    Re : Liaisin UART non fonctionnelle sur un micro-controleur

    Citation Envoyé par zibuth27 Voir le message
    le module USB-série demande des signaux TTL mais en protocole RS232 dit "TTL" : tous signaux inversés
    Tout dépend ce qu'on appelle "Module" . Si c'est un adaptateur USB-RS232 , il faut un MAX232 pour l'attaquer
    J'aime pas le Grec

  5. #4
    Yoruk

    Re : Liaisin UART non fonctionnelle sur un micro-controleur

    Non, je dispose de 2 modules indépendants : un à base de max232, que j'ai relié à un port série physique, et un second, qui est un module USB-TTL, à base de FTDI. J'ai fait l'essai avec les 2. (Micro relié au max, puis micro relié au module TTL-USB).

    Je n'ai pas de module USB-RS232.

    Je n'avais pas envisagé le problème d'inversion des signaux... J'avais l'intention de faire des essais avec une arduino sur ces 2 modules. (même type de microcontrôleur, un ATMEGA)
    La robotique, c'est fantastique !

  6. A voir en vidéo sur Futura
  7. Comparatifs

    Gagnez du temps et de l'argent grâce à nos comparatifs de produits. Parmi nos sujets :
  8. #5
    DAUDET78

    Re : Liaisin UART non fonctionnelle sur un micro-controleur

    Citation Envoyé par Yoruk Voir le message
    un à base de max232, que j'ai relié à un port série physique,
    Et tu as fait quel câblage entre la sortie du MAX232 et le DB9 du PC ?
    J'aime pas le Grec

  9. #6
    Yoruk

    Re : Liaisin UART non fonctionnelle sur un micro-controleur

    C'est un module tout fait en fait. Tu veux dire, signaux coté RS232 ? Je ferai une photo ce soir...
    La robotique, c'est fantastique !

  10. Publicité
  11. #7
    zibuth27

    Re : Liaisin UART non fonctionnelle sur un micro-controleur

    hello,

    je parle des modules à 2$ basés sur FT232 ou PL2303
    leur interfaçage coté RS232 est en niveau électrique TTL mais présente ou non un inverseur, pour ajouter à la confusion

    basés sur FT232
    demande un adaptateur/inverseur ("RS232 level converter", MAX232 par ex)
    sort un signal RS232 dit "TTL" niveaux TTL, logique inversée

    basés sur PL2303
    intègrent un "RS232 serial interface" (inversion) mais sortent en niveaux électrique TTL, en logique vraie RS232. Ils comptent sur le récepteur RS232 pour comprendre ces niveaux hors norme, mais la plupart du temps ils sont bien interprétés (sur des distances faibles, intra-équipement)

    ci joint extraits des DS Prolific et FTI

    le mega8535 se substitue fonctionnellement ET hardwarement aux antiques USARTs 16450/16550 des IBM PC des années 80 et dialogue avec le MAX232 en TTL, logique inverse. Il nécessite un inverseur/adaptateur type MAX232 entre lui et la DB9


    saluts
    Images attachées Images attachées

  12. #8
    zibuth27

    Re : Liaisin UART non fonctionnelle sur un micro-controleur

    hello,

    croisement des réponses

    donnes stp un synoptique complet, mieux un vrai schéma.

    j'attends par exemple avec un FTI et un port COM virtuel:


    Mega8535 -- MAX232 -- DB9 -- cable -- DB9 -- MAX232 -- FT232 (=port COM virtuel)


    saluts

  13. #9
    zibuth27

    Re : Liaisin UART non fonctionnelle sur un micro-controleur

    et décris en modèle OSI pour une synthèse finale

    saluts

  14. #10
    Yoruk

    Re : Liaisin UART non fonctionnelle sur un micro-controleur

    Modèle OSI ? Quésako ?
    La robotique, c'est fantastique !

  15. #11
    indri

    Re : Liaisin UART non fonctionnelle sur un micro-controleur

    Sinon tu as regardé si il y a un signal sur le pin tx?? Avant d'accuser le reste du circuit..
    Et dans ton premier code, tu n'as pas définit tx en sortie (ddrx=...1...)
    Là où va le vent...

  16. #12
    Yoruk

    Re : Liaisin UART non fonctionnelle sur un micro-controleur

    Si si, j'ai juste oublié de coller dans le premier code la sub d'initialisation des E/S qui se charge de mettre le TX et le RX en sortie/entrée.

    Je pense qu'il y a effectivement un signal, la led "RX" du module récepteur s'illuminant correctement toutes les 4 secondes, pendant quelques ms. (laps de temps encore plus court dans le cas à 19200 bauds, ce qui semble cohérent.)
    La robotique, c'est fantastique !

  17. Publicité
  18. #13
    zibuth27

    Re : Liaisin UART non fonctionnelle sur un micro-controleur

    hello,

    c'était déjà écrit dans ton message #1
    "J'observe bien toutes les 4 secondes la LED de RX qui s'illumine sur les modules "

    ce qui impliquait donc déjà la bonne direction des ports

    c'est pourquoi il fallait aller directement à autre chose comme :
    - niveau / sens logique des signaux
    - erreurs de fréquences, (à vérifier dans un second temps) moins probable, puisque pas de message d'injures protocole ou caractères bidons reporté
    - autre chose



    saluts
    Dernière modification par zibuth27 ; 15/09/2014 à 15h16.

  19. #14
    zibuth27

    Re : Liaisin UART non fonctionnelle sur un micro-controleur

    modif (la peste soit de la durée de modif!)

    ce qui impliquait donc déjà la bonne direction du port d'émission, on verra pour la réception par la suite

    saluts

  20. #15
    Yoruk

    Re : Liaisin UART non fonctionnelle sur un micro-controleur

    Oui tout à fait. J'ai mis de coté pour l'instant d'éventuelles erreurs de vitesse, car j'aurais malgré tout des caractères.

    Quel doit être le niveau du signal TX en l'absence de data à transmettre ?
    La robotique, c'est fantastique !

  21. #16
    zibuth27

    Re : Liaisin UART non fonctionnelle sur un micro-controleur

    hello,

    niveau électrique en l'absence de signal (space en langage RS232 US):

    -12V sur le câble officiel RS232 (le -8 des MAX232 et surtout le 0 V des interfaces TTLisés (PL23303) fonctionnent généralement)
    +5V sur la sortie USART (ou mega8535)

    l'état significatif 1 (mark en langage RS232 US)
    +12V sur le câble (+8 par MAX232, et +5V des interfaces TTLisés)
    0V sur la sortie USART (ou mega8535)

    c'est la tolérance des interfaces RS232 et l'utilisation par beaucoup du niveau 0 - +5V en lieu et place du +-12, qui foutent une belle cagade pour comprendre ce qui peut pourtant très bien marcher quand on s'éloigne des standards, pour des liaisons courtes.

    Au niveau liaison USART ( ou mega8535) c'est l'inverse en niveaux TTL (comme le RS232 TTLisé, mais la signification du bit est différente)


    saluts

  22. #17
    zibuth27

    Re : Liaisin UART non fonctionnelle sur un micro-controleur

    hello,

    je te retourne ta propre question #9

    dans le fil de ce jour Contrôle pression en continu en vue de commander une valve ?

    Le mieux également, un schéma global du truc !
    La robotique, c'est fantastique !


    je l'voudrais aussi, ce schéma !

    saluts
    Dernière modification par zibuth27 ; 15/09/2014 à 16h15.

  23. #18
    Yoruk

    Re : Liaison UART non fonctionnelle sur un microcontrôleur ?

    C'est bon, j'ai enfin trouvé la boulette ! Bon je vais sûrement me faire huer de ne pas avoir vérifié cela plus tôt...

    J'ai tout d'abord testé les 2 modules reliés à la pin TX d'une arduino possédant un programme similaire (envoi d'un texte toute les 5 secondes). Fonctionnement immédiat et impeccable avec les 2 modules.


    Où était donc l'erreur ? Dans la tension d'alimentation du micro ! Il est en fait alimenté depuis un petit accu me délivrant en temps normal un beau 5V. Je l'ai utilisé une grande partie ce weekend, il a également servi à alimenter un 7 segments. J'ai fini par me douter d'un truc, et j'ai tiré du 5v d'une prise USB. Bingo, j'ai eu des cochonneries dans le terminal ! J'ai modifié le code pour travailler à 9600 bauds, en utilisant les formules données par atmel pour les calculer :

    Code:
    #define FOSC 8000000// Clock Speed 
    #define BAUD 9600 
    #define MYUBRR FOSC/16/BAUD-1
    Les subs atmel n'ont toutefois pas fonctionné, je suis en train de voir d'éventuels problèmes de configuration (bits de stop...). En tout cas, j'ai bien eu "bonjour" en retour terminal avec le code ci-joint !

    Petite photo du montage :

    Pièce jointe 258056

    En haut le micro enfiché dans sa petite carte minimaliste (quartz, pins déportées, port ICSP...), le module MAX232 (pour port série) à gauche, et le module USB-TTL à droite. La nappe de gauche est reliée au programmateur.

    Et donc pour info, voici le code final :

    Code:
    #define FOSC 8000000// Clock Speed 
    #define BAUD 9600 
    #define MYUBRR FOSC/16/BAUD-1 
    
    
    int DigitDroite;
    int DigitGauche;
    
    
       //PC Software :  Hyper terminal @ 19200 baud
         //          No Parity,1 Stop Bit,
                   //Flow Control = NONE
    
    //This function is used to initialize the USART
    //at a given UBRR value
    void USARTInit(uint16_t ubrr_value)
    {
    
       //Set Baud rate
    
       UBRRL = ubrr_value;
       UBRRH = (ubrr_value>>8);
    
       //Set Frame Format
    
    
       //>> Asynchronous mode
       //>> No Parity
       //>> 1 StopBit
    
       //>> char size 8
    
       
    
       UCSRC=(1<<URSEL)|(3<<UCSZ0);
    
    
       //Enable The receiver and transmitter
    
       UCSRB=(1<<RXEN)|(1<<TXEN);
    
    
    }
    
    
    //This function is used to read the available data
    //from USART. This function will wait untill data is
    //available.
    char USARTReadChar()
    {
       //Wait untill a data is available
    
       while(!(UCSRA & (1<<RXC)))
       {
          //Do nothing
       }
    
       //Now USART has got data from host
       //and is available is buffer
    
       return UDR;
    }
    
    
    //This fuction writes the given "data" to
    //the USART which then transmit it via TX line
    void USARTWriteChar(char data)
    {
       //Wait untill the transmitter is ready
    
       while(!(UCSRA & (1<<UDRE)))
       {
          //Do nothing
       }
    
       //Now write the data to USART buffer
    
       UDR=data;
    }
    
    
    
    void init_IO()
    {
    
    	//sens sorties 1:output 0:input 
    	DDRA = 0b11111111;    // 7 segment
    	//DDRB = 0b11111111;
    	DDRC = 0b11111111;  // 7 segment
    	//	DDRD = 0b11111111;
    
    	//declaration interruption
    	DDRD = 0<<PD2;		// Set PD2 as input (Using for interupt INT0)
    	//PORTD = 1<<PD2;		// Enable PD2 pull-up resistor
    
    	GICR = 1<<INT0;					// Enable INT0
    	
    	
    	//MCUCR = 1<<ISC01 | 1<<ISC00;	// Trigger INT0 on rising edge
    	MCUCR = 1<<ISC01 | 0<<ISC00;	// Trigger INT0 on falling edge ???
    
    
    	sei();				//Enable Global Interrupt
    
    	//fin code interruption
    	//cli();// coupe interruption
    
    
    	//serial config:
    
    	DDRD = 0<<PD0;  //RX
    	DDRD = 1<<PD1;  //TX
    
    }
    
    
    
    
    //Interrupt Service Routine for INT0
    ISR(INT0_vect)
    {
    
    	_delay_ms(600); // Software debouncing control
     
      DigitDroite=DigitDroite+1;
      //DigitGauche=DigitGauche+1;
      MiseAJourAfficheurs();
    
     }
    
    
    
    
    int main(void)
    {
      
    	//setup
    
    	init_IO();
    
    
    
    USARTInit(MYUBRR);    //UBRR = 51  avant
    
    
    
    	TotalActions=16;
    
    
    	//couché le chien
    	WDTCR  = 0b00000000;
    
    
    	while(1) { //la loop
      
    
    
    USARTWriteChar('b');
    USARTWriteChar('o');
    USARTWriteChar('n');
    USARTWriteChar('j');
    USARTWriteChar('o');
    USARTWriteChar('u');
    USARTWriteChar('r');
    
    
    
    //_delay_ms(4000); 
    
    
      
    
    	//DigitDroite=DigitDroite+1;
    //	DigitGauche=DigitGauche+1;
    
    
    
    	if (DigitDroite>=10) {DigitDroite=0;}
    	if (DigitGauche>=10) {DigitGauche=0;}
    
    	_delay_ms(5000);  
    
    
    
    	MiseAJourAfficheurs();
    
    
    	}
    
      return 1;
    }
    Donc tout va bien ! Merci pour votre aide !

    PS : Je n'ai pas fait de schéma, tout est câble sur de la breadboard, mais rien de compliqué !
    La robotique, c'est fantastique !

  24. Publicité

Discussions similaires

  1. Liaison UART Pic 18F45K20
    Par sani300 dans le forum Électronique
    Réponses: 2
    Dernier message: 28/04/2013, 22h01
  2. UART chez un microcontroleur
    Par just-a-man-but dans le forum Électronique
    Réponses: 3
    Dernier message: 07/09/2011, 09h15
  3. Liaison UART pour PIC18F2550
    Par Mika56 dans le forum Électronique
    Réponses: 3
    Dernier message: 17/05/2010, 08h12
  4. Liaison UART par PIC24F
    Par ezay dans le forum Électronique
    Réponses: 16
    Dernier message: 04/06/2008, 15h36
  5. TRMT - liaison UART PIC16F876
    Par smartise73 dans le forum Électronique
    Réponses: 6
    Dernier message: 19/05/2006, 10h43
Découvrez nos comparatifs produits sur l'informatique et les technologies.