Pages: [1]   Go Down
Author Topic: interruption par caractère spécial sur port série!  (Read 1113 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Full Member
***
Karma: 0
Posts: 144
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hello,

J'ai une arduino autonome connectée à des capteurs et des relais. Un serveur récupère les données quand il est allumé par Xbee. Mais j'aimerais envoyé une chaine de caractère spécial par le Xbee pour changer des variables (seuil de déclenchement ou autre). J'ai regardé du côté des interruptions, je trouve bien les physiques ou mstimer2 mais existe-t-il un équivalent ou une méthode pour générer une interruption quand une chaine spécifique arrive ? Car un simple Serial.available en debut de programme oblige un cycle complet du sketch avant d'être détecter ?

Merci pour vos éclaircissements smiley-wink !  
« Last Edit: March 10, 2010, 04:38:45 pm by startx » Logged

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

Bonsoir,

 Tu peux peut-être utiliser  l'interruption USART Rx complete ( cf datasheet du 328 ) USART_RX_vect.
Cette interruption est déclenchée  par l'arrivée d'un caractère valide, alors pour le caractère spécial c'est à toi de tester dans la routine ISR.
En espérant que cela te soit utile.
Logged

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

hello,
j'ais le meme problème, je travail avec une Arduino Mega (Atmega1280); j'ais configuré l'USART comme suit:

void USART1_Config(){
  sbi(UCSR1A, TXC1);    // set transfer complete flag (TXC1 = 1).
  cbi(UCSR1A, FE1);     //clear Frame Error flag (FE1 = 0).  
  cbi(UCSR1A, DOR1);    //clear Data overrun flag (DOR1 = 0).
  cbi(UCSR1A, UPE1);    //clear Parity overrun flag (UPE1 = 0).
  cbi(UCSR1A, U2X1);    //disable doubling of USART transmission  speed (U2X1 = 0).
  cbi(UCSR1A, MPCM1);   //Disable Multi-Processor Communication Mode-- whatever that is. (MCPM1 = 0)

  cbi(UCSR1C, UMSEL10); //USART Mode select -- UMSEL10 = 0 and UMSEL11 = 0 for asynchronous mode.
  cbi(UCSR1C, UMSEL11); //disable parity mode -- UPM10 = 0 and UPM11 = 0.
  cbi(UCSR1C, UPM10);
  cbi(UCSR1C, UPM11);
  sbi(UCSR1C, USBS1); //Set USBS = 1 to configure to 2 stop bits per DMX standard.
  sbi(UCSR1C, UCSZ10);//configuring for 8 data bits by setting UCSZ10 and UCSZ11 to 1.  
  sbi(UCSR1C, UCSZ11);
  cbi(UCSR1C, UCPOL1);//Set clock parity to 0 for asynchronous mode (UCPOL1 = 0).

  UBRR1L = baudprescale; // Load lower 8-bits of the baud rate value into the low byte of the UBRR register
  UBRR1H = (baudprescale >> smiley-cool; // Load upper 8-bits of the baud rate value into the high byte of the UBRR register
  sbi(UCSR1B,RXEN1);
  sbi(UCSR1B,TXEN1);
  }

puis j'ais fait l'appel à l'interruption ISR(USART1_RX_vect)

void setup(){
  baudprescale = (((clockspeed / (baud * 16UL))) - 1);
  cli();  //disable interrupts while initializing the USART
  USART1_Config();
  USART2_Config();  
  sei(); // Enable the Global Interrupt Enable flag so that interrupts can be processed
  sbi(UCSR1B,RXCIE1);
}//end setup()

ISR(USART1_RX_vect){
  Serial.print(UDR1);
}

j'ais essayé d'affiché le contenu du registre UDR1 et ça ne marche pas; cependant si je le met dans le void   loop() il affiche normalement

je pense que c'est un problème de syntax de l'appel d'interruption...
« Last Edit: March 11, 2010, 05:09:32 am by issound » Logged

Geneva
Offline Offline
Faraday Member
**
Karma: 30
Posts: 3231
Yoplait... le pt'it suisse
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Essaye de mettre un delay() dans ton setup avant l'appel de ta fonction d'affichage.
« Last Edit: March 11, 2010, 10:40:31 am by jfs » Logged

MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

0
Offline Offline
Full Member
***
Karma: 0
Posts: 144
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Moi aussi j'utilise une Mega,  merci pour ces piste je vais tenter ca ce week-end.
Logged

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

Premier post de n00b en arduino donc je vais peut-être dire une ânerie smiley

Si je ne m'abuse, le port série est déjà sous interrupt. Perso si je devais réagir à chaque caractère, je modifierais cette fonction dans la lib arduino :

SIGNAL(SIG_USART0_RECV)
{
  unsigned char c = UDR0;
  store_char(c, &rx_buffer);
}

dans HardwareSerial.cpp
Logged

0
Offline Offline
Full Member
***
Karma: 0
Posts: 144
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ben je suis pas calé dans ce domaine mais, il me semble que c'est bien ce que doit faire le boot loader lorsqu'on upload un skecth non ?
Quelqu'un peut m'éclaircir ?
Comment l'arduino est interrompu pour l'upload si ce n'est par l'envoie d'une chaine ou d'un caractère.
Et dans ce cas, il doit bien une méthode pas trop compliqué pour faire pareil voir une libraire non ?? Je plane , je suis le seul à avoir un tel besoin  ;D

Logged

Pages: [1]   Go Up
Jump to: