MikroBasicPRO pour PIC (version 6.0.0)
Répondre à la discussion
Page 1 sur 2 1 DernièreDernière
Affichage des résultats 1 à 30 sur 42

MikroBasicPRO pour PIC (version 6.0.0)



  1. #1
    invite9857cea4

    Lightbulb MikroBasicPRO pour PIC (version 6.0.0)


    ------

    Bonjours a tous !,

    Je programmais en basic sur programming éditor (pour des picaxes). Mais j'ai voulu rapidement pouvoir programmer sur beaucoup plus de PIC . J'ai dons étudié un petit livre sur le sujet et développais plusieur programme sans aucun problèmes
    MAIS (et c'est le sujet de ma publication), j'ai voulu faire une sérrure codé ... je tape mon langage mais lorsque j'appuis sur "BUILD" pour verrifier qu'il n'y est pas d'erreur et l'erreur :
    " main function is not defined "
    J'ai beaux chercher IMPOSSIBLE de trouver le problème !
    voila le code complet :

    ****************************** ****************************** ****************************** *******
    Code:
    program MyProject
    
    'pour entrer le code on tape sur la touche "*" du keypad
    'on entre les 4 chiffres du code à chaque bon chiffre une led vert clignote
    'on valide son code, et remet en route par la touche "#"
    
    const codeporte as string[4]=(0,0,0,0)                          'code a définir
    const sit as string[10]=(11,1,2,3,4,5,6,7,8,9)                 'converti le code
    dim pchif as byte            '1° chiffre du code (traduit)
    dim dchif as byte           '2° chiffre du code (traduit)
    dim tchif as byte          '3° chiffre du code (traduit)
    dim qchif as byte         '4° chiffre du code (traduit)
    dim bt as byte           'valeur dites BoucheTrou
    dim n as byte            'pour trad du code
    
    sub procedure alarme              's'actionne si qlq'un ouvre la porte
        portA.3=1
        delay_ms(2000)
        portA.3=0
        delay_ms(1000)
        portA.3=1
        goto main
    end sub
    
    sub procedure vali        'permet prevenir que c'est "bien/bon"
        portA.1=1
        delay_ms(1500)
        portA.1=0
        return
    end sub
    
    sub procedure oups                  'indique une erreur et renvoie au main
        dim i as byte             'valeur pour les for-next
            for i=0 to 3
            portA.0=1
            delay_ms(500)
            portA.0=0
            delay_ms(500)
            next i
        goto main
    end sub
    
    
    main:
         n=codeporte[1]            'traduit le code pour le programe
         n=n+1
         pchif=sit[n]
         n=codeporte[2]
         n=n+1
         dchif=sit[n]
         n=codeporte[3]
         n=n+1
         tchif=sit[n]
         n=codeporte[4]
         n=n+1
         qchif=sit[n]
         if portA.2=0 then    's'assure que la porte est fermé
            gosub alarme
         end if
         Keypad_init(PORTB)
         bt=keypad_read           'teste si l'on commence a entrer un code
         select case bt
                case 10    '=*
                gosub vali     ''à voir si je le laisse
                if portA.2=0 then
                   gosub alarme
                end if
                while true                        'boucle de teste du 1°chiffre
                      keypad_init(PORTB)
                      bt=keypad_read
                      if bt=pchif then
                         break
                      else
                          if portA.2=0 then     'detection de sécurité de la porte
                             gosub alarme
                          end if
                          if bt=0 then          'detection si on ne rentre rien
                             continue
                          else                  'detection si le chiffre est faux
                             gosub oups
                          end if
                      end if
                wend
                while true                         'boucle de teste du 2°chiffre
                      keypad_init(PORTB)
                      bt=keypad_read
                      if bt=dchif then
                         break
                      else
                          if portA.2=0 then     'detection de sécurité de la porte
                             gosub alarme
                          end if
                          if bt=0 then          'detection si on ne rentre rien
                             continue
                          else                  'detection si le chiffre est faux
                             gosub oups
                          end if
                      end if
                wend
                while true                        'boucle de teste du 3° chiffre
                      keypad_init(PORTB)
                      bt=keypad_read
                      if bt=tchif then
                         break
                      else
                          if portA.2=0 then     'detection de sécurité de la porte
                             gosub alarme
                          end if
                          if bt=0 then          'detection si on ne rentre rien
                             continue
                          else                  'detection si le chiffre est faux
                             gosub oups
                          end if
                      end if
                wend
                while true                      'boucle de teste du 4° chiffre
                      keypad_init(PORTB)
                      bt=keypad_read
                      if bt=qchif then
                         break
                      else
                          if portA.2=0 then     'detection de sécurité de la porte
                             gosub alarme
                          end if
                          if bt=0 then          'detection si on ne rentre rien
                             continue
                          else                  'detection si le chiffre est faux
                             gosub oups
                          end if
                      end if
                wend
                while true
                      keypad_init(PORTB)
                      bt=keypad_read
                      if bt=12 then                  'on valide car 12 corespond à "#"
                         break
                      else
                          if portA.2=0 then     'detection de sécurité de la porte
                             gosub alarme
                          end if
                          if bt=0 then          'detection si on ne rentre rien
                             continue
                          else                  'detection si le chiffre est faux
                             gosub oups
                          end if
                      end if
                wend
                gosub vali
                portA.3=0                      'desactivation de l'alarme
                delay_ms(5000)                 'delai de sécu
                while true                     'attente de la remise en route
                      kedpad_init(PORTB)
                      bt=keypad_read
                      if bt=12 then            'signal de remise en route
                      gosub vali
                      goto main                 'remise en route
                      end if
                wend
                end select
                goto main
    end.
    
    
    'corespondance touche et numero des touches :
    ' 0 = 11 ; 1=1;2=2;3=3;4=4;5=5;6=6;7=7;8=8;9=9;*=10;#=12
    ****************************** ****************************** ****************************** ***************

    merci de m'aider se serais géniale !

    -----
    Dernière modification par JPL ; 16/04/2013 à 17h27. Motif: Ajout de la balise Code (#) pour garder l'indentation

  2. #2
    Biname

    Re : MikroBasicPRO pour PIC (version6.0.0

    Tu ne peux pas appeler le label main qu'après l'avoir 'déclaré' ... apparemment ?

    D'un autre côté, tes Gosub retournant par des goto dans les fonctions vont noyer la pilounette de ton µp !

    Supprimer les goto dans tes fonctions ! Voir carrément supprimer tous les gosub et les gotos, préférer Call, et les Do, While, etc

    Conseil de première page des manuels

  3. #3
    Biname

    Re : MikroBasicPRO pour PIC (version6.0.0

    Un sub revient tout seul, pas besoin d'ajouter un return à la fin ? Le return, c'est le compilateur basic qui l'ajoutera.

  4. #4
    invite9857cea4

    Question Re : MikroBasicPRO pour PIC (version6.0.0

    Ok merci pour les conseils
    mais comment déclarer mon "main"

  5. A voir en vidéo sur Futura
  6. #5
    invite9857cea4

    Re : MikroBasicPRO pour PIC (version6.0.0

    ok merci pour le conseil

    mais cela ne repond pas a ma question ^^

  7. #6
    Biname

    Re : MikroBasicPRO pour PIC (version6.0.0

    Tu déplaces les 4 sub après End ... si ça marche ?

    Mais ceci serait plus orthodoxe

    Code:
    sub procedure alarme              's'actionne si qlq'un ouvre la porte
        portA.3=1
        delay_ms(2000)
        portA.3=0
        delay_ms(1000)
        portA.3=1
    end sub
    
    sub procedure vali        'permet prevenir que c'est "bien/bon"
        portA.1=1
        delay_ms(1500)
        portA.1=0
    end sub
    
    sub procedure oups                  'indique une erreur et renvoie au main
        dim i as byte             'valeur pour les for-next
            for i=0 to 3
            portA.0=1
            delay_ms(500)
            portA.0=0
            delay_ms(500)
            next i
    end sub
    Et appeler les sub par leur nom et après tu fais ton Goto main

    Exemple dans main :
    Code:
       oups
       goto main
    Pas un spécialiste de MicroBasic moi !

  8. #7
    Biname

    Re : MikroBasicPRO pour PIC (version6.0.0

    Citation Envoyé par Geococo31 Voir le message
    Ok merci pour les conseils
    mais comment déclarer mon "main"
    déclaré = après la ligne ou tu écris

    main:

  9. #8
    invite9857cea4

    Unhappy Re : MikroBasicPRO pour PIC (version6.0.0

    J'ai tester de passer en commentaire toute ce que presenter un problème dans mon programe :

    tout mes "goto" ; "gosub" , mes "keypad_init(PORTB)" , et les "bt=keypad_read"

    HELP ME (je vois pas pourquoi ça pose problème

  10. #9
    invite9857cea4

    Re : MikroBasicPRO pour PIC (version6.0.0

    Citation Envoyé par Biname Voir le message
    déclaré = après la ligne ou tu écris

    main:
    en gros je peu faire tout simplement comme ça :

    program biname
    '....
    '....

    main:
    'instructions
    '...
    end.

  11. #10
    invite9857cea4

    Re : MikroBasicPRO pour PIC (version6.0.0

    Citation Envoyé par Biname Voir le message
    Tu déplaces les 4 sub après End ... si ça marche ?

    Mais ceci serait plus orthodoxe

    Code:
    sub procedure alarme              's'actionne si qlq'un ouvre la porte
        portA.3=1
        delay_ms(2000)
        portA.3=0
        delay_ms(1000)
        portA.3=1
    end sub
    
    sub procedure vali        'permet prevenir que c'est "bien/bon"
        portA.1=1
        delay_ms(1500)
        portA.1=0
    end sub
    
    sub procedure oups                  'indique une erreur et renvoie au main
        dim i as byte             'valeur pour les for-next
            for i=0 to 3
            portA.0=1
            delay_ms(500)
            portA.0=0
            delay_ms(500)
            next i
    end sub
    Et appeler les sub par leur nom et après tu fais ton Goto main

    Exemple dans main :
    Code:
       oups
       goto main
    Pas un spécialiste de MicroBasic moi !
    Je crois avoir compris le début , se qui resenblera donc à ça :

    main:
    '....
    '....
    end.

    sub procedure ...
    '...
    '...
    end sub

    par contre l'histoire du
    "oups
    goto main"
    j'ai pas compris ce que tu voulais me montrer voila


  12. #11
    Biname

    Re : MikroBasicPRO pour PIC (version6.0.0

    Citation Envoyé par Geococo31 Voir le message
    en gros je peu faire tout simplement comme ça :

    program biname
    '....
    '....

    main:
    'instructions
    '...
    end.
    Je n'y arrive pas non plus ! Je capitule !

    Au suivant

  13. #12
    Biname

    Re : MikroBasicPRO pour PIC (version6.0.0

    Chez moi ceci compile ! Tous les appels KeyPad sont commentés

    Code:
    program Geococo
    ' Declarations section
    
    ' dim keypadPort as byte sfr external
    
    'pour entrer le code on tape sur la touche "*" du keypad
    'on entre les 4 chiffres du code Ó chaque bon chiffre une led vert clignote
    'on valide son code, et remet en route par la touche "#"
    
    const codeporte as string[4]=(0,0,0,0)                          'code a dÚfinir
    const sit as string[10]=(11,1,2,3,4,5,6,7,8,9)                 'converti le code
    dim pchif as byte            '1¦ chiffre du code (traduit)
    dim dchif as byte           '2¦ chiffre du code (traduit)
    dim tchif as byte          '3¦ chiffre du code (traduit)
    dim qchif as byte         '4¦ chiffre du code (traduit)
    dim bt as byte           'valeur dites BoucheTrou
    'dim nn as byte            'pour trad du code
    
    sub procedure alarme              's'actionne si qlq'un ouvre la porte
        portA.3=1
        delay_ms(2000)
        portA.3=0
        delay_ms(1000)
        portA.3=1
     '   goto main
    end sub
    
    sub procedure vali        'permet prevenir que c'est "bien/bon"
        portA.1=1
        delay_ms(1500)
        portA.1=0
     '   return
    end sub
    
    sub procedure oups                  'indique une erreur et renvoie au main
        dim i as byte             'valeur pour les for-next
            for i=0 to 3
            portA.0=1
            delay_ms(500)
            portA.0=0
            delay_ms(500)
            next i
     '   goto main
    end sub
    
    main:
         Dim n as Byte
      Do
         n=codeporte[1]            'traduit le code pour le programe
         n=n+1
         pchif=sit[n]
         n=codeporte[2]
         n=n+1
         dchif=sit[n]
         n=codeporte[3]
         n=n+1
         tchif=sit[n]
         n=codeporte[4]
         n=n+1
         qchif=sit[n]
         if portA.2=0 then    's'assure que la porte est fermÚ
            alarme
         end if
         ' Keypad_init()
         'bt=keypad_read           'teste si l'on commence a entrer un code
         select case bt
                case 10    '=*
                vali     ''Ó voir si je le laisse
                if portA.2=0 then
                   alarme
                end if
                while true                        'boucle de teste du 1¦chiffre
                      ' keypad_init(PORTB)
                      'bt=keypad_read
                      if bt=pchif then
                         break
                      else
                          if portA.2=0 then     'detection de sÚcuritÚ de la porte
                             alarme
                          end if
                          if bt=0 then          'detection si on ne rentre rien
                             continue
                          else                  'detection si le chiffre est faux
                             oups
                          end if
                      end if
                wend
                while true                         'boucle de teste du 2¦chiffre
                      'keypad_init(PORTB)
                      'bt=keypad_read
                      if bt=dchif then
                         break
                      else
                          if portA.2=0 then     'detection de sÚcuritÚ de la porte
                             alarme
                          end if
                          if bt=0 then          'detection si on ne rentre rien
                             continue
                          else                  'detection si le chiffre est faux
                             oups
                          end if
                      end if
                wend
                while true                        'boucle de teste du 3¦ chiffre
                      'keypad_init(PORTB)
                      'bt=keypad_read
                      if bt=tchif then
                         break
                      else
                          if portA.2=0 then     'detection de sÚcuritÚ de la porte
                             alarme
                          end if
                          if bt=0 then          'detection si on ne rentre rien
                             continue
                          else                  'detection si le chiffre est faux
                             oups
                          end if
                      end if
                wend
                while true                      'boucle de teste du 4¦ chiffre
                      'keypad_init(PORTB)
                      'bt=keypad_read
                      if bt=qchif then
                         break
                      else
                          if portA.2=0 then     'detection de sÚcuritÚ de la porte
                             alarme
                          end if
                          if bt=0 then          'detection si on ne rentre rien
                             continue
                          else                  'detection si le chiffre est faux
                             oups
                          end if
                      end if
                wend
                while true
                      'keypad_init(PORTB)
                      'bt=keypad_read
                      if bt=12 then                  'on valide car 12 corespond Ó "#"
                         break
                      else
                          if portA.2=0 then     'detection de sÚcuritÚ de la porte
                             alarme
                          end if
                          if bt=0 then          'detection si on ne rentre rien
                             continue
                          else                  'detection si le chiffre est faux
                             oups
                          end if
                      end if
                wend
                vali
                portA.3=0                      'desactivation de l'alarme
                delay_ms(5000)                 'delai de sÚcu
                while true                     'attente de la remise en route
                      'kedpad_init(PORTB)
                      'bt=keypad_read
                      if bt=12 then            'signal de remise en route
                      vali
       '               goto main                 'remise en route
                      end if
                wend
                end select
       Loop until 2 = 2
    end.
    
    'corespondance touche et numero des touches :
    ' 0 = 11 ; 1=1;2=2;3=3;4=4;5=5;6=6;7=7;8=8;9=9;*=10;#=12

  14. #13
    invite9857cea4

    Re : MikroBasicPRO pour PIC (version6.0.0

    Ah oui ? intéressant ! je constate 2/3 changement (loop ...) et sans comenter les keypads?

  15. #14
    invite9857cea4

    Re : MikroBasicPRO pour PIC (version6.0.0

    SUPER , je vois le remplacement du select par loop et tout le tralala...
    mais
    dans le : "dim keypadPort as byte sfr external" a quoi corespond le "sfr external?
    et pourquoi le "declaration section"?

    je vois aussi que les goto sont en commentaire , et ils sont important ! les mettre en commentaire evite le problème
    mais lors de la compilation ces goto sont primordiale :S il faut donc les garder mais...

    merci

  16. #15
    Biname

    Re : MikroBasicPRO pour PIC (version6.0.0

    Citation Envoyé par Geococo31 Voir le message
    SUPER , je vois le remplacement du select par loop et tout le tralala...
    mais
    dans le : "dim keypadPort as byte sfr external" a quoi corespond le "sfr external?
    et pourquoi le "declaration section"?

    je vois aussi que les goto sont en commentaire , et ils sont important ! les mettre en commentaire evite le problème
    mais lors de la compilation ces goto sont primordiale :S il faut donc les garder mais...

    merci

    "dans le : "dim keypadPort as byte sfr external" a quoi corespond le "sfr external?"
    on trouve ça dans help /librairies/keypad ... juste copier-coller moi des fois que !

    Normalement ce code est équivalent au tien ! On sort toujours par le bas du code, tous tes goto main sont inutiles ... normalement ???? de même que les gosub pour appeler les sub ! Faut un peu lire la doc aussi.


    Until 2 = 3 pour boucler pour toujours

    Le select pourrait être remplacé par un If, il n'y a qu'un cas


    Tu es le petit poussin juste sorti de l'oeuf qui fait piou piou ! C'est touchant.

    -------------

    Je parlais de Call dans un messages ci-dessus yapas en MikroBasic ... ni ailleurs

  17. #16
    invite5c0d525e

    Re : MikroBasicPRO pour PIC (version6.0.0

    Ayant l'habitude de programmer avec Mikrobasic pro je me permets d'intervenir.

    L'utilisation des goto et gosub-return est interdite à l'interieur d'une procedure. Le compilateur renvoie obligatoirement un message d'erreur. Par contre on peut utiliser une procedure à l'interieur d'une autre procedure à condition de respecter l'ordre dans lequel on les déclare.

    Par exemple ce code fonctionne :

    Code:
    sub procedure declenche
    dcl=0
    delay_ms(10)
    dcl=1
    pir1.6=0   'remet a 0 le flag comparateur
    end sub
    
    
    sub procedure interrupt
    declenche
    end sub
    Celui-ci ne fonctionne pas parce que la procedure "declenche" est déclarée après la procédure "interrupt"

    Code:
    sub procedure interrupt
    declenche
    end sub
    
    sub procedure declenche
    dcl=0
    delay_ms(10)
    dcl=1
    pir1.6=0   'remet a 0 le flag comparateur
    end sub

  18. #17
    invite5c0d525e

    Re : MikroBasicPRO pour PIC (version6.0.0

    J'ai un poil remanié la syntaxe et du coup ça compile même en décommentant, ça compile hein, ça veut pas dire que ça fonctionne...

    Code:
     program Geococo
    ' Declarations section
    
     dim keypadPort as byte at portb
    
    
      Dim n as Byte
    
    'pour entrer le code on tape sur la touche "*" du keypad
    'on entre les 4 chiffres du code Ó chaque bon chiffre une led vert clignote
    'on valide son code, et remet en route par la touche "#"
    
    const codeporte as string[4]=(0,0,0,0)                          'code a dÚfinir
    const sit as string[10]=(11,1,2,3,4,5,6,7,8,9)                 'converti le code
    dim pchif as byte            '1¦ chiffre du code (traduit)
    dim dchif as byte           '2¦ chiffre du code (traduit)
    dim tchif as byte          '3¦ chiffre du code (traduit)
    dim qchif as byte         '4¦ chiffre du code (traduit)
    dim bt as byte           'valeur dites BoucheTrou
    'dim nn as byte            'pour trad du code
    
    sub procedure alarme              's'actionne si qlq'un ouvre la porte
        portA.3=1
        delay_ms(2000)
        portA.3=0
        delay_ms(1000)
        portA.3=1
     '   goto main
    end sub
    
    sub procedure vali        'permet prevenir que c'est "bien/bon"
        portA.1=1
        delay_ms(1500)
        portA.1=0
     '   return
    end sub
    
    sub procedure oups                  'indique une erreur et renvoie au main
        dim i as byte             'valeur pour les for-next
            for i=0 to 3
            portA.0=1
            delay_ms(500)
            portA.0=0
            delay_ms(500)
            next i
     '   goto main
    end sub
    
    main:
    keypad_init()
    
      Do
         n=codeporte[1]            'traduit le code pour le programe
         n=n+1
         pchif=sit[n]
         n=codeporte[2]
         n=n+1
         dchif=sit[n]
         n=codeporte[3]
         n=n+1
         tchif=sit[n]
         n=codeporte[4]
         n=n+1
         qchif=sit[n]
         if portA.2=0 then    's'assure que la porte est fermÚ
            alarme
         end if
          Keypad_init()
         bt=Keypad_Key_Click()          'teste si l'on commence a entrer un code
         select case bt
                case 10    '=*
                vali     ''Ó voir si je le laisse
                if portA.2=0 then
                   alarme
                end if
                while true                        'boucle de teste du 1¦chiffre
          Keypad_init()
         bt=Keypad_Key_Click()
                      if bt=pchif then
                         break
                      else
                          if portA.2=0 then     'detection de sÚcuritÚ de la porte
                             alarme
                          end if
                          if bt=0 then          'detection si on ne rentre rien
                             continue
                          else                  'detection si le chiffre est faux
                             oups
                          end if
                      end if
                wend
                while true                         'boucle de teste du 2¦chiffre
                  Keypad_init()
                   bt=Keypad_Key_Click()
                      if bt=dchif then
                         break
                      else
                          if portA.2=0 then     'detection de sÚcuritÚ de la porte
                             alarme
                          end if
                          if bt=0 then          'detection si on ne rentre rien
                             continue
                          else                  'detection si le chiffre est faux
                             oups
                          end if
                      end if
                wend
                while true                        'boucle de teste du 3¦ chiffre
                 Keypad_init()
                   bt=Keypad_Key_Click()
                      if bt=tchif then
                         break
                      else
                          if portA.2=0 then     'detection de sÚcuritÚ de la porte
                             alarme
                          end if
                          if bt=0 then          'detection si on ne rentre rien
                             continue
                          else                  'detection si le chiffre est faux
                             oups
                          end if
                      end if
                wend
                while true                      'boucle de teste du 4¦ chiffre
                 Keypad_init()
                  bt=Keypad_Key_Click()
                      if bt=qchif then
                         break
                      else
                          if portA.2=0 then     'detection de sÚcuritÚ de la porte
                             alarme
                          end if
                          if bt=0 then          'detection si on ne rentre rien
                             continue
                          else                  'detection si le chiffre est faux
                             oups
                          end if
                      end if
                wend
                while true
                Keypad_init()
                 bt=Keypad_Key_Click()
                      if bt=12 then                  'on valide car 12 corespond Ó "#"
                         break
                      else
                          if portA.2=0 then     'detection de sÚcuritÚ de la porte
                             alarme
                          end if
                          if bt=0 then          'detection si on ne rentre rien
                             continue
                          else                  'detection si le chiffre est faux
                             oups
                          end if
                      end if
                wend
                vali
                portA.3=0                      'desactivation de l'alarme
                delay_ms(5000)                 'delai de sÚcu
                while true                     'attente de la remise en route
                 Keypad_init()
                  bt=Keypad_Key_Click()
                      if bt=12 then            'signal de remise en route
                      vali
       '               goto main                 'remise en route
                      end if
                wend
                end select
       Loop until 2 = 2
    end.
    
    'corespondance touche et numero des touches :
    ' 0 = 11 ; 1=1;2=2;3=3;4=4;5=5;6=6;7=7;8=8;9=9;*=10;#=12
    Par contre il y a encore des trucs à revoir, pas graves mais qui alourdissent le programme inutilement et le rende moins lisible. Par exemple, au lieu d'écrire :

    Code:
                          if bt=0 then          'detection si on ne rentre rien
                             continue
                          else                  'detection si le chiffre est faux
                             oups
                          end if
    Il est plus simple de faire :

    Code:
    if bt<>0 then oups
    end if

  19. #18
    Biname

    Re : MikroBasicPRO pour PIC (version6.0.0

    La ligne 'Dim nn As Byte'

    Peut être supprimée, le compilateur m'a répondu '???n already declared globally???', ce qui m'a surpris , j'ai voulu remplacé par nn et puis j'ai déplacé après main, ce Dim nn As Byte est un fossile.

    ----------------

    Le compilateur MikroBasic ne ferait qu'une 'passe' sur le code ? Tout doit être 'déclaré' dans une ligne précédent toutes les utilisations ?

  20. #19
    invite5c0d525e

    Re : MikroBasicPRO pour PIC (version6.0.0

    Je n'ai pas bien pigé le sens de ta question (ni même si elle s'adressait à moi). Mikrobasic est assez strict sur l'organisation du programme et les choses doivent être faites dans l'ordre.

    1 le nom du prg et les <include> éventuels

    2 les déclarations (symboles, constantes, variables etc...)

    3 Les procedures et les fonctions (en prenant garde à l'ordre) .

    4 le prg entre le main: et le end.

  21. #20
    Biname

    Re : MikroBasicPRO pour PIC (version6.0.0

    Citation Envoyé par gabuzo Voir le message
    Je n'ai pas bien pigé le sens de ta question (ni même si elle s'adressait à moi). Mikrobasic est assez strict sur l'organisation du programme et les choses doivent être faites dans l'ordre.

    1 le nom du prg et les <include> éventuels

    2 les déclarations (symboles, constantes, variables etc...)

    3 Les procedures et les fonctions (en prenant garde à l'ordre) .

    4 le prg entre le main: et le end.
    Merci,

    Je n'ai pas été très clair, c'est vrai !

    Certains compilateurs lisent le code plusieurs fois avant de compiler, dans ce cas l'ordre des déclarations a moins d'importance. Le fait qu'une fonction doive être déclarée/créée avant d'être appelée semble indiquer que le compilateur ne lit le code qu'une fois pour compiler. Lors de lectures multiples, le compilateur résout d'abord toutes les problèmes varaibles/fonctions/adresses/labels/includes/local/global ... avant de faire la compilation finale.

  22. #21
    invite9857cea4

    Re : MikroBasicPRO pour PIC (version6.0.0

    Citation Envoyé par Biname Voir le message
    "dans le : "dim keypadPort as byte sfr external" a quoi corespond le "sfr external?"
    on trouve ça dans help /librairies/keypad ... juste copier-coller moi des fois que !

    Normalement ce code est équivalent au tien ! On sort toujours par le bas du code, tous tes goto main sont inutiles ... normalement ???? de même que les gosub pour appeler les sub ! Faut un peu lire la doc aussi.


    Until 2 = 3 pour boucler pour toujours

    Le select pourrait être remplacé par un If, il n'y a qu'un cas


    Tu es le petit poussin juste sorti de l'oeuf qui fait piou piou ! C'est touchant.

    -------------

    Je parlais de Call dans un messages ci-dessus yapas en MikroBasic ... ni ailleurs
    ^^
    je ne suis pas d'accord quand vous dites que les "goto main" sont inutile, en effet il est trés important que à la fin du sub alarme et oups le programme ne se poursuive pas comme si on fesait un return il faut absolument revenir au main .

    si on les retire on effectue un return et ceci ne respecte pas ce que le programme dois faire .

    en effet j'aurais pu faire un if à la place du selecte mais je compter rajouter une "case" pour crée une sorte de "clé" qui permet de ne pas taper le code ... mais bon je ne vais pas rentré dans les détails

    merci

  23. #22
    invite9857cea4

    Re : MikroBasicPRO pour PIC (version6.0.0

    dsl j'avait pas vue toutt les autres message pardon

  24. #23
    invite9857cea4

    Re : MikroBasicPRO pour PIC (version6.0.0

    Citation Envoyé par gabuzo Voir le message
    J'ai un poil remanié la syntaxe et du coup ça compile même en décommentant, ça compile hein, ça veut pas dire que ça fonctionne...

    Code:
     program Geococo
    ' Declarations section
    
     dim keypadPort as byte at portb
    
    
      Dim n as Byte
    
    'pour entrer le code on tape sur la touche "*" du keypad
    'on entre les 4 chiffres du code Ó chaque bon chiffre une led vert clignote
    'on valide son code, et remet en route par la touche "#"
    
    const codeporte as string[4]=(0,0,0,0)                          'code a dÚfinir
    const sit as string[10]=(11,1,2,3,4,5,6,7,8,9)                 'converti le code
    dim pchif as byte            '1¦ chiffre du code (traduit)
    dim dchif as byte           '2¦ chiffre du code (traduit)
    dim tchif as byte          '3¦ chiffre du code (traduit)
    dim qchif as byte         '4¦ chiffre du code (traduit)
    dim bt as byte           'valeur dites BoucheTrou
    'dim nn as byte            'pour trad du code
    
    sub procedure alarme              's'actionne si qlq'un ouvre la porte
        portA.3=1
        delay_ms(2000)
        portA.3=0
        delay_ms(1000)
        portA.3=1
     '   goto main
    end sub
    
    sub procedure vali        'permet prevenir que c'est "bien/bon"
        portA.1=1
        delay_ms(1500)
        portA.1=0
     '   return
    end sub
    
    sub procedure oups                  'indique une erreur et renvoie au main
        dim i as byte             'valeur pour les for-next
            for i=0 to 3
            portA.0=1
            delay_ms(500)
            portA.0=0
            delay_ms(500)
            next i
     '   goto main
    end sub
    
    main:
    keypad_init()
    
      Do
         n=codeporte[1]            'traduit le code pour le programe
         n=n+1
         pchif=sit[n]
         n=codeporte[2]
         n=n+1
         dchif=sit[n]
         n=codeporte[3]
         n=n+1
         tchif=sit[n]
         n=codeporte[4]
         n=n+1
         qchif=sit[n]
         if portA.2=0 then    's'assure que la porte est fermÚ
            alarme
         end if
          Keypad_init()
         bt=Keypad_Key_Click()          'teste si l'on commence a entrer un code
         select case bt
                case 10    '=*
                vali     ''Ó voir si je le laisse
                if portA.2=0 then
                   alarme
                end if
                while true                        'boucle de teste du 1¦chiffre
          Keypad_init()
         bt=Keypad_Key_Click()
                      if bt=pchif then
                         break
                      else
                          if portA.2=0 then     'detection de sÚcuritÚ de la porte
                             alarme
                          end if
                          if bt=0 then          'detection si on ne rentre rien
                             continue
                          else                  'detection si le chiffre est faux
                             oups
                          end if
                      end if
                wend
                while true                         'boucle de teste du 2¦chiffre
                  Keypad_init()
                   bt=Keypad_Key_Click()
                      if bt=dchif then
                         break
                      else
                          if portA.2=0 then     'detection de sÚcuritÚ de la porte
                             alarme
                          end if
                          if bt=0 then          'detection si on ne rentre rien
                             continue
                          else                  'detection si le chiffre est faux
                             oups
                          end if
                      end if
                wend
                while true                        'boucle de teste du 3¦ chiffre
                 Keypad_init()
                   bt=Keypad_Key_Click()
                      if bt=tchif then
                         break
                      else
                          if portA.2=0 then     'detection de sÚcuritÚ de la porte
                             alarme
                          end if
                          if bt=0 then          'detection si on ne rentre rien
                             continue
                          else                  'detection si le chiffre est faux
                             oups
                          end if
                      end if
                wend
                while true                      'boucle de teste du 4¦ chiffre
                 Keypad_init()
                  bt=Keypad_Key_Click()
                      if bt=qchif then
                         break
                      else
                          if portA.2=0 then     'detection de sÚcuritÚ de la porte
                             alarme
                          end if
                          if bt=0 then          'detection si on ne rentre rien
                             continue
                          else                  'detection si le chiffre est faux
                             oups
                          end if
                      end if
                wend
                while true
                Keypad_init()
                 bt=Keypad_Key_Click()
                      if bt=12 then                  'on valide car 12 corespond Ó "#"
                         break
                      else
                          if portA.2=0 then     'detection de sÚcuritÚ de la porte
                             alarme
                          end if
                          if bt=0 then          'detection si on ne rentre rien
                             continue
                          else                  'detection si le chiffre est faux
                             oups
                          end if
                      end if
                wend
                vali
                portA.3=0                      'desactivation de l'alarme
                delay_ms(5000)                 'delai de sÚcu
                while true                     'attente de la remise en route
                 Keypad_init()
                  bt=Keypad_Key_Click()
                      if bt=12 then            'signal de remise en route
                      vali
       '               goto main                 'remise en route
                      end if
                wend
                end select
       Loop until 2 = 2
    end.
    
    'corespondance touche et numero des touches :
    ' 0 = 11 ; 1=1;2=2;3=3;4=4;5=5;6=6;7=7;8=8;9=9;*=10;#=12
    Par contre il y a encore des trucs à revoir, pas graves mais qui alourdissent le programme inutilement et le rende moins lisible. Par exemple, au lieu d'écrire :

    Code:
                          if bt=0 then          'detection si on ne rentre rien
                             continue
                          else                  'detection si le chiffre est faux
                             oups
                          end if
    Il est plus simple de faire :

    Code:
    if bt<>0 then oups
    end if
    euh moi ça ne marche pas sans commenter les goto Oo

  25. #24
    Biname

    Re : MikroBasicPRO pour PIC (version6.0.0

    Citation Envoyé par Geococo31 Voir le message
    ^^
    je ne suis pas d'accord quand vous dites que les "goto main" sont inutile, en effet il est trés important que à la fin du sub alarme et oups le programme ne se poursuive pas comme si on fesait un return il faut absolument revenir au main .
    Quand tu seras d'accord, tu auras fait un progrès .
    si on les retire on effectue un return et ceci ne respecte pas ce que le programme dois faire .
    Le 'goto main' se fait maintenant avec le Loop Until 2 = 3 ... mais faudrait vérifier que ça marche toujours.

    Tes 'goto main' dans les 'sub'
    1 - sont interdits par le compilateur comme l'a écrit Gabuzo (lui t'a corrigé les appels KeyPad qui étaient tout faux)
    2 - laissent sur la pile l'adresse du retour et remplissent la pile qui va très vite 'déborder' et planter. Là, il y a un gros morceau a potasser pour toi, voir l'instruction assembleur du PIC Call.


    en effet j'aurais pu faire un if à la place du selecte mais je compter rajouter une "case" pour crée une sorte de "clé" qui permet de ne pas taper le code ... mais bon je ne vais pas rentré dans les détails

    merci
    Courage !

  26. #25
    invite9857cea4

    Re : MikroBasicPRO pour PIC (version6.0.0

    Ah ! ok je comprend mieux
    en gros je n'ai pas le droit au goto et c'est pour ça que sa bug ,

    donc les gosub renvoie aprés le loop until 2=2

    c'est ça?

  27. #26
    invite9857cea4

    Re : MikroBasicPRO pour PIC (version6.0.0

    Citation Envoyé par Biname Voir le message
    Le 'goto main' se fait maintenant avec le Loop Until 2 = 3 ... mais faudrait vérifier que ça marche toujours.
    c'est à dire

  28. #27
    Biname

    Re : MikroBasicPRO pour PIC (version6.0.0

    Citation Envoyé par Geococo31 Voir le message
    c'est à dire
    Ecris des codes plus courts pour faire des tests et lis un peu l'aide dans le menu de MikroBasic

    Voici un code simple qui repond à ta question :

    program GeoCocoPiouPiou
    Dim s1 As Byte
    ' Declarations section
    Sub Function Additionne (dim premier as Byte, dim deuxieme as Byte) As Byte
    Additionne = premier + deuxieme
    End Sub

    main:
    Dim Somme As Byte
    Dim s1, s2 As Byte
    s1 = 25
    s2 = 2
    Do
    Somme = Additionne (s1, s2)
    Inc (s2)
    Loop Until s2 = 20
    Goto Main
    ' Main program
    end.

  29. #28
    invite9857cea4

    Re : MikroBasicPRO pour PIC (version6.0.0

    ah ok on place le goto aprés le loop

    *j'en déduit que les goto sont interdit dans les boucle et le sub ?

    * le programme "geococoPiouPiou" le piou piou c'est dans le sans "tombé du nie" ou "crane de piaf" ?

  30. #29
    invite5c0d525e

    Re : MikroBasicPRO pour PIC (version6.0.0

    Logiquement pour faire ce programme tu ne devrais pas avoir besoin de boucles, de gosub ni de goto. L'utilisation des procédures est largement préférable.

    Autre chose, pour tester l'appui sur le keypad il vaut mieux utiliser les "interrupt on change". Selon le pic que tu utilises tu dois avoir 4 broches d'un port dédiés à ces interruptions. Le pic execute automatiquement l'interruption si une de ces broches change d'état.

  31. #30
    Biname

    Re : MikroBasicPRO pour PIC (version6.0.0

    Non, Goto n'est pas interdit dans les boucles pas interdit dans les Loop !

    Pourquoi n'essayes-tu pas ? Pas difficile d'ajouter Goto main quelque part dans la boucle et compiler ? Le compilateur te dira si le code est correct.

    Pour sortir d'une boucle, il y a aussi l'instruction Break.

Page 1 sur 2 1 DernièreDernière

Discussions similaires

  1. [Brun] PROBLEME CONNEXIONS HDMI (version 1.3, version 1.4,...)
    Par invite3fb29b04 dans le forum Dépannage
    Réponses: 2
    Dernier message: 07/08/2012, 08h30
  2. Réponses: 2
    Dernier message: 30/09/2011, 14h45
  3. après l'apéro, l'entrée version pic du midi
    Par invite757da740 dans le forum Matériel astronomique et photos d'amateurs
    Réponses: 24
    Dernier message: 12/08/2009, 00h56
  4. TOEFL : version papier ou version internet ?
    Par invite1d7dd717 dans le forum Orientation après le BAC
    Réponses: 1
    Dernier message: 10/06/2009, 19h48
  5. Réponses: 4
    Dernier message: 27/10/2007, 00h05
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...