- 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 : mazertoc
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+
- paulfjujo
Expert- Messages : 2598
- Âge : 73
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
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
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;
k= Get_Fosc_kHz() ;
Ce n'est pas une indication super fiable, puisque c'est le programmeur qui fournit cette info .
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+
- paulfjujo
Expert- Messages : 2598
- Âge : 73
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
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 ..
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 R13, 1
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 R13, 1
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 R13, 1
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 !
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
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
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
- paulfjujo
Expert- Messages : 2598
- Âge : 73
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
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
attendons l' Avis d'un specialiste ASM ?
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
écrit par paulfjujo :
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
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.
A+
Retourner vers « Langage ASM »
Qui est en ligne
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 140 invités