Pages: [1]   Go Down
Author Topic: Laison série, bit de parité et... comment?  (Read 1417 times)
0 Members and 1 Guest are viewing this topic.
+33 76500
Offline Offline
Jr. Member
**
Karma: 0
Posts: 75
Arduinaute du dimanche
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour à tous

Avant toutes chose je suis débutant sur arduino.

Bon j'ai trouvé comment faire pour avoir plusieur port série sur un duemilanove je rebalance l'info au passage.

Code:

/*
  Mega multple serial test
 
 Receives from the main serial port, sends to the others.
 Receives from serial port 1, sends to the main serial (Serial 0).
 
 This example works only on the Arduino Mega
 
 The circuit:
 * Any serial device attached to Serial port 1
 * Serial monitor open on Serial port 0:
 
 created 30 Dec. 2008
 by Tom Igoe
 
 */
#include <NewSoftSerial.h>
NewSoftSerial Serial1(2,3);

void setup() {
  // initialize both serial ports:
  Serial.begin(1200);
  Serial1.begin(1200);
}

void loop() {
  // read from port 1, send to port 0:
//  for(int n=0; n<1000; n++)
  {
    if (Serial1.available())
    {
      int inByte = Serial1.read();
      Serial.print(inByte, BYTE);
    }
   //xcccccccccc delay(100);
  }
//  for(int n=0; n<1000; n++)
  {
    if (Serial.available())
    {
      int inByte1 = Serial.read();
      Serial1.print(inByte1, BYTE);
    }
    delay(1);
  }  
}

à vous de trouver la lib NewSoftSerial.h, elle est sur le site arduino.

et voilà ce qui m'améne.

je suis au borne de ma sortie téléinformation, j'utilise un démodulateur maison qui tourne au poils.

je branche un hyperterminal (pas celui de l'arduino je précise).

Je le configure pour:

- vitesse de transmission 1200 bits/s
-> 7 bits pour représenter un caractère ASCII
-> 1 bit de parité, parité paire (even)
->pas de control de flux

et j'obtient ceci

Code:
MOTDETAT 000000 B

ADCO 020322083167 9
OPTARIF BBR( S
ISOUSC 45 ?
BBRHCJB 051635727 A
BBRHPJB 060949072 O
BBRHCJW 000056111 @
BBRHPJW 000155661 W
BBRHCJR 000161940 B
BBRHPJR 000301065 I
PTEC HCJW X
DEMAIN BLEU V
IINST 028 !
IMAX 038 J
PAPP 06310 +
HHPHC Y D

c'est tout bon c'est ce que je cherche

je connecte l'arduino avec pour commencer le programme new soft sérial de maniére à voir si la com se distribue bien et là c'est le drame.

j'ai bien une com, mais ça ressemble pas du tout à tableau juste en dessus.

Comme je n'ai rien rentré dans l'arduino pour les histoires de nombres de bit, bit de parité etc.. je ne cherche pas loin à savoir où est mon probléme.

J'aimerai donc savoir comment on peu créer ce paramétrage dans l'arduino.

Merci d'avance.
Logged

Je ne conçois que trés peu, je recycle beaucoup les codes que je trouve.

0
Offline Offline
Newbie
*
Karma: 0
Posts: 45
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

http://arduiniana.org/2009/05/new-newsoftserial-coming/

Le premier commentaire propose une modification du source.
Essaie voir si ça te donne un résultat, car tu as juste le nombre de bits data qui change par rapport a une liaison type arduino  :-/.
Logged

+33 76500
Offline Offline
Jr. Member
**
Karma: 0
Posts: 75
Arduinaute du dimanche
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

merci du coup de main mais c'était pas ça

voici ce que je cherchai, merci à mon frangin

voici le code, attention la console arduino tombera en panne aprés l'uploading

par contre pas de soucis pour faire une reprogramation, le pic gére.


Code:

void setup() {
  // initialize both serial ports:
  Serial.begin(9600);
  SetParity('e');
  SetStopBits(1);
  SetWordLength(7);
}

void loop() {
  // read from port 1, send to port 0:
  if (Serial.available()) {
    int inByte = Serial.read();
    Serial.print(inByte, BYTE);
  }
}

void SetStopBits(int nbStopBits)
{
 //set stop bits
if (nbStopBits == 1)
  {
    UCSR0C = UCSR0C | B00000100;
  }
else // (stop == 2)
  {
    UCSR0C = UCSR0C | B00000000;
  }
}

void SetParity(int parity)
{
  if ((parity == 'O')|(parity == 'o'))
  {
    UCSR0C = UCSR0C | B00110000;
  }
  else if ((parity == 'E')|(parity == 'e'))
  {
    UCSR0C = UCSR0C | B00100000;
  }
  else // ((parity == 'N')|(parity == 'n')))
  {
    UCSR0C = UCSR0C | B00000000;
  }
}


void SetWordLength(int wordlength)
{
  //set word length
if (wordlength == 5)
  {
    UCSR0C = UCSR0C | B00000000;
  }
else if (wordlength == 6)
  {
    UCSR0C = UCSR0C | B00000010;
   }
else if (wordlength == 7)
  {
    UCSR0C = UCSR0C | B00000100;
  }
else if (wordlength == 9)
  {
    UCSR0C = UCSR0C | B00000110;
    UCSR0B = UCSR0B | B00000100;
  }
else // (wordlength == 8)
  {
    UCSR0C = UCSR0C | B00000110;
  }
}

Logged

Je ne conçois que trés peu, je recycle beaucoup les codes que je trouve.

Sophia-Antipolis (06)
Offline Offline
God Member
*****
Karma: 4
Posts: 618
Rejoignez le club !
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

le pic ? quel pic ? smiley
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 16
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Salut FP24V,
Comme toi, je me lance dans la laison teleinfo/arduino.
Je pense avoir compris ton code afin de paramétrer 7, E, 1.
Mais j'ai un doute :
pourquoi :   void SetStopBits(int nbStopBits) avec nbStopBits et pas
simplement void SetStopBits(int StopBits) ?
Merci
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 45
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

C'est juste une variable propre a ta fonction "void SetStopBits()".
Que tu la nomme nbStopBits ou StopBits , du moment que tu fais la correspondance des variables au sein de la fonction, ca ne posera pas de problème.
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 16
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Merci,
Je tester ce reparamétrage du port com ...
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 16
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour à tous,
Concernant la lecture des trames téléinfo sur Arduino, voici le résultat de mes expérimentations :
- reparamétrage du port com en 1200,7,E,1 (voir chapitre 19.10.4 du datasheet de l'ATmega328) c'est assez facile a comprendre.
- renvoi de la trame sur un second port com en 1200,8,N,1 lisible via hyperterminal
Attention: aprés le reparamétrage, sérialmonitor est inutile car n'étant pas paramétrable hors-mis la vitesse, ce qu'il renvoi est illisible.
Attention: pour uploader aprés le reparamétrage il faut couper la liaison entrante Rx.
Si quelqu'un est interessé par le schéma de cablage, il suffit de le demander ...
Bon, maintenant que j'ai établi le contact, je m'attaque au stockage de données sur carte SD...
Si cela vous inspire ...
A+

code:
// Arduino lit la trame teleinfo 1200,7,E,1 sur pin 0 (Rx)
// et renvoi sur pin 3 1200,8,N,1


#include <NewSoftSerial.h>
NewSoftSerial mySerial(2, 3);
int a=0;
void setup()
{
  // initialisation du port 0-1
        Serial.begin(1200);
          // parité paire E
          // 7 bits data
        UCSR0C = B00100100;
          // dans ce cas serial monitor ne fonctionne pas normalement!
          // il faut etablir une liaison avec hyperterminal
          // a partir de la broche 3...
          // attention l'uploading necessite de déconnecter la pin0 Rx
  // initilisation du port 2-3
        mySerial.begin(1200);
}
void loop()                     // run over and over again
{
  if (Serial.available())
    a = Serial.read();
    mySerial.print(a, BYTE);
}

Logged

Pages: [1]   Go Up
Jump to: