//arlotto 2007 : routine liaison série 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 ou WriteUSART ou putsUART // La réception d'une chaîne se terminant par CR (0x0D) est ici faite sans IT // La condition de fonctionnement est que la boucle for tourne plus vite // que l'arrivée des caractères sur le port série (sinon utiliser les IT) // 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 un X // configurer le terminal 9600 N 8 1 par de contrôle de flux transmission de CR en fin de ligne // Compiler le programme avec l'option Memory Model "Large code model". #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 #pragma config PBADEN = OFF // Si PBADEN = ON RB4:RB0 sont analogiques au reset ! #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 void main(void){ int x=0; char c,r=0 ; char msg[MAX_MSG+1]; 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 sans it OpenUSART( USART_TX_INT_OFF & USART_RX_INT_OFF & USART_ASYNCH_MODE & USART_EIGHT_BIT & USART_CONT_RX & USART_BRGH_HIGH, 25 ); printf("Demo USART PIC18\r\n"); printf("Commandes : ON / OFF / CLI

(1000<=p<=20000)\r\n>"); for( ;; ) { if(DataRdyUSART()) // 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=1000 && tmp_cli<=20000) {cli=tmp_cli;} else { printf("CLI : Valeur %d interdite",tmp_cli);} } else { msg[3]=c; // restitue la chaîne printf("Unknown command :%s \x7",msg); } } } printf("\r\n>"); r=0; } // clignotement x++; if (x>=cli){ RedLed = !RedLed ; x=0; } } }