Reset logiciel sur un pic
Répondre à la discussion
Page 1 sur 2 1 DernièreDernière
Affichage des résultats 1 à 30 sur 46

Reset logiciel sur un pic



  1. #1
    invitee6a3904a

    Unhappy Reset logiciel sur un pic


    ------

    Bonjour à tous,

    Pour expliquer mon projet, j'ai une application sur excel qui doit commander une carte contenant un PIC18F452 qui lui même pilote des relais qui se trouve derrière.

    Tous fonctionne correctement, c'est-à-dire que dès que je clique sur un bouton (visual basic) j'envoi une valeur hexadécimale au µC.
    Celui-ci récupère l'info et pilote le relais correspondant.

    Je communique entre le PC et le µC avec une liaison série. Juste Rx et Tx sans le contrôle de flux (avec RTS et CTS).

    Cependant au bout de quelques commandes, ma carte de commande (avec le PIC) se réinitialise sans que je demande quoi que ce soit et puis plus moyens de communiquer. Pour remettre, la communication je dois éteindre ma carte et la rallumer ou faire un reset. (J'ai prévu un bouton poussoir).

    Cependant, je ne souhaite pas utiliser cette solution, je préfère avoir une commande de reset grâce à Excel en appui sur un bouton.

    Mais je ne vois pas quel paramètre régler sur le PIC pour permettre cette manipulation. Je pensais utiliser le registre RCON, qu'en pensez-vous ?

    Merci de votre aide.
    Je suis à l'écoute pour tous complément d'informations.

    -----

  2. #2
    invitee6a3904a

    Re : Reset logiciel sur un pic

    Pour infos, j'ai vérifié l'alimentation pendant le reset intempestif mais rien j'ai bien ma tension de +5V comme prévu.

    A quoi peut être dû ce reset ?

  3. #3
    sdec25

    Re : Reset logiciel sur un pic

    Bonjour,
    Ce ne serait pas un problème de Watchdog timer ?
    Pour faire un reset sur un PIC tu peux utiliser l'instruction Reset, tout simplement.

  4. #4
    invitee6a3904a

    Re : Reset logiciel sur un pic

    J'ai désactivé le watchdog.

    Sinon je viens de remarqué avec le terminal qu'en envoyant le caractère M et aussitôt le caractère E (comme il se peut dans mon classeur Excel, le M correspondant à Marche et E à Erreur pour éviter l'éxécution du programme) que ma carte fait un reset. Par la même occasion cela me déconnecte de temps en temps le port USB. Alors là...

    Sinon je peux utiliser reset de cette façon ?
    reset();
    mais il faut que j'inclus le reset.h avant, non ?

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

    Re : Reset logiciel sur un pic

    Citation Envoyé par ElLopez Voir le message
    Sinon je viens de remarqué avec le terminal qu'en envoyant le caractère M et aussitôt le caractère E (comme il se peut dans mon classeur Excel, le M correspondant à Marche et E à Erreur pour éviter l'éxécution du programme) que ma carte fait un reset.
    Il faudrait voir ce que fait ton programme en recevant le E et le M. Un test sur simulateur serait le plus simple. Ça pourrait être par exemple un problème de pile.
    Il y a un moyen de savoir ce qui a provoqué un reset (voir la datasheet).

    Sinon pour reset() tu peux essayer avec reset.h, mais je crois que l'instruction est juste définie comme ça :
    Code:
    #define reset() _asm_ reset _endasm_

  7. #6
    invitee6a3904a

    Re : Reset logiciel sur un pic

    Je n'exclu pas l'erreur de pile.

    Voici mon code :
    Code:
    void main (void)
    {
    	int i;
    	Init();						// Initialisation des ports
    	Init_leds();				// Inintialisation des leds
    	printf( "\nLancement process mesures\n" );
    	
    	while(1)
    	{
    		char inputstr[10];			// Création d'une chaîne de caractères de 10 caractères
    		int i=0; 
    		
    		for(i=0;i<11;i++)
    		{
    			//inputstr[i]=0;
    		//}
    		getsUSART( inputstr, 1 );	// Lit un seul caractère venant de l'UART
    
     		switch (inputstr[0]) 
    		{
    			case 0x4F5452 :				// Si on lit OTR (Ouvrir Tous les Relais) :
       				printf( "\nouverture des relais\n" );       //	Renvoi "ouverture des relais"
    				//leds=0b11110111;		//Allumer la led rouge RA3	& Eteindre la led verte RA1	
    				relais = 0b00000000;			// Relais ouverts
    			break;
    
    			case 0x414D :				// Si on lit AM (Alim Mesure) :
       				printf( "\nfermeture relais mesure\n" );       //	Renvoi "fermeture relais mesure"
    				leds=0b11111101;		// Eteindre la led rouge RA3 & allumer la led verte RA1	
    				relais = 0b00000010;			// Relais ouverts
    			break;
    
    			case 0x45 :					// Si on lit E (Erreur de lecture) :
    				relais = 0x00;			// Relais ouverts
       				printf( "\nerreur lecture\n" );       //	Renvoi "Erreur de lecture code barre"
    				leds = 0b11110111;		//Eteindre la led rouge RA3 & Allumer la led verte RA1		
    				Delay10KTCYx(100);		//Tempo
    				leds = 0b11111111;		//Allumer la led rouge RA3	& Eteindre la led verte RA1
    				Delay10KTCYx(100);		//Tempo
    			break;
    
    			case 0x464431 :					// Si on lit FD1 (Fermer Diel 1) :
       				printf( "\nFermeture relais diel 1\n" );       //	Renvoi "Fermeture relais diel 1"
    				relais = 0b01101000;		//Fermeture relais Diel à 2000V
    				Delay10KTCYx(100);			//Tempo
    				relais = 0b01101100;		//Fermeture relais Diel à 2000V + Fermeture Alim diel
    			break;
    
    			case 0x464432 :				// Si on lit FD2 (Fermer Diel 2) :
       				printf( "\nFermeture relais diel 2\n" );       //	Renvoi "Fermeture relais diel 2"				
    				relais = 0b00011000;		//Fermeture relais Diel à 4000V
    				Delay10KTCYx(100);			//Tempo
    				relais = 0b00011100;		//Fermeture relais Diel à 4000V + Fermeture Alim diel	
    			break;
    
    			case 0x35 :				// Si on lit 5 :
       				printf( "\nChoix du 115V\n" );       //	Renvoi "Choix du 115V"
    				alim = 0xFF;		//Fermeture relais Choix 115V sur RD0
    			break;
    
    			case 0x30 :				// Si on lit 0 :
       				printf( "\nChoix du 230V\n" );       //	Renvoi "Choix du 230V"
    				alim = 0x00;		//Fermeture relais Choix 230V sur RD0
    			break;
    		}
    		}
    	}
    	CloseUSART();
    }
    Peut être plus simple, pour m'aider et moi expliquer.

  8. #7
    sdec25

    Re : Reset logiciel sur un pic

    Déjà, faire un case "0x4F5452" sur un entier de 8 bits a peu de chance de fonctionner.
    Et puis je ne vois pas le cas case 'M'. D'ailleurs pourquoi ne pas mettre directement le caractère après le case au lieu de sa valeur, ce serait plus lisible.

  9. #8
    invitee6a3904a

    Re : Reset logiciel sur un pic

    En fait, j'étais censé lire OTR pour "4F5452h"
    Cependant, le µC lit seulement le dernier caractère "R".
    J'ai réussi à faire lire "OTR" en entier mais lorsque je n'ai qu'un seul caractère à lire, il ne souhaitait pas.

    Je devrait sans doute revoir toute ma fonction réception de mes caractères, mais j'aurais besoin d'un peu d'aide.

    Premièrement, je vais changer mes valeurs hexa par des valeurs ascii pour être plus lisible comme tu me le conseille.

    Ensuite, j'ai du mal à utiliser les tableaux (comme tu as sans doute remarquer) si tu pouvais m'expliquer les erreurs, cela m'aiderait à progresser.

    Je comprends que j'écris OTR sur 8 bits, donc je perd de la place inutilement mais j'avais utilisé le "i" pour pouvoir le remettre à 0 une fois le tableau rempli.

    (J'ai l'impression de tout mélanger...)

  10. #9
    invitee6a3904a

    Re : Reset logiciel sur un pic

    Je viens de modifier tous mes case de la façon suivante :

    Code:
    			case 'OTR' :
       				printf( "\nouverture des relais\n" );       //	Renvoi "ouverture des relais"
    				leds=0b11110111;		//Allumer la led rouge RA3	& Eteindre la led verte RA1	
    				relais = 0b00000000;			// Relais ouverts
    			break;
    C'est sûr c'est nettement plus clair. Par contre, dans mon terminal, au lieu de taper "R" pour l'ouverture des relais, il faut faire seulement "O". Moi mon but serait de pouvoir lire "OTR" en entier.
    Est-ce possible ?

  11. #10
    sdec25

    Re : Reset logiciel sur un pic

    ok, donc quand tu fais
    Code:
    switch (inputstr[0]) 
    		{
    			case 0x4F5452 :
    inputstr[0] désigne le premier caractère de inputstr, on ne peut donc le comparer qu'à un autre caractère ou octet.
    De plus, inputstr a une taille de 10 mais on n'utilise que le premier emplacement.
    Pour comparer des chaînes de caractères il y a plusieurs solutions :
    • faire plusieurs tests : if(inputstr[0] == 'M' && inputstr[1] == ...)
    • utiliser la fonction strcmp(chaine1, "MOT")

    Mais avant il faudrait mieux connaître le protocole utilisé : Combien de caractères maximum ? On fais les tests après chaque caractère lu ou à la fin ?

  12. #11
    invitee6a3904a

    Re : Reset logiciel sur un pic

    A ok, d'accord.

    Alors moi je souhaite lire 3 caractères au max.

    Ensuite, je pense qu'il faut faire les tests après chaque caractère lu.

    Car (si j'ai bien compris) si j'ai trois caractères à lire aucun soucis mais si j'en attends que 2 pour un case, le test ne se fait que s'il y a 3 caractères.

    C'est bien ça ?
    Merci de prendre du temps.

  13. #12
    sdec25

    Re : Reset logiciel sur un pic

    Citation Envoyé par ElLopez Voir le message
    Car (si j'ai bien compris) si j'ai trois caractères à lire aucun soucis mais si j'en attends que 2 pour un case, le test ne se fait que s'il y a 3 caractères.
    Oui c'est bien ça. Donc fais le test après chaque lecture d'1 caractère et il faut placer le caractère lu à la suite du précédent :
    Code:
    char num = 0;
    getsUSART( inputstr + num, 1 );
    num += 1;
    ...
    if (mot terminé ou (mot inconnu et 3 caractères lus)) num = 0;

  14. #13
    sdec25

    Re : Reset logiciel sur un pic

    Juste une correction : char num = 0 doit être fait une seule fois (c'est un peu évident).

  15. #14
    invitee6a3904a

    Re : Reset logiciel sur un pic

    Oula, j'ai du loupé un épisode... :s

    En fait avec cette méthode, je n'utilise plus le switch - case ?

  16. #15
    invitee6a3904a

    Re : Reset logiciel sur un pic

    Citation Envoyé par sdec25 Voir le message
    Juste une correction : char num = 0 doit être fait une seule fois (c'est un peu évident).
    Oui, ça c'est bon.

  17. #16
    sdec25

    Re : Reset logiciel sur un pic

    Citation Envoyé par ElLopez Voir le message
    En fait avec cette méthode, je n'utilise plus le switch - case ?
    Ce serait trop compliqué d'utiliser switch case avec 3 lettres.
    Et il ne faut pas oublier de mettre le caractère '\0' en fin de chaîne si on utilise des fonctions de string.h comme strcmp.
    Dernière modification par sdec25 ; 20/10/2009 à 17h54.

  18. #17
    invitee6a3904a

    Re : Reset logiciel sur un pic

    Je viens d'essayer cela, je pensais être correcte mais cela ne fonctionne pas.

    Code:
    	while(1)
    	{
    		char inputstr[3];			// Création d'une chaîne de caractères de 10 caractères
    		char num = 0;
    		int i=0; 
    		
    		getsUSART( inputstr + num, 1 );
    		num += 1;
    			
    		if (inputstr[0] == 'O' && inputstr[1] == 'T' && inputstr[2] == 'R')
    		{
    			printf("\ncool\n");
    			num = 0;
    		}
    		if (inputstr[0] == 'A' && inputstr[1] == 'M')
    		{
    			printf("\nrecool\n");
    			num = 0;
    		}}

  19. #18
    sdec25

    Re : Reset logiciel sur un pic

    Citation Envoyé par ElLopez Voir le message
    Je viens d'essayer cela, je pensais être correcte mais cela ne fonctionne pas.

    Code:
    	while(1)
    	{
    		char inputstr[3];			// Création d'une chaîne de caractères de 10 caractères
    		char num = 0; // Voir mon post #13, il faut mettre ça avant le while
    		int i=0; 
    		
    		getsUSART( inputstr + num, 1 );
    		num += 1;
    			
    		if (num == 3 && inputstr[0] == 'O' && inputstr[1] == 'T' && inputstr[2] == 'R')
    		{
    			printf("\ncool\n");
    			num = 0;
    		}
    		else if (num == 2 && inputstr[0] == 'A' && inputstr[1] == 'M')
    		{
    			printf("\nrecool\n");
    			num = 0;
    		}
    		else if (num == 3) {
    			printf("instruction non reconnue");
    			num = 0; // au cas où il y a un problème
    		}
    }
    J'ai fait quelques modifs.

  20. #19
    invite7b23d5a7

    Re : Reset logiciel sur un pic

    au debut quand tu initialise ton tableau

    "for(i=0;i<11;i++)"

    ton tableau à 10 cases soit de l'indice 0 à 9

    donc je pense que tu devrai faire

    "for(i=0;i<10;i++)"

  21. #20
    invite7b23d5a7

    Re : Reset logiciel sur un pic

    car sinon y a debordement et le micro plante

  22. #21
    invitee6a3904a

    Re : Reset logiciel sur un pic

    J'ai fait quelques modifs.
    Ha d'accord, je comprends mieux pourquoi l'utilisation du num.

    En fait, on fait un test si au bout de trois caractères, je reçois O, T et R, j'exécute la suite du programme.

    Si j'ai que deux caractères à lire, j'attends seulement A et M.

    Sinon, si au bout de trois caractères, je reçois des choses inintéressantes, il y a erreur de lecture.

    Pour répondre à Morpheus
    au debut quand tu initialise ton tableau

    "for(i=0;i<11;i++)"

    ton tableau à 10 cases soit de l'indice 0 à 9

    donc je pense que tu devrai faire

    "for(i=0;i<10;i++)"
    Je ne pensais pas vu que je part de 0 et je m'arrête avant 11 soit 10 du coup, j'ai limité mon nombre de case dans le tableau vu que je ne lis que 3 caractères au max.

    Donc je devrais mettre "for(i=0; i<3; i++)" ?

    Maintenant avec la nouvelle forme de programme proposé par sdec25, dois-je vraiment mettre cette boucle for ?

    Je vais tester d'abord sans puis dans un second temps avec. Je vous retiens au courant.

    Merci de votre aide, ça me permet d'être plus propre sur mon programme.

  23. #22
    invitee6a3904a

    Re : Reset logiciel sur un pic

    Je viens d'essayer sans la boucle "for", cela fonctionne. Avec la boucle, j'ai quelques soucis.

    Sinon, cela fonctionne bien si j'envoi OTR ou AM, lorsque j'envoi 3 caractères qui ne correspondent pas cela fonctionne également.
    Mais en envoyant, un "W" par exemple puis en enchainant avec OTR cela ne fonctionne plus car le PIC lit :
    WOT.instruction non reconnue.
    R //il attend d'autres valeurs et du coup il ne connait plus derrière AM ou encore OTR.

    J'essaye de voir pour rajouter des instructions if dans ces cas là.

  24. #23
    invitee6a3904a

    Re : Reset logiciel sur un pic

    J'ai réussi à faire en partie ce que je souhaitais.
    C'est-à-dire que dès que j'envoi "W" ou un autre caractère ne correspondant pas à "O" ou "A", il met erreur.

    Je vous montre le code. J'ai rajouté deux autres instructions FD1 et FD2.

    Code:
    	while(1)
    	{
    		char inputstr[3];			// Création d'une chaîne de caractères de 10 caractères
    
    		getsUSART( inputstr + num, 1 );			// Lit un seul caractère venant de l'UART
    		num += 1;
    			
    		if (num == 3 && inputstr[0] == 'O' && inputstr[1] == 'T' && inputstr[2] == 'R')
    		{
    			printf("\ncool\n");
    			num = 0;
    		}
    		else if (num == 2 && inputstr[0] == 'A' && inputstr[1] == 'M')
    		{
    			printf("\nrecool\n");
    			num = 0;
    		}
    		else if (num == 3 && inputstr[0] == 'F' && inputstr[1] == 'D' && inputstr[2] == '1')
    		{
    			printf("\nTest diel 1\n");
    			num = 0;
    		}
    		else if (num == 3 && inputstr[0] == 'F' && inputstr[1] == 'D' && inputstr[2] == '2')
    		{
    			printf("\nTest diel 2\n");
    			num = 0;
    		}
    		else if (num == 1 && inputstr[0] != 'O' && inputstr[0] != 'A' && inputstr[0] != 'F'){
    			printf("\ninstruction non reconnue\n");
    			num = 0; // au cas où il y a un problème
    		}	
    		else if (num == 2 && inputstr[1] != 'T' && inputstr[1] != 'M' && inputstr[1] != 'D'){
    			printf("\ninstruction non reconnue\n");
    			num = 0; // au cas où il y a un problème
    		}			
    		else if (num == 3) {
    			printf("\ninstruction non reconnue\n");
    			num = 0; // au cas où il y a un problème
    		}
    Je pense que c'est un peu lourd comme programme car si j'envoi un "A" il attend une réponse derrière mais si j'envoi un "D" après il attend un autre caractère alors que "AD" n'a aucune correspondance.

    J'ai pensé à deux solutions :

    1/ Peut être devrais-je faire les tests sur des mots.

    2/ Sinon il faut que je prenne toutes les possibilités et les tests une par une. Ca risque d'être long et pas facile à débuger.

  25. #24
    invitee6a3904a

    Re : Reset logiciel sur un pic

    J'arrive à faire ce que je souhaite avec ce code :
    else if (num == 2 && inputstr[0] == 'O' && inputstr[1] != 'T'){
    printf("\ninstruction non reconnue\n");
    num = 0; // au cas où il y a un problème
    }
    else if (num == 2 && inputstr[0] == 'A' && inputstr[1] != 'M'){
    printf("\ninstruction non reconnue\n");
    num = 0; // au cas où il y a un problème
    }
    else if (num == 2 && inputstr[0] == 'F' && inputstr[1] != 'D'){
    printf("\ninstruction non reconnue\n");
    num = 0; // au cas où il y a un problème
    }
    Ce que j'aimerais savoir, est-ce que la façon de faire est correcte ?
    Je trouve ça un peu lourd...

  26. #25
    invitee6a3904a

    Re : Reset logiciel sur un pic

    Bon niquel ! En utilisant la solution précédente, j'ai réussi à obtenir ce que je souhaitais.

    Cependant pour revenir à mon problème d'origine, cela ne change rien.

    Ré-explication :
    Lorsque je lance le test, Excel (via VBA) envoi les "AM" ou "OTR" pour faire commuter les relais correspondants.

    Cependant, parfois il arrive que Excel envoi ces valeurs mais que le PIC ne les traite pas. Au même moment, j'ai un reset du PIC.

    Je ne vois pas d'où ça peut venir ni pourquoi.

    Avant de faire ces dernières modifications sur la méthode de lecture sur le RS232, j'arrivais en envoyant des caractères via un terminal à provoquer le reset du PIC.

    Maintenant, avec le nouveau programme, je n'y arrive plus via le terminal. Mais avec Excel, rien n'a changé.

  27. #26
    sdec25

    Re : Reset logiciel sur un pic

    Pour ta question sur les tests je ne sais pas s'il y a UNE solution mieux que les autres.
    De toute façon tu as bien compris qu'il faut un programme un minimum intelligent pour savoir qu'un début d'instruction est erroné. Ça se fait soit avec plein de tests if mais si tu rajoutes des instruction ça sera galère !
    Une autre solution consiste à avoir un tableau des noms d'instructions ("AM", "OTR", ...) et à tester à chaque lecture d'un nouveau caractère si les lettres lues correspondent à un début d'instruction.
    Si tu penses ajouter de nouvelles instructions tu peux faire comme ça, sinon tu peux garder ton programme actuel.

  28. #27
    invitee6a3904a

    Re : Reset logiciel sur un pic

    Ok merci, je pense rester sur ce que j'ai fait. En toute logique, je ne devrais pas pouvoir rajouter d'autres instructions ou 1 ou 2 mais pas 36 tout le temps.

    Sinon j'aurais voulu savoir si tu avais une solution à apporter sur le fait que le µC se reset.

  29. #28
    sdec25

    Re : Reset logiciel sur un pic

    Tu as enlevé le for qui faisait un débordement ?
    Sinon tu devrais essayer en enlevant tous les printf().
    Et aussi essayer le programme sur un simulateur (MPSIM par exemple).

  30. #29
    invitee6a3904a

    Re : Reset logiciel sur un pic

    Désolé pas assez rapide pour éditer.

    J'ai listé les différentes raisons d'un reset sur un PIC :

    a) Power-on Reset (POR)
    Tension d'alimentation qui descend trop bas. Après vérification, elle reste stable.

    b) MCLR Reset during normal operation
    Circuit classique, résistance, condensateur et bouton poussoir pour un reset manuel.

    c) MCLR Reset during SLEEP
    Alors là, je pense que le MCLR est activé lorsque le PIC passe en mode économe. Je n'utilise pas ce mode. Peut être paramétrer quelque chose mais ayant jamais utilisé, je ne vois pas comment.

    d) Watchdog Timer (WDT) Reset (during normal
    operation)
    Watchdog, toujours entendu parlé mais jamais utilisé non plus. Par contre, là j'ai placé ce code pour le désactiver :
    #pragma config WDT = OFF
    e) Programmable Brown-out Reset (BOR)
    La je ne vois pas du tout ce que c'est. Port permettant le reset logiciel ?

    f) RESET Instruction
    Quel instruction mettre et où ? Ce que tu m'as dit précédement ne fonctionne pas et mettre seulement : reset(); ne fonctionne pas non plus.

    g) Stack Full Reset
    Pile pleine, je pensais que ça aurait pu être ça vu que j'utilisais mal ma détection de caractère mais du coup je le remet tout le temps à 0 donc je ne pense pas que cela vienne de là.

    h) Stack Underflow Reset
    Là je coince aussi, pile "...", débordement de la pile ?
    Je pense que le problème est résolu avec ce que ma conseillé Morpheus

  31. #30
    sdec25

    Re : Reset logiciel sur un pic

    Un brown-out reset se produit lorsque la tension Vdd tombe en dessous d'un certain seuil.
    Sinon stack overflow et underflow ça veut dire que la pile est pleine (pour overflow) ou qu'on a essayé de retirer un élément de la pile alors qu'elle était vide (underflow).
    Un overflow peut se produire notamment quand on utilise plein de fonctions imbriquées.
    Et le fait d'utiliser beaucoup de tableaux (donc des chaînes de caractères) peut être problématique. D'où mes conseils sur mon post précédent.

Page 1 sur 2 1 DernièreDernière

Discussions similaires

  1. Problème reset Pic 16F57
    Par invite2b3366a1 dans le forum Électronique
    Réponses: 7
    Dernier message: 03/08/2009, 19h53
  2. Reset multiples PIC simultanément
    Par invite60243f9b dans le forum Électronique
    Réponses: 3
    Dernier message: 15/12/2008, 18h32
  3. reset PIC
    Par invite1208e497 dans le forum Électronique
    Réponses: 7
    Dernier message: 13/11/2008, 00h25
  4. reset sur pic ou atmel
    Par inviteac54bf81 dans le forum Électronique
    Réponses: 1
    Dernier message: 18/11/2007, 23h05
  5. Reset inattendu d'un PIC
    Par Toufinet dans le forum Électronique
    Réponses: 4
    Dernier message: 17/04/2006, 01h43
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...