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

appel aux specialistes ASM decalage 96 bits
Temps-x
Avatar de l’utilisateur
Expert
Expert
Messages : 1352
Enregistré en : juillet 2016
Localisation : Terre

#51 Message par Temps-x » dim. 10 nov. 2019 02:39

Bonjour paulfjujo, et tout le forum,


J'ai enfin trouvé la solution, grâce au programme Led-Matrix, savait fait sous Dos un petit programme en QuickBasic pour bien comprendre le principe, je le mets à disposition avec la source pour les plus intéressé, :sifflotte: c'est du basic....

TOURNE.zip

Revenons au langage ASM, ci-dessous j'ai écrit le programme pour une rotation à gauche, dans ce code la rotation se fait sur 64 bits, si vous rajoutez des matrices en plus, il faut juste faire (8 bits x Nombre de Matrice) = sortie

Exemple pour 8 matrices, pour une rotation à gauche

Code : Tout sélectionner

;***********************************************************************************************
;************
 "La rotation vers la gauche à était testé avec succès, sous MPLAB" ***************
;***********************************************************************************************

    Errorlevel-302                        ; Supprime le message "Ensure that bank bits are correct" 

    list p
=18f26K22                       ; processeur utilisé                  
    
#include <p18f26K22.inc>              ; Définitions des constantes

;***********************************************************************************************

;
 CONFIG11H
     CONFIG FOSC 
= INTIO67 
     CONFIG FCMEN 
= OFF 
     CONFIG IESO 
= OFF
; CONFIG2L
     CONFIG PWRTEN 
= OFF 
     CONFIG BOREN 
= OFF 
     CONFIG BORV 
= 190
; CONFIG2H
     CONFIG WDTEN 
= OFF 
     CONFIG  WDTPS 
= 1
; CONFIG3H
     CONFIG CCP2MX 
= PORTC1                         
     CONFIG PBADEN 
= OFF
     CONFIG CCP3MX 
= PORTC6
     CONFIG HFOFST 
= OFF
     CONFIG T3CMX 
= PORTC0
     CONFIG P2BMX 
= PORTC0
     CONFIG MCLRE 
= INTMCLR
; CONFIG4L
     CONFIG STVREN 
= OFF 
     CONFIG LVP 
= OFF 
     CONFIG XINST 
= OFF 
     CONFIG DEBUG 
= OFF
; CONFIG5L
     CONFIG CP0 
= OFF 
     CONFIG CP1 
= OFF 
     CONFIG CP2 
= OFF 
     CONFIG CP3 
= OFF
; CONFIG5H
     CONFIG CPB 
= OFF 
     CONFIG CPD 
= OFF
; CONFIG6L
     CONFIG EBTR0 
= OFF
; CONFIG6H
     CONFIG EBTR1 
= OFF
; CONFIG7L
     CONFIG EBTR2 
= OFF
; CONFIG7H
     CONFIG EBTR3 
= OFF

;*************************************** assignations ***************************************** 
;
;
;
;
;
;**********************************************************************************************
;******************************
 déclaration des variables *************************************
;**********************************************************************************************
  

   CBLOCK H
'0'                                 
     netoyer 
:1
     temps   
:15
     sortie  
:1
   ENDC 

;**************************** adresse de depart après reset **********************************

    ORG H'0'
      bra debut      

;********************************* interruption haute priorité *********************************

    ORG    H'8'
      retfie 

;********************************* interruption basse priorité *********************************

    ORG     H'18'                                  
      retfie 

debut

;*********************************************************************************************** 
;***************** "configuration de la bank sélectionné du microcontrôleur" *******************
;***********************************************************************************************
 

     movlw B
'00000000'                    ; même si par defaut le microcontrôleur démarre avec   
     movwf BSR                            
; BSR = 0 , je préfére en être sur.

;***********************************************************************************************
 
;******************** "configuration de l'oscillateur du microcontrôleur" ********************** 
;*********************************************************************************************** 

    
;  movlw B'01110100'                  ; oscillateur à 16 Mhz, fréquence stable si PLL (16 * 4)= 64 Mhz
      movlw B
