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

MAX7219 : suppression des "0" occupant les premières positions d'un nombre comme 006
folkeu08
Débutant
Débutant
Messages : 31
Âge : 52
Enregistré en : novembre 2017
Localisation : Ardennes (08)
Contact :

#11 Message par folkeu08 » dim. 3 nov. 2019 23:21

Bonjour à tous (car certains ont pris le sujet en route),

Je n'ai pas encore écrit une ligne sur le W-E.
-> où j'en suis avec l'assembleur ?
Un ami m'avait expliqué ce language dans les années 90 de mémoire lorsqu'il "pissait" du code (pour le plagier) pour les réalisations qu'il publiait dans Radio-Plans.
* Il m'a expliqué qu'une pin du pic se programme en entrée ou sortie (en fonction du data ne peut être qu'une entrée ou une sortie d'origine).
* Il est possible de décaler des données par la droite ou la gauche (nous avons vu les commandes les plus communes)
J'ai assimilé cela.

Ce qui me bloque car mal compris et quelque part non visuel, ce sont les registres W et F et C (carry).

Cet après-midi, j'ai repris un de ses bouts de programme pour une de ses publications :
Ces valeurs sont stockées d'origine dans l'eeprom du pic 16f877 :

Code : Tout sélectionner


              CALL rd_eeprom                
              CALL conv
              CALL see

;###################################################################
;#####                         convertion pour adresse 16bits                      #########
;#####                                    OP1 => BCD                                       #########
;###################################################################
;
conv                CLRF BCDH
            CLRF BCDL
            MOVF OP3H
,W
            MOVWF OP1H
            MOVF OP3L
,W
            MOVWF OP1L
            CLRF OP2H
            CLRF OP2L
            INCF OP2L
,F
            CALL add16
conv1        CLRF OP2H
            MOVLW 100
            MOVWF OP2L
            CALL sub16
            BTFSC OP1H
,7
            GOTO conv2
            INCF BCDH
,F
            GOTO conv1                        
conv2        CLRF OP2H
            MOVLW 100
            MOVWF OP2L
            CALL add16
conv3        CLRF OP2H
            MOVLW 10
            MOVWF OP2L
            CALL sub16
            BTFSC OP1H
,7
            GOTO conv4
            MOVLW 0x10
            ADDWF BCDL
,F
            GOTO conv3
conv4        CLRF OP2H
            MOVLW 10
            MOVWF OP2L
            CALL add16
            MOVF OP1L
,W
            ADDWF BCDL
,F
            MOVLW 0xF0
            IORWF BCDH
,F
            MOVF BCDH
,W
            ANDLW 0x0F
            IORLW 0x00
            BTFSS STATUS
,Z
            RETURN
            MOVLW 0x0F
            IORWF BCDH
,F
            MOVF BCDL
,W
            ANDLW 0xF0
            IORLW 0x00
            BTFSS STATUS
,Z            
            RETURN
            MOVLW 0xF0
            IORWF BCDL
,F
            RETURN

;###################################################################
;#####                 addition pour adresse DMX512 sur 16bits                #########
;#####                                    OP1 + OP2 = OP1                                #########
;###################################################################
;
add16        MOVF OP2L,W
            ADDWF OP1L
,F
            BTFSC STATUS
,C
            INCF OP2H
,F
            MOVF OP2H
,W
            ADDWF OP1H
,F
            RETURN


rd_eeprom    BANK2
            MOVLW    H
'00'
            MOVWF    EEADR
            BANK3
            BCF EECON1
,EEPGD
            BSF    EECON1
,RD
            BANK2
            MOVF    EEDATA
,W
            BANK0
            MOVWF    OP3H
            MOVLW attente_full
            CALL wait
            BANK2    
            MOVLW    H
'01'
            MOVWF    EEADR
            BANK3 
            BCF EECON1
,EEPGD
            BSF    EECON1
,RD
            BANK2 
            MOVF    EEDATA
,W
            BANK0
            MOVWF    OP3L
            RETURN

;================================================================
;======
         SET_TIME dans eeprom              ===============
;================================================================
;
        ORG    H'2100'
        DE    H'01' ;OP3H
        DE    H
'FF' ;OP3L


La routine "Add16" permet, je suppose, d'obtenir un mot de 16bits ( variable ?) en ajoutant les 2 de 8 bits (OP3H et OP3L).
Il est fait des choses avec F (ADDWF BCDL,F) et W (MOVF OP1L,W). Il y est mis souvent des choses dedans pour aller les rechercher ensuite. Dans mon esprit, F et W sont des cases "mémoire" où une seule valeur y est stockée dans chaque. Or, quand j'essaye de comprendre un programme en assembleur, c'est pas possible.
Qui peut me démystifier déjà ces 2 choses ?
Pour le Carry et encore de mémoire, c'est une histoire de dépassement, la valeur change d'état si cela arrive.
Déjà m'éclaircir cela Merci !
Il y a t-il une application libre (opensource) qui permette de visualiser les différents registres ainsi que l'empilement des données (il m'avait parlé de cela aussi -> les data s'empilent avec une adresse pour aller les rechercher). J'aurai un visuel et je comprendrai plus vite.
Je vais questionner sur les choses non comprises dans vos réponses cette semaine pour m'essayer le W-E prochain de 3 jours à écrire seul cette fois des lignes.
François

MAX7219 : suppression des "0" occupant les premières positions d'un nombre comme 006
Temps-x
Avatar de l’utilisateur
Expert
Expert
Messages : 1367
Enregistré en : juillet 2016
Localisation : Terre

#12 Message par Temps-x » lun. 4 nov. 2019 03:15

Bonsoir folkeu08, et tout le forum,

Ah la..la .. tu mélanges pas mal de chose, je vais essayer d'éclaircir ton esprit, ça va pas être facile parce que tu t'attaques à un sujet difficile.

W et un registre de travail, ce registre sert à transmettre une valeur dans une variable ou un registre.

On ne peut pas le faire directement sur un 16F (pour ton cas).

Exemple

Code : Tout sélectionner


     movlw D
'154'                         ; copier 154 décimal dans W
     movwf temps                          
; copier W dans temps 

     movlw B
'00100001'                    ; copier 00100001 binaire dans W
     movwf PORTA                          
; copier W dans PORTA 


F et ton destinataire

Exemple

Code : Tout sélectionner


    decf temps
,F                          ; retire 1 dans temps, car F représente la variable temps

    incf temps
,F                          ; ajoute 1 dans temps, car F représente la variable temps


    movlw D
'178'                          ; copier 178 décimal dans W
    addwf temps
,F                         ; additionner (+ temps) le résultat est mis dans temps 


    movlw D
'178'                          ; copier 178 décimal dans W
    addwf temps
,W                         ; additionner (+ temps) le résultat est mis dans W(registre de tavail)      


:roll: Certain oublie de rajouter W ou F, ce qui amène à des erreurs dans le code, je citerais pas de non :sifflotte:


C appelé aussi CARRY et utilisé pour contrôler une valeur plus grand ou plus petit c'est on réalité le 9 bits

Exemple

Code : Tout sélectionner


    bcf STATUS
,C                          ; mettre à zéro le bit C(carry) qui est dans le registre STATUS

    movlw D
'155'                          ; copier 155 décimal dans W                        
    addlw D
'172'                          ; additionner (+ 172)

    btfsc STATUS,C                        ; regarder si le bit C(carry) et à 1
    goto oui                              
; oui C(carry) est à 1
    goto non                              
; non C(carry) est à 0
    
oui
                                          
; <== le résultat arrivera ici car (155 + 172) 
                                          
; 

non
  
; traitement 


folkeu08 a écrit :Source du message Il y a t-il une application libre (opensource) qui permette de visualiser les différents registres ainsi que l'empilement des données


Dans ASM tout est gratuit, tu n'as pas à sortir ton porte monnaie pour payer quoi que se soit, par contre c'est plus dur à apprendre, mais ça t'ouvre des portes.

Il existe MPLAB 8.92 pour te permette de visualise tes registres et tes variables, j'ai fait un tutoriel ICI si ça peut t'intéresser, il est entièrement gratuit.


Tu veux aller trop vite, sais tu ce que sait un tableau binaire ?

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

MAX7219 : suppression des "0" occupant les premières positions d'un nombre comme 006
folkeu08
Débutant
Débutant
Messages : 31
Âge : 52
Enregistré en : novembre 2017
Localisation : Ardennes (08)
Contact :

#13 Message par folkeu08 » lun. 4 nov. 2019 18:30

Bonjour à tous,
Ma méthode de progression peut vous surprendre mais je me connais. Depuis tout petit, ce qui est simple pour quelqu'un est difficile pour moi et inversement :sifflotte: .
Temps-X merci pour ces explications, c'est pigé pour moi sans aucune hésitation.
Je vais vite aller chercher ton tuto pour m'y exercer et bien m'imprégner de W et F avec les exercices de Bigonoff.
Je programme sous Delphi et j'ai déjà cette logique nécessaire.
Les tableaux numériques ne seraient-il pas l'équivalent d'Arrays (suite de data ordonnées) ?
J'ai déjà fait plus difficile et je n'en sortirai même si je mélange. J'ai plutôt besoin de comprendre ce qu'il se passe que de savoir ce qu'il se passe. J'apprends plus vite par l'expérimentation que par la connaissance théorique.
Je me mets en stand-by pour l'instant et je reviens dès que je maitrise le jeu avec quelques variables et que j'habitue mon esprit à jongler avec.
Merci !
Bonne fin de semaine.
François

MAX7219 : suppression des "0" occupant les premières positions d'un nombre comme 006
Temps-x
Avatar de l’utilisateur
Expert
Expert
Messages : 1367
Enregistré en : juillet 2016
Localisation : Terre

#14 Message par Temps-x » lun. 4 nov. 2019 21:04

Bonsoir folkeu08, et tout le forum,

Je pourrais faire ton programme, mais tu n'apprendrais rien, maintenant si c'est çà que tu veux faut me le dire.

folkeu08 a écrit :Source du message Les tableaux numériques ne seraient-il pas l'équivalent d'Arrays


Pour bien comprendre un tableau numérique à l'époque savais fait un petit programme, que je viens de retrouver, je le mets à disposition pour le forum, il est protégé contre les virus.

C'est un convertisseur 16 bits, donc obligé d'avoir deux variables

Picconv.jpg


Fichier ci-joint
Picconv.zip


==> A+
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
:roll: Les requins, c'est comme le langage ASM, c'est le sommet de la chaîne alimentaire. :wink:


Retourner vers « Langage ASM »

Qui est en ligne

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