analyseur logique

Salut a tous,

Je suis actuellement en train de réaliser un analyseur logique (Analyseur logique — Wikipédia pour ceux qui ne savent pas ce que c'est) à base d'arduino (pour reverser une carte qui est sensé communiquer, par je ne sais qu'elle protocole, mais dont je ne trouve ni mode d'emploi ni Datasheet pour les CI sur la carte :relaxed: ).
Et donc j'ai besoin de visualiser l'évolution de l'état logique de chaque broche de sortie à l'écran. J'utilise l'arduino pour faire l'aquisition des "données" et je traite ensuite avec processing (http://processing.org/) pour m'afficher à l'écran l'états de chaque broche.

Je me suis inspirer de l'oscilloscope a base d'arduino trouver ici:http://fr.flossmanuals.net/arduino/ch023_oscilloscope

Mon prototype est pour l'instant assez rudimentaire mais je compte l'améliorer au fur et a mesure. Je post mon code maintenant en esperant que cela puisse aider quelqu'un, et aussi peut être pouvoir faire évoluer a plusieurs l'idée et de trouver des conseils pour optimiser: l'acquisition, le traitement, la mise en forme, ou l'ajout d'outils pour faciliter l'analyse logique.

Coter arduino le code est tres simple:

void setup() {
  DDRB=B10000000;
  Serial.begin(115200);
}

void loop() {
  Serial.println(PINB);
}

Ce code amorce une communication serie avec l'ordinateur (à la vitesse maximum proposée par le terminal série arduino, mais il est peut être possible de l'augmenter?!) puis envoi en boucle la valeur de PINB.
pour ceux qui ne connaissent pas:http://arduino.cc/fr/Main/PortManipulation
Une lecture avec digital.Read() est plus longue! Je me demande si le temps ainsi gagner n'est pas perdu a cause de la communication série trop lente?!

Coter processing voila le code:

import processing.serial.*;
Serial maConnection;
int a,b,c,d,e,f,donnees=0,x,fenetreTemps=12000;

void setup() {
    size(1200, 400);
    String NomDuPort = Serial.list()[0];
    println("connection a "+NomDuPort);
    maConnection = new Serial(this, NomDuPort, 115200);
    background(255);
}

void draw() {
}

void serialEvent (Serial maConnection) {
  String retour=maConnection.readStringUntil('\n');
  if (retour != null) {
        retour = trim(retour);
        donnees = int(retour);
    }
    
    int oldx=x;
    x=(millis()%fenetreTemps)*width/fenetreTemps;
    if (oldx>x) {
        oldx=0;
        background(255);
    }
  plot(donnees,x);
    
}

void plot(int val, int pos) {
        a=val & 1;
        b=(val & 2)/2;
        c=(val & 4)/4;
        d=(val & 8)/8;
        e=(val & 16)/16;
        f=(val & 32)/32;
    point(pos,a*20+50);
    point(pos,b*20+100);
    point(pos,c*20+150);
    point(pos,d*20+200);
    point(pos,e*20+250);
    point(pos,f*20+300);
}

