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 ---
On parle des Pics, sans rapport avec le langage ou la programmation

Modérateur : Jérémy

Utilisation du coprocesseur flottant Micromega uM-FPU
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#11 Message par Jérémy » ven. 22 févr. 2019 18:36

Merci Claudius de ces précisions. Je pensais qu'il s'agissait d'une sorte de FPGA spéciale floatpoint !

cela me parait un peu compliqué pour mon niveau actuel , mais je vais vous lire avec attention
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Utilisation du coprocesseur flottant Micromega uM-FPU
F6FCO
Avatar de l’utilisateur
Expert
Expert
Messages : 1412
Âge : 70
Enregistré en : décembre 2017
Localisation : Furtif je suis.
Contact :

#12 Message par F6FCO » ven. 22 févr. 2019 19:49

Bonsoir tous,
J'ai aussi reçu le mien, pour le moment sur le bureau parce que je suis très occupé par un bug récalcitrant sur 4L1C3. Je tiens à régler ce problème avant de m'intéresser au FPU, sinon le bug risque de devenir définitif :furieux:

Claudius, pour qu'on fasse et parle de la même chose dans ce sujet (et surtout parce que pour ce projet tu vas être mon maître), comment vas-tu le relier au PIC ?
SPI 2 wires ? SPI 3 wires ? I²C ?
Tu programmes en ASM ?

J'ai regardé le datasheet, tout en langue du chat qui expire, j'avoue que je suis un peu à la rue. Sinon j'ai installé l'IDE et un peu joué avec, pas grand chose, juste fais le tutorial proposé en page 10 du manual qu'on trouve dans le menu HELP de l'IDE.

On le programme dans une espèce de Basic:

Code : Tout sélectionner


distance    WAR Word
Radius    equ F10

Radius
=distance/1000

On appuie ensuite sur le bouton compile et il nous donne le code à intégrer dans le programme du PIC. Jeremy tu peux si tu veux obtenir du code en CCS C PIC,
pour ma part j'ai sélectionné MPASM donc il ma généré du code asm. Le seul truc qui me chagrine c'est qu'il y a plein de variables dans ce code et je ne sais pas encore trop comment (ou s'il faut) les déclarer.
Une porte nand prend 2 bits en entrée... la cochonne !!! :langue:

Utilisation du coprocesseur flottant Micromega uM-FPU
Claudius
Avatar de l’utilisateur
Passioné
Passioné
Messages : 260
Âge : 68
Enregistré en : septembre 2015
Localisation : ELANCOURT (78 - YVELINES)
Contact :

#13 Message par Claudius » ven. 22 févr. 2019 20:37

Bonsoir F6FCO et à tous,

Mon PIC sera relié en I2C et programmé en assembleur

A l'occasion, peux-tu fournir le code assembleur généré qui, je l'espère, compile sans problème

Je suis toujours intéressé par ce que génèrent les IDE et autres L4G qui embarquent, par expérience, 80% de code inutile et de plus, difficilement lisible mais cela ne me fait pas peur - s'il compile (ou plutôt s'assemble, c'est déjà un bon début ;-)

Utilisation du coprocesseur flottant Micromega uM-FPU
F6FCO
Avatar de l’utilisateur
Expert
Expert
Messages : 1412
Âge : 70
Enregistré en : décembre 2017
Localisation : Furtif je suis.
Contact :

#14 Message par F6FCO » ven. 22 févr. 2019 21:05

Donc je vais étudier l'I²C sur le 18F4525, encore jamais fais çà.

Voilà le code que tu obtiens dans la fenêtre OUTPUT après compilation. Rien de bien sorcier, juste des appels au FPU, c'est surtout que je ne sais pas comment MPLab va gérer les variables générées par le FPU. Et si c'est au programmeur de les déclarer, à quelle taille et que mettre comme valeur dedans ?.
C'est bien joli de dire movlw SELECTA, mais que vaut SELECTA ?

Code : Tout sélectionner

;-------------------- uM-FPU Register Definitions -----------------------------
#define    Radius        .10        ; uM-FPU register

;-------------------- Variable Definitions ------------------------------------
distance    res    2        ; signed word variable 

;-------------------- Generated Code ------------------------------------------
    ; distance    VAR Word
    
