Lire un octet de l'UART sur AVR en C

Do you have a question? Post it now! No Registration Necessary

Translate This Thread From French to

Threaded View
Bonjour,

Je suis en train de concevoir un footcontroller MIDI avec un
AtMega644. Pour cela, j'utilise l'UART du microcontrF4%leur.
Pour l'envoi des messages MIDI, c'est OK mais pour la lecture, E7%a se
corse un peu.

Dans un premier temps, j'ai besoin de dE9%tecter si un message de
Program Change est reE7%u sur le canal 0, soit le code 0xC0, mais comme
le bit de poids fort est envoyE9% en premier, je reE7%ois 0x03 et c'est
donc cette valeur que je dois lire.

Y-a-t-il un moyen de contourner E7%a simplement ?
J'ai pensE9% E9%crire un algo de pile LIFO mais E7%a me parait un peu lourd
pour E7%a.

Merci,
LoEF%c

Re: Lire un octet de l'UART sur AVR en C

Quoted text here. Click to load it

Bizarre ce truc, normalement les UART envoient et recoivent
les octets avec les bits dans le bon sens, c'est standard ?
Tu ne peux pas paramE9%trer cela directement sur l' UART ?

Sinon (si j'ai bien compris)
 soit 'R' l'octet recu [ 76543210 ]
 soit 'S' l'octet voulu [ 01234567 ]

// inversion de l'ordre des bits

 for( i3D%8; i--; R >>3D% 1 )
  S 3D% (S << 1) | (R & 1);

// HTH

Re: Lire un octet de l'UART sur AVR en C
Le 27/11/2009 13:38, Jean-Christophe a écrit :
Quoted text here. Click to load it

C'est ce que je pensais aussi mais visiblement non, à moins que j'ai
oublié quelque chose, c'est aussi un peu le but de mon post ;)

J'ai regardé dans le datasheet du 644 et j'ai rien vu à ce propos.

Merci pour ton bout de code, c'est un peu ce que je pensais faire aussi
mais si quelqu'un voit l'éventuel problème ou a une meilleure solution,
je suis preneur.

Re: Lire un octet de l'UART sur AVR en C (HS sur ce fil)
Quoted text here. Click to load it


Desolé JC,
J'ai répondu un peu tard sur ta proposition d'essai de logiciel de schema
( voir sur le fil ferrite)
--

Alain



Re: Lire un octet de l'UART sur AVR en C (HS sur ce fil)

Quoted text here. Click to load it

Ok, j'ai postE9% un link vers le ZIP sur le fil "ferrite".

Re: Lire un octet de l'UART sur AVR en C (HS sur ce fil)
Quoted text here. Click to load it
Merci


--

Alain



Re: Lire un octet de l'UART sur AVR en C

snipped-for-privacy@l13g2000yqb.googlegroups.com...
Quoted text here. Click to load it




pa bien compris, a l'emission c'est dans le bon ordre, et a la reception
c'est inversé ?

quoi qu'il en soit, si tu veux détecter 0xC0 et que tu recoit 0x03, il
suffit de tester sur 0X03

#ifdef INVERSE
#define PROGRAM_CHANGE 0x03
#else
#define PROGRAM_CHANGE 0xCO
#endif


comme cela, tu definis INVERSE ou pas, et tu n'as pas a modifier ton code



Re: Lire un octet de l'UART sur AVR en C
On Nov 27, 2:29A0%pm, "jlp" <glloq>

Salut JL,

Quoted text here. Click to load it

Pour pinaller : ca ne marchera pas !

0xCO !3D% 0xC0

;-)

Re: Lire un octet de l'UART sur AVR en C

snipped-for-privacy@b2g2000yqi.googlegroups.com...
On Nov 27, 2:29 pm, "jlp" <glloq>

Salut JL,

Quoted text here. Click to load it

Pour pinaller : ca ne marchera pas !

0xCO != 0xC0

;-)

j'ai eu du mal a conprendre, mais ca y est, j'ai changé de lunettes !



Re: Lire un octet de l'UART sur AVR en C
Le 27/11/2009 14:29, jlp a écrit :
Quoted text here. Click to load it

Pour l'émission, je sais pas trop car pour le moment, j'utilise des
fonctions de la librairie de mikroelectronica (en mikroC, donc) pour
l'émission et celle pour la réception ne me plait pas (ça n'a pas l'air
d'utiliser les interruptions).
Comme c'est une librairie proprio, je sais pas comment ça marche ...

Quoted text here. Click to load it

Oui mais ça c'était qu'un exemple, pour la suite (je vais avoir des
valeurs codées sur les 8 bits à récupérer), c'est nettement moins
pratique ;)

Quoted text here. Click to load it

Par contre, l'idée du #define, ça me plait. Ça me parait moins lourd
d'√©crire les 128 #define en inversant les valeurs √† la main plut√īt que ¬ę
retourner ¬Ľ chaque octet re√ßu.

Re: Lire un octet de l'UART sur AVR en C