'01100100'                  ; oscillateur à 8 Mhz, fréquence stable si PLL (* 4) = 32 Mhz
    
;  movlw B'01010010'                  ; oscillateur à 4 Mhz, fréquence stable  
    
;  movlw B'01000010'                  ; oscillateur à 2 Mhz, fréquence stable  
    
;  movlw B'00110010'                  ; oscillateur à 1 Mhz, fréquence stable  

      movwf OSCCON
      
;**************************** configuration du registre OSCTUNE ********************************

      movlw B'00000000'                   ; bit 6 à 1 : PLL * 4
      movwf OSCTUNE                       
; bit 6 à 0 : PLL désactivé
                                           
;*********************************************************************************************** 
;*************** "configuration du convertiseur analogique du microcontrôleur" *****************
;***********************************************************************************************

;***************************
 configuration du registre ANSELA ********************************** 

      movlw B
'00000000'                   ; en mode numérique :
      movwf ANSELA                        ; en mode E/S       : 2(RA0), 3(RA1), 4(RA2), 5(RA3), 7(RA5)                                       

;**************************** configuration du registre ANSELB ********************************* 

      movlw B
'00000000'                   ; en mode numérique : 
      movwf ANSELB                        
; en mode E/S       : 21(RB0), 22(RB1) 23(RB2), 24(RB3), 25(RB4), 26(RB5)  
             
;**************************** configuration du registre ANSELC ********************************* 

      movlw B
'00000000'                   ; en mode numérique :
      movwf ANSELC                        ; en mode E/S       : 13(RC2),  14(RC3), 15(RC4), 16(RC5), 17(RC6), 18(RC7)  

;***********************************************************************************************
;***********************
 "configuration des pattes du microcontrôleur" *************************      
;*********************************************************************************************** 

;************ configuration des registres TRISA & TRISB & TRISC & TRISE en bank 1 ************** 

      movlw B
'00000000'                   ; RA0(2), RA1(3), RA2(4), RA3(5), RA4(6), RA5(7), RA6(10), RA7(9)  
      movwf TRISA                         
; 

      movlw B
'11111111'                   ; RB0(21), RB1(22), RB2(23), RB3(24), RB4(25), RB5(26), RB6(27), RB7(28)
      movwf TRISB                         ; 

      movlw B
'00000000'                   ; RC0(11), RC1(12), RC2(13), RC3(14), RC4(15), RC5(16), RC6(17), RC7(18)     
      movwf TRISC                         
; 

      movlw B
'00001000'                   ; RE3(1) 
      movwf TRISE                         
;

                                          ; VSS(8), VSS(19), VDD(20) 

;**************************** configuration du registre INTCON2 ******************************** 

     movlw B
'00000000'                    ; B7 = 0 résistances en service
     movwf INTCON2                        
;

;****************************
 configuration du registre WPUB *********************************** 
                                        
     movlw B
'11111111'                    ; tirage de résistance sur        : RB0(21), RB1(22), RB2(23), RB3(24), RB4(25), RB5(26), RB6(27), RB7(28)  
     movwf WPUB                           
; pas de tirage de résistance sur :

;****************************
 configuration du registre INTCON *********************************      

    movlw B
'00000000'                     ; 
    movwf INTCON                          
; interruption hors service 

;*********************************** "départ du programme" *************************************

      movlw D'15'                         ; nombre de variable à remettre à zéro 
      movwf netoyer
  
      lfsr FSR0
,temps+0                   ; se placer au début de l'adresse de la variable "temps" 

efface_1                                  ; mettre toutes les variables "temps" quand va utiliser à zéro
      clrf INDF0         
      incf FSR0L,F    

      decfsz netoyer,F  
      bra efface_1

ini_1
      movlw D'
64'                
      movwf sortie                        ; 8 matrice x 8 points = 64    

