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

LCD origine inconnu
satinas
Expert
Expert
Messages : 1225
Enregistré en : novembre 2015

#31 Message par satinas » sam. 15 déc. 2018 19:21

Bonsoir,
Il est très bien ce programme, l'essentiel, c'est que ça marche à la fin.
Organigramme plutôt que chronogramme, et acceuil cela s'écrit "accueil", cela peut surprendre, mais c'est comme ça :)
Il faut faire "GOTO STOP" car si tu fais un call, comme il n'y a pas de return, au bout de 8 appels la pile programme explose. Il faut faire le "GOTO STOP" depuis la boucle principale, car si c'est depuis un sous-programme en cours d'exécution, il y aura aussi des problèmes avec la pile.
Si les boutons ont une fonction différente selon le type d'entrée sélectionnée, pas simple, ton choix de les scruter dans chaque module de programme n'est pas si mal.
Par contre un sous-programme d'affichage de chaînes comme le dit Temps_x, est nécessaire. Cela serait simple en 18F, en 16F je m'y risquerais plus :)

LCD origine inconnu
nondediode
Amateur
Amateur
Messages : 148
Enregistré en : novembre 2018
Localisation : Lyon

#32 Message par nondediode » sam. 15 déc. 2018 19:46

Oh merci satinas pour ce conseil de goto je n'en connaissait pas les risques
je corrige de suite :oops:

Pour accueil j'ai tout simplement pas fait attention à l'orthographe

J'avoue que pour ce prg j'en ai bavé avec cette fichue boucle

Merci à toi

LCD origine inconnu
nondediode
Amateur
Amateur
Messages : 148
Enregistré en : novembre 2018
Localisation : Lyon

#33 Message par nondediode » sam. 15 déc. 2018 20:21

J'ai remplacé ttes les cdes
Call stop par goto stop et le programme plante complètement
il va chercher n'importe quoi dans les routines, j'ai beau essayer de rapprocher le prg STOP au plus près du prg principal ça ne change rien.
J'ai l'impression que la distance et le nbre de routines complique le déroulement c'est possible ce genre de truc?

En fait quand tu regardes bien mon programme, quand je suis dans le module stop ou stop2 celui va chercher l'affichage ARRET qui lui se termine par un RETURN pour revenir au prg stop ou stop2 afin de finir de couper les relais et ensuite il renvoie le prg sur INIT

Avec cette config y a t'il le risque de tuer la pile?
J'ai testé plusieurs fois de suite la cde stop et ça n'a pas l'air de contrarier le système
Lis bien ma routine d'arrêt et dis moi ce que tu en penses

LCD origine inconnu
satinas
Expert
Expert
Messages : 1225
Enregistré en : novembre 2015

#34 Message par satinas » sam. 15 déc. 2018 20:34

le sous-programme STOP se termine soit par un "return" soit par "goto init", cest là qu'est le problème.
Je n'ai pas regardé en détail, il faut vérifier que tu empiles correctement les sous-programmes, et qu'ils se terminent tous par un return, pas par un goto intempestif.
Si aucun sous-programme n'est en cours d'exécution, pas de problème pour un faire un "goto init", c'est pas très beau, mais ça marche.
Si on sort d'un sous-programme sans faire de return, la pile le tolérera car elle trouvera tôt ou tard un return, mais le programme plantera de façon aléatoire, sur un stack overflow.
Tout call doit se terminer par un return.

Si tu veux revenir à init depuis un sous-programme, tu peux l'indiquer dans une variable, puis sortir des sous-programmes en cours, et là tu peux faire le "goto init".

PS: Il semble que même TUN_1, tu l'appelles par un "CALL TUN_1", et je vois pas de return, va falloir faire un schéma avec l'arborescence de tes sous-programmes, car ton programme marche, mais question durée de vie avant plantage, ouille :)

Utilise le debugger, tu mets un break sur la ligne "GOTO INIT", et tu regardes le contenu de la pile dans Mplab "menu View/Hardware Stack". Elle doit être empty, sinon tu redémarres ton init avec une pile non vide, et plantage en vue.

Au fait, les spécialistes du 16F, si le programme est de grande taille, il faut pas utiliser le registre PCLATH pour les sauts ?
Modifié en dernier par satinas le sam. 15 déc. 2018 21:47, modifié 1 fois.

LCD origine inconnu
Temps-x
Avatar de l’utilisateur
Expert
Expert
Messages : 2595
Enregistré en : juillet 2016
Localisation : Terre

#35 Message par Temps-x » sam. 15 déc. 2018 21:47

Bonsoir satinas, et tout le forum,

satinas a écrit :Source du message Au fait, les spécialistes du 16F, si le programme est de grande taille, il faut pas utiliser le registre PCLATH pour les sauts ?


Normalement ouais, un saut est limité à 2048 mots, ce qui représente plus de 2000 lignes de code à partir du saut.

Je crois pas que c'est le cas pour son programme, car je viens de regarder son code dans l'éditeur, et j'arrive à 1470 lignes.

