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 ---
Forum général en BASIC et PASCAL !

Modérateur : Gérard

Mikrobasic
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 1084
Âge : 68
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#51 Message par paulfjujo » dim. 14 oct. 2018 11:30

bonjour à tous,


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 ! :lol: Salut à tous.
Tango


Merci ! :+1: 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

Test_bit_Basic.jpg


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.
Compiler_output_settings.JPG


j'ai ensuite verifié sur mikroC .. c'est AUSSI OK

Test_bit_mikroC.jpg


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
Tango
Débutant
Débutant
Messages : 36
Âge : 67
Enregistré en : février 2017
Localisation : Vosges

#52 Message par Tango » lun. 15 oct. 2018 17:18

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 = :mur: . Merci d'avance et bonne soirée.
Tango.

Mikrobasic
Gérard
Avatar de l’utilisateur
Confirmé
Confirmé
Messages : 843
Âge : 60
Enregistré en : septembre 2015
Localisation : Alsace

#53 Message par Gérard » lun. 15 oct. 2018 21:47

Je fais bien du Basic mais je n'ai jamais utilisé de servo, désolé.
Le 11 / 07 / 2017, j'ai commandé une Ford Mustang.
Le 31 / 08 / 2017, j'ai eu la Mustang, un régal.

Mikrobasic
Tango
Débutant
Débutant
Messages : 36
Âge : 67
Enregistré en : février 2017
Localisation : Vosges

#54 Message par Tango » mar. 16 oct. 2018 00:44

Bonsoir, j'avais pensé ça, mais je ne sais pas si ça peut marcher ... :!!:

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
Administrateur du site
Messages : 2154
Âge : 39
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#55 Message par Jérémy » mar. 16 oct. 2018 07:48

Bonjour à tous,

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
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Mikrobasic
Tango
Débutant
Débutant
Messages : 36
Âge : 67
Enregistré en : février 2017
Localisation : Vosges

#56 Message par Tango » mar. 16 oct. 2018 13:38

Bjr Jérémy,
OK pour ça.

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 vais faire un essai, on verra ce que ça donne ... :wink:

Bye, bonne journée.
Tango.

Mikrobasic
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 1084
Âge : 68
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#57 Message par paulfjujo » mar. 16 oct. 2018 17:18

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 ..

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
Tango
Débutant
Débutant
Messages : 36
Âge : 67
Enregistré en : février 2017
Localisation : Vosges

#58 Message par Tango » mer. 17 oct. 2018 16:39

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 :wink:

Merci et bonne soirée. Bye.
Tango.

Mikrobasic
Gérard
Avatar de l’utilisateur
Confirmé
Confirmé
Messages : 843
Âge : 60
Enregistré en : septembre 2015
Localisation : Alsace

#59 Message par Gérard » mer. 17 oct. 2018 17:26

>>3 veut dire décalage vers la droite de 3, soit diviser par 8.
Le 11 / 07 / 2017, j'ai commandé une Ford Mustang.
Le 31 / 08 / 2017, j'ai eu la Mustang, un régal.

Mikrobasic
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 1084
Âge : 68
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#60 Message par paulfjujo » mer. 17 oct. 2018 21:06

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 1 invité