;***********************************************************************************************
;*************************************** "pour 8 Matrice" **************************************
;***********************************************************************************************
tourne_1        
      btfsc temps+7,7                     ; regarder si le bits 7, de la variable "temps+7" est 1 
      bsf STATUS,C                        ; oui, en incrémennte carry à 1
      btfss temps+7,7                     ; regarder si le bits 7, de la variable "temps+7" est 0 
      bcf STATUS,C                        ; oui, en incrémennte carry à 0
 
      rlcf temps+0,F                      ;
      rlcf temps+1,F                      ;
      rlcf temps+2,F                      ;
      rlcf temps+3,F                      ; 
      rlcf temps+4,F                      ; 
      rlcf temps+5,F                      ;
      rlcf temps+6,F                      ;
      rlcf temps+7,F                      ; 

suite_1
      decfsz sortie,F
      bra tourne_1
fini_1
      nop
      bra fini_1   

      End



Exemple pour 12 matrices, pour une rotation à gauche

Code : Tout sélectionner

;*********************************** "départ du programme" *************************************

      movlw D'15'                         ; nombre de variable à remettre à zéro 
      movwf netoyer
  
      lfsr FSR0
,temps+0                   ; se placer au début de l'adresse de la variable "temps" 

efface_1                                  ; mettre toutes les variables "temps" quand va utiliser à zéro
      clrf INDF0         
      incf FSR0L,F    

      decfsz netoyer,F  
      bra efface_1

ini_1
      movlw D'
96'                
      movwf sortie                        ; 12 matrice x 8 points = 96  (8 bits  x  Nombre de Matrice) = sortie  

;***********************************************************************************************      
tourne_1
      btfsc temps+11,7                    ; regarder si le bits 7, de la variable "temps+11" est 1 
      bsf STATUS,C                        ; oui, en incrémennte carry à 1
      btfss temps+11,7                    ; regarder si le bits 7, de la variable "temps+11" est 0 
      bcf STATUS,C                        ; oui, en incrémennte carry à 0

      rlcf temps+0,F                      ;
      rlcf temps+1,F                      ;
      rlcf temps+2,F                      ;
      rlcf temps+3,F                      ; 
      rlcf temps+4,F                      ; 
      rlcf temps+5,F                      ;
      rlcf temps+6,F                      ;
      rlcf temps+7,F                      ; 
      rlcf temps+8,F                      ;
      rlcf temps+9,F                      ;
      rlcf temps+10,F                     ;
      rlcf temps+11,F                     ; 

suite_1
      decfsz sortie,F
      bra tourne_1
fini_1
      nop
      bra fini_1   

      End


:roll: Elle possède pas de doublon...... :roll: Elle possède pas de doublon......
Bon, je vous est donnée la rotation à gauche, alors qui va trouver comment on fait une rotation à droite ....... exit

==> A+
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Modifié en dernier par Temps-x le dim. 10 nov. 2019 21:33, modifié 1 fois.
:roll: Les requins, c'est comme le langage ASM, c'est le sommet de la chaîne alimentaire. :wink:

appel aux specialistes ASM decalage 96 bits
JMarc
Confirmé
Confirmé
Messages : 557
Enregistré en : août 2016
Localisation : Dans le Sud...

#52 Message par JMarc » dim. 10 nov. 2019 17:52

Temps-x a écrit :Bon, je vous est donnée la rotation à gauche, alors qui va trouver comment on fait une rotation à droite ....... exit

==> A+


Y a cas tourner le circuit imprimé. exit

appel aux specialistes ASM decalage 96 bits
Claudius
Avatar de l’utilisateur
Passioné
Passioné
Messages : 206
Âge : 64
Enregistré en : septembre 2015
Localisation : ELANCOURT (78 - YVELINES)
Contact :

#53 Message par Claudius » dim. 10 nov. 2019 20:36

Bonsoir,

La partie:

Code : Tout sélectionner