Ce code permet à processing d'établir la communication serie avec l'arduino puis d'ouvrir une fenêtre 1200*400 et tracer de facon continue les valeurs des états logique de chaque broches, respectivement 8 à 13 de l'arduino(Mais il est envisageable de pousser le principe à toutes les broches de l'arduino).
On se retrouve donc avec 6 tracé corespondant à chacune de leur broches respective et permet de faire une interpretation visuel des chagement d'états logique.

Ceci est bien sur une version test, mes prochains objectif sont:

  • d'enregistrer les valeurs recu dans un grand tableau[] pour pouvoir faire l'aquisition sur une longue periode.
  • d'ameliorer la communication serie
  • De faire une meilleur présentation visuel des signaux
  • Eventuelement ajouter des outils d'analyse pour different protocole (I2C, UART,...?!)

Toute aide ou sugestion est évidement la bienvenue :slight_smile:

Un ptit truc : faire le serial.print() uniquement s'il y a un changement d'état, sinon ça ne sert à rien.

Un autre petit truc. Faire une recherche sur le forum ou sur le net avant de se lancer dans des projets comme ça:

Il existe déjà un projet à base d'Arduino qui s'appuie sur SUMP et utilise son environnement d'affichage

http://arduino.cc/forum/index.php/topic,52881.0.html

Bonjour
-faire soi même à partir de zéro est un 'plan' qui est intéressant si l'objectif est de comprendre le principe.
-le projet mentionné par fdufnews a été présenté sommairement dans ce fil :

c'est un projet qui avance (doucement)

Attention je ne dénigre pas le développement en partant de zéro. Mais il est des fois plus "utiles" de partir d'un projet existant est de le faire avancer un pas plus loin Cela permet d'avoir un outil plus complet au lieu d'avoir 10 projets commencés et jamais aboutis.

Bonjour,

Le principe est là mais en situation réel un tel analyseur logique serait inutilisable.

Ce qui fait la force d'un analyseur logique c'est la fréquence d'échantillonnage.
Celle ci doit être stable, terriblement stable même et surtout connu.

Dans ton code tu ne fait que "boucler", rien ne te dit à quelle fréquence tu échantillonnes.
De fait tu ne peu donc pas savoir combien de µs/ms/s dure un front, ce qui est la base d'un analyseur logique.

fdufnews:

Faire une recherche sur le forum ou sur le net avant de se lancer dans des projets comme ça:

Je ne sais pas par ou commencer pour répondre a ça, mais tentons tout de même. J'ai longtemps chercher avant de commencer et je suis tomber sur plusieurs truc, plus ou moins fonctionelle du genre:
http://code.google.com/p/arduinoscope/
http://code.google.com/p/xoscillo/
Le lien que tu me fourni, je m'y etait déja interesser.
Et si malgré tout ca j'ai quand même décider de tenter d'en faire un moi meme, c'est que les les liens que je donne ci dessus ne corespondent pas exactement a mes attentes mais que surtout ils ne sont pas facilement installable/modifiable, quand au lien que tu me donne, est, de loin, le plus dur de tous! (il n'y a qu'a voir le probleme que les gens rencontrent dans les sujet qui en parle, et en plus il demande a faire des modification sur la carte meme de larduino

al1fch:

-faire soi même à partir de zéro est un 'plan' qui est intéressant si l'objectif est de comprendre le principe.

je ne sais pas si j'ai bien compris ce que tu dit, mais de facon narcissique je peut t'affirmer que mon objectif premier est de ne rien comprendre...

fdufnews:

Attention je ne dénigre pas le développement en partant de zéro. Mais il est des fois plus "utiles" de partir d'un projet existant est de le faire avancer un pas plus loin Cela permet d'avoir un outil plus complet au lieu d'avoir 10 projets commencés et jamais aboutis.

Je rejoins totalement ce que tu dit la, d'ailleur, comparé a ton premier post, cela me surprend un peu.
On peu dire plein de chose a propos de ne pas réinventer la roue, alors que d'autre projet existe deja sa sert a rien d'en etamer d'autre, on pourait certainement améliorer indefiniment les autres deja existant aussi, et je ne propose pas quelque chose de révolutionaire, juste un outil simple (comme ce dont j'ai besoin) et qui peut rapidement donner une idée visuel de ce qui se passe.
arduino et processing sont des logiciel relativement simple a installer, et permetre a quiconque qui le veuille, d'avoir juste a recopier un code et de l'executer aurait etait un analyseur logic qui repond a mes atentes.
et j'aimerais aussi prendre l'exemple de linux dont il existent des centaines de distribution et le fait qu'il y en ai autant n'empeche pas des equipe de devellopeur de se reunir pour en creer de nouvelle

skywodd:

Le principe est là mais en situation réel un tel analyseur logique serait inutilisable.

