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 :

#61 Message par Claudius » mer. 13 nov. 2019 17:59

Bonsoir le Forum,

Je rejoins Temps-x (dixit: Si il y a un décalage dans tes variables, c'est que la mémoire est touchée à l'endroit où sont entreposées tes variables, la solution serait d'essayer un autre emplacement mémoire ... MikroC)

Maintenant, écrire la gestion SPI en assembleur permettra de déterminer et si cela fonctionne, qu'il y a effectivement collision entre les zones mémoire utilisées en C et celles utilisées en ASM. C'est toute la difficulté de cette cohabitation Langage C / ASM qu'il faut qualifier une fois pour toute et ce pour un compilateur donné (mémoire utilisée, changement de Bank, registres à sauver / restaurer éventuellement ;-)

Question: Le modèle mémoire utilisé par MikroC est-il documenté ? A défaut, reste à faire du reverse engineering :geek:

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

#62 Message par Temps-x » jeu. 14 nov. 2019 02:21

Bonsoir paulfjujo, Claudius, et tout le forum,


Pour configuration du mode SPI, avec PIC18F26K22

Code : Tout sélectionner


 
;************************ configuration du registres TRISC pour mode SPI ***********************

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

;**************************** configuration du registre SSP1CON1 ******************************* 

      movlw B
'01000000'                   ; B7 = 0 : lecture des données au milieu
      movwf SSP1STAT                      
; B'01000000'

      movlw B'00100001'                   ; B0 ...B3 = spi en mode maître, clock = FOSC/16, B5 = polarité négative
      movwf SSP1CON1                      
; 16 /16(quartz) = 1Mbps B'00100001'

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

loop
       movff POSTINC0
,WREG                ; aller chercher les données en mémoire
       rcall envoi_spi                    
; envoyer sur ligne spi 

       decfsz envoi
,F
       bra loop

;*********************************************************************************************** 
fini
      bra fini

;*********************************************************************************************** 
envoi_spi    
       movwf SSP1BUF    
    
attends
      btfss SSP1STAT
,BF                    
      bra attends
    
      return


:roll: Je viens de voir une chose bizarre dans MPLAB quand je copie 16 octets de la bank 1 vers bank 0.

La copie se passe bien jusqu'à H'09' après la copie continue sur H'10' alors quand théorie ça devrait passer sur H'0A' :sifflotte:
J'ai déclarer mes variables à un autre emplacement mémoire H'20' même problème :eek:

Mes déclarations sont faite comme ceci

Code : Tout sélectionner


   CBLOCK H
'00'                           ; bank 0                               
     temps          
:16
     point_y        
:1
     point_x        
:1
     valeur         
:1    
     emplacement    
:1
                   
     lecture        
:1
   ENDC 

;*********************************************************************************************** 
copier
      lfsr FSR0
,H'100'                    ; pointer sur le début de la bank 1

      movff POSTINC0
,temps+
      movff POSTINC0
,temps+1
      movff POSTINC0
,temps+2
      movff POSTINC0
,temps+3
      movff POSTINC0
,temps+4
      movff POSTINC0
,temps+5
      movff POSTINC0
,temps+6
      movff POSTINC0
,temps+7
      movff POSTINC0
,temps+8
      movff POSTINC0
,temps+9
      movff POSTINC0
,temps+10
      movff POSTINC0
,temps+11
      


Après ce programme je prends des vacances, ça commence à fumer...., Gérard le spécialiste ASM me remplacera. dehors!!

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

#63 Message par Claudius » jeu. 14 nov. 2019 11:34

Bonjour,

@ La copie se passe bien jusqu'à H'09' après la copie continue sur H'10' alors quand théorie ça devrait passer sur H'0A' :sifflotte:
J'ai déclarer mes variables à un autre emplacement mémoire H'20' même problème :eek:

Argh !...
Et donc, quels sont les codes assembleur correspondant à:

Code : Tout sélectionner

      movff POSTINC0,temps+0
      movff POSTINC0,temps+1
      movff POSTINC0,temps+2
      movff POSTINC0,temps+3
      movff POSTINC0,temps+4
      movff POSTINC0,temps+5
      movff POSTINC0,temps+6
      movff POSTINC0,temps+7
      movff POSTINC0,temps+8
      movff POSTINC0,temps+9
      movff POSTINC0,temps+10
      movff POSTINC0,temps+11


NB: Toujours fournir ce code assembleur pour une analyse plus approfondies ;-)

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 :

#64 Message par paulfjujo » jeu. 14 nov. 2019 16:17

bonjour

j'ai refais des test qui confirme qu'il y a des interactions incompatibles avec le C et l'asm encapsulé
si je test uniquement a fonction ASM (encapsulée dans du C) , no problemo
le decalage 64 bits de mes 8 registres composés chacun de 2 entiers longs 32 bits se fait bien
Avant le test, je charge la valeur 1 dans chaque registre pour pouvoir observer les decalage sous debugger MikroC et Watch window
le bit circule bien circulairement .

je capture l'ecran Watch variables juste avant la decrementation du compteur Sortie
nota : compteur Sortie initalisé à 63 !
je vois donc la valeur 2 apres le premier decalage .. etc ..

point d'arret ,pour capture image Watch window
Sequence_decalage_Point_arret_191114.jpg


Sequence_decalage_191114.jpg




le code associé

Code : Tout sélectionner



 
#define OFFSET 0x0016
 
unsigned long temps[16absolute OFFSET;
char sortie absolute OFFSET+65;


 
// init des mots de 64 bits avec valeur 1
   
for (i=0;i<16;i=i+2)
   {
      
temps[i]=1;
     }
   
sortie=0;
   
   
   
_asm {
  
ici:
      
movlw 63
      movwf _sortie                        
8 matrice x 8 points 64  (8 bits  x  Nombre de Matrice) = sortie

tourne
:
      
bcf STATUS,C                        positionnement à priori de carry à 0
      btfsc _temps
+7,7                    regarder si le bits 7de la variable "temps+11" est 1
      bsf STATUS
,C                        si ouipositionnement de 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                      ;
   
//2em
      
bcf STATUS,C
      btfsc _temps
+15,7
      bsf STATUS
,C

      rlcf _temps
+8,F                      ;
      
rlcf _temps+9,F                      ;
      
rlcf _temps+10,F                      ;
      
rlcf _temps+11,F                      ;
      
rlcf _temps+12,F                      ;
      
rlcf _temps+13,F                      ;
      
rlcf _temps+14,F                      ;
      
rlcf _temps+15,F                      ;

    
//3em
      
bcf STATUS,C
      btfsc _temps
+23,7
      bsf STATUS
,C

      rlcf _temps
+16,F                      ;
      
rlcf _temps+17,F                      ;
      
rlcf _temps+18,F                      ;
      
rlcf _temps+19,F                      ;
      
rlcf _temps+20,F                      ;
      
rlcf _temps+21,F                      ;
      
rlcf _temps+22,F                      ;
      
rlcf _temps+23,F                      ;
   
//4em
       
bcf STATUS,C
      btfsc _temps
+31,7
      bsf STATUS
,C

      rlcf _temps
+24,F                      ;
      
rlcf _temps+25,F                      ;
      
rlcf _temps+26,F                      ;
      
rlcf _temps+27,F                      ;
      
rlcf _temps+28,F                      ;
      
rlcf _temps+29,F                      ;
      
rlcf _temps+30,F                      ;
      
rlcf _temps+31,F                      ;
    
    
//5em 
      
bcf STATUS,C
      btfsc _temps
+39,7
      bsf STATUS
,C
      rlcf _temps
+32,F                      ;
      
rlcf _temps+33,F                      ;
      
rlcf _temps+34,F                      ;
      
rlcf _temps+35,F                      ;
      
rlcf _temps+36,F                      ;
      
rlcf _temps+37,F                      ;
      
rlcf _temps+38,F                      ;
      
rlcf _temps+39,F                      ;
      
    
//6em
      
bcf STATUS,C
      btfsc _temps
+47,7
      bsf STATUS
,C
      rlcf _temps
+40,F                      ;
      
rlcf _temps+41,F                      ;
      
rlcf _temps+42,F                      ;
      
rlcf _temps+43,F                      ;
      
rlcf _temps+44,F                      ;
      
rlcf _temps+45,F                      ;
      
rlcf _temps+46,F                      ;
      
rlcf _temps+47,F                      ;

    
//7em
      
bcf STATUS,C
      btfsc _temps
+55,7
      bsf STATUS
,C
      rlcf _temps
+48,F                      ;
      
rlcf _temps+49,F                      ;
      
rlcf _temps+50,F                      ;
      
rlcf _temps+51,F                      ;
      
rlcf _temps+52,F                      ;
      
rlcf _temps+53,F                      ;
      
rlcf _temps+54,F                      ;
      
rlcf _temps+55,F                      ;
      
      
//8em
      
bcf STATUS,C
      btfsc _temps
+63,7
      bsf STATUS
,C
      rlcf _temps
+56,F                      ;
      
rlcf _temps+57,F                      ;
      
rlcf _temps+58,F                      ;
      
rlcf _temps+59,F                      ;
      
rlcf _temps+60,F                      ;
      
rlcf _temps+61,F                      ;
      
rlcf _temps+62,F                      ;
      
rlcf _temps+63,F                      ;

      
decfsz _sortie,F
      
goto tourne
fini
:
      
nop
     
goto ici
  
}
 


si ensuite , j'utilise des fonctions en C , pour
afficher sur le terminal (UART) le resultat des 8 mots en binaire * ou .
ou affichage sur matrices en SPI
c'est OK pendant seulement 4 declages successifs, puis par en quenouille au 5eme

Affichage _Sequence_decalage_191114.jpg


y aurait-il des "grumeaux dans la Francine" ?
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 :

#65 Message par paulfjujo » jeu. 14 nov. 2019 16:19

  oops
Modifié en dernier par paulfjujo le jeu. 14 nov. 2019 16:24, modifié 1 fois.
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 :

#66 Message par paulfjujo » jeu. 14 nov. 2019 16:20

oops

question:

si on veut effacer un message , because erreur ou doublon,
efface t-on que le #post en cours de frappe ou TOUT le message ?
Aide toi, le ciel ou FantasPic t'aidera

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

#67 Message par satinas » jeu. 14 nov. 2019 16:39

Salut Paul,
Peux tu nous montrer le fichier LST assembleur produit par le compilateur, pour le code asm inséré dans le C.
Je viens de voir que Claudius a fait la même demande :)
merci

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

