Répondre à la discussion
Affichage des résultats 1 à 17 sur 17

PIC16F84A ecrire dans EEP directive LOCAL



  1. #1
    ogre31

    PIC16F84A ecrire dans EEP directive LOCAL


    ------

    Bonsoir,
    Avant de poster j'ai fait une recherche dans le forum,désolé si je l'ai raté.... donc voila
    Je n'arrive pas à saisir le rôle de la directive "LOCAL", expliquée dans le cours de bigonoff, pour ecrire dans l'EEP.
    J'arrive bien à ecrire dans EEp en utilsant le corp de la macro 'WRITEE' pour incrementer une variable comme ceci:
    Code:
    	     ;WRITEE eereload ; (appel macro WRITEE écrire à l'adresse 0x00 (try to use with out macro)
    	    ;LOCAL loop
    	    movwf EEDATA
    	    movlw 0x00
    	    movwf EEADR
    ;-----
    ;loop
    	   bcf INTCON , GIE 	; interdire interruptions
    	  ;btfsc INTCON , GIE 	; tester si GIE bien à 0 (inutile)
    	  ;goto loop 			; non, recommencer (inutile)
    	  bsf STATUS , RP0 	; passer en banque1
    	  bcf EECON1 , EEIF 	; effacer flag de fin d'écriture
    	  bsf EECON1 , WREN 	; autoriser accès écriture
    			;----- debut commandes constructeur------
    	  movlw 0x55 			; charger 0x55
    	  movwf EECON2 		; envoyer commande
    	  movlw 0xAA 			; charger 0xAA
    	  movwf EECON2 		; envoyer commande
    	  bsf EECON1 , WR 	; lancer cycle d'écriture
    			;----- fin commandes constructeur------
    	  bcf EECON1 , WREN 	; verrouiller prochaine écriture
    	  bsf INTCON , GIE 	; réautoriser interruptions
    	  bcf STATUS , RP0 	; repasser en banque 0
    ;------
    mais je n'arrive pas a comprendre, comme dit plus haut, le pourquoi de "LOCAL loop".

    Merci

    -----
    Dernière modification par gienas ; 15/05/2020 à 06h50. Motif: Ajouté les balises code obligatoires pour les programmes

  2. Publicité
  3. #2
    simon.

    Re : PIC16F84A ecrire dans EEP directive LOCAL

    Salut...

    La prochaine fois ce serait sympa de mettre le bout de code original plutot que le resultat de tes modifications
    Code:
    WRITEE macro addwrite ; la donnée se trouve dans W
    LOCAL loop ; étiquette locale
    movwf EEDATA ; placer data (w) dans registre
    movlw addwrite ; charger adresse d'écriture
    movwf EEADR ; placer dans registre
    loop
    bcf INTCON , GIE ; interdire interruptions
    btfsc INTCON , GIE ; tester si GIE bien à 0 (inutile)
    goto loop ; non, recommencer (inutile)
    bsf STATUS , RP0 ; passer en banque1
    bcf EECON1 , EEIF ; effacer flag de fin d'écriture
    bsf EECON1 , WREN ; autoriser accès écriture
    movlw 0x55 ; charger 0x55
    movwf EECON2 ; envoyer commande
    movlw 0xAA ; charger 0xAA
    movwf EECON2 ; envoyer commande
    bsf EECON1 , WR ; lancer cycle d'écriture
    bcf EECON1 , WREN ; verrouiller prochaine écriture
    bsf INTCON , GIE ; réautoriser interruptions
    bcf STATUS , RP0 ; repasser en banque 0
    endm
    Ca veut ici dire que le label 'loop' est local a cette macro. Ca donne le droit d'en redefinir d'autres avec le meme nom dans d'autres macros.

  4. #3
    ogre31

    Re : PIC16F84A ecrire dans EEP directive LOCAL

    Bonsoir,
    Merci et désolé pour la surcharge du post

  5. #4
    freepicbasic

    Re : PIC16F84A ecrire dans EEP directive LOCAL

    If faut charger une valeur dans W

    soit
    movlw (quelque chose)

    soit
    movf (adresse du quelque chose) ,W
    A+, pat

  6. #5
    freepicbasic

    Re : PIC16F84A ecrire dans EEP directive LOCAL

    LOCAL loop

    Le nom loop est interne à la Macro et un appelle à loop dans le programme principale devra - être un autre loop.
    A+, pat

  7. A voir en vidéo sur Futura
  8. #6
    ogre31

    Re : PIC16F84A ecrire dans EEP directive LOCAL

    Bonsoir,
    et merci à tous,
    Il est dit que l’accès à EEP est limité a 1M de cycles.
    Mes questions , j'en ai 2.
    1-est-ce que les accès en lecture sont comptabilisés, ou le 1M de cycle ne concerne que les écritures dans l'EEP.
    2-Peut-on appeler une interruption de l’intérieur d'une autre interruption.

    Merci.

  9. Publicité
  10. #7
    invite03481543

    Re : PIC16F84A ecrire dans EEP directive LOCAL

    Bonjour,
    non elles ne sont pas comptabilisées, c'est juste statistique, une EEPROM est limitée en cycles d'écriture.
    Un PIC ne traite qu'une interruption à la fois, c'est pour cette raison qu'il ne faut pas s'endormir dans l'interruption et traiter à l'extérieur le travail à faire pour rendre la main au plus vite et ne pas rater un autre événement.

  11. #8
    ogre31

    Re : PIC16F84A ecrire dans EEP directive LOCAL

    Bonsoir,
    c'est rassurant ,Merci beaucoup pour vos réponses et conseils

    Bonne soirée/Bonne journée

  12. #9
    ogre31

    Re : PIC16F84A ecrire dans EEP directive LOCAL

    Bonsoir, et meri de m'aider
    je reviens avec une autre question concernant le code ci-dessous.
    je n'arrive pas a comprendre pourquoi l'instruction "btfsc NewTime,0" ne saute pas
    l'appel de la marcro "WRITEE"(routine d'ecriture dans l'EEp) contrairement à l'appel
    de la macro "BANK0"


    Merci pour votre aide
    bonne soirée/journée
    Code:
    ;*********************************************************************
    	LIST      p=16F84A 	
    	#include <p16F84A.inc> 	
    	radix dec		
    
    	__CONFIG   _CP_OFF & _WDT_OFF & _PWRTE_ON & _HS_OSC
    
    ;*********************************************************************
    ;                              ASSIGNATIONS                          *
    ;*********************************************************************
    OPTIONVAL	EQU	H'40'
    INTERMASK	EQU	H'80'   ; t0ie ohh b'1    0   0   0     0     0   0    0'
    ;*********************************************************************
    ;                             MACRO                                  *
    ;*********************************************************************
    BANK0	macro
    	bcf STATUS,5
    	endm
    BANK1	macro
    	bsf STATUS,5
    	endm
    
    WRITEE macro addwrite 
    	LOCAL loop 
    	movwf EEDATA 
    	movlw addwrite 
    	movwf EEADR
    loop
    	bcf INTCON , GIE 
    	btfsc INTCON , GIE 
    	goto loop 
    	bsf STATUS , RP0 
    	bcf EECON1 , EEIF 
    	bsf EECON1 , WREN 
    	movlw 0x55 ; charger 0x55
    	movwf EECON2 
    	movlw 0xAA 
    	movwf EECON2 
    	bsf EECON1 , WR 
    	bcf EECON1 , WREN 
    	bsf INTCON , GIE 
    	bcf STATUS , RP0 
    	endm
    ;*********************************************************************
    ;                   DECLARATIONS DE VARIABLES                        *
    ;*********************************************************************
    	CBLOCK 0x00C   	
    	NewTime	: 1
    	ENDC		
    ;*********************************************************************
    ; 			DECLARATIONS DE LA ZONE EEPROM *
    ;*********************************************************************
    	org 0x2100 		
    #DEFINE AddrSce 0x00
    ;**********************************************************************
    ;                      DEMARRAGE SUR RESET                            *
    ;**********************************************************************
    	org 0x000 	
      	goto    init		
    ;*********************************************************************
    ;                       INITIALISATIONS                              *
    ;*********************************************************************
    init
    	clrf	PORTA		
    	clrf	PORTB			
    	bsf	STATUS,RP0			
    	movlw	OPTIONVAL			
    	movwf	OPTION_REG			
    	goto start
    ;*********************************************************************
    ;                      PROGRAMME PRINCIPAL                           *
    ;*********************************************************************
    start
    	bcf NewTime,0
    	btfsc NewTime,0
    	WRITEE AddrSce  ;impossible de sauter cette instruction :sos:
    	btfsc NewTime,0
    	BANK0
    	goto 	start				
    	END 	
    ;*********************************************************************
    Dernière modification par gienas ; 30/05/2020 à 06h59. Motif: Ce serait bien de TENIR COMPTE des corrections et d’ajouter les balises code OBLIGATOIRES sans avoir à les rajouter

  13. #10
    simon.

    Re : PIC16F84A ecrire dans EEP directive LOCAL

    C'est parce qu'il ne faut pas confondre macro et fonction.

    Quand tu "appelles" une macro, en fait c'est comme si tu recopiais son contenu a l'endroit de l'appel.

    Donc si tu mets un btfsc avant l'appel de ta macro, au mieux tu ne vas sauter que la premiere instruction de la macro.

    Pour BANK0 ca marche, vu que cette macro n'a qu'une instruction. Mais WRITEE en a plusieurs.

  14. #11
    ogre31

    Re : PIC16F84A ecrire dans EEP directive LOCAL

    Bonjour, et un grand merci
    Tres subtile, en effet le branchement sur la maro "WRITEE" se fait sur la 2eme instruction, c'est ce que j'avais remarqué!!!! sans pouvoir me l'expliquer.
    Ce qui semble marcher avec la macro "BANK0" ne l'est pas car en ajoutant des "nop" je constate que seule une instruction est sauté.
    J'aurais besoin de votre avis sur la solution ci-dessous, ou éventuellement m'en proposer une autre si vous avez le temps.

    merci pour votre aide,elle m'a beaucoup aidé

    ==============================
    appel
    WRITEE AddrSce
    return


    start
    bcf NewTime , 0
    btfsc NewTime , 0
    call appel
    btfsc NewTime , 0
    BANK1
    goto start

    end
    ==============================

  15. #12
    simon.

    Re : PIC16F84A ecrire dans EEP directive LOCAL

    Je pense que tu corriges ton probleme de btfsc, mais je ne crois pas que ca suffisse a faire un programme correct.

    D'ailleurs, il doit faire quoi, ce programme ? (au fait pourquoi s'infliger de l’écrire en assembleur ?)


    Meme si je ne sais pas quel est le but y'a un truc qui m'interpelle.

    Code:
    bcf NewTime , 0
    btfsc NewTime , 0
    call appel
    Je vois pas bien l’utilité de tester un truc que tu viens de remettre a zéro. A moins que tu comptes sur une interruption pour changer la valeur ? Si oui tu lui laisse pas une grande fenêtre de tir...

  16. Publicité
  17. #13
    ogre31

    Re : PIC16F84A ecrire dans EEP directive LOCAL

    Bonjour et merci encore une fois pour votre aide.

    Il s'agit, en fait,de la gestion d'un feu tricolore de carrefour,avec possibilité de modifier la temporisation.Pour travailler cette partie qui reste et aussi pour me faire la main, je l'ai morcelé.

    Donc je compte travailler le changement de la temporisation du clignotement d'une LED pour maîtriser le process.
    Pour se faire je compte utiliser 4 cases EEP,dans la 2eme, 3eme et 4eme Je mets les valeurs des tempo's, et dans la 1ere case(AddrSce-->adresse de service) je stocke l'ADRESSE du tempo en cours (càd l'adresse de la 2eme,3eme...ou 4eme case EEP).
    En utilisant une interruption pour passer au tempo suivant, je récupéré l'adresse du tempo actuel, en lisant la case EEP n°1, je l’incrémente ainsi j'aurais l'adresse du tempo suivant.J'use de la variable "NewTime" pour signaler un changement de tempo et appeler la routine d’écriture pour stocker l'adresse du nouveau tempo dans la case EEP n°1.Voila!!!!

    J'ai des tas de questions,mais je ne les poserais que quand je jetterai l'eponge.

    Merci encore une fois
    Dernière modification par ogre31 ; 30/05/2020 à 17h16.

  18. #14
    simon.

    Re : PIC16F84A ecrire dans EEP directive LOCAL

    Houlala.

    - Avant de commencer a penser a des histoires d'eeprom, de tempo variables, est-ce que tu as deja un programme simple qui marche pour des temporisations fixes ? C'est par la qu'il faut commencer. ENSUITE, on peut rajouter des tempos variables.
    - D'autre part, es-tu sur d'avoir besoin de 4 cases d'eeprom ? 3 devraient suffire, une pour chaque temporisation. Sauf dans un but particulier (reprise après coupure de courant...) il n'y a pas de raison de stocker l'etat courant dans l'eeprom. Il ne faut pas confondre la memoire EEPROM et la RAM. Est-ce que tu connais la différence entre les deux ?

  19. #15
    ogre31

    Re : PIC16F84A ecrire dans EEP directive LOCAL

    Bonjour,et merci de me consacrer du temps.

    Houla
    Le problème posé en texte semble compliqué... peut etre que c'est mal présenté.

    Oui, j'ai déjà réalisé la partie clignotement des feux avec le basculement sur feux oranges pour les 4 voies.
    J'utilise plus ou moins bien les 4 sources d'interruptions du 16f84.
    Par contre pas encore touché au LC24

    L'approche que j'ai adopté vient des pratiques du temps des fichiers séquentiels,ou on utilisé le 1ere enregistrement pour y mettre la longueur du fichier,mais de la à dire que c'est la bonne approche....!? je bosse dessus.

    merci

  20. #16
    simon.

    Re : PIC16F84A ecrire dans EEP directive LOCAL

    > Par contre pas encore touché au LC24

    Que quoi ?

    On parle d'eeprom interne au pic ou d'eeprom externe ?

  21. #17
    ogre31

    Re : PIC16F84A ecrire dans EEP directive LOCAL

    bonsoir,
    non non on parle bien de EEP,par LC24 j'entends mémoire externe au PIC.

    bonee soiréf

Discussions similaires

  1. Programmation PIC16F84A sous Flowcode dans le cadre d'un PPE
    Par Nikazuki dans le forum Électronique
    Réponses: 12
    Dernier message: 20/04/2012, 23h13
  2. Ecrire dans de la flash.
    Par Elyfean dans le forum Électronique
    Réponses: 2
    Dernier message: 09/01/2011, 18h27
  3. ecrire un tableau dans un PIC
    Par mouadhou dans le forum Électronique
    Réponses: 1
    Dernier message: 14/05/2010, 17h15
  4. ATmega : écrire dans la ram
    Par invite9865321 dans le forum Électronique
    Réponses: 6
    Dernier message: 06/08/2009, 15h12
  5. Ecrire dans la flash d'un pic 18
    Par snyfir dans le forum Électronique
    Réponses: 1
    Dernier message: 05/06/2009, 15h24
Découvrez nos comparatifs produits sur l'informatique et les technologies.