Communication série via un Pickit2
Transcription
Communication série via un Pickit2
http://www.didel.com/ [email protected] C pour microcontrôleurs www.didel.com/kidules/KiUART.pdf Communication série via un Pickit2 L’idéal serait de communiquer avec le clavier-écran du PC via USB. Mais ce qui existe partiellement (CDC) est lourd, incomplet et ne semble pas bien fonctionner. La solution via le port série et le Pickit2 est facile. Si vous avez un vieux PC avec un port série, un adaptateur avec un Max232 était bien connu il y a 10 ans, et doit se trouver. Il y a encore des adaptateurs RS232/USB qui ont besoin d’un Max232 en plus. Donc, le Pickit2 si nécessaire par ailleurs est la meilleure solution. Le Pickit2 se mets en mode UART à 9600 bits/s. Les signaux Tx et Rx sont bien documentés, il suffit de faire le câble. Les photo ci-dessous sont explicites Picstar KiCar Ki2550 Logiciel Pinguino supporte en standard la liaison série, avec l’ordre Serial.print un peu simplifié par rapport au printf du C. Il doit être précédé d’un Serial.begin(9600); D’autres bit-rates ne sont pas garantis. L’utilisation pour déverminer ses programmes est évidente (voir www.didel.com/kidules/Deverminage.pdf Pour mémoire, le C a l’ordres suivant pour afficher des nombres et textes (repris sur le Web): printf ("La variable a contient %d et la variable b contient %d", a, b) ; La fonction printf() admet un nombre quelconque d'arguments. Le premier argument est toujours une chaîne de caractères qui indique comment les arguments suivants doivent être affichés. La séquence de caractères "%d" est un spécificateur qui signifie qu'il faut afficher l'argument correspondant en format décimal. + \n retour à la ligne suivante \r CR \t tab \o caractère nul %% pour imprimer % \\ pour imprimer \ type d décimal signé s16 u décimal non signé u16 x hexa non signé c caractère ‘a’ s affiche une chaine ‘’abc’’ o octal b binaire X en majuscule Exemples //UART.pde dans KiMix.zip void setup () { TRISC = 0b00111111; Serial.begin(9600); Serial.printf ("Test serie\r\n"); } u8 a = -35 ; s8 b = 34234 ; void loop() { Serial.printf ("Pinguino\r\n"); Serial.printf ("Hello \\ world %% \t 1 \t 2 \r\n"); Serial.printf ("%s", "For Kidules et Picstar\r\n"); Serial.printf ("a = %d et b = %d \r\n", a, b) ; Serial.printf ("a = %u et b = %u \r\n", a, b) ; Serial.printf ("a = %x et b = %x \r\n", a, b) ; Serial.printf ("a = %X et b = %X \r\n", a, b) ; Serial.printf ("a = %b et b = %b \r\n", a, b) ; Serial.printf ("Ascii: %c %c \r\n", 'a', 65); Serial.printf ("-----------\r\n"); while (1) ; } Résultat : Test serie Pinguino Hello \ world % 1 2 For Kidules et Picstar a = 221 et b = -70 a = 221 et b = 65466 a = dd et b = ffba a = DD et b = FFBA a = 11011101 et b = 1111111110111010 Ascii: a A Pickit2 passe à la ligne pour à chaque LF Le CR semble agir seulement si la ligne n’a pas la place. Pinguino active les interruptions pour gérer ces transferts et le driver prend 25% de la mémoire. Pinguino documente aussi les ordres suivants pour lire : Serial.read - read a character received on the RX pin (RC7, arduino pin18) Exemple : Serial.read(TODO); Serial.available - Check the serial receive buffer to know if at least one byte is available. Exemple : if (Serial.available()) { if (Serial.read()=='L') PORTB = 0x55 ; if (Serial.read()=='C') PORTB = 0xCC ; } } // if L is received display 55 // if C is received reset output 0 Serial.flush - clear the serial receive buffer. Exemple : Serial.flush(); Exemple assez complet : http://wiki.pinguino.cc/index.php/Serial_Write_Example Exemple avec Kicar (le Kidule2550 utilise RC7 pour le HP, il faut dessouder la résistance du HP et tirer un fil). Pour le Picstar, il suffit de changer l’adresse de la LED bleu, pour utiliser par exemple la Led rouge sur RB7. //SerialInTest.pde void setup () { TRISC = 0b10111111 ; Serial.begin(9600) ; Serial.printf (« Test serie input\r\n ») ; Serial.printf (« Type A to switch led on, B to switch led off\r\n ») ; TRISAbits.TRISA4=0 ; // LED bleue on Kidule as ouput PORTAbits.RA4=0 ; } void loop() { char inp ; if (Serial.available()) { inp=Serial.read() ; if ((inp==’A’) ||(inp==’a’) ) PORTAbits.RA4=0 ; if ((inp==’B’) ||(inp==’b’) ) PORTAbits.RA4=1 ; } } Interface direct. L’UART interne du 18F2550 se gère aussi facilement que le convertisseur analogique ou le timer. On configure quelques registre et on écrit dans le registre TXREG et lit les caractères arrivés dans RCREG. Les attentes sur la transmission des caractères sont blocantes, puisqu’il n’y a pas d’interruption. La transmission d’un caractère à 9600 b/s prend 1 ms environ. Le programme de test le plus simple fait l’echo d’une touche tapée au clavier dans l’écran, via le Pickits. Le programme complet pour Kidule est : //UART2doc.pde 2550 48 MHz Pickit2 echo #define TxFlag PIR1bits.TXIF #define RcFlag PIR1bits.RCIF void setup () { TRISC = 0b10111111; SPBRG = 77 ; // 9600 bits/s TXSTA = 0x20 ; // config pour envoyer RCSTA = 0x90 ; // config pour recevoir } u8 car ; void loop () { //echo while (RcFlag == 0) ; car = RCREG ; while (TxFlag==0) ; TXREG = car ; } jdn110712/110811