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
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 :