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

Embarqué Discussion :

Décodeur morse avec un atmega


Sujet :

Embarqué

  1. #1
    Candidat au Club
    Décodeur morse avec un atmega
    Bonjour,

    J'essaie de faire un decodeur morse avec un atmega 8. J'arrive actuellement à savoir si le signal récu est un "." ou un "-". Mais je ne sais pas comment faire pour dire que c'est la fin du mot. J'ai pensé a faire que lorsque le temps est à 0 je mets un "/" dans ma chaine de caractère. Mais ce n'est pas possible car entre un . et un - il y a tfacon 0 dans la variable tPulse.

    Est ce que vous pouvez m'aider ?

    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
    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
    #include <avr/io.h>
    #include <stdlib.h>
    #include  <util/delay.h>
    #include <avr/interrupt.h>
    #define F_CPU 8000000UL
    #include "dj_tools_lcd_V2.h"
    volatile uint16_t tPulse,time, tStart;
     
    ISR(TIMER1_CAPT_vect)
    {
     
     
        uint16_t t = ICR1 /8;
        if (TCCR1B & (1<<ICES1)) { // Si front montant
     
     
            tStart = t;
            TCCR1B &= ~(1<<ICES1); //front descendant en suite
     
        } else {
     
     
            time = t ;
            tPulse = time - tStart;
            TCCR1B |= (1<<ICES1); //front montant ensuite
        }
    }
    int main()
    {
        char chaine[100];
        char test[100];
        test[0]='a';
        int i=0;
        int a=1;
        int input;
        uint16_t temps[10];
     
     
        lcd_set4bit();    //initialise le mod 4 bits
        lcd_init();
        lcd_clear();
        DDRC = 0xFF;//PORT C en sortie
        DDRD=0x00;
        TCNT1=0;
        TIMSK=(1 << TICIE1); // input capture
        TCCR1B |= (1 << CS12) | (1 << CS10)  ; //prédiviseur par 1024
        TCCR1B |= (1 << ICNC1) | (1<<ICES1) ; //noice canceler + front montant sur ICP1
        sei(); // activer les interruptions
        while(1)
        {
            input=(PIND&0x01);
            dtostrf(tPulse,7,3,temps);
     
            if (tPulse < 0x23 && tPulse > 0x0A && tPulse != 0x00) {
                lcd_ligne(1,1);
                lcd_write_text(".");
                chaine[i]='.';
                tPulse=0;
                lcd_ligne(3,a);
                lcd_write_char(chaine[i]);
                i=i+1;
                a=a+1;
                i=i+1;
            }
     
            if (tPulse > 0x23 )
            {
                lcd_ligne(1,1);
                lcd_write_text("-");
                chaine[i]='-';
                tPulse=0;
                lcd_ligne(3,a);
                lcd_write_char(chaine[i]);
                i=i+1;
                a=a+1;
     
            }
            if(input>=0x01)
            {
                i=0;
                a=1;
                lcd_clear();
            }
     
     
     
        }
     
    }

  2. #2
    Modérateur

    Bonjour

    Comment est définie la fin d'un mot?
    En répondant à cette question tu auras une piste sur comment détecté la fin d'un mot...

    Bonne suite

    Delias

  3. #3
    Candidat au Club
    Pour detecter la fin dune lettre j'avais l'intention de mettre en séparateur par exemple un "/". Mais j'ai une idéé. C'est quand si pendant temps de temps rien ne c'est passé j'ajoute le caractère "/" a ma chaine. Je vais essayer cela. Je vous redis si j'ai réussi.

  4. #4
    Modérateur

    Salut,
    Il me semble que tout ceci est normalisé en MORSE (il y a du handshaking ou des acknowledge, fin de transmission, répéter message etc...)

    Mon beau père ayant été dans les transmissions à l'armée, on ne fait pas transiter de phrase en français d'habitude. Ce sont des messages codés en chiffres/lettres
    La science ne nous apprend rien : c'est l'expérience qui nous apprend quelque chose.
    Richard Feynman

  5. #5
    Modérateur

    Bonjour à tous

    J'ai toujours été une pige en morse donc la suite sans garantie d'être exact ou unique, il y a éventuellement des variantes que j'ai oublié!
    Normalement la spécification dont je parle est la durée des pauses entre les impulsions qui varie en fonction de sa signification: séparation entre deux impulsions d'une même lettre, séparation entre deux lettres ou séparation entre deux mots.

    Bonne suite

    Delias

  6. #6
    Nouveau Candidat au Club
    un tiret est égal a 3 points
    l'espace entre 2 élements d'une meme lettre est égal à 1 point
    l'espace entre 2 lettres est égal a 3 points
    l'espace entre 2 mots est égal a la durée de 7 points