Go Down

Topic: interruption par caractère spécial sur port série! (Read 1 time) previous topic - next topic

startx

Mar 10, 2010, 10:37 pm Last Edit: Mar 10, 2010, 10:38 pm by startx Reason: 1
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 ;) !  

Brownfox

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.

BiBO

#2
Mar 11, 2010, 11:02 am Last Edit: Mar 11, 2010, 11:09 am by issound Reason: 1
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 >> 8); // 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...

Jean-François

#3
Mar 11, 2010, 04:39 pm Last Edit: Mar 11, 2010, 04:40 pm by jfs Reason: 1
Essaye de mettre un delay() dans ton setup avant l'appel de ta fonction d'affichage.
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

startx

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

fl0w

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

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

startx

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


Go Up