compréhension code assembleur (13 lignes)
Répondre à la discussion
Affichage des résultats 1 à 18 sur 18

compréhension code assembleur (13 lignes)



  1. #1
    erwannomar

    compréhension code assembleur (13 lignes)


    ------

    Bonjour,

    je suis actuellement en train d'essayer de comprendre un code assembleur pour un PIC 16F628A.

    j'ai fait quelques recherches mais cela ne me semble pas trés concluant

    vous trouverez ci aprés le code avec mes commentaires (de ce que j'ai compris, mais en fait je n'ai pas compris grand chose...)
    Bref si quelqu'un peut me corriger mes commentaire de façon à ce que je comprenne mieux ce code..

    Merci beaucoup.
    Code:
    voici le code :
    
    
    main
    comf PORTA,w                                     (commentaire: PORTA)
    andlw b'01100000'                               
    skpz                                                   (commentaire: skip on zero ?? )
    goto $+7h                                          (commentaire: executé si ?? (ne doit pas etre ça))
    comf PORTB,w 
    skpnz
    ligt_off                                               (commentaire: LED éteinte )
    skpnz
    sleep                        
    skpz
    call Tx_transfer                                  (commentaire: appel de la fonction de transfer )
    goto main                                         (commentaire: retour au début de la fonction )

    -----
    Dernière modification par gienas ; 19/09/2014 à 18h00. Motif: Modification du titre et ajout des balises code obligatoires pour les programmes

  2. #2
    jiherve

    Re : comprehension code assembleur (13 lignes)

    Bonjour,
    es tu sur de la cible car skpnz est inconnu pour le 16F628.
    http://ww1.microchip.com/downloads/e...Doc/40300C.pdf.
    ceci dit skip signifie que l'on saute l'instruction suivante.
    JR
    l'électronique c'est pas du vaudou!

  3. #3
    paulfjujo

    Re : compression code assembleur (13 lignes)

    bonjour,

    et bon courage...
    il va falloir te pencher serieusement sur la datascheet du 16F628
    et du jeu d'instruction qui est tres bien detaillé
    il faut aussi decortiquer le code hexadecimal avec les adresses correspondantes
    pour en deduire ce que represente les macro tel que light_off
    et pour trouver le sous programme Tx_transfer
    C'est faisable mais demande beaucoup de travail..

    J'ai deja programmé en hexadecimal sur un KIM6502 ! et meme entré un bootloader aux cles 0 et 1
    sur un calculateur telemecanique.. il y a des lustres.
    on ne fait plus cela de nos jours, bien que ce soit tres instructif..

    comment as tu recupéré ces lignes d'assemblage
    en utilisant MPASM apres avoir relu l'HEX de ton PIC avec un Pickit2 ou 3. ?

    il faut rajouter dans la colonne de gauche les adresses ,meme si ton code est relogeable
    cela aide à la comprenette.

    Code:
    main
    comf PORTA,w          ; complement (inversion des bits) de PORTA mis dans  W)
    andlw b'01100000'     ; masque ET logique avec la valeur 0x60 => isole les bits 5 et 6
    skpz 			   ; si le resultat (bits 5 et 6 sont à 0 ) on saute par dessus le goto...
    goto $+7h 	   ; saut à l'adresse courante +7  (call Tx)
    comf PORTB,w 	   ; complement (inversion des 8 bits) de PORTB mis dans  W)
    skpnz                  ; saut à l'adrese +1    si un seul bit du portB est à 0
    ligt_off 	          ; c'est sans doute une macro qui fait quoi ( LED éteinte ? mais lesquelles ? )  
    skpnz		   ; saut si >0 ..mais indefini sans le contexte
    sleep 		   ;le PIC  passe en mode standby ... sera reveillé par ???
    skpz                  ; ???
    call Tx_transfer      ; appel sous programme  fonction de transfer  ? non defini ici
    goto main 		    ;  retour au début du programme principal
    a jiHerve
    exact, mais il y des macros dans l'assembleur , predefinies pour globaliser
    test et saut en une seule macro au lieux de 2 lignes d'instruction
    Dernière modification par paulfjujo ; 19/09/2014 à 15h14.

  4. #4
    erwannomar

    Re : compression code assembleur (13 lignes)

    merci pour vos réponses, cela m'aide beaucoup.
    En fait je souhaite comprendre ce code, (ici il n'y a qu'un petit morceau de ce code), pour le modifier et l'adapter à mes besoins. A noter que ce code fonctionne très bien (ce qui risque de ne pas durer lorsque je vais y faire des modifs...).
    J'avais commencé à programmer en C, ce qui m'allait trés bien, mais la il faut que je m'adapte a l'assembleur : du coup existe-t'il une application capable de retranscrire de l'assembleur en C ??? je crois déjà connaitre la réponse...

    Merci.

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

    Re : compression code assembleur (13 lignes)

    Bonsoir,
    Moi qui ai commencé à coder à une époque ou il n'existait ni µP ni C je suis resté assembleur addicted, tous les assembleurs se ressemblent peu ou prou et au moins je sais avec certitude ce que je vais obtenir, et surtout c'est très économe en mémoire; passé le coté un peu rébarbatif c'est tout de même assez facile, avec un peu d'habitude tu liras même l’hexadécimal de ton µC chéri de façon courante.
    Pour la question : il n'existe pas de moyen de passer d'un code assembleur à un code C sauf si l'assembleur provient du C sans aucune modification sauvage.
    JR
    l'électronique c'est pas du vaudou!

  7. #6
    RISC

    Re : compression code assembleur (13 lignes)

    Salut,
    Citation Envoyé par erwannomar Voir le message
    J'avais commencé à programmer en C, ce qui m'allait trés bien, mais la il faut que je m'adapte a l'assembleur : du coup existe-t'il une application capable de retranscrire de l'assembleur en C ??? je crois déjà connaitre la réponse...
    Peux-tu expliquer ce qui "t'oblige" à faire de l'assembleur alors que tu sais programmer en C ??
    L'assembleur est très hermétique et il faut passer beaucoup de temps pour le maitriser correctement. Avant c'était une obligation, maintenant ca ne l'est plus.
    De nos jours tous les microcontroleurs sont programmables en C et l'assembleur ne se justifie plus. Si tu as besoin d'un peu plus de performance, il suffit d'utiliser un PIC16 plus récent comme les PIC16F1xxx qui tournent à 8MIPS contre 5MIPS pour les anciens. De plus en C on oublie les banques, en assembleur il va falloir y faire très attention. C'est d'ailleurs la principale source d'erreurs en assembleur...

    a+
    Dernière modification par RISC ; 20/09/2014 à 10h13.

  8. #7
    erwannomar

    Re : compression code assembleur (13 lignes)

    Merci pour vos réponses,
    je souhaite continuer a travailler sous ce code qui pour l'instant fonctionne très bien (en effet j'ai beaucoup galéré pendant de nombreux mois à essayer de faire tourner une application à partir de code en C, mais sans résultat).
    Aujourd'hui j'ai adapté un bout de code en ASM et mon appli fonctionne, du coup je vais m'adapter à ce langage, mais effectivement j'aurai préféré coder en C...

    Du coup, j'aurai besoin de qqes renseignements sur le code ASM, du genre : est-il possible d'appeler une fonction pendant une durée déterminée, du genre :

    call fonctionX "pendant 2 secondes"

    Merci

  9. #8
    DAUDET78

    Re : compression code assembleur (13 lignes)

    Tout est possible en assembleur ! Y a qu'à écrire le programme ....

    - Tu appelles ton programme
    - Ce programme lance un Timer de deux secondes
    - Ce programme s’exécute en testant régulièrement que le Timer n'est pas arrivé à deux secondes
    - Si oui, tu quittes ton programme

    Y a plus ka ....
    J'aime pas le Grec

  10. #9
    erwannomar

    Re : compression code assembleur (13 lignes)

    Merci pour la réponse,

    mais du coup je me pose une seconde question: si mon programme principal appelle une fonction, qui elle même appelle une autre fonction, va-t'il falloir que je lance le timer dans cette autre fonction ?

    merci.

  11. #10
    terriblement

    Re : compression code assembleur (13 lignes)

    Tu as accès aux registres du timer peu importe dans quelle fonction tu te trouves .

  12. #11
    erwannomar

    Re : compression code assembleur (13 lignes)

    si je fais :


    movlw .8
    movwf compteur

    partie du code à executer 8 fois

    decfsz coun_c,f
    goto main

    est-ce que cela répond bien à une boucle d'execution ??
    merci.

  13. #12
    erwannomar

    Re : compression code assembleur (13 lignes)

    si je fais (j'ai modifié car erreur sur mon précédent message) :


    movlw .8
    movwf compteur

    partie du code à executer 8 fois

    decfsz compteur,f
    goto main

    est-ce que cela répond bien à une boucle d'execution ??
    merci.

  14. #13
    paulfjujo

    Re : compréhension code assembleur (13 lignes)

    bonjour,

    on ne voit pas la notion de durée ,ni de timer dans ton code .

    et ta demande n'est pas tres claire.
    Tu veux appeler une fonction (ou lancer une execution d'un morceau de programme)
    PENDANT 2 secondes ? et que fait ta fonction PENDANT ces 2 secondes ?
    ou veux-tu lancer ta fonction toutes les 2 secondes ?


    si ton morceau de code est situé dans le main ?
    (main: programme principal)
    tu ne peux pas faire un goto main !

    Code:
    	movlw .8
    	movwf compteur
    ici:
    
          ; operations à faire 8 fois de suite
          ; mettre le code ici
    
    	decfsz compteur,f
    	bra ici                     ; usage possible de BRA  sur 1 cycle au lieu de 2 cycle pour le GOTO
    	; poursuite du programme
    	.. etc...

  15. #14
    erwannomar

    Re : compréhension code assembleur (13 lignes)

    Bonjour, merci pour la réponse,

    En fait mon programme principal appel un sous programme d'initialisation, puis un sous programme de transfer pendant 5s environ, puis ensuite un sous programme d'initialisation et pour finir un sous programme de reception pendant 10s environ.
    Voici ce que j'ai testé, la première partie fonctionne bien (j'ai bien l'emission pendant la durée programmée), par contre la seconde partie, je ne comprends pas trop car cela ne fonctionne pas (je retombe au début du programme principal 1s environ aprés avoir quitté mon sous programme d'emission).

    Code #
    ;************ programme principal ****************************** *********
    main
    call init_Tx ; appel de la fonction d'initialisation Tx
    movlw .50000 ; chargement de la valeur 1000 dans f
    movwf coun_d ; ecriture de la valeur dans f dans la variable coun_d (soit 1000)
    call Tx_transfer ; appel de la fonction suivant le nombre de cycles défini dans coun_d
    decfsz coun_d,f ; décrémente f, passe le goto $-2 si coun_d = 0
    goto $-2
    call del_100ms
    call init_Rx ; appel de la fonction d'initialisation Rx
    movlw .100000 ; chargement de la valeur 1000 dans f
    movwf coun_d ; ecriture de la valeur dans f dans la variable coun_d (soit 1000)
    call RX_receive ; appel de la fonction suivant le nombre de cycles défini dans coun_d
    decfsz coun_d,f ; décrémente f, passe le goto $-2 si coun_d = 0
    goto $-2
    goto main ; renvoi main

    Code #

  16. #15
    erwannomar

    Re : compréhension code assembleur (13 lignes)

    Bonjour pour suite du précédent message,

    voici le code du programme principal qui fonctionne :

    Code:
    main
            call	init_Tx                       ; appel de la fonction d'initialisation Tx
            movlw	.50000                       ; chargement de la valeur 50000 dans f
            movwf	coun_d                      ; ecriture de la valeur dans f dans la variable coun_d (soit 50000)
            call	Tx_transfer                ; appel de la fonction suivant le nombre de cycles défini dans coun_d
            decfsz	coun_d,f                     ; décrémente f, passe le goto $-2 si coun_d = 0
            goto	$-2h
            call	 init_Rx                       ; appel de la fonction d'initialisation Rx
            call	RX_receive                    
            goto	$-1h
            goto	main                          ; renvoi main
    Ce fonctionnement me va bien sauf que je souhaite que la fonction RX_receive soit appelée pendant 5secondes environ.
    La fonction Tx_transfer est bien appelée comme je le souhaite, grâce au compteur, sauf que quand je souhaite appliquer un compteur à la fonction RX_receive cela ne fonctionne pas. Dans le code affiché ci dessus, la fonction RX_receive est appelée indéfiniment et cela joue son rôle correctement (mais indéfiniment... malheureusement).

    Quelqu'un aurait-il une idée pour que je puisse correctement appliquer une tempo sur l'execution de la fonction RX_receive ?

    Merci beaucoup.
    Dernière modification par erwannomar ; 23/09/2014 à 15h18.

  17. #16
    DAUDET78

    Re : compréhension code assembleur (13 lignes)

    Citation Envoyé par erwannomar Voir le message
    Quelqu'un aurait-il une idée pour que je puisse correctement appliquer une tempo sur l'execution de la fonction RX_receive ?
    J'y connais rien en µC ....
    Mais normalement, si on ne veux pas que la routine de lecture soit bloquante, il faut tester un bit de l'UART qui indique qu'un octet est reçu.
    J'aime pas le Grec

  18. #17
    paulfjujo

    Re : compréhension code assembleur (13 lignes)

    bonsoir,


    Bizarre comme application
    tu veux appeler 50.000 fois un sous programme ?
    Il ne faut pas confondre un nombre d'iteration avec une tempo .
    à moins que ton sous programme call tx_transfer dure exactement 100µS
    50000x100=5000000µS => 5sec

    d'ailleur tu auras du mal à mettre 50000 dans W qui est sur 8 bits...donc dans ta variable count_d..
    il faut travailler sur 16 bits (non signes)

    ... soit 1000)
    c'est 50000 ou 1000 ?
    n'importe comment meme probleme.

    Poste aussi le code correspondant à tes appels (call) de fonctions.

  19. #18
    erwannomar

    Re : compréhension code assembleur (13 lignes)

    bonsoir,
    j'ai trouvé comme solution d'appeler des milliers de fois cette fonction.... solution temporaire et nulle je vous l'accorde ! cependant à terme il faudra que je résolve ce problème...

Discussions similaires

  1. A propos un code assembleur
    Par invitec8ad04ce dans le forum Électronique
    Réponses: 0
    Dernier message: 19/02/2012, 23h19
  2. Réponses: 3
    Dernier message: 10/08/2011, 18h51
  3. code assembleur sur isis
    Par invitef0165562 dans le forum Électronique
    Réponses: 1
    Dernier message: 04/07/2011, 03h53
  4. 3 lignes d'assembleur pic pose probleme ?
    Par alainav1 dans le forum Électronique
    Réponses: 5
    Dernier message: 23/06/2009, 14h50
  5. [PIC] Utiliser des routines assembleur dans le code C
    Par invite745cb0cc dans le forum Électronique
    Réponses: 4
    Dernier message: 29/12/2008, 23h29
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...