version 0.0
27 sept 2016
rev .....

TEST UART SOFTWARE avec Interrupt RB0 18F46K22 (MikroC)


Usage d'un Pic 18F46K22 avec MikroC Pro V6.3
Le but est de tester la reception UART software MikroC et UART Software avec mode interruption

HARDWARE Proto:

Le 18F46K22 possedant déja 2 UART Hardware UART1 et UART2 ,
Le montage Prototype est alimenté en 5V DC via le Pickit2 et la liaison ICSP
Une Led rouge est raccordée sur la Sortie RA4
Le PIC utilise son Oscillateur interne FOSC=8MHz (sortie sur OSC2 pour veruif au scope)
L'UART1 Hardware est RC6 TX1 et RC7 RX1
L'UART MikroC Software est défini sur RA1 TX et RA0 RX
L'UARTS Software Interrupt est défini sur RB2 TX et RB0 RX
Le LCD standart 1 ligne de 16 cars est utilisé en mode 4 bits parrallele
Liaison Hardware avec cordon TTL/USB Prolifix PL2303 ver terminal virtuel Vbray sur COM23 9600,8,N,1

t_18F46K22_RB0_UART_Proto_160927.gif



Version avec biblio. MikroC Software UART

mais la reception est en mode Pooling, donc bloquante !
sauf si on utilise Timer0 comme TimeOut pour sortir de la boucle d'attente de caractere .
via Soft_UART_Break();
On peut utiliser n'importe quelle E/S disponible. (ex: RA0 et RA1.).

// ==== IT Timer0 =============
if((TMR0IE_bit==1) && (TMR0IF_bit==1))
{
Cpt0++;
if (Cpt0>5)
{
Flag_Timer0=1;
TMR0IE_bit=0; // interdit interrupt
Cpt0=0;
Soft_UART_Break();
TMR0ON_bit=0; // stop timer
// 26472 1 sec at 10MHz avec diviseur 64
}
TMR0H= 67;
TMR0L =68 ;
TMR0IF_bit=0; // Raz Flag
}


#define Version "160513"
// test Soft UART RA0 =TX RA1=RX .. OK à 9600 bds (Q=10Mhz)
SourceMikroC : 18F46k22_UART1_SOFT_UART_LCD1x16_mode4bits_2016.c



Version (Sans la biblio MikroC ) et avec interruption

Pour des besoins de debugging,il peut s'averer avoir besoin d'un 3em UART pour
afficher des resultats , ou recevoir une commande via clavier terminal
(liaison au PIC , via cordon USB/TTL PL2303 ou via Bluetooth mode SSP, ou vrai R232 avec MAX232)

Il est relativement facile d'envoyer des caractères , en définissant la durée d'un bit élémentaire.
En regle générale on part sur un moment de 10 bits classique :
1 start, 8 datas, 1 stop, pas de parité
à 9600 bauds, un bit dure donc : 1 000 000 / 9 600 => 104 µS

La version proposé , utilise RB2 en emission TX et RB0 en reception RX
Nota: On peut prendre n'importe quel autre bit , en sortie, pour la transmission
mais le choix RB0 s'impose ici , sur la reception, pour benefitier d'un mode Interruption
preferable à un mode " pooling" bloquant le programme.
nota: J'ai rajouté des R de rappel de 4,7K au +VCC sur RB0 RX et RB2 TX. pour bien fixer les potentiels.

La Partie Emission :
L'envoi d'un caractere 100% en C ou 90% en ASM (inclus dans le C)
le choix étant fait au moment d ela compilation avec la directive
#define Version_ASM

à noter:
les branchement relatif avec la directive d'assemblage pour l'adresse en cours "$" , ne passe pas en mikroC
il faut utiliser une etiquette de branchement.
La Rotation à droite RRF pour PIC16F devient RRCF pour le PIC18F

Au repos RB2 est à 1!
On place le bit de Start =0 pendant 104µS
puis, on pousse chacun des 8 bits data successifs à droite..bit qui tombe alors dans le Carry
suivant le test de celui ci on met à 1 ou pas le bit de sortie B2 (TX)
et on termine par le placement du bit de STOP à 1

les bytes utilises dans les parties en ASM
sont definie dans la Bank0 à des adresses fixes, permettant de les utiliser plus facilement
donc directement avec leur adresses connues.
sinon,il faudrait passer par des pointeurs...etc..gestion de bank..


La partie RECEPTION
est plus ardue , car le front descendant RB0 signale l'arrivé d'un caractere
mais avant qu'il soit pris en compte, il faut rajouter les durées de traitement
(Les 2 versions 100%en C ou 90% en ASM à choisir via la directive #define Version_ASM )

Voir le schema explicatif.. ci-joint , traitant la reception d'un caractere 'A'
T0 globalise les durees de :
- sauvegarde du contexte
- Entre dans le traitement
- quelques inits..
A cett duree de Start 104µS + s'ajoute la duree T0 pour le bit suivant
on sera ainsi déja situé temporellement sur l'etat du bit DATA suivant ( et non pas sur un front)
de sorte à tester l'etat de RB0 pour savoir si ce bit data est à 1 ou 0
On compte ainsi les 8 bits de data et on se sert d'un bit special CARRY situé dans le registre MCU STATUS
pour le pousser avec l'etat correspondant à la lecture de RB0, dans le registre Ram get_RsByte
via une rotation à doite via Carry bit.
ainsi de suite apres application d'un delay de 104µS.. on echantillone les bits de data toujours au meme endoit.
Au bout de 8 rotations , on a bien les 8 bits datas recu
et on laisse passer le bit de Stop .. avec une tempo plus courte,car il reste du traitement (quelques µS) à faire
Si on laisse le bit stop à 104µS, on risque de rater le front descendant du caractere suivant accolé
voir T1 et TX sur schema explicatif..
Le timming est rick rack ! entre la fin d'un car et le debut du suivant,
si les caracteres sont contigus, on ne dispose que de 104µS ,pour stocker le caractere ,puis sortir de l'interrupt, et y revenir.

Un index Idx permet le rangement de chaque byte reçu dans le buffer_SU
ce traitement reste en C ..
Ici le caractere CR=13=0x0D sert de delimiteur de reception de string ou alors la limite de taille du buffer_SU
Quand il est rencontré on arme le drapeau RB0_Flag pour signaler la reception complete du string envoyé par le terminal,
permettant de le recuperer dans le corps du programme principal ..
Test d'envoi d'un seul tenant ( tous les caracteres sont collés!) => OK

Cette solution presente l'avantage de ne pas etre BLOQUANTE pour recevoir un message...
MAIS CE N'EST PAS EQUIVALENT A LA SOLUTION UART HARDWARE !
le buffer hardware permettant 104µS*10=1040µS minimum entre 2 cars.
10 fois plus de temps dispo.

Des l'arrivé d'un caract par le front descendant, on est bloqué sur les 10 moments du caractere , soit 10x104)1,04mS
Si les caracteres sont contigus..on est Bloqué sur la reception pendant la duree du message
Si 80 car => 80x10x104µS => 83,2mS mimum
Mais le reste du temps , on peut vaquer à autre chose.

SOFTWARE :
Fichier source (MikroC ): 18F46k22_UART1_HARDW_SOFT_UART_RB2_RB0_interrupt_LCD1x16_4bits_160927.c
Programe chargeur :18F46K22_UART1_SoftUART_RB2_RB0_LCD1x16_4bits.hex
Projet MikroC : 18F45K22_RFP_Big_LCD_MC.zip

résultat :





paulfjujo@free.fr


../common/GIF/LTC1286p.jpg



Retour à l'index general