Auteur Sujet: Problème reception rapide CAN  (Lu 23150 fois)

mavrik

  • Newbie
  • *
  • Messages: 5
    • Voir le profil
Problème reception rapide CAN
« le: février 26, 2019, 03:42:04 pm »
Bonjour a tous,


J'ai un problème avec mon programme. Je reçoit bien les trame CAN souhaité si elle sont envoyé toutes les 1000ms. Dés que j'essaie de passer a 100ms le programme se fige.

Je ne trouve pas pourquoi.

Dominique

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 3038
  • 100% Arduino et N
    • Voir le profil
Re : Problème reception rapide CAN
« Réponse #1 le: février 26, 2019, 04:48:35 pm »
Bonjour,
Est-ce que vous pourriez commencer par simplifier votre programme pour ne conserver que la partie Can et, par exemple, compter les messages Can et afficher les compteurs toutes les secondes.

Comme il est courant de recevoir plusieurs centaines de messages par seconde, vu les exemples que nous décrivons sur Locoduino, qui marchent, je suis certain que votre problème est ailleurs.

En plus votre programme ne semble pas se rapporter au modélisme ferroviaire (une station météo ?) et comporte de multiples raisons de se bloquer (des conditions de sortie des boucles while, plutôt restrictives), peut-être des conflits d’interruptions, une lourde partie graphique et apparemment 2 voies Can, le tout dans un programme assez mal organisé.



« Modifié: février 26, 2019, 05:03:27 pm par Dominique »
Cordialement,
Dominique

Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1714
    • Voir le profil
Re : Problème reception rapide CAN
« Réponse #2 le: février 26, 2019, 05:53:23 pm »
C'est pour de la voiture.

Vous avez des delay(xxx) partout avec xxx valant des centaines de ms. Pendant ce temps les messages arrivant tous les 100ms saturent le MCP2515.

Ça ne marchera jamais. C'est impossible de tenir un débit autre que ridicule avec du code bloquant. Tout est à réécrire.
Cordialement

mavrik

  • Newbie
  • *
  • Messages: 5
    • Voir le profil
Re : Problème reception rapide CAN
« Réponse #3 le: février 28, 2019, 02:46:47 pm »
Bonjour,

Effectivement c'est pour commander une soufflerie en CAN suivant une T° moteur reçu par CAN d'une voiture.

Pas de soucis pour refaire le programme mais comment le structurer ?

Merci d'avance pour votre aide.

msport

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 2217
  • HO avec DCC++ en DIY Réseaux très éphémères
    • Voir le profil
Re : Problème reception rapide CAN
« Réponse #4 le: février 28, 2019, 09:02:45 pm »
Bonjour,

pourquoi ne pas commencer par faire quelques recherches sur le site éditorial ?

à lire et relire :

http://locoduino.org/spip.php?article6

http://www.locoduino.org/spip.php?id_mot=28&page=theme
http://locoduino.org/spip.php?id_mot=30&page=theme

Bon courage.
Cordialement

Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1714
    • Voir le profil
Re : Re : Problème reception rapide CAN
« Réponse #5 le: mars 01, 2019, 09:27:03 am »
Bonjour,

Pas de soucis pour refaire le programme mais comment le structurer ?

À chaque fois que dans loop ou dans toute fonction appelée par loop, vous avez delay, il faut le supprimer. Donc :
- À quoi servent ces delay, c'est requis pour gérer l'écran tactile que vous utilisez ?
- Si ils servent effectivement, il faut les remplacer par une machine à états temporisée
Cordialement

mavrik

  • Newbie
  • *
  • Messages: 5
    • Voir le profil
Re : Problème reception rapide CAN
« Réponse #6 le: mars 01, 2019, 11:25:56 am »
Merci pour ces infos. Je vais lire tous ça et essayer de réécrire mon programme  sans les delay.

mavrik

  • Newbie
  • *
  • Messages: 5
    • Voir le profil
Re : Problème reception rapide CAN
« Réponse #7 le: mars 04, 2019, 02:50:42 pm »
Bonjour a tous,

j'ai commencé a refaire mon programme en utilisants la fonction  millis(). (attention le programme n'est pas fini)

Ma loop CAN_stockV() freeze l'affichage au bout de 21 messages reçu donc quand le tableau _CirculeV est plein. Mais le programme continue de fonctionner car il envoie toujours une trame can toutes les 100ms.
« Modifié: mars 04, 2019, 02:54:30 pm par mavrik »

mavrik

  • Newbie
  • *
  • Messages: 5
    • Voir le profil
Re : Problème reception rapide CAN
« Réponse #8 le: mars 06, 2019, 03:23:22 pm »
Problème résolu  :)

Le problème venait du faite que j'ai rempli le unsigned char _Circule[256] par un unsigned int _CirculeV[256]   car j'utilise des identifiants CAN plus grand que 255. Sauf qu'un sizeof(_CirculeV) d'un unsigned int ne donne plus 256 mais 512...

Je divise donc par 2 la valeur du sizeof dans les comparaisons et je n'ai plus de probléme. Il faut bien faire la modification dans la boucle qui écrit dans Circule mais aussi dans la boucle qui récupère les valeurs dans Circule.


while (_NcanV > 2)  {    // chaque message dans _Circule occupe au moins 3 octets
    _NcanV--;
    RIdV = _CirculeV[_indexRV];        // recup Id
    _indexRV++;
    if (_indexRV == sizeof(_CirculeV) / 2)  {_indexRV = 0;}
    _NcanV--;
    RlenV = _CirculeV[_indexRV];       // recup longueur
    _indexRV++;
    if (_indexRV == sizeof(_CirculeV) / 2)  {_indexRV = 0;}

    for (int k = 0; k < RlenV; k++)  {
      _NcanV--;
      RbufV[k] = _CirculeV[_indexRV];  // recup octets message
      _indexRV++;
      if (_indexRV == sizeof(_CirculeV) / 2)  {_indexRV = 0;}

    }

  }