==> A+
Modifié en dernier par Temps-x le sam. 15 déc. 2018 22:15, modifié 5 fois.
:roll: Les requins, c'est comme le langage ASM, c'est le sommet de la chaîne alimentaire. :wink:

LCD origine inconnu
satinas
Expert
Expert
Messages : 1225
Enregistré en : novembre 2015

#36 Message par satinas » sam. 15 déc. 2018 22:03

ok, merci Temps-x
nondediode, surveille ta pile avec le debugger.

Il se peut que par défaut, il n'y ait pas de plantage si le pointeur de pile revient à 0 sur overflow.
Après lecture datasheet, c'est bien le cas, donc on va dire que ton programme marche, y a juste quelques returns qui manquent, et on le dira à personne :)

LCD origine inconnu
nondediode
Amateur
Amateur
Messages : 148
Enregistré en : novembre 2018
Localisation : Lyon

#37 Message par nondediode » dim. 16 déc. 2018 10:24

Bonjour Satinas, Temps-X et tous les autres,

Je vais vérifier ces "return" "call" et "goto" mais il me semble avoir fait attention à cette logique.
Car de tte façon dans mon expérience perso, lorsque qu'un sous programme est appelé avec la cde goto ça plante systématiquement car il ira pas forcement chercher le bon sous prg et si ce sous prg appelé par la cde CALL ne se termine pas par "RETURN" le pointeur, (je ne sait pas si c'est comme ça qu'il faut le nommer) continuera de lire la suite jusqu'à ce qu'il rencontre un return Ex;

Prg TUNER est suivi par CD1.
Si je n'ai pas un return à la fin de ce sous-prg il continuera sur CD1
Lorsque j'effectue la cde Call tuner il va bien chercher TUNER mais si je remplace call par goto il ira pas obligatoirement chercher TUNER mais il prendra autre chose ou le prg fera n'importe quoi. ça je l'ai compris depuis bien lgtps. Voir même mon post précédent où j'ai tenté de remplacer CALL par GOTO pour le sous-prg STOP et STOP2.

Le sous programme de TUN_1 est lié au sous programme TEST_B.

J'indique dans TEST_B que je teste le bouton sur RC1 et j'appelle TUN_1 si RC1=1 si il est à 0 je continue ma série de test et je boucle sur TEST_B si rien n'a été validé, et dans chaque test j'utilise la cde CALL car avec GOTO ça pose pb .
En somme, j'ai bien la cde CALL pour l'action de TUN_1
Dans TUN_1:
J'ai gardé la même philosophie que TEST_B.
C'est une série de tests qui ira chercher par une cde CALL les sous programme utiles.

Pour résumer cette histoire de boucle, je dirais que je suis obligé d'utiliser CALL pour tous les sous-programmes de tests dans lequel il ne reviendra jamais dans le sous-prg d'origine

C'est cette boucle qui m'a été très compliqué à mettre en place et je n'ai pas trouvé d'autres solutions aussi fiable.

Mais c'est aussi celle-ci que j'aimerai retravailler pour la simplifier à son maximum parce que j'aime les choses simples :wink:
Je ne vois pas comment faire autrement, je me suis arraché les cheveux pendant 2 jrs là dessus en essayant des tas de méthodes :cry:
J'ai testé plusieurs fois mon programme et il tourne à merveille :-)
Seul petit soucis que j'ai eu 1 seule fois, c'est la LED rouge qui ne s'est pas allumée en début de prg. J'ai tout simplement rajouté CALL ATTENTE5 avant la cde du message d'accueil et le pb a été réglé.

Je ne suis hélas pas un PRO de la programmation et je suis loin d'en connaitre ttes les subtilités. :oops:
J'avoue que ce prg est le plus complexe que j'ai réalisé il contient forcement des erreurs dont je suis conscient mais grâce à vous et ce forum je sais que je vais renforcer mes connaissances.

Si d'entres vous, vous avez bien compris cette boucle en vous aidant de l'organigramme
chronogramme de LCD_845.docx

essayez de me la ré-écrire dans une méthode simple et compréhensible. A regarder le prg cela peut sembler simple mais n'oublions pas que certains bouton ont une double action et qu''il y a pour chaque écran 2 possibilités; mode recherche et mode validé donnant accès à d'autres fonctions.

A bientôt
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.

LCD origine inconnu
nondediode
Amateur
Amateur
Messages : 148
Enregistré en : novembre 2018
Localisation : Lyon

#38 Message par nondediode » dim. 16 déc. 2018 10:45

J'ai oublié de préciser une méthode qui me semblait bonne.
En utilisant l'eeprom pour y ranger chaque config. et d'aller chercher la bonne config par une adresse définie
Aidé par un exemple de programme de serrure codée, Le pb était de savoir comment gérer cette méthode qui n'est pas simple à mon esprit

LCD origine inconnu
satinas
Expert
Expert
Messages : 1225
Enregistré en : novembre 2015

#39 Message par satinas » dim. 16 déc. 2018 13:32

Bonjour à tous,

