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

portée du call
F6FCO
Avatar de l’utilisateur
Passioné
Passioné
Messages : 417
Âge : 64
Enregistré en : décembre 2017
Localisation : Furtif je suis.
Contact :

#1 Message par F6FCO » ven. 16 févr. 2018 13:49

Un truc que je ne pige pas, avec le call limité à une portée max de 256 octets, il y a t''il une astuce de programmation pour aller se brancher plus loin ? je suis sur un programme d'affichage de lettres sur la matrice 8x8 (16F877) et j'ai défini mes lettres et caractères en tableaux avec RETLW.
Genre comme çà:
; --------------------------
Anodes_A
addwf PCL+W
retlw b'0'
retlw b'01111110'
retlw b'11111111'
retlw b'11100111'
retlw b'11100111'
retlw b'11111111'
retlw b'11111111'
retlw b'11100111'
retlw b'11100111'

Anodes_B
addwf PCL+W
retlw b'0'
retlw b'01111111'
retlw b'11111111'
retlw b'11100111'
retlw b'01111111'
retlw b'01111111'
retlw b'11100111'
retlw b'11111111'
retlw b'01111111'

etc., etc., 26 lettres + caractères.
Mais çà prend de la place en mem, plus que 256 octets et hors de portée d'un call.
Tant que les sauts+PCL sont inférieurs à FF tout se passe bien et les Retlw reviennent bien après la ligne suivant le call. Dés que çà dépasse FF, par exemple :
Anodes_V
addwf PCL+W ; situé à hxFC
retlw b'0'
retlw b'11100111'
retlw b'11100111'
si W contient 8 --> FC+8 = FF+4 donc je ne vais pas plus loin et je reviens à l'adresse 4, début du programme.

y -a-t'il moyen de contourner cette limitation ? Il me semble avoir lu un truc sur les sauts de page en configurant PCLATH mais il faut que je retrouve l'info.
J'ai essayé d'être clair mais pas facile à expliquer.
Quand Chuck Norris dit « Hein ? », personne ne dit 2…

portée du call
F6FCO
Avatar de l’utilisateur
Passioné
Passioné
Messages : 417
Âge : 64
Enregistré en : décembre 2017
Localisation : Furtif je suis.
Contact :

#2 Message par F6FCO » ven. 16 févr. 2018 17:45

Je m'auto-réponds à moi-même. J'ai trouvé un début de piste avec la macro GOTOX de Bigonoff (page 37 du cours sur le 876, c'est vraiment le boss ! ) mais çà ne résoud pas le pbm de mes tableaux qui font plus de FF octets et que je dois appeler par des call. Je continue à potasser son cours.
Quand Chuck Norris dit « Hein ? », personne ne dit 2…

portée du call
F6FCO
Avatar de l’utilisateur
Passioné
Passioné
Messages : 417
Âge : 64
Enregistré en : décembre 2017
Localisation : Furtif je suis.
Contact :

#3 Message par F6FCO » ven. 16 févr. 2018 17:55

Je me re-auto-réponds. J'en suis à la macro CALLX, je vais tester sur mon code pour voir si çà résoud mon pbm.

YESSSSS ! çà fonctionne. J'y retourne :-D

PS: suis content, je me suis fais un sujet questions/réponses à moi tout seul :-D
Quand Chuck Norris dit « Hein ? », personne ne dit 2…

portée du call
satinas
Passioné
Passioné
Messages : 268
Enregistré en : novembre 2015

#4 Message par satinas » ven. 16 févr. 2018 18:50

Bonjour F6FCO, trop tard j'ai cogité :)

Le pointeur d'instructions du pic 16F877 comporte 13 bits (0 à 8191), cela lui permet d'adresser ses 8k mots (instructions de taille 14 bits). Particularité de ce pointeur d'instructions, seuls les 8 bits de poids faible sont accessibles directement depuis le code, c'est le registre PCL.

Les instructions GOTO et CALL étant sur 14 bits, on a pu réserver que 11 bits (0 à 2047) pour l'adresse de destination, ce qui explique pourquoi on a des pages programme de 2k mots (4 pour le 16F877). Tant que le programme reste contenu dans la première page, pas de problème. S'il déborde cela se complique pour les sauts.
Pour les instructions qui modifient PCL, on a un problème dès qu'on franchit une page de 256 mots.

Il y a 3 cas possibles de franchissement de page :

- Incrémentation du compteur d'instructions franchit une frontière de page de 2k. Dans ce cas pas de problème car le compteur d'instruction est sur 13 bits.

- Exécution d'un GOTO ou CALL. Là on a que 11 bits, il manque les 2 bits indiquant la page de destination. Le pic considère que c'est à toi de les fournir dans le registre PCLATH. Il va obtenir l'adresse complète du saut ainsi :
. le bit b4 de PCLATH devient le bit b12 de l'adresse
. le bit b3 de PCLATH devient le bit b11 de l'adresse
. l'instruction GOTO ou CALL fournit les bit B10 à b0
Une fois qu'il a les 13 bits, il peut faire le saut. Si c'est un CALL, Le return ne posera pas de problème car avant le saut l'adresse de retour 13 bits est stockée dans la pile programme de 8 niveaux. Effectivement Bigonoff a prévu des macros (GOTOX) pour calculer et renseigner PCLATH.

- Modification manuelle du registre PCL, le pic va faire un saut, et il veut toujours l'adresse complète. Il faut fournir les bits manquants b12 à b8, grâce au registre PCLATH. Le pic obtient l'adresse complète du saut ainsi :
. le bit b4 de PCLATH devient le bit b12 de l'adresse
. le bit b3 de PCLATH devient le bit b11 de l'adresse
. le bit b2 de PCLATH devient le bit b10 de l'adresse
. le bit b1 de PCLATH devient le bit b9 de l'adresse
. le bit b0 de PCLATH devient le bit b8 de l'adresse
. l'instruction de modif de PCL fournit les bit b7 à b0
Une fois qu'il a les 13 bits, il peut faire le saut. Bigonoff a aussi prévu des macros pour incrémenter PCLATH si l'on franchit une page de 256 mots (chercher label tablesaut)

portée du call
Temps-x
Avatar de l’utilisateur
Confirmé
Confirmé
Messages : 792
Enregistré en : juillet 2016
Localisation : Terre

#5 Message par Temps-x » ven. 16 févr. 2018 19:40

Bonsoir F6FCO, satinas, et tout le forum,

Comme satinas à presque tout dit j'ai pas grand chose à rajouter.

Mais pas la peine de rajouter addwf PCL+W pour chaque lettre.

Ont peux stocker les 26 lettres en EEPROM 26 * 8 = 208 octets, sinon la solution et de faire une passerelle :wink:


==> A+
Quand la souris nargue le chat, c'est que son trou n'est pas loin.

portée du call
F6FCO
Avatar de l’utilisateur
Passioné
Passioné
Messages : 417
Âge : 64
Enregistré en : décembre 2017
Localisation : Furtif je suis.
Contact :

#6 Message par F6FCO » ven. 16 févr. 2018 19:55

Bonsoir,
Je vous remercie d'avoir cogité pour moi :wink: .
Mais en fait c'est un peu plus compliqué que çà parce que mes datas sont eux aussi trop importants pour tenir dans une seule page. Il fallait donc modifier le PCLATH pour accéder au début des datas, mais aussi le modifier avec une autre valeur pour aller lire au dela de la lettre V. Du coup choisir la valeur suivant la lettre à afficher.
Pfffttt, usine à gaz.
Heureusement Bigonoff fournit dans son cours sur le 16F876 deux macros toutes faites (avec des IF, ELSE, ENDIF et tout le bazar) GOTOX et CALLX qui s'occupent de tout.
J'ai donc stocké la première partie des datas à partir de 0x1000, et le reste à 0x1800, et la macro CALLX s'occupe de tout, je saute tranquille. :-)
Grosse galère au départ mais finalement je suis content, çà m'a bien fait progresser.
Quand Chuck Norris dit « Hein ? », personne ne dit 2…

portée du call
satinas
Passioné
Passioné
Messages : 268
Enregistré en : novembre 2015

#7 Message par satinas » ven. 16 févr. 2018 20:16

C'est ce que j'appelle "Modification manuelle du registre PCL".

portée du call
F6FCO
Avatar de l’utilisateur
Passioné
Passioné
Messages : 417
Âge : 64
Enregistré en : décembre 2017
Localisation : Furtif je suis.
Contact :

#8 Message par F6FCO » ven. 16 févr. 2018 20:25

Voilà, j'ai passé l'après-midi à bricoler là-dessus :-)
0x0 dans PCL et 0x18 dans PCLATH et on saute à 0x1800
Quand Chuck Norris dit « Hein ? », personne ne dit 2…

portée du call
ducran lapoigne
Débutant
Débutant
Messages : 80
Enregistré en : septembre 2015

#9 Message par ducran lapoigne » sam. 24 mars 2018 17:21

bonjour,
une méthode qui m' a toujours réussi et peu importe ou commence la table
NB: méthode trouvée je ne sais plus sur quel site

Code : Tout sélectionner

;------------------------------------------------------------------------------
ENTREE_RECHERCHE 
    MOVFW    VAR_INDEX
    MOVWF    TABLE_OFFSET
    MOVLW    LOW    LOOKUP_TABLE 
+ 1
    ADDWF    TABLE_OFFSET
,F
    MOVLW    HIGH LOOKUP_TABLE
    BTFSC    STATUS
,C
    ADDLW    1        
;cas FF
    MOVWF    PCLATH
    MOVF    TABLE_OFFSET
,W
    CALL    LOOKUP_TABLE
    RETURN                        
------------------------------------------------------------------------------
;
 TABLE de 256 OCTETS MAX
; APPELEE PAR LE SOUS PROGRAMME ENTREE_RECHERCHE  
; VALEUR DANS W AU RETOUR

LOOKUP_TABLE
        
    MOVWF        PCL    

    RETLW        H
'B2'
    RETLW        H'BF'
    RETLW        H'C8'
    RETLW        H'CF'
    RETLW        H'D4'
    RETLW        H'D8'
    RETLW        H'DC'
    RETLW        H'DF'
    RETLW        H'E1'
    RETLW        H'E4'
    RETLW        H'E6'
    RETLW        H'E7'
    RETLW        H'E9'
    RETLW        H'EA'
    RETLW        H'EB'
    RETLW        H'EC'
    RETLW        H'ED'
    RETLW        H'EE'
    RETLW        H'EF'
    RETLW        H'EF'
    RETLW        H'F0'
    RETLW        H'F1'
    RETLW        H'F1'
    RETLW        H'F2'
    RETLW        H'F2'
    RETLW        H'F3'
;    .....        ....
;
    .....        ....
;
    .....        ....
    RETLW        H'F3'
    RETLW        H'F4'
    RETLW        H'F4'
    RETLW        H'F4'

portée du call
F6FCO
Avatar de l’utilisateur
Passioné
Passioné
Messages : 417
Âge : 64
Enregistré en : décembre 2017
Localisation : Furtif je suis.
Contact :

#10 Message par F6FCO » sam. 24 mars 2018 22:35

Merci Antoine :wink:
Quand Chuck Norris dit « Hein ? », personne ne dit 2…


Retourner vers « Langage ASM »

Qui est en ligne

Utilisateurs parcourant ce forum : Google [Bot] et 10 invités