Bienvenue aux nouveaux arrivants sur FantasPic !

- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.

--- L’équipe FantasPic ---
Forum général sur le langage C !

Modérateur : Jérémy

Reception UART par interrupton sur 12F683
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2589
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#1 Message par paulfjujo » lun. 18 déc. 2017 15:53

bonjour,

MikroC peut gerer les MCU, avec un niveau tres proche de l'ASM, via les registres MCU,
ou par l'ajout de fonction directe en ASM dans le code C.
J'avais besoin d'envoyer des donnes via blueTooh sur ce petit PIC 12F683 .

12f683_uart_hc06_schema.jpg


Comme il n'y a pas d'UART Hardware sur ce PIC12F683
je propose une solution (parmi tant d'autres!), pour gerer un UART Software à 9600 bauds
en émission , mais surtout en réception sur Interruption..
Pin GP0 est affecté en Reception , GP1 en Emission

Il n'y a pas de bit specific (RCIF) Interrupt RX dans ce PIC ,
c'est donc l'interrupt GPIO qui servira de point d'entrée dans l'interruption Soft UART reception.

12F683_Interrupts_schem.jpg


La principale difficulté est de bien caler le bit de START
J'ai utilisé mon analyser SQ50 pour celà, qui apporte une aide non negligeable.
En mettant un bit de synchro pour visualiser le front de lecture de chaque bit.
Bit de synchro Enlévé par la suite.
Le point de depart etant 9600 bds => 1 bit dure 104,1µS
la FOSC interne 8MHz du MCU est utilisée.
=> MCU à 8MHZ => 1 cycle en 4/8= 0,5µS

Fabrication d'une tempo en ASM : Bit_Delay de 102µS + appel et retour => ~104µS
La duree de cette tempo est aisement mesurable , en se mettant en mode debugger , pas à pas,
et utilisant la fenetre WATCH CLOCK, pour mesurer le nombre de cycle et duree en µS.

Des l'apparition du front descendant arrivant sur RX UART => Interruption GPIO
Introduction d'une duree de 1/2 Bit (52µS) pour etre sur de tester
tous les autres bits suivant , sur l'etat stable du bit .

rapel : la trame UART (format 8,N,1) comporte 10 moments
demarre avec un bit de start =0
puis les 8 bits de donnees avec LSB en tete ,
(sans Parité) et se termine avec un bit de STOP à 1

Le bit de stop est tronqué, car il faut tenir compte du temps que met l'interruption
pour remettre le contexte original des registres MCU ,
sinon on ne pourrait pas suivre une reception contigue de bytes (sans delai intercaractere).

la variable des tempo "Rs_tmp" est declaré absolue , pour etre sur de la trouver
sans interference avec le travail du compilateur .

Ce PIC a peu de RAM et ROM
et ici le buffer de reception nommé TEXTE n'a que 32 bytes de profondeur
en prevision de l'usage de ADC posterieurement
(avec partie analogique ADC et affichage mesure ADC MCU plein à 99%)

Un HC06 BlueTooth connecté sur l'UART , au lieu d'un PC via un cordon Prolic,
permet l'usage d'un terminal BlueTooth .
ex: BlueTerm sur Android
La transmission pouvant etre simultanée , sur PC et Via BlueTooth
Pour la reception, on dot choisir , Of course..

Dans le main programme, qui oomporte un delay de boucle de 1 sec
(1 seconde à rien faire ou pour faire autre chose! )
on test l'etat du flag .. si il est armé, c'est qu'on a recu une chaine de caratere
terminée par <CR> ou que le buffer est plein (31 caracteres)
Ici , on affiche simplement ce que l'on à reçu (du clavier ou de l'Android)
et on se remet en condition d'interruption, avec Index sur le debut du buffer de reception.

l'interruption RX

Code : Tout sélectionner


void Bit_Delay
(void);
void Demi_Bit_Delay(void);
void Quart_Bit_Delay(void);

void Interrupt() iv 0x0004 ics ICS_AUTO 
{   int n;
   if ((GPIE_bit)&&(GPIF_bit))
   {  
     Recu
=0;
     Demi_Bit_Delay();
     Led_Verte=ON;
     Bit_Delay();   //passe le start
     // SQ50_Synchro =1;
     if(GPIO.F0==1) Recu.B0=1;
     // SQ50_Synchro =0;
     Bit_Delay();
     if(GPIO.F0==1) Recu.B1=1;
      Bit_Delay();
     if(GPIO.F0==1) Recu.B2=1;
      Bit_Delay();
     if(GPIO.F0==1) Recu.B3=1;
      Bit_Delay();
     if(GPIO.F0==1) Recu.B4=1;
      Bit_Delay();
     if(GPIO.F0==1) Recu.B5=1;
      Bit_Delay();
     if(GPIO.F0==1) Recu.B6=1;
      Bit_Delay();
     // SQ50_Synchro =1;
     if(GPIO.F0==1) Recu.B7=1;
    // SQ50_Synchro=0;
      Bit_Delay();
      Quart_Bit_Delay();

    if((Recu==13) || (Index>30))
    {
      Flag_Reception=1;
      TEXTE[Index]=0;
      GPIE_bit=0;
      }
      else
      
{
      TEXTE[Index]=Recu;
      Index++;
     // option  au lieu du test Index>30
     // Index=Index & 0x001F;   // 31 cars maxi
      }
     Led_Verte=OFF;
     GPIF_bit=0;
    }
}
 

L'Application cmplete MikroC zippée
_12F683_UART_TX_IT_RX_171218.zip


Resultat dialogue sur terminal PC

Test UART TX et IT RX, 12F1863
Version : 171215
Attente envoi du HC06
Recu = bonjour
Recu = hello
Recu = 255
Recu = 1024


resultat sur terminal bluetooth :
Blue_Term_7_running.jpg



lien sur : Usage de BlueTerm Android application
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Aide toi, le ciel ou FantasPic t'aidera

Retourner vers « Langage C »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 41 invités