; Radius        equ F10
    
; 
    
; Radius=distance/1000
    movlw    SELECTA
    call    fpu_write
    movlw    Radius
    call    fpu_write
    movlw    LOADWORD
    call    fpu_write
    movf    distance
, W
    call    fpu_write
    movf    distance
+1, W
    call    fpu_write
    movlw    FSET0
    call    fpu_write
    movlw    LOADWORD
    call    fpu_write
    movf    1000
, W
    call    fpu_write
    movf    1000
+1, W
    call    fpu_write
    movlw    FDIV0
    call    fpu_write

Une porte nand prend 2 bits en entrée... la cochonne !!! :langue:

Utilisation du coprocesseur flottant Micromega uM-FPU
Claudius
Avatar de l’utilisateur
Passioné
Passioné
Messages : 260
Âge : 68
Enregistré en : septembre 2015
Localisation : ELANCOURT (78 - YVELINES)
Contact :

#15 Message par Claudius » sam. 23 févr. 2019 00:14

Super, merci pour le code qui se lit comme un poème ou presque ;-)

Déjà, le code est incomplet (il ne peut pas se compiler) comme tu l'as remarqué si justement :
- l'appel à 'fpu_write' qui prend le registre W du PIC en argument correspond à l'écriture dans le uM-FPU sans préjuger de l'interface I2C ou SPI
=> A définir @ la datasheet (§ I2C Data Transfers avec I2C Write Data Transfer et I2C Read Data Transfer si I2C choisie)

- Les codes SELECTA, LOADWORD, FSET0 et FDIV0 correspondent aux définitions spécifiées dans uM-FPU V3.1 - Instruction Set - § Appendix A - uM-FPU V3.1 Instruction Summary - Page 63 (ex: SELECTA égal à 0x01 et signifie "Sélection du Registre A")

- Le séquencement de chaque commande est entièrement définie et par exemple

Code : Tout sélectionner

    movlw   LOADWORD
    call    fpu_write
    movf    distance, W
    call    fpu_write
    movf    distance+1, W
    call    fpu_write

indique d'initialiser reg[0] du uM-FPU avec float(signed b1*256 + b2) ; soit ici la distance sur 16 bits en 2 écritures de 8 bits (msb suivi du lsb)
=> et voilà la distance transférée et convertie en flottant dans le uM-FPU prête à être utilisée...

On trouve plus loin le même type de code

Code : Tout sélectionner

    movlw   LOADWORD
    call    fpu_write
    movf    1000, W
    call    fpu_write
    movf    1000+1, W
    call    fpu_write

mais là, j'ai des doutes sur la validité car 1000 est le diviseur dans ton code "Radius=distance/1000" et j'aurais plutôt vu:

Code : Tout sélectionner

    movlw   LOADWORD
    call    fpu_write
    movlw   0x03                  ; 1000 en décimal = 0x03E8 en hexadécimal
    call    fpu_write
    movlw   0xE8
    call    fpu_write


- Ensuite, FSET0 exécute dans le uM-FPU l'affectation reg[A] = reg[0] et FDIV0 la division tant attendue reg[A] = reg[A] / reg[0]

- Reste à récupérer le résultat que je ne vois pas dans le code généré et qui devrait s'appuyer sur une séquence FREAD nn b1,b2,b3,b4 - Read 32-bit floating point from reg[nn] que je verrai comme

Code : Tout sélectionner

    movlw   FREAD
    call    fpu_write
    call    fpu_read       ; Lecture du résultat au format IEEE 754 de la division
    movwf   B1,f
    call    fpu_read
    movwf   B2,f
    call    fpu_read
    movwf   B3,f
    call    fpu_read
    movwf   B4,f