Est ce que tu pourait m'eclaircir, car comme je le dit au tout debut mon objectif est de comprendre une carte sur laquelle je n'ai aucune information...
mais j'ai une petite idee sur le fonctionement et dans mon cas l'analyseur serait (avec une legere amelioration) parfaitement l'outil qu'il me faut.
Je pourait tout a fais envoyer les echantillon de facon cadencé avec une horloge interne sa se rapprocherais plus de la precision que tu recherche, mais encore une fois je souhaite vraiment recevoir des conseils ou critique (constructive) pour ameliorer l'idée de depart et dans l'idéal la rendre le plus simple possible.

AKkarol7:
Est ce que tu pourait m'eclaircir, car comme je le dit au tout debut mon objectif est de comprendre une carte sur laquelle je n'ai aucune information...
mais j'ai une petite idee sur le fonctionement et dans mon cas l'analyseur serait (avec une legere amelioration) parfaitement l'outil qu'il me faut.
Je pourait tout a fais envoyer les echantillon de facon cadencé avec une horloge interne sa se rapprocherais plus de la precision que tu recherche, mais encore une fois je souhaite vraiment recevoir des conseils ou critique (constructive) pour ameliorer l'idée de depart et dans l'idéal la rendre le plus simple possible.

Ton but est de capturer un signal, qui par définition est défini sur une plage de temps T par des fronts de durée inconnu.
Ton code actuel permet de capturer ces fronts, mais sans base de temps, donc sans pouvoir mesurer précisément la durée des dit fronts.

Les "vrai" analyseurs logiques utilisent une horloge à une fréquence connu (et élevé) pour capturer les échantillons.
Une fois le signal capturé tu sait que le front x a durée N tick d'horloge -> tu connais la durée d'un tick -> tu connais la durée du front.

À moins de travailler sur un signal ayant déjà une ligne d'horloge (SPI, ...) un analyseur logique sans base de temps c'est comme un oscilloscope sans base temps : aucun intérêt.

En intégrant une mesure avec micros(), ce serait déjà un début acceptable non ?

Jean-François:
En intégrant une mesure avec micros(), ce serait déjà un début acceptable non ?

Le problème ne sera que déplacé, il faut penser aussi au temps que prend Serial.println() (qui est bufferisé et sous interruptions en plus).

Le code arduino compatible SUMP par exemple utilise un timer pour la capture à "temps fixe" et un tableau en RAM pour stocker les échantillons.
C'est exactement le même principe qui est utilisé dans la carte OpenLogicSniffer, sauf que l'horloge est bien plus rapide qu'un bête timer et que la mémoire RAM est aussi bien plus grande.

Je ne parle pas français. Désolé pour les erreurs de traduction.

Je suis l'auteur de l'esquisse Arduino analyseur logique. Si vous rencontrez des problèmes avec l'AGLA ou les fonctionnalités manquantes, j'aimerais obtenir de la rétroaction et de le corriger.

S'il vous plaît comprendre les limites actuelles sont dues à des contraintes matérielles de l'Arduino lui-même, je fais ce que je peux pour rendre l'échantillon le plus rapidement (et aussi profondément) que possible.

Merci.

Hi Gillham

Excuse Me! for traduction mistake :slight_smile:

I'm very impressed of your logic anlyser project but, as i say on my top message, i have a board that i can't find any documentation and integrate circuit solded to it don't have to... i have a little idea of how this board can work so i just need a easy to use analyser tool to approved what i think, but all project that i find on the web does not suit for me (in term of ease). the only critisism i can't say to your project is, because of the need to do modification on the arduino board.
That's why i just write a little piece of code for arduino and processing to have a visualisation of what appen on different wire of my board.

AKkarol7:
the only critisism i can't say to your project is, because of the need to do modification on the arduino board.

That's why i just write a little piece of code for arduino and processing to have a visualisation of what appen on different wire of my board.

Thanks AKkarol7. I just wanted to find out if there were any issues I could fix to make my logic analyzer easier to use or more useful. Making your own tool that does exactly what you need is cool too and part of the fun of learning how things work.

