IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MPLAB Discussion :

Inserer du code C dans un programme ASM


Sujet :

MPLAB

  1. #1
    Membre du Club

    Inscrit en
    Mars 2008
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 75
    Points : 66
    Points
    66
    Par défaut Inserer du code C dans un programme ASM
    Bonjour,

    Je voudrais savoir si l'on peux insérer du code C dans un programme en assembleur.

    En effet, j'ai des multiplications et division a faire dans le style : x = ((887*5)/1024)+0,475)/0,0475
    c'est jouable en assembleur ?

    qu'en pensez-vous ?

    Je vous remercie par avance de vos remarques ou de vos réponses.

    Cordialement,

    Elecpic

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 35
    Points : 50
    Points
    50
    Par défaut
    Salut,

    En général on fait plutôt l'inverse...appel d'un morceau d'assembleur à partir du C.
    Cela dit, autant tout faire en langage C.
    1/ quel microcontrôleur utilises-tu ?
    2/ Combien de temps as-tu pour faire le calcul ?
    3/ Aquelle fréquence fonctionne ton micro ?
    Les petits 8 bits peuvent faire des calculs flottants si tu n'es pas trop pressé.
    Il existe différentes astuces pour éviter les calculs flottants mais c'est un peu plus compliqué.
    La solution est de tourner un peu plus vite si ton micro n'est pas à la vitesse max ou de migrer sur un modèle plus rapide.

    a+

  3. #3
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Consultant en Systèmes Embarqués
    Inscrit en
    Avril 2002
    Messages
    3 190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Systèmes Embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 190
    Points : 11 573
    Points
    11 573
    Par défaut
    Citation Envoyé par elecpic Voir le message
    qu'en pensez-vous ?
    Que la dernière fois que j'ai fait de tels trucs, c'était y a 20 ans

    Si tu peux faire comme le suggère intelligemment ohayo, ça fera moins mal à la tête.

    ps : en assembleur ta multiplication peut être une somme (de 887) dans une boucle pour le faire 5 fois, une division par 1024 peut être par une rotation à droite de 10 bits ? Et la division par 0,0475... soit avec du Doliprane ? Soit en multipliant par 21,0526315789 ? Ou par une suite de soustraction ?
    La science ne nous apprend rien : c'est l'expérience qui nous apprend quelque chose.
    Richard Feynman

  4. #4
    Membre du Club

    Inscrit en
    Mars 2008
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 75
    Points : 66
    Points
    66
    Par défaut faudrais songer a changer de langage...
    Bonjour,

    Désolé pour cette réponse tardive... confinement = nettoyage de printemps

    pour ma part, j'aime bien l'assembleur car : Pas de bibliothèque en include -> meilleure compréhension des modules du pic et des data-sheet des composants externes.

    ... Bon, cela dit, j'aimerais bien commencer un langage plus évolué (le C entre autre) et passer à d'autre famille que les 16F.
    Pour cela, existe-t'il des tutos bien fait ?

    Courage pour le confinement et merci de vos réponses.

    Cordialement,

    Elecpic

  5. #5
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Consultant en Systèmes Embarqués
    Inscrit en
    Avril 2002
    Messages
    3 190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Systèmes Embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 190
    Points : 11 573
    Points
    11 573
    Par défaut
    Citation Envoyé par elecpic Voir le message
    pour ma part, j'aime bien l'assembleur car : Pas de bibliothèque en include -> meilleure compréhension des modules du pic et des data-sheet des composants externes.
    Toute à fait et il oblige à avoir de la rigueur dans la gestion de la mémoire (notamment dans les appels de pile)

    Citation Envoyé par elecpic Voir le message
    Bon, cela dit, j'aimerais bien commencer un langage plus évolué (le C entre autre) et passer à d'autre famille que les 16F.
    Et c'est peut être le moment de passer à un autre fabricant

    Moi j'ai commencé sur Motorola puis PIC16F en 100% assembleur, ensuite j'ai appris le C et très vite je me suis rendu compte des faiblesses des PIC mid-range si on le compare à des petits MSP430 de chez Texas ou des ATMEGA chez Atmel (propriété de Mircochip.)

    - Stack matérielle (PIC16/18) vs Stack en mémoire (MSP430 et AVR)
    - 1 malheureux registre de travail 8 bits W (PIC16/18) vs 12 registres de 16 bits de travail (MSP430)
    - Compilateur proprio (PIC) vs Compilo GCC (MSP430, AVR, PC, ARM)

    Par contre je trouve que Microchip a une gamme de micro 10F extrêmement intéressante par rapport aux autres.

    Citation Envoyé par elecpic Voir le message
    Pour cela, existe-t'il des tutos bien fait ?
    Pas sur que tu aies besoin d'un tuto, le parallèle est souvent intuitif.
    La science ne nous apprend rien : c'est l'expérience qui nous apprend quelque chose.
    Richard Feynman

  6. #6
    Membre du Club

    Inscrit en
    Mars 2008
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 75
    Points : 66
    Points
    66
    Par défaut Mais par ou commencer ?
    Bonjour Vincent,

    Ok, je vais partie sur un nouveau langage.
    Par ailleurs, je programme sur Delphi 7 (Pascal) et j'ai donc de bonne base.

    Mais par ou commencer ?
    Existe-il est tuto en C pour pic? (j'ai un stock à la maison, autant les épuiser !)
    est-il possible d'avoir un code très simple (en C ) dans le style : faire clignoter une led ?

    Je te remercie infiniment pour ta patience.

    Elecpic

  7. #7
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Consultant en Systèmes Embarqués
    Inscrit en
    Avril 2002
    Messages
    3 190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Systèmes Embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 190
    Points : 11 573
    Points
    11 573
    Par défaut
    Salut,
    Avec MPLAB ça donnerait un truc comme ça (le programme met le port B en sortie et met tout le port à 1)

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    #define _XTAL_FREQ 4000000       //4 MHz pour le quartz
    #include <xc.h> // j'inclue le fichier qui définie ce qu'est TRISB, PORTB, et tous les autres registres. En fait ce sont les adresses des registres qui se trouvent derrière ces noms.
     
    void main(void) 
    {
        TRISB = 0x00;          // tout le port B en sortie (le 0x de 0x00 signifie que je cause en hexa, si j'avais mis 0 c'était 0 en décimal
        PORTB = 0xFF;    // tout le port B à High (le 0x de 0xFF signifie que je cause en hexa, mais j'aurai pu écrire 255 en décimal
     
        while (1) // boucle inifinie 
        {
            ; // ne rien faire
        }
     
        return; 
    }


    Si je ne me trompe pas (attention ça fait 20 ans que j'ai pas fait d'assembleur) ça doit donner un truc comme ça.


    Code ASM : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    ; TODO INSERT CONFIG CODE HERE USING CONFIG BITS GENERATOR
    #INCLUDE <P16F84A.INC>
    RES_VECT  CODE    0x0000            ; vecteur reset
        GOTO    START                   ; on demarre a l'etiquette start
     
     
     
    MAIN_PROG CODE                      ; let linker place main program
     
     MAIN
        BSF STATUS, RP0                      ; je vais en bank1
        MOVLW 0x00
        MOVWF TRISB                      ; je mets TRISB à 0  pour tout mettre en sortie
        BCF STATUS, RP0                      ; je vais en bank0
        MOVLW 0xFF
        MOVWF TRISB                      ; je mets PORTB à 1  pour tout mettre en sortie
     
     
    ATTENDRE
         GOTO ATTENDRE
     
        END

    Je pense que le parallèle n'est pas trop hard.
    La science ne nous apprend rien : c'est l'expérience qui nous apprend quelque chose.
    Richard Feynman

  8. #8
    Membre du Club

    Inscrit en
    Mars 2008
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 75
    Points : 66
    Points
    66
    Par défaut C 'est si simple !
    Bonjour,

    Merci pour cet exemple. Je me lance donc vers la programmation en C.
    Je vais commencer par 'décortiqué ' ton morceau de code... avec l'aide d'un bon tuto

    Par ailleurs, je viens de comprendre 2 choses :
    - l'assembleur est parfait pour aller au cœur des pics (manipulation des registres), mais c'est parfois compliqué quand on a un programme de 700 lignes avec des calculs a la
    - le C ( je crois ) permet des calculs quasi impossible en assembleur, permet (si je ne m'abuse) d'inclure des bibliothèque de composants et donc de manipuler des fonctions.

    Je m’arrête la, en clôturant cette discutions et te remercie très vivement pour tes conseils.

    Cordialement,
    Elecpic

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 35
    Points : 50
    Points
    50
    Par défaut
    Bonjour

    Pour référence : tutoriel pour apprendre le langage C embarqué sur le simulateur de MPLAB X : https://microchipdeveloper.com/tls2101:start
    Le tutoriel est fait sur un PIC24 (16 bits) mais les principes sont absolument les même pour les PIC 8 bits (PIC16 et PIC18)

    Bon courage

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 22/04/2007, 08h31
  2. introduire du code assembleur dans un programme C++
    Par hzaki1986 dans le forum C++
    Réponses: 1
    Dernier message: 14/04/2007, 17h14
  3. Inserer du code javascript dans un wiki
    Par c.betty dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 27/02/2007, 21h01
  4. compiler du code c dans un programme cpp
    Par momofiant dans le forum C++
    Réponses: 1
    Dernier message: 05/01/2007, 10h39
  5. Réponses: 2
    Dernier message: 07/07/2006, 21h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo