Voir les contributions

Cette section vous permet de consulter les contributions (messages, sujets et fichiers joints) d'un utilisateur. Vous ne pourrez voir que les contributions des zones auxquelles vous avez accès.


Messages - bobyAndCo

Pages: 1 2 [3] 4 5 ... 60
31
Vos projets / Re : RailCom: Générateur de CutOut
« le: avril 25, 2024, 11:54:22 am »
(...)
Par exemple, je suis à peu près certain que cette commande écrite en partie en assembleur est malgré tout moins rapide en exécution qu’une écriture directe sur les ports.
- on ne peut pas aller + vite que l'assembleur , mais on peut écrire l'équivalent en C (me souviens plus comment)
- écrire directement sur le PORT , quelque soit la méthode , a pour inconvénient de modifier toutes les sorties du PORT , voir si c'est gênant ou pas
je crois le + rapide c'est :
PINB = 0b00110000 ; // on bascule les bits 4 et 5 sans toucher aux autres

Si on peut aller plus vite que l'assembleur quand on travaille avec l'IDE Arduino. C'est le cas ici et le fichier a bien comme extension .ino. Christian explique précisément cela dans son article : https://www.locoduino.org/spip.php?article280

Timing d’une fonction
Dans certains cas, l’IDE d’Arduino ne permet pas d’obtenir ce qu’on veut. Consultez la page du site Arduino qui décrit la fonction delayMicroseconds() et examinez le petit programme fourni en fin de page et repris dans la figure 3.

Selon Arduino, ce programme tout simple ne donnera pas le résultat escompté.
Si vous examinez à l’oscilloscope le signal obtenu sur la sortie (ici broche 8), vous constaterez un signal carré cyclique dont la demi-période fait 53,5 µs au lieu de 50 µs comme le voulait le programmeur et parfois ce signal montre une demi-période de presque 60 µs. Comme il est dit sur la page du site d’Arduino, cette approximation est due à l’exécution de code qui a été rajouté par l’IDE.


Il en est de même pour digitalRead() ou digitalWrite() dont on estime le temps d'exécution entre 16 et 20 fois supérieur à l'écriture ou la lecture directe du port.

Voir également : https://docs.arduino.cc/retired/hacking/software/PortManipulation/

Je crois le + rapide c'est :
PINB = 0b00110000 ; //

Nous sommes d'accord.

Ceux qui commence à s'attaquer à ce type de programmation ne sont pas des perdreaux de l'année, ils savent adapter les ports selon la platelorme. Et rien n'empèche de mettre des #define en début de programme selon les µc.

32
Vos projets / Re : RailCom: Générateur de CutOut
« le: avril 25, 2024, 11:29:59 am »
Oui je veux bien que tu regardes si tu peux. Selon moi, ce doit être proche du "minimum syndical" mais probablement pas plus de 16.

En modifiant très légèrement DCC-Ex cela est certainement modifiable... mais attention à l'occasion de mises à jour !

et je regarde comment insérer le HW dans LaBox

Pas comprendre HW ?

Merci

Christophe

33
Vos projets / Re : RailCom: Générateur de CutOut
« le: avril 25, 2024, 10:10:07 am »
Au niveau du soft, j’ai aussi quelques interrogations quant à certains choix.

Par exemple, je suis à peu près certain que cette commande écrite en partie en assembleur est malgré tout moins rapide en exécution qu’une écriture directe sur les ports.

void Dcc_Interrupt() {
  if (digitalRead(PinIn1) == true) {
    asm("cbi 0x0B, 5");
    asm("sbi 0x0B, 4");
    TCCR2B |= (T2_PRESCALER_BITS);  // Start Timer 2
  }
  else {
    asm("cbi 0x0B, 4");
    asm("sbi 0x0B, 5");
  }
}

Et que le digitalRead() aurait pu être très avantageusement remplacé par une lecture du port !!!

Ceci n’est pas très important à ce stade mais pourra faire partie des réflexions d’évolution

34
Vos projets / Re : RailCom: Générateur de CutOut
« le: avril 25, 2024, 09:53:23 am »
Bonjour Marc,