#68 Message par Temps-x » ven. 15 nov. 2019 00:38

Bonsoir Claudius, paulfjujo, satinas, et tout le forum,

paulfjujo a écrit :Source du message question:

si on veut effacer un message , because erreur ou doublon,
efface t-on que le #post en cours de frappe ou TOUT le message ?


Je réponds à la place de Jérémy, oui ça supprime que le post en cours, suffit de cocher la casse, et d'indiquer le motif.

message-1.JPG


:roll: Normalement, ça ne devrait pas être 63 qui devrait être copié dans la variable "_sortie" mais 64, il me semble dans les essais que j'avais fait, je mettais bien la valeur des points.

Code : Tout sélectionner


 ici
:
      movlw 63
      movwf _sortie                        
; 8 matrice x 8 points = 64  (8 bits  x  Nombre de Matrice) = sortie



Claudius a écrit :Source du message NB: Toujours fournir ce code assembleur pour une analyse plus approfondies ;-)


Ok, mais là c'est d'aucune utilité, puise que c'est en mémoire que mes variables se suive pas, avec une copie d'écran tu comprendras, j'ai tout indiqué.

Débug.jpg


Le code se résume à ça

Code : Tout sélectionner


ligne_charge
      lfsr FSR0
,H'100'                    ; pointer sur le début de la bank 1

      movf emplacement
,W
      addwf FSR0L
,F                       ; pointer sur l'adresse 

      movff POSTINC0,temps+0 
      movff POSTINC0,temps+1
      movff POSTINC0,temps+2
      movff POSTINC0,temps+3
      movff POSTINC0,temps+4
      movff POSTINC0,temps+5
      movff POSTINC0,temps+6
      movff POSTINC0,temps+7
      movff POSTINC0,temps+8
      movff POSTINC0,temps+9
      movff POSTINC0,temps+10
      movff POSTINC0,temps+11

      movf valeur,W                       ; 
      addwf emplacement,F                 ; pour prochain traitement

      return  
      


oops encore un truc bizarre.... :roll: y a t'il des fantômes qui hante Microchip.... je vais faire appelle à un exorciste ....

==> A+
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Modifié en dernier par Temps-x le ven. 15 nov. 2019 19:58, 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
satinas
Expert
Expert
Messages : 1225
Enregistré en : novembre 2015

#69 Message par satinas » ven. 15 nov. 2019 04:33

Bonjour

Code : Tout sélectionner

unsigned long temps[16] absolute OFFSET;
// init des mots de 64 bits avec valeur 1
for (i=0;i<16;i=i+2)
   {
      temps[i]=1;
   }

C'est un tableau de 16 long, il faut faire i++, pas i=i+2

