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 ---
Forum général sur l'Assembleur !

Modérateur : mazertoc

Afficheur lcd
Temps-x
Avatar de l’utilisateur
Expert
Expert
Messages : 2595
Enregistré en : juillet 2016
Localisation : Terre

#21 Message par Temps-x » sam. 15 juil. 2017 03:59

Bonjour JMarc, paulfjujo, et bonjour à tous,

paulfjujo, d'après toi, comment il font en C, BASIC, PASCAL, pour avoir des temps précis, pour tous oscillateur ?

Il y a bien une fonction qui doit s'occuper de cela, suppose que tu as un quartz de 6Mhz dans ta déclaration, comment le compilateur C
va interpréter cela ?

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

Afficheur lcd
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2589
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#22 Message par paulfjujo » sam. 15 juil. 2017 18:14

Temps-x a écrit :.. d'après toi, comment il font en C, BASIC, PASCAL, pour avoir des temps précis, pour tous oscillateur ?
Il y a bien une fonction qui doit s'occuper de cela, suppose que tu as un quartz de 6Mhz dans ta déclaration, comment le compilateur C
va interpréter cela ?
A+


avec MikroC, il n'interprete rien ..
il faut lui dire .
valeur FOSC à mettre dans Edit Project ..MCU clock frequency


Config_6Mhz.jpg



Tous les Delay_uS et Delay_mS sont calculés à partir de cette valeur
de meme pour les UART Baud rate ...
C'est pourquoi il est fort utile de toujours verifier , au moins 1 fois , avec un petit clignotement de Led à 1sec
que le MCU oscille et que le FOSC correspond bien.

on peut recuperer la valeur mise dans la config via

Code : Tout sélectionner

unsigned int  k;
kGet_Fosc_kHz() ;
 

Ce n'est pas une indication super fiable, puisque c'est le programmeur qui fournit cette info .
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Aide toi, le ciel ou FantasPic t'aidera

Afficheur lcd
Temps-x
Avatar de l’utilisateur
Expert
Expert
Messages : 2595
Enregistré en : juillet 2016
Localisation : Terre

#23 Message par Temps-x » dim. 16 juil. 2017 01:58

Bonjour JMarc, paulfjujo, et bonjour à tous,

D'accord, mais il y a un programme qui effectue les tempos, par rapport à ce que tu lui as rentrée, par exemple,
si tu veux une tempo de 200 millisecondes, au moment de la compilation le programme va ajuster la tempo en
fonction du FOSC qui est fournit par le programmeur.

Je conclus pour dire, qu'il y a une astuce pour faire un telle chose, surement un programme, qui doit faire les tempos
quand lui demande automatiquement, en fonction du FOSC.

En ASM quand on veut faire une tempo, on se sert généralement d'un petit programme, comme celui qui est décrit par
Guigui02 viewtopic.php?p=5856#p5856, le C doit faire la même chose, mais automatisé.

A+
Modifié en dernier par Temps-x le dim. 16 juil. 2017 13:12, modifié 1 fois.
:roll: Les requins, c'est comme le langage ASM, c'est le sommet de la chaîne alimentaire. :wink:

Afficheur lcd
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2589
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#24 Message par paulfjujo » dim. 16 juil. 2017 11:29

bonjour à tous,


Temps-x a écrit :Je conclus pour dire, qu'il y a une astuce pour faire un telle chose, surement un programme, qui doit faire les tempos
quand lui demande automatiquement, en fonction du FOSC.

Exact ..
Attention!! mais pas aussi visible avec mikroC
il faut fouiller dans
built_in.h header file (located in the include folder of the compiler)
Their sources can be found in Delays.c file located in the uses folder of the compiler.


exemple extrait :

Code : Tout sélectionner


void VDelay_Advanced_ms
(unsigned Time_ms, unsigned Current_Fosc_kHz){
unsigned long NumberOfCyc;
  NumberOfCyc = Current_Fosc_kHz >> 2;
  NumberOfCyc *= Time_ms;
  if (NumberOfCyc < 690)
    return;
  NumberOfCyc -= 690;
  NumberOfCyc =  NumberOfCyc >> 5; // Dec and While below take around 32 instructions
  while (NumberOfCyc--)
    {
      asm nop;
      asm nop;
      asm nop;
      asm nop;
      asm nop;
      asm nop;
      asm nop;
      asm nop;
    }
}


autre exemple tiré du fichier *.lst resultant de la compilation de
Delay_ms(1000);
Delay_ms(990);
Delay_ms(512);

Code : Tout sélectionner



;PIC_TX_16F1847_170715.c,495 ::         