Merci d’apporter des éclairages. Je ne suis pas aussi sûr que toi que les centrales du commerce génèrent (beaucoup) plus de bits de préambule que nécessaire soit 12, 14 ou 16.

Sait-on par exemple combien de bit de préambules sont générés dans DCC-Ex, soft qui est à la base de la Box ?

Oui pour obtenir le signal de DIR soit les 1 (HIGH) soit les 0 (LOW), baiser en tension l’un des conducteurs du signal DCC, sans doute une bonne idée. Comment procèderais-tu pour « tenir » dans un 5V max ?

Il est plus facile à implanter directement en sortie du µcontroleur. Ce qui est désigné sur le schéma comme « entrée DCC » serait en fait la sortie DIR. C’est elle qui génère soit les 1 (HIGH) soit les 0 (LOW).

Pour le court-circuit, tu penses que mettre EN1 et EN2 en cc suffit ! cad. 1/0 = 1/0 , 0/1 = 0/1 et , pour le cutout , 1/1 = 0/0 Tu as certainement raison, je ne suis pas ici dans ma zone de confort pour ce qui est de mes compétences.

Merci de nous permettre à tous de mieux appréhender ce sujet.

Christophe





35
Vos projets / Re : RailCom: Générateur de CutOut
« le: avril 24, 2024, 11:54:39 pm »
Bonjour lebelge,

Je suis très intéressé et en même temps certaines choses m'étonnent.

Je comprends bien le principe adopté pour insérer le cutout à la place de certains bits du préambule. Mais encore faut il qu'il y ait assez de bits ! Si la centrale ne génère que 16 bits de préambule, ou 14 ? Avec une centrale en DIY, on peut générer le nombre de bits que l'on veut, mais une centrale du commerce ?

Par ailleurs, pour activer le transfert, il faut que le booster court-circuite la sortie pour que le décodeur envoie un courant dans la boucle ainsi créée. Or je ne vois pas comment tu réalises cela ici ? Avec un LMD18200 qui dispose d'une entrée BRAKE, c'est très simple. Sur un L603 je crois que l'on peut le faire avec la pin ENABLE1 et  ENABLE1 (mais je ne vois pas cela dans ton montage). Et avec un L298N ?

Merci pour tes réponses.

Christophe

36
Bonjour à tous,

René (alias rNé) a réalisé un nouveau dessin de la carte satellite plus compact mais aussi moins chère à fabriquer puisqu'elle tient maintenant dans un format de 100 mm X 100 mm qui chez JLCPCB revient à 3,99€ port compris pour 5 exemplaires soit 80 centimes pièce !

Deux ou trois corrections ou améliorations (sérigraphie...) et le prochaine version sera en production.

Quelques photos pour vous faire patienter :










37
Non bien sûr, cela n'est pas normal dans la mesure où l'objet de la centrale est d'assurer le roulage des locomotives !

Maintenant, tu apportes deux informations cruciales qui permettent de mieux isoler la cause. Il y a un courant de +/- 18 à 20 volts sur la voie, suffisant donc pour des décodeurs en HO et les trames DCC sont globalement dans les "clous" pour que le décodeur les interprète.

Je commencerais par m'assure que la locomotive a bien pour adresse "3" quand j'envoie <t 1 3 20 1>. Eventuellement, je ferais le test avec une autre locomotive dont je suis assuré de l'adresse et dont je sais qu'elle fonctionne.

Sinon, c'est un problème de soft dans la centrale mais c'est peu probable si tu n'as rien modifié.

Commence par cela et reviens nous dire quelque soit l'issue !

Christophe

38
Aide / Re : Problème de démarrage serveur.
« le: avril 15, 2024, 08:16:28 am »
Il y a eu des problèmes signalés sur le forum avec cette version : https://forum.locoduino.org/index.php?topic=1536.msg16598#msg16598

Je te conseille de commencer par implanter une version "native" : https://github.com/Locoduino/DCCpp

ou DCC-Ex : https://dcc-ex.com/index.html