With a recent version of the sketch and client software you do not have to disable the automatic reset feature if you are using Jawi's alternative client. I will try to improve my README so it is more clear in that area. You should be able to just upload the sketch and launch the java client to use AGLA.

I just wanted to find out if there were any issues I could fix to make my logic analyzer easier to use or more useful.

i think people, often need, quick to use without any complex instalation tool. maybe you should make a youtube tutorial, i think that will be a good help. :wink:
because a must confess i was always lost on github project and for your project i don't find a good place where to find help :S

Making your own tool that does exactly what you need is cool too and part of the fun of learning how things work.

it's true i found fun to realize it :slight_smile:

Hi everybody

I made an extention for the arduino due up to 10 Mhz

Thanks Gillham.

S'il vous plait conversez en français !

Je lis de temps en temps le forum anglophone.
Les modérateurs anglophones n'ont pas notre "élégance française" et déplacent immédiatement tout message non en anglais.
Et s'ils tardent à le faire immédiatement des "USE GOOGLE TRANSLATORS" fusent de partout.

Nous n'en sommes heureusement pas là, nous pouvons accepter que l'auteur anglophone réponde (en partie) dans sa langue ,
Par contre que des français, sur la partie francophone du forum écrivent en anglais c'est faire peu de cas des autres membres de la communauté francophone qui n'ont pas la chance de comprendre l'anglais.
Merci pour eux.

Je propose qu'un francophone voulant se faire comprendre dans une autre langue écrive dans cette autre langue, mais qu'il mette également la traduction en français. Ca demande un peu plus de temps, mais cela simplifierait bien les choses!

Pour revenir au topic de base, j'ai aussi cette idée de faire un analyseur logique, et si on trifouille bien, on doit pouvoir tapper des signaux assez rapides, on peut utiliser un timer en comptage à 16MHz et le lire à chaque changement du port analysé. on peut espérer atteindre une précision de 250ns (2 MHz) avec un peu d'assembleur qui surveille le port en question, et il y aura bien un moment de tranquilité pour envoyer des couples (data; timelaps) sur le port série...

Ne pas oublier que la void loops() ne met pas toujours le même temps à boucler grâce aux rajouts inutiles du core arduino...

Super_Cinci:
...
Pour revenir au topic de base, j'ai aussi cette idée de faire un analyseur logique, et si on trifouille bien, on doit pouvoir tapper des signaux assez rapides, on peut utiliser un timer en comptage à 16MHz et le lire à chaque changement du port analysé. on peut espérer atteindre une précision de 250ns (2 MHz) avec un peu d'assembleur qui surveille le port en question, et il y aura bien un moment de tranquilité pour envoyer des couples (data; timelaps) sur le port série...

...

Bonjour
c'est surement possible puisque ce petit analyseur (produit commercial) que j'utilise de temps en temps
http://www.ikalogic.com/ikalogic-products/scanalogic-2/
tourne sur un ATMEGA 168 @ 20 Mhz
la comm se fait par V-USB

Artouste:
http://www.ikalogic.com/ikalogic-products/scanalogic-2/ tourne sur un ATMEGA 168 @ 20 Mhz

Si on utilise les 4 voies cela fait quelle fréquence d'échantillonage réelle par voie ?

68tjs:

Artouste:
http://www.ikalogic.com/ikalogic-products/scanalogic-2/ tourne sur un ATMEGA 168 @ 20 Mhz

Si on utilise les 4 voies cela fait quelle fréquence d'échantillonage réelle par voie ?

peut etre un peu plus d'info sur cette question ici
http://sigrok.org/wiki/IKALOGIC_Scanalogic-2

sinon je regarderais dans la semaine, mais j'ai l'impression que c'est de l'acquisition // = la memoire dispo n'est pas "redistribuable" , elle est affectée en dur , le max d'echantillonage (sampling max rate) est de 20 MHz pour 4 voies (ou une)