//arlotto 2006 : routine liaison série avec it en rx pour pic 18F // Ce fichier montre l'émission et la réception de chaîne de caractères. // L'émission sur fait simplement par printf WriteUSART ou putsUART // La réception d'une chaîne se terminant par CR (0x0D) est ici faite dans // une routine d'IT // ici les it sont utilisées dans le mode compatible mid range (pic16) // pas de priorité (RCONbits.IPEN = 0 ) // L'autorisation se fait par les bits GIE et PEIE de INTCON. // Attention à la gestion particulière des chaînes constantes par PIC18 // (cf C18 user guide DS51288e chap 2.7.3 // le message "ON" allumme RB1 le message OFF l'éteind // le message "CLI nnnn" fait clignoter RB2 un tour de boucle sur nnnn fois // 1000<=nnnn<=20000 // l'appui sur RB0 affiche nnnn // configurer le terminal 9600 N 8 1 pas de contrôle de flux transmission de CR en fin de ligne #include #include // pour fonctions UART #include // pour strmcp #include // pour printf #include // pour atoi // configuration PICDEM2+ quartz #pragma config OSC = HS #pragma config WDT = OFF #pragma config LVP = OFF #define Button PORTBbits.RB0 #define GreenLed PORTBbits.RB1 #define RedLed PORTBbits.RB2 #define MAX_MSG 20 #define CAR_CR 0x0D #define CAR_LF 0x0A #define CAR_BS 0x08 #define CLI_DEF 8000 //prototype du gestionnaire d'interruption void InterruptHandlerHigh (void); char r ; // indique qu'une chaîne complète à été reçue char msg[MAX_MSG+1]; void main(void){ int x=0; char c; int cli = CLI_DEF ; int tmp_cli ; char i=0; char state=0; GreenLed= 0 ; RedLed = 0 ; TRISBbits.TRISB1=0; TRISBbits.TRISB2=0; // init 9600Bd à 4Mhz avec it en rx OpenUSART( USART_TX_INT_OFF & USART_RX_INT_ON & USART_ASYNCH_MODE & USART_EIGHT_BIT & USART_CONT_RX & USART_BRGH_HIGH, 25 ); INTCONbits.PEIE = 1 ; // autorisation des it périphériques INTCONbits.GIE = 1 ; // autorisation globale des it for( ;; ) { //émission sur bouton : switch (state) { case 0 : if(!Button) { state=1;} break ; case 1 : WriteUSART('C'); // juste pour montrer la fonction printf((rom char *)(rom char *)"LI : %d\r\n",cli); state=2 ; break ; case 2 : if(Button) { state=0;} break ; } /* Interprèteur de commande vite fait (mal fait)*/ // éxécution de la commmande si chaîne compléte reçue // le cast en (rom char*) supprime les warnings // attention à bien utiliser la bonne version de strcmp // en fonction de la nature (ram ou rom) des paramètres if(r){ if(strcmppgm2ram(msg,(rom char*)"ON")==0 ) { GreenLed = 1 ; } else { if(strcmppgm2ram(msg,(rom char *)"OFF")==0 ) { GreenLed = 0 ; } else { c=msg[3]; msg[3]='\0'; // place fin de chaîne après CLI if(strcmppgm2ram(msg,(rom char *)"CLI")==0 ) { tmp_cli = atoi(msg+4); if(tmp_cli >=1000 && tmp_cli<=20000) {cli=tmp_cli;} else { printf((rom char *)"CLI : Valeur %d interdite\r\n",tmp_cli);} } else { msg[3]=c; // restitue la chaîne printf((rom char*)"Unknown command :%s \r\n\x7",msg); } } } r=0; } // clignotement x++; if (x>=cli){ RedLed = !RedLed ; x=0; } } } //Placement d'un saut vers le gestionnaire d'interruption //---------------------------------------------------------------------------- // High priority interrupt vector #pragma code InterruptVectorHigh = 0x08 void InterruptVectorHigh (void) { _asm goto InterruptHandlerHigh //jump to interrupt routine _endasm } // Routine gestionnaire d'interruption //---------------------------------------------------------------------------- // High priority interrupt routine #pragma code #pragma interrupt InterruptHandlerHigh void InterruptHandlerHigh () { static char i ; // doit être statique pour conserver sa valeur entre les IT char c ; // Partie réception d'un caractère if(PIR1bits.RCIF) // si un car arrivé { c=ReadUSART(); // le lire WriteUSART(c); // echo if( c==CAR_BS) { if(i>0){ i--; } } else { if(c!=CAR_CR && i