pour isoler le problème et l'identifier. Si ça fonctionne avec l'un ou l'autre, il faudra regarder ce qui cloche dans la biblio DCCppS88

De toutes les façons, il est souhaitable de contacter son auteur pour avoir des précisions : http://lormedy.free.fr/

Christophe

39
Aide / Re : Problème de démarrage serveur.
« le: avril 14, 2024, 07:15:31 am »
Bonjour,

Quelle-est la source de ce fichier DCCpp-S88L ? Et pourquoi ce fichier et pas les programmes comme DCC++ (maintenant dépassé) et donc maintenant DCC-Ex ?

Pour moi la cause du problème est liée à l’utilisation de ce fichier.

Christophe

40
Bonjour Antoine,

Pour l'instant, je n'ai que des cartes montées. Celles-ci reviennent à 6€ environ. Tu as une alternative avec Laurent de son côté vient juste de produire des cartes Railcom en composants CMS. Marcel les a testées et elles sont OK.

J'ai des cartes vierges qui sont en production mais je pense qu'il faut encore compter 10 jours environ.

Dis moi ce que tu décide !

Christophe

41
De mon côté, avec le montage que j'ai présenté précédemment, je ne rencontre aucune difficulté. Les lectures sont très stables et fiables. Au travers du switch, on a 4 choix possibles pour la détection de présence et 4 autres choix pour les seuils de courts-circuits. J'ai pu régler finement les détections sur mon réseau.

C'est un ATtyni44 qui assure la lecture analogique. Le code utilise la lecture et l'écriture directe des ports ce qui accélère grandement la vitesse d'exécution.

Par acquis de conscience, je réalise 4 lectures dont je fais la moyenne pour obtenir les consommations de courant.

En cas de court-circuit, le relais coupe très rapidement l'alimentation DCC sur les rails. Avant même que la centrale elle même ne coupe l'alimentation générale ce qui est bien sûr le but recherché. En même temps, un signal digital est envoyé sur la sortie CC.

/*

  Détection de présence et courts-circuits pour ATtiny44 (84)

  © Christophe BOBILLE 04/24 pour locoduino (www.locoduino.org)
  v 0.4

  Datasheet :
  https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7701_Automotive-Microcontrollers-ATtiny24-44-84_Datasheet.pdf

  Getting Started with ADC on ATTiny
  https://ww1.microchip.com/downloads/en/Appnotes/TB3209-Getting-Started-with-ADC-90003209A.pdf

  PA0 - PA1 / RX - TX

*/

#include <avr/io.h>


// Variables
uint32_t tempoCC = 5000UL;                             // Tempo réarmement suite à court-circuit
const uint16_t tabSeuilOcc[] = { 30, 40, 50, 60 };     // Seuil pour l'occupation
const uint16_t tabSeuilCc[] = { 250, 350, 450, 550 };  // Seuil pour le court-circuit
uint16_t seuilOcc;
uint16_t seuilCc;

// Etats
byte etatSwitchOcc;  // Etat des bits pour switch occupation
byte etatSwitchCc;   // Etat des bits pour switch court-circuit


uint16_t get_ADC_sample(void) {
  ADCSRA |= (1 << ADSC);  // start ADC measurement
  while (ADCSRA & (1 << ADSC))
    ;
  // return the ADC value
  return (ADCL | (ADCH << 8));
}



