Aller au contenu


Photo
- - - - -

Encore un problème de prog...


42 réponses à ce sujet

#1 Sugi

Sugi

    Habitué

  • Membres
  • PipPip
  • 235 messages
  • Location:Vers Dunkerque

Posté 28 octobre 2006 - 08:37

Bonsoir a tous,

Me revoila avec une nouvelle question programmation.

J'aimerais simplement répeter une action (une fonction) pendant plusieurs
secondes (2, 5, 10...). Par exemple pour faire tourner les servos pendant 5 secondes...
Les fonctions delay ne peuvent pas m'aider puisqu'il me faut une sorte de boucle,
les boucles for et while sont limité en nombre d'instrucion (limitation à des nombres
en 16 bit si j'ai bien compris...).

Alors que puis je faire ? j'ai lu quelque part des truc sur les timer, mais je ne comprend
pas bien.

Merci d'avance.

#2 JEF

JEF

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 819 messages
  • Gender:Male
  • Location:St Cannat (13)

Posté 28 octobre 2006 - 08:49

les boucle for ne font pas l'affaire????
ah ben ça alors!!
tu peu declaré une variable en "short long" qui est de 32 bits je crois. sinon, pour 5 secondes, meme avec un quartz de 20Mhz le temps de cycle est suffisement long pour perdre 5 seconde avec une boucle for je pense.

a pars les Delays, for et while, je ne sais rien d'autre sur les tempos.
desolé

Chaque jour est le premier du reste de ta vie.


#3 Sugi

Sugi

    Habitué

  • Membres
  • PipPip
  • 235 messages
  • Location:Vers Dunkerque

Posté 28 octobre 2006 - 09:27

Sur un 16f877A, avec 200ns par instruction, il me faut 25 000 000 d'instruction pour faire 5 sec
(ou alors j'ai encore une fois rien compris <_< )
Sa me ferais genre:

#include <16f877A.h>
#fuses ....
#use delay(clock=20000000)
short long temps;

void main()
{
	for(;;)
		{
			for(temps=0;temps<25000000;temps++)
			   {
					servos(AV); //une fonction que j'ai crée pour mes servos
			   }
		}
}

Tu est sur que c'est possible avec un PIC ? On est pas limité a 16 bit ?

#4 JEF

JEF

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 819 messages
  • Gender:Male
  • Location:St Cannat (13)

Posté 28 octobre 2006 - 10:04

bah, pourquoi pas...tu as testé?
et les delays? tu as essayé aussi?

Chaque jour est le premier du reste de ta vie.


#5 Sugi

Sugi

    Habitué

  • Membres
  • PipPip
  • 235 messages
  • Location:Vers Dunkerque

Posté 28 octobre 2006 - 10:10

Non je n'est aps essayer, puisque je pensait être limiter à 16 bit.

Pour les delays je peut pas m'en servir dans se cas la.

Je peu pas faire sa:
for(;;)
	{
		servos(AV);
		delays_ms(5000);
	}
Sinon y va donner une seul impulsion, puis attendre 5 sec etc etc

A moins que tu a autre chose derriere la tête ?

#6 JEF

JEF

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 819 messages
  • Gender:Male
  • Location:St Cannat (13)

Posté 28 octobre 2006 - 10:24

A moins que tu a autre chose derriere la tête ?

a pars des cheveux, j'ai rien (blague pourri mais il fallait que je la sorte, desolé :P )
non, serieux, si tu créé une fonction a pars qui fait avancé ton servo et que tu appelle la fonction pendant 5 sec, ça peu pi etre marché non?
en meme temps, tu devra faire une fonction rien que pour ça, c'est bete...

Non je n'est aps essayer, puisque je pensait être limiter à 16 bit

bon, ben essaye, on sait jamais.

Chaque jour est le premier du reste de ta vie.


#7 Sugi

Sugi

    Habitué

  • Membres
  • PipPip
  • 235 messages
  • Location:Vers Dunkerque

Posté 28 octobre 2006 - 10:38

a pars des cheveux, j'ai rien (blague pourri mais il fallait que je la sorte, desolé :P )
C'est pas grave, surement parce qu'il est tard ?

si tu créé une fonction a pars qui fait avancé ton servo et que tu appelle la fonction pendant 5 sec, ça peu pi etre marché non?

J'ai deja crée une fonction pour mes servos (avancer, reculer, tourner à gauche, tourner à droite et s'arreter), mais pour les faire
tourner pendant X seconde, j'en reviens toujours au même. Il me faut cette boucle ou alors une autre solution que je ne connais pas encore...

bon, ben essaye, on sait jamais.
J'essaye demain, la je vais dodo j'ai une migraine monstrueuse -_-

Demain j'essaye je dirais si sa fonctionne.

Bonne nuit.

edit: au fait tu fais comment toi ?

Modifié par Sugi, 28 octobre 2006 - 10:39 .


#8 JEF

JEF

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 819 messages
  • Gender:Male
  • Location:St Cannat (13)

Posté 29 octobre 2006 - 09:02

edit: au fait tu fais comment toi ?

pour la migraine, je prend un efferalgan, pour les servos, ben, je n'ai jamais etait confronté a ce genre de probleme. perso, les servo je les utilise comme des motoreducteur simple, sans CI.

Chaque jour est le premier du reste de ta vie.


#9 Sugi

Sugi

    Habitué

  • Membres
  • PipPip
  • 235 messages
  • Location:Vers Dunkerque

Posté 29 octobre 2006 - 11:13

Bonjour,
Alors voila je viens d'essayer en déclarant un "long int" pui un "int32" (comme indiquer dans l'aide de CCS). Aucun problème à la compilation, par contre quand je demarre le robot il ne donne qu'une seule impulsion...

Donc je reste bloquer <_< . Personne d'autre n'a d'idée ?

JEF tu est le seule actif sur se forum en se moment ou quoi ?

(moi je prend des aspegic pour la migraine :lol: )

#10 JEF

JEF

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 819 messages
  • Gender:Male
  • Location:St Cannat (13)

Posté 29 octobre 2006 - 11:19

moi je prend des aspegic pour la migraine

ok, je note :D

JEF tu est le seule actif sur se forum en se moment ou quoi ?

bah, c'est pour certain les vacances, donc ils partent, pour d'autre c'est le boulot, donc ils peuvent pas... en fait, normalement je pars aussi pendant les vacances, mais là, c'est une execption. le peuple viens le soir en general.

bon, je VEUX trouvé comment faire.

sinon, on laisse tombé la fonction toute prete des servos, et tu met une boucle for pour les 5 seconde, et dedans une delays pour les impulsions du servo...c'est naze mais c'est tous ce que j'ai maintenant.

je continue a cherché...

Chaque jour est le premier du reste de ta vie.


#11 Sugi

Sugi

    Habitué

  • Membres
  • PipPip
  • 235 messages
  • Location:Vers Dunkerque

Posté 29 octobre 2006 - 11:44

sinon, on laisse tombé la fonction toute prete des servos, et tu met une boucle for pour les 5 seconde,
et dedans une delays pour les impulsions du servo...c'est naze mais c'est tous ce que j'ai maintenant.

Si j'ai bien compris se que tu me dit, sa reviens au même que se que je fait, sauf que ma fonction pour
les servo m'evite de retaper les impulsions a chaque fois. C'est justement la boucle for de 5sec qui ne fonctionne pas.

faire sa:
for(temps=0;temps<25000000;temps++)
	{
		servos(AV);
	}
ou sa:
for(temps=0;temps<25000000;temps++)
	{
			output_high(servo_g);//marche avant robot
			delay_us(2000);
			output_low(servo_g);
			delay_ms(16);
			output_high(servo_d);
			delay_us(1000);
			output_low(servo_d);
			delay_ms(18);
	}
Sa reviens au même car servos(AV)=tout le pavé juste au dessus.

#12 JEF

JEF

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 819 messages
  • Gender:Male
  • Location:St Cannat (13)

Posté 29 octobre 2006 - 02:38

ouaip, t'as raison

FABARBUCK, BERNARD, n'importe qui venait nous en aide!!!!!

là, c'etait juste un crie desesperé.


pour le programme, je sais pas si la boucle for est bonne
1_tu donne une valeur a "temps" qui est de 0
2_tu dis que tant que "temps" est inferieur a 25 000 000 tu sort pas de la boucle
3_tu incremente

si c'est ça, tu a peu etre créé une fonction qui te fesait une pause de 5 sec au lieu de faire marché pendant 5 sec...non?

je m'embrouille de plus en plus.....

Chaque jour est le premier du reste de ta vie.


#13 Sugi

Sugi

    Habitué

  • Membres
  • PipPip
  • 235 messages
  • Location:Vers Dunkerque

Posté 29 octobre 2006 - 02:51

Ben avec ma boucle for en gros j'executer la fonction entre crochet
tant que la valeur de 25000000 n'est pas atteinte. Une fois fini je passe
à la suite, du moins c'est comme sa que je le vois...
Encore une fois, je crois que le 16f877A ne gere pas les nombres
de plus de 16bit...

J'ai vu Bernard connecter ici tout à l'heure mais il n'a pa repondu :(

Modifié par Sugi, 29 octobre 2006 - 02:52 .


#14 JEF

JEF

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 819 messages
  • Gender:Male
  • Location:St Cannat (13)

Posté 29 octobre 2006 - 03:02

en fait, perso j'utilise des 18f252 donc ça marche peu etre qu'avec les miens, ou sinon, je me suis planté de A a Z.

pour ce qui est de bernard, il a pas mal de chat a foité comme on dit, et a voir alternativement ton nom et le mien, il doit se dire qu'il n'y a pas de probleme,...faut patienté....helas...

je viens de voir un collegue très orienté programmation et il pense que c'est un souci de programme car normalement, les delays, for et autre truc de tempo devrai suffir... :(

pfff, j'aime cherché et j'adore trouvé, mais resté planté, j'aime pas ça du tout...il faut qu'on trouve

Chaque jour est le premier du reste de ta vie.


#15 Sugi

Sugi

    Habitué

  • Membres
  • PipPip
  • 235 messages
  • Location:Vers Dunkerque

Posté 29 octobre 2006 - 03:08

Bah pour les for sa marcherai si je ne depassais des nombres de 16bit.

Faudrais que je divise le nombre en plusieurs nombres 16 bits et imbriqué
plusieurs boucle for, mais voila le bordel que sa ferais dans mon programme...

#16 JEF

JEF

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 819 messages
  • Gender:Male
  • Location:St Cannat (13)

Posté 29 octobre 2006 - 03:10

tu as deja essayé avec une valeur plus petite??
si c'est non, tente, on sait jamais...on ne cerne jamais assez bien le probleme du premier coup.

Chaque jour est le premier du reste de ta vie.


#17 Sugi

Sugi

    Habitué

  • Membres
  • PipPip
  • 235 messages
  • Location:Vers Dunkerque

Posté 29 octobre 2006 - 03:19

Pour des nombres en 16 bit y'a pas de probleme, sa fonctionne.

Maintenant peu être que le calcul que j'ai fait pour le nombres d'instruction
est mauvais...

Sinon entre les 18f252 et les 16f877 y doit pas y avoir d'enorme difference,
à part que tu peu tourner a 4 x 10 MHz je crois.

#18 JEF

JEF

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 819 messages
  • Gender:Male
  • Location:St Cannat (13)

Posté 29 octobre 2006 - 04:27

ben, les 18f sont plus haut de gamme que les 16f, après, je sais pas ou la difference se fait....
bon, si a fonctionne avec une tempo plus courte, c'est qu'en effet, le souci n'est pas dans la boucle...

et en reduisant la frequence du quartz? tu te retrouve avec des temps de cycle plus long, donc un chiffre moin grand dans la boucle...là, tu es a 20MHz, non? en descendant a 4MHz, tu arrive a un temps de cycle d' 1µs.

Chaque jour est le premier du reste de ta vie.


#19 Otatiaro

Otatiaro

    Membre occasionnel

  • Membres
  • Pip
  • 135 messages

Posté 29 octobre 2006 - 05:14

Salut,

même si on m'a pas appelé à la rescousse, je me permet de venir donner mon avis ...

typiquement, ce dont tu as besoin, c'est de faire une action (marcher, par exemple) pendant un certain temps.

idéalement, il faudrait que tu puisses marcher, marcher, jusqu'a ce que qq'un de dise "STOP, ca fait 5s, on passe à autre chose" ...

et bien c'est la raison d'être des timers dans les PICs, une fois configurés et lancés, ils comptent le temps (en fait les cycles d'horloge), et quand ils ont fini de compter, ils gueulent un bon coup pour prévenir tout le monde (ca s'appel lever une interruption, mais j'aime bien les métaphores ...).

les avantages d'un timer sont nombreux, il compte les cycles d'horloge indépendemment de ce que tu executes comme programme (sinon il faut faire le calcul soit même, j'ai fais telle instruction, ca fait tant de cycles d'horloges, et un PIC à beau être un RISC, c'est quand même super chiant), et comme il lève une interruption, c'est super facile à gérer.

après je te laisse regarder dans les cours de bigo comment gérer les interruptions, mais ca n'a vraiment de rien compliqué.

un petit détail en passant, comme tu veux attendre 5s, ou plutôt faire des tempos en secondes, je te conseilles de configurer ton timer pour qu'il débordes grosso-modo toutes les secondes (y'a des prédiviseurs, ca devrait etre faisable ...) et lorsqu'il déborde, il incrémente une variable que tu connais.

comme ca quand tu as besoin d'avoir une base de temps, tu remet ce compteur à 0 (le timer aussi), tu fais ton action en checkant régulièrement ou en est ton compteur de temps ... quand il dépasse la valeur que tu veux, hop tu sors de ta boucle et tu continues ton programme.

une autre astuce, si ton PIC n'a que des compteurs 8 bits et que tu as impérativement besoin d'un timer sur 16 bits, tu rajoutes un compteur avec la "valeur haute du timer" : à chaque dépassement du timer, tu incrémentes ce compteur, et tu vérifies s'il déborde, s'il déborde, tu lances l'interruption de dépassement des 16 bits ...

si tu n'as pas compris mes astuces, je pourrais t'ecrires ca en pseudo-code (pas de code, ca dépend de trop de choses, et je suis pas là pour faire le boulot des autres ...).

++

[EDIT] PS : de manière générale, les interruptions servent souvent à imbriquer plusieurs traitements, et à les synchroniser.

#20 JEF

JEF

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 819 messages
  • Gender:Male
  • Location:St Cannat (13)

Posté 29 octobre 2006 - 06:16

même si on m'a pas appelé à la rescousse, je me permet de venir donner mon avis ...

ah!!! enfin une ame charitable....
je connaissai pas les timer, ça a l'air sympa, tes metamorphose sont bien sympatique, il faudrai que tu en mette plus la prochaine fois :lol:

Chaque jour est le premier du reste de ta vie.




Répondre à ce sujet



  


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

0 members, 1 guests, 0 anonymous users