;
PIC_TX_16F1847_170715.c,498 ::         Delay_ms(1000);
0x02D5    0x3015          MOVLW      21
0x02D6    0x00FB          MOVWF      R11
0x02D7    0x304B          MOVLW      75
0x02D8    0x00FC          MOVWF      R12
0x02D9    0x30BE          MOVLW      190
0x02DA    0x00FD          MOVWF      R13
L_main41
:
0x02DB    0x0BFD          DECFSZ     R131
0x02DC    0x2ADB          
GOTO       L_main41
0x02DD    0x0BFC          DECFSZ     R12
1
0x02DE    0x2ADB          
GOTO       L_main41
0x02DF    0x0BFB          DECFSZ     R11
1
0x02E0    0x2ADB          
GOTO       L_main41
0x02E1    0x0000          NOP
;PIC_TX_16F1847_170715.c,499 ::         Delay_ms(990);
0x02E2    0x3015          MOVLW      21
0x02E3    0x00FB          MOVWF      R11
0x02E4    0x3017          MOVLW      23
0x02E5    0x00FC          MOVWF      R12
0x02E6    0x30CB          MOVLW      203
0x02E7    0x00FD          MOVWF      R13
L_main42
:
0x02E8    0x0BFD          DECFSZ     R131
0x02E9    0x2AE8          
GOTO       L_main42
0x02EA    0x0BFC          DECFSZ     R12
1
0x02EB    0x2AE8          
GOTO       L_main42
0x02EC    0x0BFB          DECFSZ     R11
1
0x02ED    0x2AE8          
GOTO       L_main42
0x02EE    0x0000          NOP
0x02EF    0x0000          NOP
;PIC_TX_16F1847_170715.c,500 ::         Delay_ms(512);
0x02F0    0x300B          MOVLW      11
0x02F1    0x00FB          MOVWF      R11
0x02F2    0x3064          MOVLW      100
0x02F3    0x00FC          MOVWF      R12
0x02F4    0x30B4          MOVLW      180
0x02F5    0x00FD          MOVWF      R13
L_main43
:
0x02F6    0x0BFD          DECFSZ     R131
0x02F7    0x2AF6          
GOTO       L_main43
0x02F8    0x0BFC          DECFSZ     R12
1
0x02F9    0x2AF6          
GOTO       L_main43
0x02FA    0x0BFB          DECFSZ     R11
1
0x02FB    0x2AF6          
GOTO       L_main43
0x02FC    0x0000          NOP



nota : les valeurs sont definies en DUR pour initialiser R11 ,R12 et R13 pour chaque valeur de tempo
je pense que c'est fait par le pre-processor qui utilise la directive valeur MCU FOSC xx.Mhz
et eventuelle PLL active ou pas .

Nota: Les Delay_uS et Delay_ms sont utilisées comme des macros !
si on en utilise beaucoup , autant les mettre dans des sous programmes !
Aide toi, le ciel ou FantasPic t'aidera

Afficheur lcd
JMarc
Confirmé
Confirmé
Messages : 605
Enregistré en : août 2016
Localisation : Dans le Sud...

#25 Message par JMarc » dim. 16 juil. 2017 11:43

Bonjour Paulfjujo et Temps-x

paulfjujo a écrit :
Nota: Les Delay_uS et Delay_ms sont utilisées comme des macros !
si on en utilise beaucoup , autant les mettre dans des sous programmes !


ben alors c'etait bon ma macro :sifflotte:


bon grace au lien ci dessus sur les logiciels pour la creation des tempos, j'ai pensé a cette sous routines qui va mettre tres utile et facile a modifier :-D

Avec un appel

Code : Tout sélectionner

rcall Tempo_ms_100


Code : Tout sélectionner

Tempo_ms_100
    local tempoboucle1
    local tempoboucle2
    local tempoboucle3
    movlw D
'100'   
    movwf msd3
tempoboucle3
    movlw D
'7'     pour quartz 20 mhz
    movwf msd2
tempoboucle2
    movlw D
'237'
    movwf msd1
tempoboucle1
    decfsz msd1
    bra tempoboucle1
    decfsz msd2
    bra tempoboucle2
    decfsz msd3
    bra tempoboucle3
    return



ou bien en macro avec appel

Code : Tout sélectionner

Tempo_ms .100

.100 pour 100 ms

ou bien mettre valeur au choix entre 1 et 255

Code : Tout sélectionner

Tempo_ms    MACRO a1
    local tempoboucle1
    local tempoboucle2
    local tempoboucle3
    movlw a1   
    movwf msd3
tempoboucle3
    movlw D
'7'     pour quartz 20 mhz
    movwf msd2
tempoboucle2
    movlw D
'237'
    movwf msd1
tempoboucle1
    decfsz msd1
    bra tempoboucle1
    decfsz msd2
    bra tempoboucle2
    decfsz msd3
    bra tempoboucle3
    ENDM

Afficheur lcd
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2589
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#26 Message par paulfjujo » dim. 16 juil. 2017 15:03

:+1: bien , de differencier macro et Subroutine.

Attention!! ATTENTION pour les macros
si tes variables msd1,msd2,msd3 ne sont pas dans la zone BANK commune ..
accessible depuis n'importe quelle position dans l'espace RAM
je suspecte un risque d'effet de bords ou plantage

la banque en cours n'etant pas forcement la meme au moment de l'appel de cette macro

idea ! attendons l' Avis d'un specialiste ASM ?
Aide toi, le ciel ou FantasPic t'aidera

Afficheur lcd
JMarc
Confirmé
Confirmé
Messages : 605
Enregistré en : août 2016
Localisation : Dans le Sud...

#27 Message par JMarc » dim. 16 juil. 2017 19:16

Je les ai déclarés comme ceci dans le programme

Code : Tout sélectionner

   Local loop,loop1,loop2,msd1,msd2,msd3,usd1,usd2,usd3
    Group_Local udata 
    loop res 1  
; boucle pour macro Delay 
    loop1 res 1
    loop2 res 1
    msd1 res 1
    msd2 res 1
    msd3 res 1
    usd1 res 1
    usd2 res 1
    usd3 res 1


puis avec un include

Code : Tout sélectionner

;  pour quartz 20 mhz pic 18F
;  variable a déclarer dans le programme principal
;  msd1,msd2,msd3 usd1,usd2,usd3 
;******************************************************************************* 

Tempo_10us    MACRO a1
    local tempoboucle1
    local tempoboucle2
    local tempoboucle3
    movlw a1    
    movwf usd3
tempoboucle3
    movlw D
'5'    pour quartz 20 mhz
    movwf usd2
tempoboucle2
    movlw D
'2'
    
movwf usd1
tempoboucle1
    decfsz usd1
    bra tempoboucle1
    decfsz usd2
    bra tempoboucle2
    decfsz usd3
    bra tempoboucle3
    ENDM
;*********************************************************
Tempo_ms    MACRO a1
    local tempoboucle1
    local tempoboucle2
    local tempoboucle3
    movlw a1    
    movwf msd3
tempoboucle3
    movlw D
'7'    pour quartz 20 mhz
    movwf msd2
tempoboucle2
    movlw D
'237'
    
movwf msd1
tempoboucle1
    decfsz msd1
    bra tempoboucle1
    decfsz msd2
    bra tempoboucle2
    decfsz msd3
    bra tempoboucle3
    ENDM
;******************************************************    
Tempo_10ms    MACRO a1
    local tempoboucle1
    local tempoboucle2
    local tempoboucle3
    movlw a1    
    movwf msd3
tempoboucle3
    movlw D
'70'    pour quartz 20 mhz
    movwf msd2
tempoboucle2
    movlw D
'237'
    
movwf msd1
tempoboucle1
    decfsz msd1
    bra tempoboucle1
    decfsz msd2
    bra tempoboucle2
    decfsz msd3
    bra tempoboucle3
    ENDM
    

Afficheur lcd
Temps-x
Avatar de l’utilisateur
Expert
Expert
Messages : 2595
Enregistré en : juillet 2016
Localisation : Terre

#28 Message par Temps-x » jeu. 20 juil. 2017 02:03

Bonjour JMarc, paulfjujo, et bonjour à tous,


écrit par paulfjujo :

idea ! attendons l' Avis d'un spécialiste ASM ?


Je ne suis pas un spécialiste ASM, mais ça reste mon langage, et je peux dire que oui, si au moment de l'appelle
on se trouve pas dans la banque approprié, le programme plante, c'est du vécu....

Ce qu'il faut faire, c'est sauvegarder la banque ou on se trouve, et la restaurer fin de macro, ou sous programme.
Donc, il est impérative de faire un sous programme qui s'occupe de cela.

écrit par JMarc :

ben alors c'etait bon ma macro :sifflotte:


Tu fais de l'assembleur, ça te permets d'optimiser ton code, alors ne copie pas sur les mauvais élèves, C, BASIC, PASCAL

Comme j'ai vraiment pas beaucoup de temps en ce moment, j'ai pas eu le temps de regardé ton code, mais si je peux, on va y
revenir. :wink:

A+
Modifié en dernier par Temps-x le jeu. 20 juil. 2017 21:15, modifié 3 fois.
:roll: Les requins, c'est comme le langage ASM, c'est le sommet de la chaîne alimentaire. :wink:

Afficheur lcd
Gérard
Avatar de l’utilisateur
Expert
Expert
Messages : 1640
Âge : 65
Enregistré en : septembre 2015
Localisation : Alsace - Haut-Rhin

#29 Message par Gérard » jeu. 20 juil. 2017 08:29

Temps-x a écrit :
...
De fait de l'assembleur, ça te permets d'optimiser ton code, alors ne copie pas sur les mauvais élèves, C, BASIC, PASCAL

...
A+


Je reste donc dans le camp des mauvais ... :sifflotte:
Le 18/04/19 je suis devenu papy de jumeaux, le 01/09/23 une petite cousine des jumeaux est née.

Afficheur lcd
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2589
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#30 Message par paulfjujo » jeu. 20 juil. 2017 10:33

Gérard a écrit :
Temps-x a écrit :
...
De fait de l'assembleur, ça te permets d'optimiser ton code, alors ne copie pas sur les mauvais élèves, C, BASIC, PASCAL

...
A+


me too ... :sifflotte:
Aide toi, le ciel ou FantasPic t'aidera


Retourner vers « Langage ASM »

Qui est en ligne

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