Maintenant, comme tu ne parles pas IEEE 754 (comme moi d'ailleurs ;-), il y a une jolie commande du uM-FPU qui convertit le format IEEE 754 en une string ASCII; à savoir : FTOA,bb Convert floating point to ASCII string

J'avoue que c'est un peu fastidieux au début mais c'est comme une calculatrice programmable avec son langage propre qui est une succession de commandes à passer au uM-FPU et de lectures des réponses

NB: Consulter la page Downloads commune à tous les uM-FPU

Utilisation du coprocesseur flottant Micromega uM-FPU
F6FCO
Avatar de l’utilisateur
Expert
Expert
Messages : 1412
Âge : 70
Enregistré en : décembre 2017
Localisation : Furtif je suis.
Contact :

#16 Message par F6FCO » sam. 23 févr. 2019 14:18

Merci Claudius, j'ai de quoi aller gratter maintenant. Donc c'est bien à nous de déclarer les variables telles que SELECTA ou autres en leur donnant les valeurs indiquées dans le PDF Instructions Set.
Ils auraient quand même pu faire un effort de ce coté-là :wink:
Une porte nand prend 2 bits en entrée... la cochonne !!! :langue:

Utilisation du coprocesseur flottant Micromega uM-FPU
Claudius
Avatar de l’utilisateur
Passioné
Passioné
Messages : 260
Âge : 68
Enregistré en : septembre 2015
Localisation : ELANCOURT (78 - YVELINES)
Contact :

#17 Message par Claudius » sam. 23 févr. 2019 15:32

C'est exactement cela F6FCO...
En pièce jointe, un fichier de définition de toutes les commandes SELECTA and Co. avec leur fonctionnalité pour un uM-FPU64 qui est plus complet qu'un uM-FPU V3.1

S'agissant de "Ils auraient quand même pu faire un effort de ce coté-là", peut-être qu'il manque un bouton à cocher ;-)

De toute façon, l'important est la liste des instructions avant les appels à fpu_write et après les appels à fpu_read, méthodes qu'il faut écrire pour une interface I2C suivant les spécifications particulières pour un uM-FPU (notamment son adresse 0xC8 pour une écriture et 0xC9 pour une lecture) :

ScreenClip-I2C-uM-FPU-Write.jpg

ScreenClip-I2C-uM-FPU-Read.jpg
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.

Utilisation du coprocesseur flottant Micromega uM-FPU
F6FCO
Avatar de l’utilisateur
Expert
Expert
Messages : 1412
Âge : 70
Enregistré en : décembre 2017
Localisation : Furtif je suis.
Contact :

#18 Message par F6FCO » sam. 23 févr. 2019 20:06

Hum... il a dit "bouton à cocher" :geek:
Une porte nand prend 2 bits en entrée... la cochonne !!! :langue:

Utilisation du coprocesseur flottant Micromega uM-FPU
Temps-x
Avatar de l’utilisateur
Expert
Expert
Messages : 2585
Enregistré en : juillet 2016
Localisation : Terre

#19 Message par Temps-x » dim. 24 févr. 2019 16:02

Bonsoir F6FCO, Claudius, Jérémy, et tout le forum,

:sifflotte: Hum....

Je me demande pourquoi ce qui font du langage C pour microcontrôleur Pic, utilise ce circuit, alors qu'ils peuvent
très bien prendre un microcontrôleur Pic 32 bits, ce qui simplifie tous le reste, que ça soit en rapidité, ou calcul.

A++
:roll: Les requins, c'est comme le langage ASM, c'est le sommet de la chaîne alimentaire. :wink:

Utilisation du coprocesseur flottant Micromega uM-FPU
Claudius
Avatar de l’utilisateur
Passioné
Passioné
Messages : 260
Âge : 68
Enregistré en : septembre 2015
Localisation : ELANCOURT (78 - YVELINES)
Contact :

#20 Message par Claudius » dim. 24 févr. 2019 19:54

Bonsoir Temps-x et à tous,

Entièrement d'accord avec toi Temps-x, la solution software avec de telles "bêtes" que sont les PIC32 cadencés à 32 MHz voire plus et bien programmés (avec notamment un OS Temps Réel derrière comme le Microchip PIC32 MX RTOS ;-) est globalement plus efficace...

Maintenant, je dirai que c'est un exercice de style dans un but pédagogique, de contrainte informatique et de challenge puisque le but, du moins pour moi, est d'interfacer un opérateur flottant avec un des moins puissants PIC cadencé à 4 MHz et programmé, cela va de soit, en assembleur

J'adore faire tourner des tâches en //, déléguer celles impossibles à réaliser avec le µC choisi et décortiquer les datasheet ...

Quelle satisfaction intellectuelle ! à la fin ;-)


Retourner vers « Généralités sur les PICs »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 4 invités