Pourquoi des long, on parle d'octets
unsigned char temps[64] absolute OFFSET;

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 :

#70 Message par paulfjujo » ven. 15 nov. 2019 12:15

satinas a écrit :C'est un tableau de 16 long, il faut faire i++, pas i=i+2
Pourquoi des long, on parle d'octets
unsigned char temps[64] absolute OFFSET;


je represente mes 8 lignes afficheurs matrice8x8 avec un simili mot de 64 bits
= 2 long concaténés , ce qui explique le i+2 , pour atteindre le LSB de chaque mot de 64 bits
ou j'ai rangé la valeur 1 ,comme bit de depart pour le voir se deplacer de droite à gauche
temps{1]+ Temps[0]= 1ere ligne
car par la suite ,pour l'affichage reel sur matrice ( et non plus sur l'ecran)
j'utilise

Code : Tout sélectionner



void _Affiche_Text_8_Matrices_H
(Byte *pp)
{
Byte c1;
int i,j,k;
i=0;
Depart=OFFSET;  // 0x0016
    
j=0;
    while (*(
pp)>0)
    {
        
c1=*(pp);
        
k=(c1*8);
        for (
i=0;i<8;i++)
        {
        *(
Depart +j+i)=  font_8x8_H[k+i];
        
SPI_Write_To_8x7219(i+1,*(Depart+i),*(Depart+8+i),*(Depart+16+i),*(Depart+24+i),*(Depart+32+i),*(Depart+40+i),*(Depart+48+i),*(Depart+56+i));
           }
       
j=j+8;
       
pp++;
    }
  }
  
 


Depart[0+i]...Depart[56+i] <-- le mot de 64 bits
mais il est vrai qu'on peut aussi raisonner au niveau du Byte (octet)
c'est toujours plus ou moins une vue de l'esprit, comment on veut voir une variable
soit modulo 8bits,....16, 32, 64
j'avais essayé de definir mes 8 variables avec un double , qui est sensé etre donc sur 64 bits
mais MikroC fait la gueule , car il se les reserve que pour des doubles flottants
et je ne vois pas pourquoi , sachant que l'arithmetique MATHS flottants n'est que sur 32 bits avec mikroC.

Nota:
difficulté supplementaire : mes matrices actuellement en test fonctionnent en INVERSE !
marquage au dos different (inversé)
(par rapport à celle que j'avais utilisée dans une precedente application)
sens de defilement et sens vertical

matrice2 ----- matrice1 ------- SPI PIC
L1 .....................L0
L3......................L2
L5 .....................L4
L7......................L6
L9 .....................L8
L11....................L10
L13....................L12
L15....................L14

il y a de quoi perdre les pédales ! avec ces ERSATZ fournis par les RPC


un test avec decalage long uniquement en C
avec

Code : Tout sélectionner


 Report
=(L10>>31);  L10 =(L10<<1) + Report ;
      
Report=(L11  >> 31);  L11 =(L11<<) +Report ;
       
Report=(L12  >> 31);  L12 =(L12<<) +Report ;
        
Report=(L13  >> 31);  L13 =(L13<<) +Report ;
         
Report=(L14  >> 31);  L14 =(L14<<) +Report ;
          
Report=(L15  >> 31);  L15 =(L15<<) +Report ;
           
Report=(L16  >> 31);  L16 =(L16<<) +Report ;
            
Report=(L17  >> 31);  L17 =(L17<<) +Report ;
             
Report=(L18  >> 31);  L18 =(L18<<) +Report ;
              
Report=(L19  >> 31);  L19 =(L19<<) +Report ;
               
Report=(L20  >> 31);  L20 =(L20<<) +Report ;
                
Report=(L21  >> 31);  L21 =(L21<<) +Report ;
                 
Report=(L22  >> 31);  L22 =(L22<<) +Report ;
                  
Report=(L23  >> 31);  L23 =(L23<<) +Report ;
                   
Report=(L24  >> 31);  L24 =(L24<<) +Report ;
                    
Report=(L25  >> 31);  L25 =(L25<<) +Report ;
 


le decalage n'est correct QUE entre le 29em et 32em ????

Affichage _Sequence_decalage_en_C_191115.JPG


fichier *.Lst , *.c et *.asm dans le zip
PIC18F27K42_Test_defil_8_Reverse_Matrices_Max7219_Horiz_191115.zip
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Aide toi, le ciel ou FantasPic t'aidera


Retourner vers « Langage ASM »

Qui est en ligne

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