[Programmation] Interruption Bluetooth - MickroC
Répondre à la discussion
Affichage des résultats 1 à 7 sur 7

Interruption Bluetooth - MickroC



  1. #1
    Ersh

    Interruption Bluetooth - MickroC


    ------

    Bonjour,

    J'ai pour projet de fin d'année la réalisation d'un accès sécurisé avec un capteur d'empreinte, une gâche électrique et une application android. Je me charge de la partie bluetooth où je dois réaliser une interruption pour recevoir les données envoyées par le téléphone. Je travaille donc avec un module bluetooth six broches (HC-05) et la carte PIC16F887. Mon problème étant que mon prof' m'a donné un bout de code mais je comprends assez mal certaines de ces lignes malgré les nombreux commentaires. Si une personne pouvait me résumer l'utilisation de ce code, ce serait sympathique.


    Code:
    char int=0;   					//variable de comptage du nb d'interruption
    char Tab[] = "            ";	//tableau recevant les octets reçus par INT
    
    void Interrupt()                //Sous-programme gérant l'INT
    {
    	if (PIR1.RCIF)
    	{
    		INTCON.GIE = 0;			//arrêt de la reception d'INT
    		
    		portb = 0xFF;			//mise à 255 de port B si interruption
    		delay_ms(100);			//temps pour voir la mise à 0b11111111 de port B
    		Tab[int] = Usart_Read();	//lecture de la donnée arrivant par Rx + vidage
    								//sinon RCIF va rester à '1' (donc INT sans cesse)
    		int++;					
    		INTCON.GIE = 1;			//Autorisation de prise en compte d'INT
    	}
    }	
    
    void Init_PIC()
    {
    	RCSTA.SPEN = 1;			//auorise le fonctionnement de l'USART 
    	Usart_init(9600);		//définit la vitesse de USART
    	
    	INTCON.GIE =1;			//autorise les interruptions
    	INTCON.PEIE =1;			//autorise les interruptions venant des périphériques
    	PIE1.RCIE =1;			//autorise les interruptions venant de Rx...
    	
    	trisb=0;
    	Lcd_Init (&PORTD);
    	Lcd_Cmd(Lcd_Clear);
    	Lcd_Out(1,1,"Affiche car BT :");	//ecriture sur ligne 1
    }
    		
    void main()
    {
    	char int2;				//variable de comptage 2
    	Init_PIC();				//appel au SP d'init
    		
    	while(1)
    	{
    		porb=0;
    		Lcd_Out(2,1,Tab);	//ecriture de tout le tableau sur ligne 2
    		delay_ms(150);		//durée de visibilité de l'affichage
    		if(int==16)			//ici pour savoir si on est au bout du LCD
    		{
    			int=0;			//repositionne i au début pour avoir tab neuf
    			for (int2=0; int2<16; int2++) //efface la ligne déjà écrite
    				Tab[int2] = '  ';
    		}
    	}
    }

    -----

  2. #2
    naru2to

    Re : Interruption Bluetooth - MickroC

    Bonjour,
    La fonction Interrupt() ne me semble pas correcte (en tout cas pas du tout optimisée) :
    - Logiquement si on entre dans l'ISR, c'est que PIR1.RCIF est à '1' donc pas besoin de if (PIR1.RCIF).
    - Il est important de remettre PIR1.RCIF à 0 (sauf s'il se remet à 0 automatiquement), sinon le système ne repassera pas dans l'ISR.
    - Ne jamais insérer de délais dans un vecteur d'interruption, elle doit s'exécuter le plus rapidement possible, donc on y met que le stricte nécessaire (manipulation de variable, éviter les appels de fonction)

    Où est déclarée Usart_Read();?

  3. #3
    Chtulhu

    Re : Interruption Bluetooth - MickroC

    Bonsoir,

    Usart_Read() est une fonction fournie par MikroC (si on la coche parmi les autres fonctions de la bibliothèque).
    Code:
    Usart_init(9600);
    Initialise la comm à 9600 bauds.

    Même remarque que naru2to pour la routine d'interruption, on ne met pas de délais dedans...
    Si les profs code comme ça pas très étonnant que les élèves codent aussi mal.
    Dernière modification par Chtulhu ; 15/05/2018 à 17h08.

  4. #4
    vincent66

    Re : Interruption Bluetooth - MickroC

    Bonsoir,

    On serait presque nostalgique de l'époque où on nous apprenait à coder une routine avec le minimum d'instructions en assembleur...

    Belle soirée...!
    Leonardo était ingénieur "sans papier", et moi diplômé juste...technicien...

  5. A voir en vidéo sur Futura
  6. #5
    paulfjujo

    Re : Interruption Bluetooth - MickroC

    bonjour,

    Citation Envoyé par naru2to Voir le message
    Bonjour,
    - Logiquement si on entre dans l'ISR, c'est que PIR1.RCIF est à '1' donc pas besoin de if (PIR1.RCIF).
    sauf que l'ISR peut desservir d'autre interuption qui n'emane pas forcément de la reception d'un caractere,
    c'est donc une bonne habitude de le tester .
    de meme , le bit RCIE peut aussi etre testé, si dans l'application on ne veut pas reagir ,ou isoler la reception UART
    dans certaines portion du programme.

    - Il est important de remettre PIR1.RCIF à 0 (sauf s'il se remet à 0 automatiquement), sinon le système ne repassera pas dans l'ISR.
    on NE PEUT PAS remettre à zero RCIF , il n'y a qu'une lecture de RCREG qui remet à zero ce bit

  7. #6
    naru2to

    Re : Interruption Bluetooth - MickroC

    Bonjour,
    sauf que l'ISR peut desservir d'autre interuption qui n'emane pas forcément de la reception d'un caractere,
    c'est donc une bonne habitude de le tester .
    Effectivement j'oubliais le cas des microcontrôleurs qui n'ont qu'un ISR pour tous les types d'interruption, trop pris l'habitude des 24F
    on NE PEUT PAS remettre à zero RCIF , il n'y a qu'une lecture de RCREG qui remet à zero ce bit
    J'ai écrit sauf s'il se remet à 0 automatiquement, erreur de ma part je n'avais pas fait attention au commentaire //sinon RCIF va rester à '1' (donc INT sans cesse), la lecture de RCREG doit se faire dans Usart_Read().

  8. #7
    RISC

    Re : Interruption Bluetooth - MickroC

    Salut Ersh,
    Quand une interruption est acceptée et qu'on entre dans l'interruption, GIE est automatiquement désactivé dans l'architecture PIC16.
    Lire http://ww1.microchip.com/downloads/e.../33023a.pdfsur l'architecture du coeur qui explique en détails les interruptions
    Quand on sort de l'interruption, les interruptions sont automatiquement réautorisées (GIE = 1).
    Il ne faut surout jamais manipuler GIE dans une interruption. Il peut se passer des choses inimaginables...et des bugs aléatoires incompréhensibles.
    POur RCIF il faut effectivement lire la FIFO jusqu'à vider tous les caractères arrivés pour que RCIF soit remis à 0 (attention à la FIFO...)
    a+

Discussions similaires

  1. [Outils/Fab/Comp] comment étudier le signal bluetooth d'entrée et de sortie d'un module bluetooth ?
    Par pog347 dans le forum Électronique
    Réponses: 5
    Dernier message: 24/01/2017, 10h29
  2. Réponses: 13
    Dernier message: 02/03/2015, 14h27
  3. Projets Bluetooth (capteur mémoire/bluetooth senseo)
    Par BabaTiste dans le forum Électronique
    Réponses: 4
    Dernier message: 07/04/2014, 11h59
  4. PIC : interruption externe et interruption on change ?
    Par jlg_47 dans le forum Électronique
    Réponses: 10
    Dernier message: 09/04/2012, 12h41
  5. usb bluetooth vers hdmi bluetooth
    Par Electech dans le forum Électronique
    Réponses: 4
    Dernier message: 12/12/2011, 11h51
Découvrez nos comparatifs produits sur l'informatique et les technologies.