La config est très simple, elle se stocke dans quelques variables, avec les écrans à afficher correspondants.
Il faudrait une seule boucle qui scrute les poussoirs, et qui agit en fonction du contexte.
C'est vrai que ce serait peut être plus simple d'avoir du texte en eeprom plutôt qu'en flash.

Dans l'état actuel de ton programme, si tu veux pas que la pile n'y perde son latin, Il faut "GOTO TUN_1", "GOTO STOP", "GOTO STOP2"
Il n'est pas possible de mettre un return derrière STOP et STOP2, donc pas de retour en arrière possible, dès qu'on appuie sur "OFF" la procédure d'arrêt se lance. De même pas de stop possible depuis les sous-programmes CLIGNOTE, MENU_B

Autre solution, ne toucher à rien, et remplacer le "GOTO INIT" par un reset hardware déclenché par le watchdog. C'est un peu brutal, mais si cela ne pose pas de problème avec les relais et autres sorties.

le bit RC7 c'est quel type de retour audio ?
Avec l'autre lcd, tu aurais pu faire un vu-mètre avec l'ADC du pic. Avec le 4x40, il y a possibilité d'avoir un caractère plein de hauteur ou largeur variable en utilisant les 8 caractères programmables. Et en affichant plusieurs caractères, on peut faire un vu-mètre horizontal.

LCD origine inconnu
nondediode
Amateur
Amateur
Messages : 148
Enregistré en : novembre 2018
Localisation : Lyon

#40 Message par nondediode » dim. 16 déc. 2018 15:05

Concernant le GOTO INIT je viens de réaliser une ruse qui permet de m'en affranchir sans gêner le processus actuel.

STOP et STOP2 sont à la suite l'un de l'autre et le sous programme d'après s'appelle INIT
Voilà ce que j'ai fait :wink:

A la fin de stop et stop2, j'ai supprimé GOTO INIT et j'ai remplacé par GOTO FINI :lol: Mouais il fallait bien trouver qq chose :-D
J'ai créer une étiquette qui s'appelle fini et que j'ai placé à la fin de sous-prg STOP / STOP2 sur lequel j'ai écrit NOP.
Comme le sous programme INIT est placé juste après il va forcement se placer au début de sous prg INIT

Code : Tout sélectionner

    DECFSZ    RETARD4,F    ; On décrémente RETARD4,F si RETARD5,F=0 on saute l'instruction suivante
    GOTO    ATTENTE_B    ; Si RETARD5,F=1 retour à ATTENTE_B

    MOVLW    B'
00000000'    ; Relais statiques désactivés
    MOVWF    PORTA    
;    GOTO    INIT
    GOTO    FINI
STOP2
    CALL    TEMPO2        ; Appel de TEMPO2    
    BTFSS    PORTB,3        ; Test du bouton OFF
    RETURN
    CALL    ARRET        ; Appel de l'
affichage ARRET
    CALL    ATTENTE5    
; Appel ATTENTE5
    MOVLW    B
'00110000'    ; Relais HT droit et gauche désactivé
    MOVWF    PORTA        
; 
    MOVLW    B
'00000100'    ; Leds rouges activées
    MOVWF    PORTB        
;     
;    GOTO    INIT
FINI
;    CALL    ATTENTE5    ; Appel ATTENTE5
    NOP    

;-----------------------------------------PROGRAMME D'INITIALISATION----------------------------------------

INIT
    CLRF    PORTA        ; On remet à 0 le port A
    CLRF    PORTB        ; On remet à 0 le port B
    CLRF    PORTC        ; On remet à 0 le port C
    CLRF    PORTD        ; On remet à 0 le port D    
    CLRF    PORTE        ; On remet à 0 le port E
    BSF    STATUS,RP0    ; Selection de la page mémoire RP0
    BCF    STATUS,RP1    ; Déselection de la page mémoire RP1


Dans la procédure de la cde de STOP ou STOP2 l'appui par RB3 lance le prog après avoir maintenu appuyé le bouton qq secondes.
Un coup le processus lancé il est impossible de revenir en arrière.

Pour le GOTO TUN_1 je viens de corriger
Pour CLIGNOTE je suis obligé de garder la cde

Je suis entrain de penser à une chose; Est-il possible de mettre RB3 dans un prg d'interruption? cela faciliterai bien des choses :wink:

Pour RC7 c'est une info qui vient d'un autre appareil sur lequel est connecté ttes mes sources et 1 autre ampli.
Le fonctionnement de cet appareil que je nome B est le suivant:
Lorsque B est allumé il envoie une sortie 5V à l'ampli A
Et A renvoie un message binaire à B qu'il va décoder pour savoir quelle source il doit commuter.
Tuner 001
CD1 010
CD2 011
DVD 100
TAPE 101
PHONO 110

Pour le vumètre horizontale l'idée est excellente mais je ne suis pas très adepte de cet option qui n'a pas une grande utilité.
Les vumètres c'est mes oreilles :lol:


Retourner vers « Langage ASM »

Qui est en ligne

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