[C] Simulation microcontroleur PIC & MPLAB

Simulation microcontroleur PIC & MPLAB [C] - C - Programmation

Marsh Posté le 10-06-2011 à 16:20:39    

Bonjour à tous,
 
je programme un PIC 18F4450 (pour faire de l'USB à terme), sous MPLAB, compilateur Microchip C18 ToolSuite. Voici le code de mon programme :
 

Code :
  1. #include <p18f4450.h>
  2. void init(void);
  3. void main(void)
  4. {
  5. //      unsigned char a = 0x00;
  6.         init();
  7.         while(1)
  8.         {
  9.                 if(PORTC == 0x00)
  10.                         PORTB = 0x01;
  11.                 else
  12.                         PORTB = 0xF9;
  13.         }
  14.         return;
  15. }
  16. void init(void)
  17. {
  18.         TRISB = 0x00;
  19.         PORTB = 0xAA;
  20.         TRISC = 0xFF;
  21.         return;
  22. }


Je visualise simplement sur le port B l'état du port C (j'affiche 0 ou 1 sur l'afficheur 7 segments). Je simule le fonctionnement sur le PROTEUS Profesional 7.4 :  
http://www.microcontest.com/proteus.jpg
 
Comme vous pouvez le voir, tout va bien. Seulement, quand je décommente la ligne 7 (unsigned char a = 0x00; ), Proteus  me sort l'erreur suivante :
 
http://www.microcontest.com/erreur.jpg
 
Avez vous une idée d'où peut venir ce problème?
 
Merci d'avance


---------------
http://www.microcontest.com - Site de challenges de programmation : Cryptographie - Multimedia - Intelligence Artificielle - Réseaux - Algorithmique - Mathématiques
Reply

Marsh Posté le 10-06-2011 à 16:20:39   

Reply

Marsh Posté le 10-06-2011 à 19:11:14    

Déja, ça:

Code :
  1. void main(void)


c'est pas du C.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 10-06-2011 à 19:44:43    

Pourquoi affirmes-tu une telle chose :o?
Et si ce n''est pas du C, qu'est-ce?
Je précise que le compilateur compile parfaitement...


---------------
http://www.microcontest.com - Site de challenges de programmation : Cryptographie - Multimedia - Intelligence Artificielle - Réseaux - Algorithmique - Mathématiques
Reply

Marsh Posté le 10-06-2011 à 19:51:55    

Parce que en C, main doit retourner un int. C'est la norme qui impose ça.
Et si des compilos laxistes acceptent des syntaxes non conformes, ce n'est pas une excuse pour les employer.
 

Citation :

ISO/IEC 9899:1989 (C90):
 
main should be declared as either:
 

int main(void)
int main(int argc, char **argv)


Or equivalent. For example, int main(int argc, char *argv[]) is equivalent to the second one. Further, the int return type can be omitted as it is a default.
 
If an implementation permits it, main can be declared in other ways, but this makes the program implementation defined, and no longer strictly conforming.
 
The standard defines 3 values for returning that are strictly conforming (that is, does not rely on implementation defined behaviour): 0 and EXIT_SUCCESS for a successful termination, and EXIT_FAILURE for an unsuccessful termination. Any other values are non-standard and implementation defined. main must have an explicit return statement at the end to avoid undefined behaviour.
 
Finally, there is nothing wrong from a standards point of view with calling main() from a program.
 
ISO/IEC 9899:1999 (C99):
 
For C99, everything is the same as above except:
 
The int return type may not be omitted.
You may omit the return statement from main. If you do, and main finished, there is an implicit return 0.


Donc void main(...) c'est pas du C (ni du C++). C'est OK en java par contre.
 
A+,


Message édité par gilou le 10-06-2011 à 19:59:35

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 10-06-2011 à 22:11:48    

Et quelle fonction pourrait traiter cette valeur de retour dans un microcontroleur? J'ai indiqué int comme type de retour et retourné 0. A la compilation :  
Warning [2103] default startup code expects main function declared as 'void main (void)'
 
Je recite ta source :

Citation :

If an implementation permits it, main can be declared in other ways, but this makes the program implementation defined, and no longer strictly conforming.


 
En l'occurrence, on est précisément dans ce cas. Le problème ne vient donc pas de là.


---------------
http://www.microcontest.com - Site de challenges de programmation : Cryptographie - Multimedia - Intelligence Artificielle - Réseaux - Algorithmique - Mathématiques
Reply

Marsh Posté le 10-06-2011 à 22:26:08    

Je n'ai pas dit qu'il venait de la, le problème.
 
La boucle infinie peut réécrite en plus court:  
while (1) { PORTB = (PORTC)?0xF9:0x01; }  
 
et inutile d'écrire des return; en dernière ligne de procédures void XXX()
 
A+;


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 11-06-2011 à 00:20:02    

Tu as l'air de vraiment tenir à faire du zèle, ça doit être un truc de modo (le prend pas mal je rigole ^^). Je suis loin d'être débutant en C, et j'ai mes habitudes, comme mettre les return pour les fonctions void x(). Je suis un peu puriste de ce côté là, je préfère que ce soit clair, je n'aime pas les choses implicites. Chacun fait comme il veut puisque effectivement, l'omission du return reste dans la norme. En ce qui concerne la boucle while, effectivement ton code marche parfaitement, mais je ne suis pas d'accord d'écrire aussi salement les choses, quitte à écrire plusieurs ligne, je préfère éclaircir le code. Et puis on peut écrire ton code encore plus court :

Code :
  1. while(1) PORTB = PORTC?0xF9:0x01;


Et enfin ce n'est qu'un code de test, pas besoin d'optimisation donc.
 
En ce qui concerne mon problème  :D , penses-tu qu'il puisse venir des bits de configuration du micro?


---------------
http://www.microcontest.com - Site de challenges de programmation : Cryptographie - Multimedia - Intelligence Artificielle - Réseaux - Algorithmique - Mathématiques
Reply

Marsh Posté le 11-06-2011 à 02:09:40    

Citation :

je n'aime pas les choses implicites

Une parenthèse fermante finale de procédure ne retournant rien, je ne vois pas ce que ça a d'implicite.
Un return dans ce type de procédure, je n'ai rien contre en milieu de code, mais cela n'a aucune utilité en dernière ligne.
 

Citation :

Et puis on peut écrire ton code encore plus court


Non on ne peut pas écrire plus court, sans la définition de PORTC (que je n'ai pas) qui s'il est défini par un #define, peut faire foirer l'expression sans parenthèses.
 
Et je suis désolé, mais pour un programmeur C, et je suis très loin d'être un débutant en C, moi aussi,

Code :
  1. while(1)
  2.         {
  3.                 if(PORTC == 0x00)
  4.                         PORTB = 0x01;
  5.                 else
  6.                         PORTB = 0xF9;
  7.         }


c'est beaucoup moins propre (pas de parenthèsage autour des alternatives du if, même pour une instruction, c'est vouloir vivre dangereusement) et lisible que  
while (1) { PORTB = (PORTC)?0xF9:0x01; }  
qui lui est immédiatement transparent.
 

Citation :

En ce qui concerne mon problème  :D , penses-tu qu'il puisse venir des bits de configuration du micro?


Pas la moindre idée, car le programme en C est correct. Le problème du plantage lors de l'ajout de  
unsigned char a = 0x00;
provient probablement de spécificités liées au PIC 18F4450 ou au simulateur, que je ne connais pas.
 
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed