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

Documents pareils