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 ---
- 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 ---
Modérateur : Jérémy
Utilisation du coprocesseur flottant Micromega uM-FPU
Utilisation du coprocesseur flottant Micromega uM-FPU
- F6FCO
Expert- Messages : 1948
- Âge : 70
- Enregistré en : décembre 2017
- Localisation : Furtif je suis.
- Contact :
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
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:
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.
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
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.
Utilisation du coprocesseur flottant Micromega uM-FPU
- Claudius
Passionné- Messages : 260
- Âge : 69
- Enregistré en : septembre 2015
- Localisation : ELANCOURT (78 - YVELINES)
- Contact :
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 ;-)
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 ;-)
Enregistreur de traces GPS & Boussole GPS parlante (PIC & Arduino)
Utilisation du coprocesseur flottant Micromega uM-FPU
- F6FCO
Expert- Messages : 1948
- Âge : 70
- Enregistré en : décembre 2017
- Localisation : Furtif je suis.
- Contact :
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 ?
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
Utilisation du coprocesseur flottant Micromega uM-FPU
- Claudius
Passionné- Messages : 260
- Âge : 69
- Enregistré en : septembre 2015
- Localisation : ELANCOURT (78 - YVELINES)
- Contact :
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
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
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:
- 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
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
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
Enregistreur de traces GPS & Boussole GPS parlante (PIC & Arduino)
Utilisation du coprocesseur flottant Micromega uM-FPU
- F6FCO
Expert- Messages : 1948
- Âge : 70
- Enregistré en : décembre 2017
- Localisation : Furtif je suis.
- Contact :
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à
Ils auraient quand même pu faire un effort de ce coté-là
Utilisation du coprocesseur flottant Micromega uM-FPU
- Claudius
Passionné- Messages : 260
- Âge : 69
- Enregistré en : septembre 2015
- Localisation : ELANCOURT (78 - YVELINES)
- Contact :
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) :
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) :
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Enregistreur de traces GPS & Boussole GPS parlante (PIC & Arduino)
Utilisation du coprocesseur flottant Micromega uM-FPU
Utilisation du coprocesseur flottant Micromega uM-FPU
Bonsoir F6FCO, Claudius, Jérémy, et tout le forum,
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++
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++
Utilisation du coprocesseur flottant Micromega uM-FPU
- Claudius
Passionné- Messages : 260
- Âge : 69
- Enregistré en : septembre 2015
- Localisation : ELANCOURT (78 - YVELINES)
- Contact :
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 ;-)
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 ;-)
Enregistreur de traces GPS & Boussole GPS parlante (PIC & Arduino)
Retourner vers « Généralités sur les PICs »
Qui est en ligne
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 11 invités