tourne_1
      btfsc temps+11,7                    ; regarder si le bits 7, de la variable "temps+11" est 1
      bsf STATUS,C                        ; oui, en incrémennte carry à 1
      btfss temps+11,7                    ; regarder si le bits 7, de la variable "temps+11" est 0
      bcf STATUS,C                        ; oui, en incrémennte carry à 0
      ...

Peut-être optimisée (2 cycles gagnés à chaque passage ;-) et corrigée d'un point de vue commentaire, en:

Code : Tout sélectionner

tourne_1
      bcf STATUS,C                        ; positionnement à priori de carry à 0
      btfsc temps+11,7                    ; regarder si le bits 7, de la variable "temps+11" est 1
      bsf STATUS,C                        ; si oui, positionnement de carry à 1
      ...


Edit: 2 cycles gagnés à chaque passage
Modifié en dernier par Claudius le lun. 11 nov. 2019 09:40, modifié 2 fois.

appel aux specialistes ASM decalage 96 bits
Temps-x
Avatar de l’utilisateur
Expert
Expert
Messages : 1352
Enregistré en : juillet 2016
Localisation : Terre

#54 Message par Temps-x » dim. 10 nov. 2019 21:17

Bonjour, JMarc, Claudius, et tout le forum,

Claudius a écrit :Source du message Peut-être optimisée (1 cycle de gagné à chaque passage ;-) et corrigée d'un point de vue commentaire, en:

Code : Tout sélectionner
tourne_1
bcf STATUS,C ; positionnement à priori de carry à 0
btfsc temps+11,7 ; regarder si le bits 7, de la variable "temps+11" est 1
bsf STATUS,C ; si oui, positionnement de carry à 1


:eek: ..Yes,.... :bravo: ==> et Merci ! pour la correction orthographique, ainsi que l’optimisation du code... ça fait plaisir de voir des professionnelles intervenir.

Je retiens la leçon :oops:

JMarc a écrit :Source du message Y a cas tourner le circuit imprimé. exit


:lol: Tricheur.... ...:langue:

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

appel aux specialistes ASM decalage 96 bits
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 1472
Âge : 69
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#55 Message par paulfjujo » lun. 11 nov. 2019 20:59

bonsoir,


oui , OK pour 1 ligne ..
mais pour les 8 autres lignes ?
Aides toi, le ciel ou Fantastpic t'aideras

appel aux specialistes ASM decalage 96 bits
Temps-x
Avatar de l’utilisateur
Expert
Expert
Messages : 1352
Enregistré en : juillet 2016
Localisation : Terre

#56 Message par Temps-x » lun. 11 nov. 2019 21:50

Bonsoir, paulfjujo, et tout le forum,

:sifflotte: j'ai peut être la solution, mais il faut au moins 100 octets, (8x 12) X 8 = 768 bits /8 = 96 octets, on peu prendre la bank1 sur un Pic18F26K22

Code : Tout sélectionner



      movlw D
'96'                         ; sur une ligne pour 12 matrices 
      movwf sortie_1                      
; 

      movlw D
'8'                          ; en partant vers le bas, égal 8 points 
      movwf sortie_2                      
; 768 bits = (8 X 12) X 8

tourne
      bcf STATUS
,C                        ; remettre carry à zéro
      btfsc temps
+11,7                    ; regarder si le bits 7, de la variable "temps+11" est 1 
      bsf STATUS
,C                        ; oui, en positionne carry à 1

      rlcf temps
+0,F                      ;
      rlcf temps+1,F                      ;
      rlcf temps+2,F                      ;
      rlcf temps+3,F                      ; 
      rlcf temps
+4,F                      ; 
      rlcf temps
+5,F                      ;
      rlcf temps+6,F                      ;
      rlcf temps+7,F                      ; 
      rlcf temps
+8,F                      ;
      rlcf temps+9,F                      ;
      rlcf temps+10,F                     ;
      rlcf temps+11,F                     ; 

     
; ===> Tu envoies tes données ici, si j'ai compris

suite_1
      decfsz sortie_1,F
      bra tourne

      ; ==> ici pour la ligne qui vient d'
être fait 


      decfsz sortie_2
,F
      bra tourne



Je voudrais savoir si c'est bien le cas, si c'est bien à cette endroit que tu envoies tes données, j'ai la solution, mais avant je voudrais une confirmation.

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

appel aux specialistes ASM decalage 96 bits
satinas
Passioné
Passioné
Messages : 414
Enregistré en : novembre 2015

#57 Message par satinas » mar. 12 nov. 2019 13:56

Bonjour,

Dans le même esprit que Temps-x, en utilisant l'adressage indirect aussi pour les décalages :

Pour 8 matrices, stocker les pixels dans un buffer C de 64 octets, n'importe où en ram.
Pour 12 matrices, buffer de 96 octets.
Si le texte affiché est plus large que l'afficheur, buffer de (8 * largeur du texte) octets, et on affiche qu'une partie du buffer.

Pour 8 matrices (pas testé, à vérifier) :

Code : Tout sélectionner

    movffl  FSR0H,save_fsrh   // sauvegarder FSR0, il va être modifié
    movffl  FSR0L,save_fsrl

    lfsr    0,buffer          // adressage indirect FSR0 en début de buffer
    movlw   8                 // 8 lignes à décaler

bcl addfsr  0,7               // placer dans carry le pixel de droite qui va entrer à gauche
    rlcf    INDF0             
    rrncf   INDF0
    subfsr  0,7
 
    rlcf    POSTINC0          // décaler les 8 matrices sur une ligne
    rlcf    POSTINC0
    rlcf    POSTINC0
    rlcf    POSTINC0
    rlcf    POSTINC0
    rlcf    POSTINC0
    rlcf    POSTINC0
    rlcf    POSTINC0

    decfsz  WREG,0,0          // boucler
    bra     bcl

    movffl  save_fsrh,FSR0H   // restituer FSR0
    movffl  save_fsrl,FSR0L


Pour la font 8x8 stockée en 0x005B, il n'y a pas de problème (voir cours Bigonoff 18F).

La ram du 18F27K42 va de 0 à 0x3FFF, on y accède :

- soit en adressage indirect, avec les registres FSR (14 bits)

- soit par MOVFF, on copie un octet de la ram vers la ram, en donnant 2 adresses 12 bits (donc limité aux banks 0 à 15)
- soit par MOVFFL, on copie un octet de la ram vers la ram, en donnant 2 adresses 14 bits (18F27K42 only)

- soit par le numéro de bank 0 à 63 placé dans BSR (6 bits), en donnant une adresse 8 bits
Il faut alors positionner le bit ACCESS/BANKED sur BANKED dans les ins asm MOVF, BTFSC, BCF, ...

- Si l'on positionne le bit sur ACCESS, le pic ne tiendra pas compte de BSR.
Il sélectionnera la bank 0 si l'adresse 8 bits est < 0x60, sinon la bank 0x3F (là ou il y a les registres du pic)
Ces 256 octets de mémoire access ont donc un moyen d'accès supplémentaire, mais on y accède aussi avec les méthodes précédentes.

Le compilateur et l'assembleur peuvent ajouter le bit ACCESS/BANKED car ils connaissent l'adresse complète, notamment si on accède à un registre ils sélectionnent le mode ACCESS. Dans mes exemples je spécifiais explicitement ce bit, car cela permet de visualiser le mécanisme.
Le compilateur va renseigner BSR lorsque c'est nécessaire, mais l'assembleur ne le fera pas, il faut le faire soi même.

Tu as déclaré des adresses "absolute" de 0x0016 à 0x005A. Le compilateur a donc utilisé la suite de la ram de 0x005B à 0x045A (1024 octets) poour stocker la font.
Le fait qu'elle empiète sur la mémoire access (0x5B à 0x5F) ne gêne pas. Il utilisera FSR, ACCESS, BANKED ou MOVFF pour accéder aux caractères de la font.


Retourner vers « Langage ASM »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité