- 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
Je me régale
La commande dans le code source
Code : Tout sélectionner
movlw 'A'
rcall LCD_ENVOIS_DONNEES
et la routine dans le fichier inc. pour l'instant je n'utilise pas toutes les pates du port données mais patience, je vais le faire
Code : Tout sélectionner
LCD_ENVOIS_DONNEES
movwf LCD_DONNEES ; sauvegarde de la donnée
bsf lcd_e ; enable on
movwf lcd_port ; envoi de la donnée
rcall Wait50µs
bcf lcd_e ; enable off
swapf LCD_DONNEES,w ; seconde partie de l'octet
bsf lcd_e
movwf lcd_port
rcall Wait50µs
bcf lcd_e
return
et félicitation pour ta ténacité,
Quelle est la différence entre le 16f et le 18f pour notre afficheur ?
- les instructions
- la vitesse
- la mémoire
- double interruptions, (principal, et non principal)
- plus d'option, sur les protocoles de communication
Moi, je vais doucement pour apprendre, toi on peut dire que tu fonces, et tu voudrais tous savoir.
JMarc il faut te laissé le temps d'apprendre, je sais, c'est passionnant d'apprendre ce qu'on aime faire.
Voici une tempo de 200 millisecondes, pour un 16Fxx avec un quartz à 4 Mhz
Code : Tout sélectionner
;********************************** pause de 200 millisecondes ********************************
_200mS
movlw D'63'
movwf d0
movlw D'157'
movwf d1
Delay_0
decfsz d0,F
goto $+2
decfsz d1,F
goto Delay_0
return
Et voici une tempo de 200 millisecondes, pour un 18Fxx avec un quartz à 4 Mhz
Code : Tout sélectionner
;********************************** pause de 200 millisecondes ********************************
_200mS
movlw D'63'
movwf d0
movlw D'157'
movwf d1
Delay_0
decfsz d0,F
goto $+6 <-------------- la ça change
decfsz d1,F
goto Delay_0
return
Tu voies, dans les 18Fxx, certaines instructions demandes beaucoup plus de cycle, mais les 18Fxx sont beaucoup plus rapides, et plus pratiques.
Voici un montage très intéressant sur les LCD de une, deux ou quatre lignes en 16 ou 20 caractères alphanumériques
avec un vieux, (ou vielle) PIC16F84 :
http://kudelsko.free.fr/interfaces/lcd_ ... mmaire.htm
A+
temps-x, tu vois, je l'ai lâché mon 16f877
Enfin une bonne nouvelle, pour commencer ma journée.
Peu t'on utiliser les tempos du langage C (delay_ms) en assembleur ?
A mon avis, je dirais que non, mais l’inverse est possible, on peu utiliser les tempos ASM en langage C
Maintenant il faudrait posé la question au spécialiste du langage C, moi je pratique ASM
Le C, BASIC, PASCAL, c'est du chinois pour moi, mais je comprends quelque ligne quand
je vois les registres.
A+
- paulfjujo
Expert- Messages : 2597
- Âge : 73
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
Je confirme ..
tu ne gagneras strictement rien à utiliser les delays de MikroC si tu utilises l'assembleur ..
exemple de l'asm généré par le compilo mikroc pour
les valeurs d'init des registres dependent de FOSC !
Delay_us(250);
Code : Tout sélectionner
0x000D 0x3002 MOVLW 2
0x000E 0x00FC MOVWF R12
0x000F 0x304B MOVLW 75
0x0010 0x00FD MOVWF R13
L_Comm_Delay0:
0x0011 0x0BFD DECFSZ R13, 1
0x0012 0x2811 GOTO L_Comm_Delay0
0x0013 0x0BFC DECFSZ R12, 1
0x0014 0x2811 GOTO L_Comm_Delay0
L_end_Comm_Delay:
0x0015 0x0008 RETURN
Delay_us(120);
Code : Tout sélectionner
0x0071 0x309F MOVLW 159
0x0072 0x00FD MOVWF R13
L_toggleCSN9:
0x0073 0x0BFD DECFSZ R13, 1
0x0074 0x2873 GOTO L_toggleCSN9
MikroC utilise des simili registres R0..R15 au lieu des registre PIC .. un peu comme sur les vieux PDP11 !
j'ai fais un peu d'assembleur PDP11.. en 1978
un des plus puissant ancien microprocesseur de l'epoque.
et le contraire ; une tempo en ASM dans mikroC
une tempo de 1mS ajustable à 0,25µS pres (FOSC=16MHz)
Code : Tout sélectionner
unsigned char N1;
N1=100; // initialise once the variable , to be reconized by compiler
void Tempo_1mS()
{
asm{
MOVLW 210 ;
MOVWF _N1; // 8 bit counter
ici:
nop ;// 1 x 0,25µS
nop ;
nop ;
nop ;
nop ;
nop ;
nop ;
nop ;
nop ;
nop ; //10
nop ;
nop ;
nop ;
nop ;
nop ;
nop ; //16
decfsz _N1 ,F ; //decr counter, skip over next instruction if equal to zero
bra ici ;
nop; // add 4x0.25=1µS to round tempo "pile poil" to 1000µS
nop;
nop;
nop;
} ;
}
par contre, à voir AUSSI, l'utilisation des timers 8 ou 16 bits pour faire des tempos..
Nez en moins , il peut etre interessant de voir comment le compilo interpretre des fonctions ecrites en C
Question de pif..
cela peut etre instructif.
exemple l'outil Timer de Mikroc
// PIC16F FOSC 16MHz
/ Timer1
//Prescaler 1:8; TMR1 Preload = 15536; Actual Interrupt Time : 100 ms
genere un code assez facilement transposable en asm
Code : Tout sélectionner
void InitTimer1(){
T1CON = 0x31;
TMR1IF_bit = 0;
TMR1H = 0x3C;
TMR1L = 0xB0;
TMR1IE_bit = 1;
INTCON = 0xC0;
}
void Interrupt(){
if (TMR1IF_bit){
TMR1IF_bit = 0;
TMR1H = 0x3C;
TMR1L = 0xB0;
//Enter your code here
}
}
J'ai pensé a faire cette macro avec passage de parametre Delay_ms .100 ici 100 pour 100 ms si je ne me suis pas trompé (a ajuster bien sur)
Code : Tout sélectionner
Delay_ms MACRO a1
Local Delayloop
local Delayloop1
local Delayloop2
movlw 4 ; 4 x pour 20 mhz
movwf loop2
Delayloop2
Movlw a1
MOVWF loop1
Delayloop1
MOVLW 0x98
MOVWF loop
Delayloop
DECFSZ loop, F
bra Delayloop ; x152
DECFSZ loop1, F
bra Delayloop1 ; x a1
decfsz loop2,f
bra Delayloop2 ; x 4 pour 20 mhz
ENDM
cela vous plait ?
cela vous plait ?
Ben pas trop, parce que une macro, ça réécrit un bout de programme, pour chaque appelle que tu vas lui demander,
tu vas te retrouver avec un programme énorme.
Par contre, tu peux faire un fichier : temps.inc, et le déclarer quand tu en as besoin dans ton programme et incoporer
des directives.
Bon JMarc, comme tu veux tout savoir, je vais te parler des directives :
#DEFINE
#IFDEF
#ENDIF
Code : Tout sélectionner
; selectionner le quartz approprié, et enlevez le point virgule dans la ligne, pour que le compilateur en prenne compte.
;#DEFINE quartz4
;#DEFINE quartz8
;#DEFINE quartz16
;#DEFINE quartz20
#IFDEF quartz4
; code à metre
#ENDIF
#IFDEF quartz8
; code à metre
#ENDIF
#IFDEF quartz16
; code à metre
#ENDIF
#IFDEF quartz20
; code à metre
#ENDIF
Je te laisse réfléchir, pour info c'est pas du C, BASIC, PASCAL, c'est les directives de Microchip.
Tu peux te servir des Timer, comme le suggère paulfjujo, mais attention car il dépende de
ton oscillateur, qui soit en externe ou interne.
A+
écrit par paulfjujo :
les valeurs d'init des registres dependent de FOSC !
Bien sur, tout dépends de l'oscillateur, qui soit en externe ou interne.
l'utilisation des timers 8 ou 16 bits pour faire des tempos..
Oui mais ça dépends encore de l'oscillateur, qui soit en externe ou interne.
Disons, c'est peut être plus pratique, car on peut faire faire autre chose au microcontrôleur, j'ai déjà pensée
à cela, mais par manque de temps j'ai jamais fait.
ça peut être intéressant de faire des tempos avec les Timer en ASM, et surtout très précis.
A+
- paulfjujo
Expert- Messages : 2597
- Âge : 73
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
JMarc a écrit :J'ai pensé a faire cette macro avec passage de parametre Delay_ms .100 ici 100 pour 100 ms si je ne me suis pas trompé (a ajuster bien sur)
J'avoue ne pas avoir vérifié ta Macro..
parce que l'inconvenient d'une MACRO, c'est qu'elle sera REPETEE
à chaque appel , et donc consomme beaucoup plus de memoire RAM et ROM
q'un simple appel à un sous programme avec passage d'un argument ...
à ton clavier ...
mais cela n'empeche pas que cela reste un bon exercice
Retourner vers « Langage ASM »
Qui est en ligne
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 48 invités