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
JMarc
Passioné
Passioné
Messages : 493
Enregistré en : août 2016
Localisation : Dans le Sud...

#11 Message par JMarc » mar. 11 juil. 2017 20:13

Bonjour a tous

Je me régale :-D

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 :sifflotte:

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

Afficheur lcd
Jérémy
Administrateur du site
Administrateur du site
Messages : 2112
Âge : 39
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#12 Message par Jérémy » mar. 11 juil. 2017 20:54

Bonsoir ici ,

Je vois tu avances bien JMArc . Je suis ravi !

Bon courage pour la suite
C'est en faisant des erreurs, que l'on apprend le mieux !!!

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

#13 Message par Temps-x » mer. 12 juil. 2017 21:59

Bonjour JMarc, Jérémy, paulfjujo, et bonsoir tous le monde,


:bravo: 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. :wink:

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) :lol: PIC16F84 :

http://kudelsko.free.fr/interfaces/lcd_ ... mmaire.htm

A+
Quand la souris nargue le chat, c'est que son trou n'est pas loin.

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

#14 Message par JMarc » jeu. 13 juil. 2017 06:59

Bonjour à tous

Merci Jeremy pour les encouragements. Je vais y arriver a faire un tutoriel sur cet écran :wink:


temps-x, tu vois, je l'ai lâché mon 16f877 humour!!

Peu t'on utiliser les tempos du langage C (delay_ms) en assembleur ?

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

#15 Message par Temps-x » jeu. 13 juil. 2017 13:29

Bonjour JMarc, et tous le monde,

temps-x, tu vois, je l'ai lâché mon 16f877 humour!!


Enfin une bonne nouvelle, pour commencer ma journée. dehors!!

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. :wink:

A+
Quand la souris nargue le chat, c'est que son trou n'est pas loin.

Afficheur lcd
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 1032
Âge : 67
Enregistré en : juillet 2015
Localisation : 01120
Contact :

#16 Message par paulfjujo » jeu. 13 juil. 2017 17:23

bojour JMARC et à tous,

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

Attention!! 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 .. :eek: 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 ,;   //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
  
}
}
 

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

#17 Message par JMarc » ven. 14 juil. 2017 10:01

Bonjour temps-x et Paulfjujo

Pour moi aussi c'est du chinois et je préfère rester sur un langage simple :wink:

Je vais faire un fichier inc et mettre toutes les tempos cela fera du bien dans la lisibilité du source

Bientôt un tuto sur cet afficheur :-D

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

#18 Message par JMarc » ven. 14 juil. 2017 19:06

Bonjour a tous

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 ? :sifflotte:
Modifié en dernier par JMarc le ven. 14 juil. 2017 19:52, modifié 3 fois.

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

#19 Message par Temps-x » ven. 14 juil. 2017 19:38

Bonjour JMarc, paulfjujo, et bonjour à tous,

cela vous plait ? :sifflotte:


oops 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. :lol:

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 :
Attention!! 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+
Modifié en dernier par Temps-x le sam. 15 juil. 2017 04:02, modifié 3 fois.
Quand la souris nargue le chat, c'est que son trou n'est pas loin.

Afficheur lcd
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 1032
Âge : 67
Enregistré en : juillet 2015
Localisation : 01120
Contact :

#20 Message par paulfjujo » ven. 14 juil. 2017 21:46

bonsoir JMarc et à tous,

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)


:sifflotte: 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 3 invités