- 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 ---
Modérateur : mazertoc
- Claudius
Passioné- Messages : 260
- Âge : 69
- Enregistré en : septembre 2015
- Localisation : ELANCOURT (78 - YVELINES)
- Contact :
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
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
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'
J'ai déclarer mes variables à un autre emplacement mémoire H'20' même problème
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+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
Après ce programme je prends des vacances, ça commence à fumer...., Gérard le spécialiste ASM me remplacera.
A+
- Claudius
Passioné- Messages : 260
- Âge : 69
- Enregistré en : septembre 2015
- Localisation : ELANCOURT (78 - YVELINES)
- Contact :
@ 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'
J'ai déclarer mes variables à un autre emplacement mémoire H'20' même problème
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 ;-)
- paulfjujo
Expert- Messages : 2597
- Âge : 73
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
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
le code associé
Code : Tout sélectionner
#define OFFSET 0x0016
unsigned long temps[16] absolute 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 7, de la variable "temps+11" est 1
bsf STATUS,C ; si oui, positionnement 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
y aurait-il des "grumeaux dans la Francine" ?
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.
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é.
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
encore un truc bizarre.... y a t'il des fantômes qui hante Microchip.... je vais faire appelle à un exorciste ....
A+
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;
- paulfjujo
Expert- Messages : 2597
- Âge : 73
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
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<<1 ) +Report ;
Report=(L12 >> 31); L12 =(L12<<1 ) +Report ;
Report=(L13 >> 31); L13 =(L13<<1 ) +Report ;
Report=(L14 >> 31); L14 =(L14<<1 ) +Report ;
Report=(L15 >> 31); L15 =(L15<<1 ) +Report ;
Report=(L16 >> 31); L16 =(L16<<1 ) +Report ;
Report=(L17 >> 31); L17 =(L17<<1 ) +Report ;
Report=(L18 >> 31); L18 =(L18<<1 ) +Report ;
Report=(L19 >> 31); L19 =(L19<<1 ) +Report ;
Report=(L20 >> 31); L20 =(L20<<1 ) +Report ;
Report=(L21 >> 31); L21 =(L21<<1 ) +Report ;
Report=(L22 >> 31); L22 =(L22<<1 ) +Report ;
Report=(L23 >> 31); L23 =(L23<<1 ) +Report ;
Report=(L24 >> 31); L24 =(L24<<1 ) +Report ;
Report=(L25 >> 31); L25 =(L25<<1 ) +Report ;
le decalage n'est correct QUE entre le 29em et 32em ????
fichier *.Lst , *.c et *.asm dans le zip
Retourner vers « Langage ASM »
Qui est en ligne
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 42 invités