Aller au contenu


Photo
- - - - -

programmation microC (pic 16f877)


  • Veuillez vous connecter pour répondre
8 réponses à ce sujet

#1 modeste

modeste

    Nouveau membre

  • Membres
  • 7 messages

Posté 23 avril 2011 - 04:32

bonsoir

j'ai un problème avec le label mon petit programme n'arrive pas à le reconnaitre et pourtant je l'ai mis dans le main () et j'utilise microC (mon pic 16F877) ;

et j'ai écris while((condition 1) and (condition2)) do{....} ;dans une partie de mon code ou je veux utiliser le contrôle avec deux conditions mais il me renvoie l'erreur lors de la compilation et m'indique le label et ma boucle.


est ce que je dois utiliser une librairie ou ai je mal écrit la syntaxe? si oui laquelle devrais je ecrire pour declarer un label et utiliser une boucle while (avec deux conditions )qui doivent etre verifié en meme temps, je rappelle que j'utilise le 16f877.

merci

#2 Maïck

Maïck

    Membre passionné

  • Membres
  • PipPipPip
  • 390 messages
  • Gender:Male
  • Location:Suisse

Posté 23 avril 2011 - 07:48

Rien comprit à ton histoire de label...

Pour la boucle while, je ne connais pas microC mais normalement c'est soit:

{
}
while(condition);
[/code]

ou sinon

{
}
[/code]

Donc pas le "do" ni les ";" si tu commence par le while.

#3 modeste

modeste

    Nouveau membre

  • Membres
  • 7 messages

Posté 23 avril 2011 - 09:07

maïk , le label c'est juste un identifiant ou etiquette que l'on place devant une suite de ligne de code de tel sorte que a chaque moment que tu veux executer cette suite de ligne de code tu m'aura plus à les ecrire tu va directement au label .
ex:

L1:
i=0;
PORTB = 0;
delay_ms(5000);
l=ADC_Read(1);
delay_ms(10);

a chaque fois que dans mon programme j'ecris " go to L1; " j'executerai ces suites de lignes de code mais le probleme c'est au niveau de la declaration comment le declaré? car je l'ai declaré comme ceci (Label L1;) dans le void main(), mais malheuresement je ne sais pas si le mot label n'est un mot clé comme ( int ,char ..) ou il me faut d'abord utilisé une librairie pour que se soit pris en compte ,je ne sais pas.
c'est sa mon pb!!

pour la boucle while si par exemple je veux dire tant que (a et b positifs) faire ...

ceci entraine ce code en microc?

while((a >0)&( b>0)) {...} car c'est ce que j'ai mis et il me signal erreur!!!

ou bien?????

#4 modeste

modeste

    Nouveau membre

  • Membres
  • 7 messages

Posté 25 avril 2011 - 12:42

voici le code en entier:





void main ()
{
long int i,ldr;


TRISB =0;
TRISC =0xFF;
TRISA =0xFF;
ADCON0 = 0x8F;

PORTB =0;

while (1)

{ label L1:

i=0;
PORTB = 0;
ldr=ADC_Read(1);
delay_ms(10);
delay_ms(5000);


while ((ldr < 16)&(PORTC.0=0)) do
{
PORTB.0 = 1;
ldr= adc_read(0);
delay_ms(100);
i=i+1;
if (i==50)
goto L1;




PORTB = 0;

while ((ldr>16)&(PORTC.1=0)) do
{
PORTB.1 =1;
ldr =ADC_Read(1);
delay_ms(100);
}

il ne reconnait pas mon label, comment devrai-je le declaré?? et au niveau de ma boucle while il m'envoie se message
" Syntax Error: ')' expected, but '.0' found "

#5 Esprit

Esprit

    Pilier du forum

  • Membres
  • PipPipPipPipPip
  • 1 503 messages
  • Gender:Male
  • Location:Belgique

Posté 25 avril 2011 - 06:53

Bonjour Modeste.



Ton histoire de label m'a un peu perturbée, je ne voyais pas du tout de quoi tu voulais parler et apparemment je ne suis pas le seul. J'ai fais quelques recherches pour trouver réponse à ta question.



Dans un pdf sur les microcontrôleurs :

Tout ce qui commence à la première colonne est considéré comme une étiquette (label) permettant de faire des renvois et aussi des assignations de constantes et de variables. (Pour l'assembleur)







Dans un autre pdf

ch db "Microcontroleur",'\0' ;ecrire en mémoire programme

Le label « ch » pointe vers le premier caractère de la chaîne, c'est donc l'adresse de début de la chaine.






Je n'ai trouvé que des références à l'assembleur et d'après ce que j'ai compris, le label n'est pas une instruction en sois. C'est comme si tu parlais d'une déclaration de variable et que tu mettais "déclaration" dans ton programme. ;)





Ah, je pense avoir trouvé quelque chose de sérieux cette fois :

Le microcontrôleur basic Stamp II :

Rappel de l'expérience #1 une instruction comme recheck: n’est pas vraiment une commande, c’est un “label” (étiquette), simplement un marqueur ou indicateur à un certain endroit dans notre programme. Quand notre programme atteint par la suite le goto recheck:, il (le programme) recherche l'étiquette recheck se branche à cet endroit , et puis continue l'exécution du programme.



Je commence à comprendre ce que c'est. Un label est un "marqueur" qui permet ensuite de renvoyer le programme à une ligne particulière.



J'ai l'impression que les labels n'existent pas en C... En tout cas, je n'ai jamais été amené à les utiliser alors qu'ils ont l'air omniprésents en assembleur.



#6 webshinra

webshinra

    Membre passionné

  • Membres
  • PipPipPip
  • 510 messages

Posté 25 avril 2011 - 08:43

En C, ces horreurs archaïque existe bien, mais de nombreux articles on débattu de l'usage du goto, et ont prouvé que ça n'a aucun intérêt, que ça crée juste de la programmation spaghetti.

Surtout, on n'utilise jamais les labels et les GOTO en C, c'est un usage qui appartient au passé, le seul cas ou il est admissible d'utilisé un goto, c'est lorsque tu veut sortir d'un groupe de boucle imbriqué.

#7 Esprit

Esprit

    Pilier du forum

  • Membres
  • PipPipPipPipPip
  • 1 503 messages
  • Gender:Male
  • Location:Belgique

Posté 25 avril 2011 - 10:03

Programmation spaghetti ? :D



Merci pour ce complément d'information en tout cas.





[Edit: Wiki : La programmation spaghetti

"En programmation informatique, la programmation spaghetti est un style d'écriture de code source qui favorise l'apparition du syndrome du plat de spaghettis: un code peu clair et qui fait un usage excessif de sauts inconditionnels (voir goto), d'exceptions en tous sens, de gestion des événements complexes et de threads divers.



En fait, la programmation spaghetti qualifie tout ce qui ne permet pas de déterminer le qui, le quoi et le comment d'une prise de contrôle par une portion de programme (incompréhension du flux de contrôle)."


#8 Maïck

Maïck

    Membre passionné

  • Membres
  • PipPipPip
  • 390 messages
  • Gender:Male
  • Location:Suisse

Posté 25 avril 2011 - 10:37

[quote"modeste"]maïk , le label c'est juste un identifiant ou etiquette que l'on place devant une suite de ligne de code de tel sorte que a chaque moment que tu veux executer cette suite de ligne de code tu m'aura plus à les ecrire tu va directement au label .[/quote]

AHHH, mais emploi pas ça malheureux !

Comme dit webshinra ça va pour de l'assembleur, mais en C emploi des fonctions !

{ [/code]

Deux fautes dans ce bout de code: le "do" n'a rien à faire là et pour un test il faut employer le "==" un "=" c'est une assignation !

En plus tu oublie de fermer l'accolade !

Edit: 3 fautes, tu doit employer le double & : "&&" pour un ET logique. le "&" est fait pour faire la fonction ET sur chaque bit d'une variable.

#9 modeste

modeste

    Nouveau membre

  • Membres
  • 7 messages

Posté 25 avril 2011 - 05:32

merci a tous d'avoir disposé votre temps pour ces réponses qui m'ont d'ailleurs permises de résoudre le problème, il suffisait juste de mettre directement L1: puis suivit des lignes de code et ensuite à chaque endroit où il y'aura goto L1, le programme se placera directement vers L1;

en effet j'avais deux boucles imbriquées dont une infinie d'où il me fallait cela; et les autres erreurs comme l'a su dire maïk les opérateurs "&&,=="; et enfin j'ai compilé avec succès.

merci encore une fois de plus pour vos réponses pertinentes!!!!




0 utilisateur(s) li(sen)t ce sujet

0 members, 0 guests, 0 anonymous users