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
Claudius
Avatar de l’utilisateur
Passioné
Passioné
Messages : 260
Âge : 69
Enregistré en : septembre 2015
Localisation : ELANCOURT (78 - YVELINES)
Contact :

#41 Message par Claudius » mer. 6 nov. 2019 15:23

Ok pour les IT's inhibées (c'est déjà une piste en moins)
S'agissant de la boucle for suivante que j'ai un peu reformatée pour plus de lisibilité:

Code : Tout sélectionner

   for (i = 0; i < 128; i++)
   {
      UART1   Write(' '); WordToStrWithZeros(i, CRam1);
      UART1   Write_Text(CRam1); UART1_Write_CText(" -> ");
      tx      t = &TEXTE[0];

      CarryX = Carry[0];         // table contenant les reports des 8 mots de 64 bits

      _asm {
         rlcf    _L10+0,1,0      // rotate left through carry de _L10[0] (rlcf _L10,F,ACCESS)
         rlcf    _L10+1,1,0
         rlcf    _L10+2,1,0
         rlcf    _L10+3,1,0

         rlcf   _L11+0,1,0       // 2em partie mot de 64 bits
         rlcf   _L11+1,1,0
         rlcf   _L11+2,1,0
         rlcf   _L11+3,1,0
   
         // modif 06-11-2019
         bcf _L10,0
         btfsc STATUS,0,1        // si Carry=1 => reporté dans le bit 0 du mot de depart
         bsf _L10,0
         nop
         nop
      }

      Carry[0] = CarryX;         // memorise report si C=1
      Binarise_32bits(L11, txt); UART1_Write('|'); Binarise_32bits(L10,txt);
      CRLF1();
   }

je serais intéressé par le code assembleur correspondant car seul celui-ci est sans appel à l'exécution
De plus, il est tjs possible de l'exécuter séparément voire de le parcourir de visu
C'est peut-être fastidieux, mais c'est le coût à payer pour continuer à avancer...

Questions
- Pourquoi CarryX = Carry[0]; et Carry[0] = CarryX; alors qu'un tableau de [8] est défini et initialisé
=> Si Ok, ne pas utiliser de tableau pour la compréhension du lecteur (en plus, doit être moins coûteux en temps d"exécution ;-)

- Pourquoi 2 x nop successifs
=> Si Ok, n'en garder qu'un seul pour le saut btfsc STATUS,0,1

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

#42 Message par paulfjujo » mer. 6 nov. 2019 16:31

Merci ! merçi de te pencher sur mon cas .

lorsque j'initialise ma table de long avec le message à afficher
il s'affiche correctement ...
ensuite je veux decaler cette table pour faire defiler le texte. d'un pas (pixel) à gauche , mais en gardant le buffer circulaire
pour que le texte sortant revienne sur l'entree ( en boucle fermée)
Le test de decalage sur 64 boucles ou 128 boucle de la 1ere ligne constituée de L11-L10 me parait pourtant OK
Test_128_decalages_sur_mot_de_64bits.txt


voici le *.lst correspondant au decalage des 8 lignes de 2 long=32+32= 64 bits ( pour correspondre aux 8 max 8X8)
PIC18F27K42_Test_decalage_8_long_asm_pour_8Max7219.txt


Je me suis assuré que mes variables 16 entiers longs et pointeur Depart sont bien alloués en bank0 .
MikroC s'accaparant de 21 bytes R0 à R20
RAM_mapping_18F27K42.jpg


j'espere ne pas avoir d'effets de bords vu que j'occupe la bank0 presque à ras bord ( max=0x005F)


carry[8] et carryx ne sont plus utilisés..
effectivement menage à faire !

projet MikroC
_PIC18F27K42_Test_defil_8_Reverse_Matrices_Max7219_Horiz_191106.zip


==============================================
07-11-2019

ce matin , je refais un test 100% en C
je teste le decalage sur la 1ere ligne en mode DEBUG .. OK
puis j'implemente le code pour les 8 lignes de 2x32 bits , decalage à gauche de 1 bits et surveillance des bits MSB
pour report de carry vers l'entree (rebouclage bit 31 du " MSB entier long" vers bit 0 du" LSB entier long" (MSB=LSB=64 bits)

code en C

Code : Tout sélectionner


 m
=0;
     GIE_bit=0;
     Depart=START_Absolute_Adresse;
     //Pointeur_Rotation=START_Absolute_Adresse;
     for (i=0;i<8;i++) Carry[i]=0;
     do
     
{  
      
//  Test terminal seulement
     /*
       Depart=START_Absolute_Adresse;
        for (j=0;j<8;j++)
        {
         SPI_Write_To_8x7219(j+1,*(Depart+j),*(Depart+8+j),*(Depart+16+j) ,*(Depart+24+j),
          *(Depart+32+j) ,*(Depart+40+j),*(Depart+48+j),*(Depart+56+j));
          Delay_ms(50);
        }
      */
       WordToStr(m,CRam1);
       UART1_Write_CText(" indice m = "); UART1_Write_Text(CRam1);CRLF1();
      //*****************************
      // Shift_ALL_8_Long();    // en ASM
      //***************************

       // tes 100% en C
          if (L10>>31) Carry[0]=1; else Carry[0]=0;
          L10=L10<<1;
          if (L11>31) Carry[1]=1; else Carry[1]=0;
          Carry[1]=L11>>31;
          L11=(L11<<) ;
          L11=L11 + Carry[0];
          L10=L10 + Carry[1];
          
          if 
(L12>>31) Carry[2]=1; else Carry[2]=0;
          L12=L12<<1;
          if (L13>>31) Carry[3]=1; else Carry[3]=0;
          L13=(L13<<1) ;
          L13=L13 + Carry[2];
          L12=L12 + Carry[3];

          if(L14>>31)  Carry[4]=1; else Carry[4]=0;
          L14=L14<<1;
          if (L15>>31) Carry[5]=1; else Carry[5]=0;
          L15=(L15<<) ;
          L15=L15 + Carry[4];
          L14=L14 + Carry[5];

          if(L16>>31) Carry[6]=1; else Carry[6]=0;
          L16=L16<<1;
          if (L17>>31) Carry[7]=1; else Carry[7]=0;
          L17=(L17<<);
          L17=L17 + Carry[6];
          L16=L16 + Carry[7];

          if(L18>>31) Carry[8]=1; else Carry[8]=0;
          L18=L18<<1;
          if(L19>>31) Carry[9]=1; else Carry[9]=0;
          L19=(L19<<) ;
          L19=L19 + Carry[8];
          L18=L18 + Carry[9];

          if(L20>>31) Carry[10]=1; else Carry[10]=0;
          L20=L20<<1;
          if(L21>>31) Carry[11]=1; else Carry[11]=0;
          L21=(L21<<);
          L21= L21 + Carry[10];
          L20= L20 + Carry[11];

          if(L22>>31) Carry[12]; else Carry[12]=0;
          L22=L22<<1;
          if(L23>>31) Carry[13]; else Carry[13]=0;
          L23=(L23<<);
          L23=L23  + Carry[12];
          L22= L22 + Carry[13];
          
          if
(L24>>31) Carry[14]=1; else Carry[14]=0;
          L24=L24<<1;
          Carry[15]=L25>>31;
          if (L25>>31) Carry[15]=1; else Carry[15]=0;
          L25=L25 + Carry[14];
          L24=L24 + Carry[15];


       txt=&TEXTE[0];
       pB=START_Absolute_Adresse;
       for (ja=0;ja<8;ja++)
        {
        UART1_Write(TAB); 
        UART1_Write_Text
( Bin2Asc( *(pB+ja)));  UART1_Write_Text( Bin2Asc( *(pB+ja+8)));
        UART1_Write_Text( Bin2Asc( *(pB+ja+16)));  UART1_Write_Text( Bin2Asc( *(pB+ja+24)));
        UART1_Write_Text( Bin2Asc( *(pB+ja+32)));  UART1_Write_Text( Bin2Asc( *(pB+ja+40)));
        UART1_Write_Text( Bin2Asc( *(pB+ja+48)));  UART1_Write_Text( Bin2Asc( *(pB+ja+56)));
        CRLF1();
        }
       CRLF1();
       Delay_1sec();
        m++;
    } while(m<64);
      CRLF1();


le 1er affichage est OK (avant decalage) .. normal, je viens juste de precharger les registre avec le texte à afficher
et se degrade des le 1er decalage, de plus en plus .. voir au 32em decalage :
... puis semble OK du 62eme au 64em
c'est pas ETONNANT ça ! et surtout incomprehensible (du moins,par moi)

Test_Decalage_64bits_en_C_tombe_en_marche_vers_la_fin_191107.jpg
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Aide toi, le ciel ou FantasPic t'aidera

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

#43 Message par paulfjujo » jeu. 7 nov. 2019 11:37

paulfjujo a écrit :Merci ! merçi de te pencher sur mon cas .

lorsque j'initialise ma table de long avec le message à afficher
il s'affiche correctement ...
ensuite je veux decaler cette table pour faire defiler le texte. d'un pas (pixel) à gauche , mais en gardant le buffer circulaire
pour que le texte sortant revienne sur l'entree ( en boucle fermée)
Le test de decalage sur 64 boucles ou 128 boucle de la 1ere ligne constituée de L11-L10 me parait pourtant OK
Test_128_decalages_sur_mot_de_64bits.txt

voici le *.lst correspondant au decalage des 8 lignes de 2 long=32+32= 64 bits ( pour correspondre aux 8 max 8X8)
PIC18F27K42_Test_decalage_8_long_asm_pour_8Max7219.txt

Je me suis assuré que mes variables 16 entiers longs et pointeur Depart sont bien alloués en bank0 .
MikroC s'accaparant de 21 bytes R0 à R20
RAM_mapping_18F27K42.jpg

j'espere ne pas avoir d'effets de bords vu que j'occupe la bank0 presque à ras bord ( max=0x005F)


carry[8] et carryx ne sont plus utilisés..
effectivement menage à faire !

projet MikroC
_PIC18F27K42_Test_defil_8_Reverse_Matrices_Max7219_Horiz_191106.zip

==============================================
07-11-2019

ce matin , je refais un test 100% en C
je teste le decalage sur la 1ere ligne en mode DEBUG .. OK
puis j'implemente le code pour les 8 lignes de 2x32 bits , decalage à gauche de 1 bits et surveillance des bits MSB
pour report de carry vers l'entree (rebouclage bit 31 du " MSB entier long" vers bit 0 du" LSB entier long" (MSB=LSB=64 bits)

code en C

Code : Tout sélectionner


 m
=0;
     GIE_bit=0;
     Depart=START_Absolute_Adresse;
     //Pointeur_Rotation=START_Absolute_Adresse;
     for (i=0;i<8;i++) Carry[i]=0;
     do
     
{  
      
//  Test terminal seulement
     /*
       Depart=START_Absolute_Adresse;
        for (j=0;j<8;j++)
        {
         SPI_Write_To_8x7219(j+1,*(Depart+j),*(Depart+8+j),*(Depart+16+j) ,*(Depart+24+j),
          *(Depart+32+j) ,*(Depart+40+j),*(Depart+48+j),*(Depart+56+j));
          Delay_ms(50);
        }
      */
       WordToStr(m,CRam1);
       UART1_Write_CText(" indice m = "); UART1_Write_Text(CRam1);CRLF1();
      //*****************************
      // Shift_ALL_8_Long();    // en ASM
      //***************************

       // tes 100% en C
          if (L10>>31) Carry[0]=1; else Carry[0]=0;
          L10=L10<<1;
          if (L11>31) Carry[1]=1; else Carry[1]=0;
          Carry[1]=L11>>31;
          L11=(L11<<) ;
          L11=L11 + Carry[0];
          L10=L10 + Carry[1];
          
          if 
(L12>>31) Carry[2]=1; else Carry[2]=0;
          L12=L12<<1;
          if (L13>>31) Carry[3]=1; else Carry[3]=0;
          L13=(L13<<1) ;
          L13=L13 + Carry[2];
          L12=L12 + Carry[3];

          if(L14>>31)  Carry[4]=1; else Carry[4]=0;
          L14=L14<<1;
          if (L15>>31) Carry[5]=1; else Carry[5]=0;
          L15=(L15<<) ;
          L15=L15 + Carry[4];
          L14=L14 + Carry[5];

          if(L16>>31) Carry[6]=1; else Carry[6]=0;
          L16=L16<<1;
          if (L17>>31) Carry[7]=1; else Carry[7]=0;
          L17=(L17<<);
          L17=L17 + Carry[6];
          L16=L16 + Carry[7];

          if(L18>>31) Carry[8]=1; else Carry[8]=0;
          L18=L18<<1;
          if(L19>>31) Carry[9]=1; else Carry[9]=0;
          L19=(L19<<) ;
          L19=L19 + Carry[8];
          L18=L18 + Carry[9];

          if(L20>>31) Carry[10]=1; else Carry[10]=0;
          L20=L20<<1;
          if(L21>>31) Carry[11]=1; else Carry[11]=0;
          L21=(L21<<);
          L21= L21 + Carry[10];
          L20= L20 + Carry[11];

          if(L22>>31) Carry[12]; else Carry[12]=0;
          L22=L22<<1;
          if(L23>>31) Carry[13]; else Carry[13]=0;
          L23=(L23<<);
          L23=L23  + Carry[12];
          L22= L22 + Carry[13];
          
          if
(L24>>31) Carry[14]=1; else Carry[14]=0;
          L24=L24<<1;
          Carry[15]=L25>>31;
          if (L25>>31) Carry[15]=1; else Carry[15]=0;
          L25=L25 + Carry[14];
          L24=L24 + Carry[15];


       txt=&TEXTE[0];
       pB=START_Absolute_Adresse;
       for (ja=0;ja<8;ja++)
        {
        UART1_Write(TAB); 
        UART1_Write_Text
( Bin2Asc( *(pB+ja)));  UART1_Write_Text( Bin2Asc( *(pB+ja+8)));
        UART1_Write_Text( Bin2Asc( *(pB+ja+16)));  UART1_Write_Text( Bin2Asc( *(pB+ja+24)));
        UART1_Write_Text( Bin2Asc( *(pB+ja+32)));  UART1_Write_Text( Bin2Asc( *(pB+ja+40)));
        UART1_Write_Text( Bin2Asc( *(pB+ja+48)));  UART1_Write_Text( Bin2Asc( *(pB+ja+56)));
        CRLF1();
        }
       CRLF1();
       Delay_1sec();
        m++;
    } while(m<64);
      CRLF1();
 


le 1er affichage est OK (avant decalage) .. normal, je viens juste de precharger les registre avec le texte à afficher
et se degrade des le 1er decalage, de plus en plus .. voir au 32em decalage :
... puis semble OK du 62eme au 64em
c'est pas ETONNANT ça ! et surtout incomprehensible (du moins,par moi)

Test_Decalage_64bits_en_C_tombe_en_marche_vers_la_fin_191107.jpg


je suspecte vraiment un effet de bord à cause du compilo à cause de l'usage la bank0 où sont logés mes 8 entiers longs .
quand à suivre au debugger (software) tout ce qui se passe , c'est trop compliqué
et il me faudrait un ICD tool..

je dois peut etre deplacer les 8 entiers long au debut d'une bank RAM non utilisée ?
Aide toi, le ciel ou FantasPic t'aidera

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

#44 Message par paulfjujo » jeu. 7 nov. 2019 11:39

je suspecte vraiment un effet de bord à cause du compilo à cause de l'usage la bank0 où sont logés mes 8 entiers longs .
quand à suivre au debugger (software) tout ce qui se passe , c'est trop compliqué
et il me faudrait un ICD tool..

je dois peut etre deplacer les 8 entiers long au debut d'une bank RAM non utilisée ?
Aide toi, le ciel ou FantasPic t'aidera

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

#45 Message par paulfjujo » jeu. 7 nov. 2019 11:40

oops doublon
oops doublon

:!!: impossible d'effacer un doublon , sans tout effacer ?

exit
===================================

:sifflotte: et je reviens

au vu de
"View"
"Statistics Variables"

:!!: j'ai quelques raisons de m'inquiéter

Que viens faire ma table de caracteres à l'adresse 0x005B alors que la bank 0 est limitée à 0x005F ?
Est-ce que cet outil mikroC est fiable ?

variables_statistic.jpg


je vais m'enquerir aupres de MikroE la dessus !
ce qui n'empeche pas de donner votre avis ...
Dans quelle galère je me suis fourré .. j'aurais du acheter les vieilles matrices unitaires à connections verticales !
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Aide toi, le ciel ou FantasPic t'aidera

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

#46 Message par Temps-x » jeu. 7 nov. 2019 19:07

Bonsoir paulfjujo, et tout le forum,

Comme ton cas m'intéresse, et que je travaille pas demain :langue: je vais écrire un programme pour rotation de bit, je partirais sur euh... Pic18F26K22 (ton pic préféré si je me trompe pas)

Le programme sera testé avant diffusion avec MPLAB, diffusion surement en fin de soirée vers des heures très .......

==> 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 : 2589
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#47 Message par paulfjujo » jeu. 7 nov. 2019 20:00

bonsoir,

Merci !

Temps-x a écrit :Bonsoir paulfjujo, et tout le forum,

Comme ton cas m'intéresse, et que je travaille pas demain :langue: je vais écrire un programme pour rotation de bit, je partirais sur euh... Pic18F26K22 (ton pic préféré si je me trompe pas)

Le programme sera testé avant diffusion avec MPLAB, diffusion surement en fin de soirée vers des heures très .......

==> A+


je me demande d'ailleurs, si mes problemes ne sont pas liés à l'usage du 18F27K42 ...
car mes precedents tests etaitent sur 18F26K22 !
j'ai choisi le 18F27K42 because 8K de RAM et 128K de flash..
je referai aussi les memes tests avec une base 18F26K22 , en attendant de tes nouvelles .
Aide toi, le ciel ou FantasPic t'aidera

appel aux specialistes ASM decalage 96 bits
satinas
Expert
Expert
Messages : 1225
Enregistré en : novembre 2015

#48 Message par satinas » jeu. 7 nov. 2019 20:35

Bonsoir,
J'ai pas trop eu le temps de regarder ...

Je vois des "btfsc STATUS,0,1" c'est à dire "btfsc STATUS,0,BANKED"
la case ram testée n'est pas forcément STATUS, car cela dépend de la valeur de BSR

Il faut faire "btfsc STATUS,0,0" c'est à dire "btfsc STATUS,0,ACCESS"
Les registres principaux du pic sont en mémoire access en fin de ram, donc toujours accessibles quel que soit la valeur de BSR

La bank0 va de 0x000 à 0X0FF, mais seule la partie avant 0x060 est en mémoire access
Pour le 18F27K42, La "bank" access couvre 0x0000 à 0x005F et 0x3F60 à 0x3FFF

Si le compilateur le permet, il vaut mieux écrire selon le type d'instruction
W ou ACCESS au lieu de 0
F ou BANKED au lieu de 1

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

#49 Message par Temps-x » sam. 9 nov. 2019 20:42

Bonsoir paulfjujo, et tout le forum,

Je viens de regarder tous les posts, avec les divers proposition apporté, et j'en conclus, aucune ne fonctionne après test sous MPLAB

:sifflotte: Il y a bien rotation sur les divers proposition, mais une fois 1 tour fait, c'est la catastrophe :lol: .

Carry qui est un avantage au départ devient un handicape par la suite, conclusion, il ne faut pas utiliser Carry

Je suis dessus actuellement.... depuis hier.... pouah pas simple ..... je te donnerais des nouvelles par la suite, c'est pas simple ... a faire, :roll: mais marrant.

==> 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 : 2589
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#50 Message par paulfjujo » sam. 9 nov. 2019 21:02

bonsoir TempsX,



c'est pour ça que je parle du decalage arithmetique (au post #40)
qui existait sur les vieux µProc tel que le 6800
on pousse un bit à l'entree .. le dernier bit tombe dans le carry SANS rebouclage sur l'entree
apres le carry on s'en debrouille ou pas .. mais on peut le gerer.

je pense qu'il va falloir traiter ces decalages avec des combinaison RLNCF et RLCF
ou avoir un tableau ou un byte pouvant stoker les 8 carry des 8 bytes decalés et les remettre en bonne place ensuite

une autre idée serait de ne manipuler que des pointeurs ! fini les decalages ..
mais c'est assez difficile de s'imaginer les details.
Pour savoir comment programmer l'algorythme, il faut que ça tourne deja dans l'imaginaire
et un logigramme ne peut pas tout faire/expliquer ..
une animation 3D ?
dehors!! Bon, assez dissgressé, j'ai le boulard qui va exploser !

A+
Aide toi, le ciel ou FantasPic t'aidera


Retourner vers « Langage ASM »

Qui est en ligne

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