Bienvenue aux nouveaux arrivants sur FantasPic !
- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.
--- L’équipe FantasPic ---
- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.
--- L’équipe FantasPic ---
Modérateur : Gérard
Mikrobasic
- paulfjujo
Expert- Messages : 2597
- Âge : 73
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
bonjour à tous,
Merci de ta découverte !
Etant dubitatif coté mikroC
j'ai fait un test avec mikroBasic qui prouve tes dires
et aussi la façon de faire style MikroC
nota:
j'utilise Case sensitive sur mon compilo
qui rejette donc les variables p,r,z en minuscule
c'est contraignant mais fait mieux apparaitre des erreurs de nomage de variables.
à la compilation.
j'ai ensuite verifié sur mikroC .. c'est AUSSI OK
comme quoi , Fantaspic fédere bien les utilisateurs ASM, BASIC et C
(et Pascal ?)
Tango a écrit :Je viens de découvrir que l'on peut déclarer une variable de 1 bit.
Exemple :Code : Tout sélectionner
dim t as bit ' t = 0 ou 1
dim p as byte ' p = 0 à 255
Je ne le savais pas ! Salut à tous.
Tango
Merci de ta découverte !
Etant dubitatif coté mikroC
j'ai fait un test avec mikroBasic qui prouve tes dires
et aussi la façon de faire style MikroC
nota:
j'utilise Case sensitive sur mon compilo
qui rejette donc les variables p,r,z en minuscule
c'est contraignant mais fait mieux apparaitre des erreurs de nomage de variables.
à la compilation.
j'ai ensuite verifié sur mikroC .. c'est AUSSI OK
comme quoi , Fantaspic fédere bien les utilisateurs ASM, BASIC et C
(et Pascal ?)
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Mikrobasic
Bonsoir, merci à paulfjujo pour le développement de l'explication.
Autre chose :
Qui parmi vous pourrait me fournir un petit bout de code pour faire fonctionner un servomoteur, (1.5ms à 2.5ms tous les 20ms) en Mikrobasic. Pour un PIC de la famille 16F. Il y a bien un exemple sur le forum (piège à rongeurs), mais c'est en ASM, et moi ASM = . Merci d'avance et bonne soirée.
Tango.
Autre chose :
Qui parmi vous pourrait me fournir un petit bout de code pour faire fonctionner un servomoteur, (1.5ms à 2.5ms tous les 20ms) en Mikrobasic. Pour un PIC de la famille 16F. Il y a bien un exemple sur le forum (piège à rongeurs), mais c'est en ASM, et moi ASM = . Merci d'avance et bonne soirée.
Tango.
Mikrobasic
Mikrobasic
Bonsoir, j'avais pensé ça, mais je ne sais pas si ça peut marcher ...
Commande de servomoteur : une impulsion de 1.5ms à 2.5ms toutes les 20ms.
Bye, bonne nuit.
Tango.
Code : Tout sélectionner
' PIC 12F675
' contrôle d'un servomoteur
' Tango - septembre 2018
' ----------------------------
program Servomoteur_12F675
dim pos as word ' déclaration des variables
dim t as bit
dim temps as word
sub procedure init_main
OPTION_REG = %10000000 ' pull-up activées - prédiviseur / 4
CMCON = %00000111 ' comparateur désactivé (7)
ANSEL = %00000001 ' Configure AN0 en entrée analogique
TRISIO = %00000001 ' GPIO.0 en entrée
ADCON0 = %10000001 ' configuration du convertisseur A/D
ADC_init ' activation du convertisseur
GPIO = %00000000 ' toutes les sorties GPIO à 0
end sub
'Timer1
'Prescaler 1:1; TMR1 Preload = 45536; Actual Interrupt Time : 20 ms
'Place/Copy this part in declaration section
sub procedure InitTimer1()
T1CON = 0x01
TMR1IF_bit = 0
TMR1H = 0xB1
TMR1L = 0xE0
TMR1IE_bit = 1
INTCON = 0xC0
end sub
sub procedure Interrupt()
if (TMR1IF_bit) then
TMR1IF_bit = 0
TMR1H = 0xB1
TMR1L = 0xE0
'Enter your code here une interruption toutes les 20 ms
t = 1
end if
end sub
main:
init_main
InitTimer1
while true
while true
if t = 1 then
pos = ADC_read(0) ' lecture du potentiomètre sur GPIO.0
delay_ms (1)
break ' boucle de lecture de "pos"
end if
wend
If pos < 500 then
pos = 500
end if
GPIO.1 = 1
t = 0
for temps = 1 to pos
Delay_us(3)
next temps
GPIO.1 = 0
wend
end.
Commande de servomoteur : une impulsion de 1.5ms à 2.5ms toutes les 20ms.
Bye, bonne nuit.
Tango.
Mikrobasic
-
Jérémy
Administrateur du site- Messages : 2725
- Âge : 45
- Enregistré en : juillet 2015
- Localisation : Dans le sud
- Contact :
Bonjour à tous,
Les servos moteurs classiques se commandent de 1ms à 2ms avec un point milieu à 1.5ms ! cette impulsion doit être envoyé au maximum toutes les 20ms ( moins c'est mieux ).
.
Je n'ai toujours pas eu le temps de faire un tuto . désolé.
Je travaille en "C" mais tu peux essayer de t'en inspiré voici un lien avec u nbout de code .
viewtopic.php?f=10&t=523&start=10
Bonne journée
Tango a écrit :Source du message Commande de servomoteur : une impulsion de 1.5ms à 2.5ms toutes les 20ms.
Les servos moteurs classiques se commandent de 1ms à 2ms avec un point milieu à 1.5ms ! cette impulsion doit être envoyé au maximum toutes les 20ms ( moins c'est mieux ).
.
Je n'ai toujours pas eu le temps de faire un tuto . désolé.
Je travaille en "C" mais tu peux essayer de t'en inspiré voici un lien avec u nbout de code .
viewtopic.php?f=10&t=523&start=10
Bonne journée
Mikrobasic
Mikrobasic
- paulfjujo
Expert- Messages : 2597
- Âge : 73
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
bonjour Tango et à tous,
ton programme basic tiens un peu la route ,
mais des delay (instruction basic) de 1µS sont difficile à obtenir avec FOSC=4MHz
si on a pas une FOSC tres élevée 16,32 voir 48MHz.
Algorithme :
toutes les 20ms
generer le delay minima de 1000µS
puis rajouter un delay en µS de 20 à 1000 pour couvrir 1mS à 2mS, par pas de 10µS, le point de repos étant 1,5mS
lecture de l'ADC (prend minimum 22µS)
supprimer les boucles basic : d'autant que la simple boucle for next va deja bouffer 9µS à chaque cycle ..
le premier delay de 1000µS sera à reduire pour defalcquer la duree de lecture ADC >=22µS
les quelques instructions autour et l'offset de 2x10µS du à l'usage de Delay_cyc
Mais il y a un piege avec cette fonction Delay_Cyc
l'argument doit etre compris entre 2 et 255 ( non pas 257 ! un byte ne dépasse pas 255 ) sinon plantage programme
merçi qui : MikroE !
il faut donc un petit talon sur le potentiometre pour avoir ADC=16 points au minima ( /8 => 2)
ou par soft imposer pos minima en rajoutant 2 à ADC_read()
voir avec debuggeur mikrobasic et WatchClock en mode pas à pas
Le point zero serait donc au milieu de la course du potar (lineaire)
code non testé en reel
mais Delay_µS() donne bien un delay approprié (testé ave Watchclock)
Delay_Cyc(100) donne bien 1000µS
ton programme basic tiens un peu la route ,
mais des delay (instruction basic) de 1µS sont difficile à obtenir avec FOSC=4MHz
si on a pas une FOSC tres élevée 16,32 voir 48MHz.
Algorithme :
toutes les 20ms
generer le delay minima de 1000µS
puis rajouter un delay en µS de 20 à 1000 pour couvrir 1mS à 2mS, par pas de 10µS, le point de repos étant 1,5mS
lecture de l'ADC (prend minimum 22µS)
supprimer les boucles basic : d'autant que la simple boucle for next va deja bouffer 9µS à chaque cycle ..
Code : Tout sélectionner
while true
while t=0 ' attend l'interrupt
wend
GPIO.1 = 1
t=0
pos =2+ ADC_read(0) >>3 ' si lecture du potentiomètre sur GPIO.0 sur 10 bits recadrer à 0 à 127 en divisant par 8
'Delay minimum de depart
delay_us (1000-22-20) ' valeur à ajuster : 1000µS - duree acquis ADC >=22µS - quelques µS - Talon de 2x10µS
' Delay_Cyc(dim Cycles_div_by_10 as byte)
' Value Cycles_div_by_10 must be between 2 and 257.<- ???? minima=2 maxima=255
Delay_Cyc(pos)
GPIO.1 = 0
wend
le premier delay de 1000µS sera à reduire pour defalcquer la duree de lecture ADC >=22µS
les quelques instructions autour et l'offset de 2x10µS du à l'usage de Delay_cyc
Mais il y a un piege avec cette fonction Delay_Cyc
l'argument doit etre compris entre 2 et 255 ( non pas 257 ! un byte ne dépasse pas 255 ) sinon plantage programme
merçi qui : MikroE !
il faut donc un petit talon sur le potentiometre pour avoir ADC=16 points au minima ( /8 => 2)
ou par soft imposer pos minima en rajoutant 2 à ADC_read()
voir avec debuggeur mikrobasic et WatchClock en mode pas à pas
Le point zero serait donc au milieu de la course du potar (lineaire)
code non testé en reel
mais Delay_µS() donne bien un delay approprié (testé ave Watchclock)
Delay_Cyc(100) donne bien 1000µS
Mikrobasic
Bonsoir et merci paulfjujo pour m'aider dans mon programme.
J'ai compris le fait d'ajouter [ ADC_read(0) ] à un temps fixe [ delai_us (1000) ]
Il y a deux lignes que je ne comprends pas, à savoir :
pos =2+ ADC_read(0)>>3 ' jaimais vu en basic les >>
delay_us (1000-22-20) ' ça fait quoi ?
NB : Le CAN renvoi la valeur de 0 à 1023 (10bits) suivant la position du potentiomètre sur GPIO.0
Sinon je pense comprendre le principe de la chose
Merci et bonne soirée. Bye.
Tango.
J'ai compris le fait d'ajouter [ ADC_read(0) ] à un temps fixe [ delai_us (1000) ]
Il y a deux lignes que je ne comprends pas, à savoir :
pos =2+ ADC_read(0)>>3 ' jaimais vu en basic les >>
delay_us (1000-22-20) ' ça fait quoi ?
NB : Le CAN renvoi la valeur de 0 à 1023 (10bits) suivant la position du potentiomètre sur GPIO.0
Sinon je pense comprendre le principe de la chose
Merci et bonne soirée. Bye.
Tango.
Mikrobasic
Mikrobasic
- paulfjujo
Expert- Messages : 2597
- Âge : 73
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
Tango a écrit :delay_us (1000-22-20) ' ça fait quoi ?
tu peux mettre directement 958 , c'est pareil ,
mais ça parle moins à celui qui lit le source du programme
mais c'est juste pour faciliter la comprenette dans le programme .
pourquoi enlever 22 :
.. ADC_Red() consomme un minimum de 22µS .. voir le fichier * .lst resultant de la compilation
le -20 , parce que la fonction Delay_Cyc( xxx)
ne peut pas accepter un argument < à 2
donc 2 * 10 cycles ( at 4Mhz => 10 cycles=10µs)
2x10µs = 20 µS
Retourner vers « Langage BASIC & PASCAL »
Qui est en ligne
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 92 invités