4b0ff6ba$0$941$ snipped-for-privacy@news.orange.fr...
Quoted text here. Click to load it

de toute facon, ca ne coute rien, tu seras toujours obligé de comparer d'une
maniere ou d'une autre.
soit
if (TrucRecu ==  0x03) { ....

soit
if (TrucRecu ==  PROGRAM_CHANGE) { ....

ce qui est bien plus lisible, et bien plus facile a modifier, car il suffit
de changer le #define.

dans un switch c'est encore plus flagrant.
switch (TrucRecu){
case PROGRAM_CHANGE:
    machin();
    break;

case VELOCITY:
    chose();
break

    default:
    Rien();


et ainsi de suite


si l'uart peut etre programmé pour inverser les bits, tu n'as rien a
retoucher dans le code



Re: Lire un octet de l'UART sur AVR en C

Quoted text here. Click to load it

Ecrire 128 (ou 256 ?) lignes de #define est un peu lourd E0% E9%crire,
sans compter les risques de fautes de frappe qui amE8%nent des bugs,
E0% moins de gE9%nE9%rer les #define automatiquement avec un petit soft.

Mais c'est sur que c'est le boulot du prE9%processeur,
et qu'au runtime le traitement sera plus rapide !
... je persiste E0% trouver louche ces retournements
de bits, il doit y avoir une couille quelque part ...

Re: Lire un octet de l'UART sur AVR en C

snipped-for-privacy@z41g2000yqz.googlegroups.com...

Mais c'est sur que c'est le boulot du préprocesseur,

oui

Quoted text here. Click to load it

non, ce n'est pas une question de runtime.
en C un #define, c'est du traitement de texte pur et dur.
ca ne coute rien en temps ¬Ķp


.>je persiste à trouver louche ces retournements
Quoted text here. Click to load it

je suis d'accord avec toi, mais il y a une grosse confusion entre rs232,
liaison serie (pourquoi pas rs 422 ?), midi (qui est optocouplé), nombre de
bits emis, octet lu sur l'uart et .........



Re: Lire un octet de l'UART sur AVR en C
On Nov 27, 10:54A0%pm, "jlp" <glloq>

Quoted text here. Click to load it


C'est justement pour cela que je dis qu'au runtime,
une implE9%mentation avec des #define sera plus rapide
qu'une boucle de code qui renverse l'ordre des bits E0% la volE9%e ...


Re: Lire un octet de l'UART sur AVR en C
Le 27/11/2009 22:54, jlp a écrit :
Quoted text here. Click to load it

Sur le principe, c'est la même chose, non ? Tout cela ne sont que des
détails.


Re: Lire un octet de l'UART sur AVR en C
Le 28/11/2009 15:12, GRENON Lo√Įc a √©crit :
Quoted text here. Click to load it

Bon, d'après Pierre Maurette qui a répondu sur ce fil, les bits ne sont
pas envoyés de la même manière en RS232 et en MIDI. Donc ça vient
probablement de là.
Mais je ne comprends toujours pas pourquoi √ßa fonctionne ¬ę normalement ¬Ľ
dans l'autre sens. Surement à cause de cette librairie. J'essaierai en
initialisant l'UART ¬ę √† la main ¬Ľ, dans le courant de semaine prochaine
(j'attend de recevoir un convertisseur USB<->MIDI pour pouvoir continuer
mes essais ...).

Merci tout de même aux différents intervenants ;)

Re: Lire un octet de l'UART sur AVR en C

Quoted text here. Click to load it


Tu peux bidouiller pour tester le header PROGRAM_CHANGE,
mais ce sera la meme chose pour chaque octet de la trame,
ainsi que pour toutes les donnE9%es recues par l' UART.
Je suis presque certain que c'est un problE8%me de config.

D'ailleurs, s'il y a un bit de paritE9%, celui-ci sera mal placE9%
et les octets recus devraient etre rejetE9%s au moins E0% 50 %.

Re: Lire un octet de l'UART sur AVR en C
Le 27/11/2009 22:22, Jean-Christophe a écrit :
Quoted text here. Click to load it

C'est possible puisque l'init de l'UART se fait via la librarie proprio
de Mikroélectronika. Je vais faire un essai en faisant tout cela moi
même (je voulais aller plus vite ...) et je verrai ce que ça donne.

Quoted text here. Click to load it

Il n'y a aucun bit de parité, juste un bit de start, 8 bits de données
et 1 bit de stop. (à l'oscillo, la trame est également inversée mais
c'est normal ça, non ?)


Re: Lire un octet de l'UART sur AVR en C

Quoted text here. Click to load it

Ok


L'inversion des bits n'entraine pas le changement
de leur ordonnancement msb/lsb dans un octet.

Re: Lire un octet de l'UART sur AVR en C
Le 28/11/2009 16:31, Jean-Christophe a écrit :
Quoted text here. Click to load it

C'est ce que je sous-entendais par inversée. Ce n'est pas une histoire
de potentiel inversé mais bel et bien les bits qui le sont.

Site Timeline