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

Arduino Discussion :

ATmega328p et Communication série


Sujet :

Arduino

  1. #1
    Invité
    Invité(e)
    Par défaut ATmega328p et Communication série
    Bien le bonjour

    Je suis détenteur d'un Arduino Uno. Je m'intéresse plus particulièrement à la programmation de l'ATmega328p en C, en me basant sur les bibliothèques fournis par AVR-GCC ainsi que sur le datasheet du µC.

    Mon problème aujourd'hui se situe au niveau de la communication série entre l'Arduino et le Pc. En fait, comme je développe tout autant le côté "transmission de donnée" via l'µC que le côté "réception de donnée" sur le pc, je n'arrive pas à comprendre à quel niveau se situe mon problème.

    Actuellement, je transmet en série 8bits de data, sans bit de parité, avec 1bit de stop et le baudrate set à 9600. Pas de notion de "ligne", juste 8bits bête et méchant. Pour mes tests, j'envoie soit une succession de 0 et de 1 à la chaine.

    Pour envoyer mes données, j'utilise le code suivant (atmega_main.c):

    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
    /*
     * Test de transmission serial simple...
     * ATmega328p 
     * 8bits de data, 0 bit de parity, 1 bit de stop.
     * 
     */
     
    #include <avr/io.h>
     
    int main(){
     
        /*
         * SETUP
         */
        // initialisation de la Frame
        UCSR0A &= ~(_BV(1));    // No U2X speed
        UCSR0A &= ~(_BV(0));    // Disable Multi-processor communication mode
     
        UCSR0B &= ~(_BV(4));    // Disable receiver
        UCSR0B |= _BV(3);       // Enable transmitter
        UCSR0B &= ~(_BV(2));    // Disable character size... mix avec autre
     
        UCSR0C &= ~(_BV(7));
        UCSR0C &= ~(_BV(6));    // Choisis le mode full aynchrone
        UCSR0C &= ~(_BV(5));
        UCSR0C &= ~(_BV(4));    // Disable parity bit
        UCSR0C &= ~(_BV(3));    // Un seul bit de stop
        UCSR0C |= _BV(2); 
        UCSR0C |= _BV(1);       // 8bits character size
        UCSR0C &= ~(_BV(0));    // Forcer a 0 car asynchrone
     
        // Configuration BAUDRATE via util/setbaud.h
        #define F_CPU   1843200 // définis vitesse clock internz
        #define BAUD    9600 // baudrate a atteindre
        #include <util/setbaud.h> // Se base sur F_CPU et BAUD pour calcule
     
        UBRR0H = UBRRH_VALUE;
        UBRR0L = UBRRL_VALUE; // définis tout deux dans util/setbaud
     
        /*
         * LANCEMET DES FRAMES
         */
     
        unsigned char data = 0;
     
        while(1){
            // On attends que UDR0 soit dispo -- Check de UDRE
            loop_until_bit_is_set(UCSR0A, 5);
     
            UDR0 = data;
     
            date ^= 1; // Passe de 0 a 1 et 1 a 0
        }
     
        return 0;
    }
    Le programme sur le pc, lisant sur le port /dev/ttyACM0 (pc_main.c):

    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
    94
    95
    96
    97
    98
    99
    100
    /*
     * Test de reception serial simple...
     * Reception via /dev/ttyAMC0 -> envoyé via Arduino & atmega_main.c 
     * 8bits de data, 0 bit de parity, 1 bit de stop.
     * 
     */
     
    #include <stdio.h> // affichage
    #include <unistd.h> // Read() et termios
    // Pour Open() ...
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    // Pour termios() ...
    #include <termios.h>
     
    int main(){
     
        /**************** DECLARATION ****************/
        int com_arduino;
        struct termios termios_ACM0;
     
        /* INIT */
        // Récupère fd du port com arduino...
        // -- uniquement en lecture
        // -- le TTY ne devient pas le contrôleur du processus
        if((com_arduino = open("/dev/ttyACM0", O_RDONLY | O_NOCTTY)) == -1){
            perror("Erreur à l'ouverture du port com /dev/ttrACM0 -- ");
            return 1;
        }
        else {
            puts("/dev/ttyACM0 ouvert.");
        }
     
        // récupération de termios rattaché au ttyACM0
        if(tcgetattr(com_arduino, &termios_ACM0) != 0){
            perror("Erreur à l'obtention du termios de /dev/ttyACM0 -- ");
            return 2;        
        }
        else {
            puts("termios /dev/ttyACM0 obtenu.");
        }
     
     
        /**************** SETUP ****************/
        // Set baudrate 9600
        if(cfsetispeed(&termios_ACM0, B9600) != 0){
            perror("Impossible de set baudrate de /dev/ttyACM0 -- ");
            return 3;        
        }
        else {
            puts("Set Baudrate de termios réussis.");
        }
     
        // Non-canonique, 8bits de data, 1bit de stop, pas de bit de parité
        termios_ACM0.c_iflag &= ~INPCK; // Disable pit parity check
     
        termios_ACM0.c_cflag &= ~CSIZE; // Mets a 0 size data
        termios_ACM0.c_cflag |= CS8; // 8bits de data 
        termios_ACM0.c_cflag |= CREAD; // Enable receiver
        termios_ACM0.c_cflag &= ~CSTOPB; // 1 seul stop bit
        termios_ACM0.c_cflag &= ~PARENB; // Disable parity check
     
        termios_ACM0.c_lflag &= ~ICANON; // Mode non-canonique
        termios_ACM0.c_lflag &= ~ECHO; // No-Echo
     
        /*
         * MIN > 0, TIME == 0 (blocking read)
         *      read(2) blocks until MIN bytes are available, and returns up to the 
         *      number of bytes requested.
         */
        termios_ACM0.c_cc[VMIN] = 1; // Attente de 1byte
        termios_ACM0.c_cc[VTIME] = 0; // 0 de delay
     
        // Set termios
        if(tcsetattr(com_arduino, TCSANOW, &termios_ACM0) != 0){
            perror("Impossible de set termios de /dev/ttyACM0 -- ");
            return 4;        
        }
        else {
            puts("Set de termios /dev/ttyACM0 réussis.");
        }
     
        /**************** LET'S GO' ****************/
        puts("\nMise en place de la lecture...\n");
     
        unsigned char ch_read = 0;
        int size_read = 0;
        while(1){
     
            size_read = read(com_arduino, &ch_read, 1);
     
            printf("size_read: %d || read: %d \n", size_read, ch_read);
            ch_read = 0;
     
        }
     
     
        return 0;
    }
    Le second programme me donne comme sortie :

    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
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    /dev/ttyACM0 ouvert.
    termios /dev/ttyACM0 obtenu.
    Set Baudrate de termios réussis.
    Set de termios /dev/ttyACM0 réussis.
     
    Mise en place de la lecture...
     
    size_read: 1 || read: 4 
    size_read: 1 || read: 0 
    size_read: 1 || read: 0 
    size_read: 1 || read: 4 
    size_read: 1 || read: 0 
    size_read: 1 || read: 4 
    size_read: 1 || read: 0 
    size_read: 1 || read: 4 
    size_read: 1 || read: 0 
    size_read: 1 || read: 4 
    size_read: 1 || read: 0 
    size_read: 1 || read: 4 
    size_read: 1 || read: 0 
    size_read: 1 || read: 0 
    size_read: 1 || read: 0 
    size_read: 1 || read: 0 
    size_read: 1 || read: 0 
    size_read: 1 || read: 0 
    size_read: 1 || read: 4 
    size_read: 1 || read: 0 
    size_read: 1 || read: 4 
    size_read: 1 || read: 0 
    size_read: 1 || read: 4 
    size_read: 1 || read: 0 
    size_read: 1 || read: 8 
    size_read: 1 || read: 0 
    size_read: 1 || read: 0 
    size_read: 1 || read: 4 
    size_read: 1 || read: 0 
    size_read: 1 || read: 4 
    size_read: 1 || read: 0 
    size_read: 1 || read: 4 
    size_read: 1 || read: 0 
    size_read: 1 || read: 4 
    size_read: 1 || read: 0 
    size_read: 1 || read: 4 
    size_read: 1 || read: 0 
    size_read: 1 || read: 0 
    size_read: 1 || read: 0 
    size_read: 1 || read: 4 
    size_read: 1 || read: 0 
    size_read: 1 || read: 4 
    size_read: 1 || read: 0 
    size_read: 1 || read: 4 
    size_read: 1 || read: 0 
    size_read: 1 || read: 8 
    size_read: 1 || read: 0 
    size_read: 1 || read: 0 
    size_read: 1 || read: 4 
    size_read: 1 || read: 0 
    size_read: 1 || read: 4 
    size_read: 1 || read: 0 
    size_read: 1 || read: 4 
    size_read: 1 || read: 0 
    size_read: 1 || read: 4 
    size_read: 1 || read: 0 
    size_read: 1 || read: 4 
    size_read: 1 || read: 0 
    size_read: 1 || read: 0 
    size_read: 1 || read: 0 
    size_read: 1 || read: 0 
    size_read: 1 || read: 0 
    size_read: 1 || read: 0 
    size_read: 1 || read: 4 
    size_read: 1 || read: 0 
    size_read: 1 || read: 4 
    size_read: 1 || read: 0 
    size_read: 1 || read: 4 
    size_read: 1 || read: 0 
    size_read: 1 || read: 4 
    size_read: 1 || read: 0 
    size_read: 1 || read: 0 
    size_read: 1 || read: 8 
    size_read: 1 || read: 0 
    size_read: 1 || read: 0 
    size_read: 1 || read: 0 
    size_read: 1 || read: 0 
    size_read: 1 || read: 0 
    size_read: 1 || read: 0 
    size_read: 1 || read: 4 
    size_read: 1 || read: 0 
    size_read: 1 || read: 4 
    size_read: 1 || read: 0 
    size_read: 1 || read: 4 
    size_read: 1 || read: 0 
    size_read: 1 || read: 0 
    size_read: 1 || read: 0 
    size_read: 1 || read: 0 
    size_read: 1 || read: 4 
    size_read: 1 || read: 0 
    size_read: 1 || read: 4 
    size_read: 1 || read: 0 
    size_read: 1 || read: 4 
    size_read: 1 || read: 0 
    size_read: 1 || read: 4 
    size_read: 1 || read: 0 
    size_read: 1 || read: 4 
    size_read: 1 || read: 0 
    size_read: 1 || read: 0 
    size_read: 1 || read: 0 
    size_read: 1 || read: 0 
    size_read: 1 || read: 0 
    size_read: 1 || read: 0 
    size_read: 1 || read: 0 
    size_read: 1 || read: 0 
    size_read: 1 || read: 0 
    size_read: 1 || read: 4 
    size_read: 1 || read: 0 
    size_read: 1 || read: 4 
    size_read: 1 || read: 0 
    size_read: 1 || read: 4 
    size_read: 1 || read: 0 
    size_read: 1 || read: 4 
    size_read: 1 || read: 0 
    size_read: 1 || read: 0 
    size_read: 1 || read: 8 
    size_read: 1 || read: 0 
    size_read: 1 || read: 0 
    size_read: 1 || read: 0 
    size_read: 1 || read: 0 
    size_read: 1 || read: 0 
    size_read: 1 || read: 0 
    size_read: 1 || read: 4 
    size_read: 1 || read: 0 
    size_read: 1 || read: 4 
    size_read: 1 || read: 0 
    size_read: 1 || read: 4 
    size_read: 1 || read: 0 
    size_read: 1 || read: 8 
    size_read: 1 || read: 0 
    size_read: 1 || read: 0 
    size_read: 1 || read: 4 
    size_read: 1 || read: 0 
    size_read: 1 || read: 4 
    size_read: 1 || read: 0 
    size_read: 1 || read: 4 
    size_read: 1 || read: 0 
    size_read: 1 || read: 4 
    size_read: 1 || read: 0 
    size_read: 1 || read: 4 
    size_read: 1 || read: 0 
    size_read: 1 || read: 0 
    size_read: 1 || read: 0 
    size_read: 1 || read: 0 
    size_read: 1 || read: 0 
    size_read: 1 || read: 0 
    size_read: 1 || read: 4 
    size_read: 1 || read: 0 
    size_read: 1 || read: 4 
    size_read: 1 || read: 0 
    size_read: 1 || read: 4 
    size_read: 1 || read: 0 
    size_read: 1 || read: 8 
    size_read: 1 || read: 0 
    size_read: 1 || read: 0 
    size_read: 1 || read: 4 
    size_read: 1 || read: 0 
    size_read: 1 || read: 4 
    size_read: 1 || read: 0 
    size_read: 1 || read: 4 
    size_read: 1 || read: 0 
    size_read: 1 || read: 4 
    size_read: 1 || read: 0 
    size_read: 1 || read: 4 
    size_read: 1 || read: 254 
     
    ...
    Je ne comprends absolument pourquoi la lecture aussi "irrégulière", c'est à dire que j'obtiens parfois des suites de 0, parfois des 4 ou des 8, parfois des 254, ... Alors que je suis "censé" n'envoyer que des 0 et des 1.
    Soit j'ai quelque chose de "faux", soit il y a une conversion faite par la platine Arduino pour le passage USB, auquel cas je n'ai pas trouvé l'information.. Bref.

    Je patauge un peu, à vrai dire... Est-ce que quelqu'un aurait une petite idée pour me sortir de ce pétrin ?

  2. #2
    Invité
    Invité(e)
    Par défaut
    J'ai résolu mon soucis de moi-même... !

    Au niveau de la fréquence de l'horloge interne : #define F_CPU 16000000UL à la place de #define F_CPU 1843200.

    Ce que je ne comprends pas, c'est que la "bonne" fréquence me proviens directement de la lib Arduino, alors que celle que j'avais mise de base me vient du datasheet de l'ATmega.. ?!

    Cela m'embrouille..

  3. #3
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Consultant en Systèmes Embarqués
    Inscrit en
    Avril 2002
    Messages
    3 190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Systèmes Embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 190
    Points : 11 573
    Points
    11 573
    Par défaut
    Citation Envoyé par isNaN Voir le message
    J'ai résolu mon soucis de moi-même... !

    Au niveau de la fréquence de l'horloge interne : #define F_CPU 16000000UL à la place de #define F_CPU 1843200.

    Ce que je ne comprends pas, c'est que la "bonne" fréquence me proviens directement de la lib Arduino, alors que celle que j'avais mise de base me vient du datasheet de l'ATmega.. ?!

    Cela m'embrouille..
    Salut,
    #define F_CPU 16000000UL c'est tout simplement parce que le quartz de ton Arduino UNO est un 16MHz par contre ce que moi je ne comprends pas c'est où tu as trouvé ce #define F_CPU 1843200 ?
    Tu serais me dire la page de la datasheet ?

    En tout cas, je vois que tu apprends vite Toi qui voulait sauter a pieds joints dans un micro voilà qui est fait.
    Tu as très bien initialisé tous les registres de l'USART décrit à la page 195 à 199 de la datasheet (complète) et je vois aussi que tu as su gérer le flag USART Data Register Empty dans ta fonction loop_until_bit_is_set(UCSR0A, 5); Normalement dedans tu n'as qu'une simple boucle while qui attend que le bit n°5 du registre UCSR0A passe a 1 pour dire que la donnée est partie de l'USART.

    Pour quelqu'un qui n'avait jamais mis les doigts dans un micro-contrôleur

    Tu as aussi du te rendre compte que lire un datasheet peut faire peur la première fois où tu l'ouvres mais il suffit de lire le bon chapitre qui te concerne pour se rendre compte que tout est écrit et que finalement ce n'est pas si difficile que ça ne pouvait paraître. Enfin quoi que je suis entrain de déplumer mon micro Texas qui a un port USB et là je dois avouer que je lutte un peu... mais c'est plus par méconnaissance du protocole USB en lui même.

    Tu as fait ça seul ? Rien qu'en lisant la datasheet ?
    La science ne nous apprend rien : c'est l'expérience qui nous apprend quelque chose.
    Richard Feynman

  4. #4
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Vincent PETIT Voir le message
    Salut,
    #define F_CPU 16000000UL c'est tout simplement parce que le quartz de ton Arduino UNO est un 16MHz par contre ce que moi je ne comprends pas c'est où tu as trouvé ce #define F_CPU 1843200 ?
    Tu serais me dire la page de la datasheet ?
    Je me suis basé sur l'exemple fournis par le datasheet (version complète), page 176.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #define FOSC 1843200 // Clock Speed
    #define BAUD 9600
    #define MYUBRR FOSC/16/BAUD-1
    void main( void )
    {
    ...
    USART_Init(MYUBRR)
    ...
    }
    Je n'ai pas encore regardé du côté des timers, j'avoue que ça ne m'a pas parue "bizarre" en voyant ce nombre... Et comme c'est l'exemple type donné dans le datasheet, je n'ai pas remis en cause sa véracité.
    Arduino fournit aussi d'autre version de son bootloader pour se passer des éléments externe propre à la platine ... A voir ici : https://www.arduino.cc/en/Tutorial/ArduinoToBreadboard
    J'aurais aimé pouvoir bidouiller la chose par moi-même, mais j'ai encore du mal à comprendre comment le bootloader fonctionne ici.

    Citation Envoyé par Vincent PETIT Voir le message
    En tout cas, je vois que tu apprends vite Toi qui voulait sauter a pieds joints dans un micro voilà qui est fait.
    Tu as très bien initialisé tous les registres de l'USART décrit à la page 195 à 199 de la datasheet (complète) et je vois aussi que tu as su gérer le flag USART Data Register Empty dans ta fonction loop_until_bit_is_set(UCSR0A, 5); Normalement dedans tu n'as qu'une simple boucle while qui attend que le bit n°5 du registre UCSR0A passe a 1 pour dire que la donnée est partie de l'USART.

    Pour quelqu'un qui n'avait jamais mis les doigts dans un micro-contrôleur

    Tu as aussi du te rendre compte que lire un datasheet peut faire peur la première fois où tu l'ouvres mais il suffit de lire le bon chapitre qui te concerne pour se rendre compte que tout est écrit et que finalement ce n'est pas si difficile que ça ne pouvait paraître. Enfin quoi que je suis entrain de déplumer mon micro Texas qui a un port USB et là je dois avouer que je lutte un peu... mais c'est plus par méconnaissance du protocole USB en lui même.

    Tu as fait ça seul ? Rien qu'en lisant la datasheet ?
    J'ai le même problème pour le moment ici, avec le protocole série. J'ai bien compris comment envoyer de simple trame de 8bits de donnée, par contre la réalisation de trame "avancé" me pose quelque problème. Quid de l'envois d'une donnée sur 16bits ? ou plus (une chaine de caractère par exemple) ? J'ai bien compris que je dois jouer avec les SOH, STX, ETX, ... Mais je n'ai pas encore bien saisis l'ordre de la chose, et encore moins comment cela est traité par le "receveur". C'est la prochaine étape !

    Côté PC, je m'appuie beaucoup sur les man pages Linux. J'ai quelque connaissance en C donc ça ne me fait pas (du tout) peur. Le plus dur est de trouver le début de la piste.
    Côté µC, j'ai débuté avec ce pdf : http://perso-laris.univ-angers.fr/~c...enceau1112.pdf
    En fait, il m'a surtout servis à "démystifier" la bestiole, à me dire qu'en fait ce n'était pas bien dur. Je l'ai lu une fois pour voir et ne m'en suis pas resservis ensuite. En fait, c'est semblable à tout : On a d'une part un registre pour lire/écrire, et de l'autre un registre pour contrôler/définir les options.

    J'utilise principalement le datasheet et la documentation disponible pour l'AVR-GCC ( http://www.nongnu.org/avr-libc/ ). Je la trouve de bonne qualité, facilement compréhensible et assez complète. Niveau protocole je recherche tout ce qui peu m'aider, en essayant d'éviter les codes "tout fait". J'ai déjà pu toucher aux interruptions (via macro ISR), au lecture digitale I/O, ... J'aimerais d'ici quelque jour m'attaquer à de la lecture en Analogique. Mais pour ça, "comprendre" comment cela se passe aussi. (Honte à moi, je n'ai pas encore vraiment --compris-- les spécifications technique de l'Arduino, rien que le coup de la fréquence de la clock aurait du me mettre la puce à l'oreille )

    Sinon, comme tu dis, "tout est écrit", il suffit d'être persévérant
    Je comprends également ce que tu voulais dire quand tu me disais : " A partir du moment où l'on a utiliser un µC, on sait allez sur les autres µC sans trop de soucis. "
    Le plus dur, c'est la logique (protocole série, fonctionnement de la clock interne, ... ). Une fois cela acquit, le reste ce n'est que de l'emballage.

    Mais, avec tout ça, je mets un peu l'électronique de côté Pourtant si je veux évoluer avec mon µC, il va bien falloir que je m'y mette un peu plus sérieusement aussi.

  5. #5
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Consultant en Systèmes Embarqués
    Inscrit en
    Avril 2002
    Messages
    3 190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Systèmes Embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 190
    Points : 11 573
    Points
    11 573
    Par défaut
    Chaque chose en son temps, pour programmer un Atmega328P indépendant tu as le temps de voir ça plus tard.

    Pour gérer l'envoi et la réception de chaîne de caractère ou de données plus grande que 8 bits, ce n'est pas compliqué du tout et la solution en réalité tu l'as déjà.

    Pour la valeur du quartz c'est normal que tu ne l'aies pas vu tout de suite car c'est en apprenant le hard (l'électronique) que tu feras les liens avec la config soft et c'est bien là qu'on voit que c'est très lié.
    Et c'est encore plus vrai avec le convertisseur analogique numérique !!!!!

    Ca va aller !
    La science ne nous apprend rien : c'est l'expérience qui nous apprend quelque chose.
    Richard Feynman

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

Discussions similaires

  1. visual.net c++ ( communication série)
    Par stgi02 dans le forum MFC
    Réponses: 2
    Dernier message: 27/02/2006, 22h49
  2. Communication Série un peu trop lente?
    Par SimonBrodeur dans le forum VB 6 et antérieur
    Réponses: 22
    Dernier message: 16/01/2006, 14h41
  3. [communication série] problème lecture/écriture
    Par davinout dans le forum API, COM et SDKs
    Réponses: 9
    Dernier message: 01/06/2005, 13h14
  4. [VB.NET] Communication série
    Par DotNET74 dans le forum Windows Forms
    Réponses: 4
    Dernier message: 16/03/2005, 14h02
  5. [API] Communication série NON-bloquante : OVERLAPPED/Thread
    Par Rodrigue dans le forum C++Builder
    Réponses: 2
    Dernier message: 07/11/2003, 13h43

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