void setup() {

  DDRA |= (1 << PA2);   // Signal occupation
  DDRA &= ~(1 << PA4);  // Switch 0
  DDRA &= ~(1 << PA5);  // Switch 1
  DDRA &= ~(1 << PA6);  // Switch 2
  DDRA &= ~(1 << PA7);  // Switch 3
  DDRB |= (1 << PB1);   // Signal cc
  DDRB |= (1 << PB2);   // Relais

  etatSwitchOcc = (PINA & 0x30) >> 4;
  etatSwitchCc = (PINA & 0xC0) >> 6;

  seuilOcc = tabSeuilOcc[etatSwitchOcc];
  seuilCc = tabSeuilCc[etatSwitchCc];


  ADMUX =
    (0 << ADLAR) |  // do not left shift result (for 10-bit values)
    (0 << REFS1) |  // Sets ref. voltage to internal 1.1V
    (0 << REFS0) |  // Sets ref. voltage to internal 1.1V
    (0 << MUX3) |   // use ADC3 for input (PB4), MUX bit 3
    (0 << MUX2) |   // use ADC3 for input (PB4), MUX bit 2
    (1 << MUX1) |   // use ADC3 for input (PB4), MUX bit 1
    (1 << MUX0);    // use ADC3 for input (PB4), MUX bit 0

  ADCSRA =
    (1 << ADEN) |   // Enable ADC
    (1 << ADPS2) |  // set prescaler to 64, bit 1
    (1 << ADPS1) |  // set prescaler to 64, bit 1
    (1 << ADPS0);   // set prescaler to 64, bit 0


  PORTB |= (1 << PB2);   // Relais
  PORTA &= ~(1 << PA2);  // Signal occupation
  PORTB &= ~(1 << PB1);  // Signal cc
}


void loop() {

  uint16_t sample = 0;
  for (byte i = 0; i < 4; i++)  // 4 lectures pour lisser le résultat
    sample += get_ADC_sample();
  sample = sample >> 2;


  if (sample < seuilOcc) {
    PORTA &= ~(1 << PA2);  // Signal occupation
  }

  if (sample >= seuilOcc) {
    PORTA |= (1 << PA2);  // Signal occupation
  }

  if (sample >= seuilCc) {
    PORTB &= ~(1 << PB2);  // Relais
    PORTB |= (1 << PB1);   // Signal cc
    delay(tempoCC);
    PORTB |= (1 << PB2);   // Relais
    PORTB &= ~(1 << PB1);  // Signal cc
  }
  delay(1);
}

42
Aide / Re : Attiny 85
« le: avril 05, 2024, 07:33:42 am »
Donc Mac ou PC, le problème est le même. Avis aux amateurs d'ATTiny, il faut garder une version 1.8x quelque part pour faire le chargement de programmes.

J'ai vu qu'il existait une solution sur PlatteformIO mais je n'ai pas testé : https://docs.platformio.org/en/stable/boards/atmelavr/attiny44.html#hardware

43
Aide / Re : Attiny 85
« le: avril 04, 2024, 10:28:34 am »
@pn200

Peux tu préciser sur quel OS tu es et version OS ?

Christophe

44
Aide / Re : Attiny 85
« le: avril 02, 2024, 10:15:54 pm »
C'est un problème que j'ai signalé sur le site éditorial des articles de Christian sur les ATTiny.

J'ai exactement le problème que j'ai avec les versions 2.xx de l'IDE Arduino mais pas sur les versions 1.8x. Du coup, je n'ai pas cherché plus loin et j'utilise la version 1.8x.

Je suis sur Mac (M2) Ventura 13.0 mais ma version 1.8x de l'IDE tourne sur un 10.14.6 Mojave (Intel). Et toi ???

45
Le lissage on est obligé de l'avoir vu que le coil sort un courant alternatif à la fréquence du DCC, donc il faut le redresser et le filtrer.
Et il n'y a pas 50 façons de le faire : il faut le faire avec un condensateur avant d'envoyer le signal à une entrée analogique ou
un comparateur.

Je parlais bien du montage de Cédric qui a été largement commenté précédemment. Je parlais du lissage logiciel qui n'est pas nécessaire !

Je pensais de Christophe ne pourrait pas faire à la fois la détection de présence et la détection de court-circuit avec
un seul coil mais il semble avoir trouvé les bonnes valeurs.

Les valeurs de seuils se calculent de façon empirique et sans avoir besoin d'une grande précision. Le switch permet ensuite comme je l'ai erxpliqué d'affiner les seuils avec quatre positions pour la détection de présence et quatre pour les court-circuits. Ces valeurs peuvent par ailleurs être changées dans le programme ou les pas entre les seuils.

Pages: 1 2 [3] 4 5 ... 60