usage de la directive compli IFDEF avec ASM MPLAB
Répondre à la discussion
Affichage des résultats 1 à 6 sur 6

usage de la directive compli IFDEF avec ASM MPLAB



  1. #1
    paulfjujo

    usage de la directive compli IFDEF avec ASM MPLAB


    ------

    avec des directive #IDEF xxx je veux compiler ou pas certaines portions de programme
    MAIS aussi modifier la quantité de RAM associée à ces portions de programme.

    Pourquoi ais-je une erreur (121) sur une reservation conditionnelle de datas en RAM
    (et pas d'erreur sur la partie programme)

    121 Illegal label
    Labels are not allowed on certain directive lines.
    Simply put the label on its own line, above
    the directive. Also, high, low, page, and bank are not allowed as labels.

    Existe-t-il une autre façon de faire ?

    avec cet exemple :
    programme en asm MPLAB 8.92 et 12F683




    Code:
    #define Affiche
    
      	Cblock      0x020    ; to adapt for PIC10F200  ie : 0x010
    
    	Temp                ; Temporary Value Used When Sending Out Data
    	NOTemp            ; Temporary Value to "NybbleOutput"
    	Result			; ADC 8 bits mesure 
    	btmp; affichage octet --> decimal 3 digits ( de 0 a 255 )-> LCD
    
    	DIVIS	; diviseur
    	DIVID  ;
    	QUOT  	;quotient
    	REMAIN  ; reste
    
        count   ; utilisé par tempos
        count1 ;  compteur
    
    #ifdef Affiche     ; error 121 ???? si declaré ainsi !!
    	bcent;
    	bdix;
    	bun;
    #endif
    
      	spare1
        spare2
        sparex		  
    	endc
    alors que je n'ai pas d'erreur , avec la compilation conditionnelle
    dans le main programe


    Code:
    #ifdef Affiche                      ; OK , compile ctte partie ou pas suivant le resultat de #IFDEF
    ; affiche de 0 à 9
       movlw '0'
       call    SendCHAR  
       movlw '1'
       call    SendCHAR  
       movlw '2'
       call    SendCHAR  
        movlw '3'
       call    SendCHAR  
       movlw '4'
       call    SendCHAR  
       movlw '5'
       call    SendCHAR  
       movlw '6'
       call    SendCHAR  
       movlw '7'
       call    SendCHAR 
       movlw '8'
       call    SendCHAR 
       movlw '9'
       call    SendCHAR  
    #endif

    -----

  2. #2
    gedonet

    Re : usage de la directive compli IFDEF avec ASM MPLAB

    Bonjour

    Je n'en suis pas certain, mais dans tes déclarations, Temp, Notemp, Result, ect. sont des variables, on doit donc leurs reserver un espace mémoire, on doit écrire Temp : 1 pour reserver un octet ou ecrire une adresse précise.
    Dans ton ecriture, à mon avis, le compilateur prend Temp, Notemp, Result, ect. pour des labels ( des étiquettes) qui n'ont pas leurs place dans ce contexte, dans certains cas il faut la déclaration "LOCAL" pour pouvoir reproduire un label dans une macro par exemple ou peut être dans ton cas, mais je pense que que tu parles de variable.

    Gilles

  3. #3
    paulfjujo

    Re : usage de la directive compli IFDEF avec ASM MPLAB

    Je n'en suis pas certain, mais dans tes déclarations, Temp, Notemp, Result, ect. sont des variables, on doit donc leurs reserver un espace mémoire, on doit écrire Temp : 1 pour reserver un octet ou ecrire une adresse précise.
    l'adresse de depart est definie par
    Code:
    Cblock      0x020
    et les variables occupent un octet par defaut
    si je rajoute :1 ... c'est pareil
    donc Temp est à @0x020, NoTemp @ 0x021 ... etc
    effectivement si je rajoute une variable specifique
    sparex :3 <- reserve 3 octets pour celle ci

    Code:
                               00063         Cblock      0x020    ; to adapt for PIC10F200  ie : 0x010
                               00064 
      00000020           00065         Temp                ; Temporary Value Used When Sending Out Data
      00000021           00066         NOTemp            ; Temporary Value to "NybbleOutput"
      00000022           00067         Result                  ; ADC 8 bits mesure 
      00000023           00068         btmp; affichage octet --> decimal 3 digits ( de 0 a 255 )-> LCD
                               00069 
      00000024           00070         DIVIS   ; diviseur
      00000025           00071         DIVID  ;
      00000026           00072         QUOT    ;quotient
      00000027           00073         REMAIN  ; reste
      00000028           00074         ADDR_EEPROM 
      00000029           00075     count  ; utilisé par tempos
      0000002A           00076     count1  ;  compteur
      0000002B           00077     count2
      0000002C           00078     sparex :3
      0000002F            00079     FinRam 
                                00080         endc
                                00081 
      0000000F            00082 RamUtilisee EQU (FinRam-Temp)           
                                00083         IF ( (RamUtilisee) > .15 )
                                00084                 ERROR   "Attention debordement zone RAM de 16 bytes"
                                00085         ENDIF

    la directive Cblock serait-elle considérée comme une macro ?

  4. #4
    Aurélien

    Re : usage de la directive compli IFDEF avec ASM MPLAB

    Peut etre que la directive #ifdef n'est pas acceptée dans le cadre d'un cblock.
    Essaie de le remonter d'un niveau, c'est à dire de mettre ton #ifdef avant un cblock, je pense que ça doit marcher :
    Code:
    #ifdef Affiche
    Cblock 0x020
    ...tes variables conditionnelles
    Endc
    #endif
    Cblock 0x030
    ...tes variables générales
    Endc

  5. A voir en vidéo sur Futura
  6. #5
    gedonet

    Re : usage de la directive compli IFDEF avec ASM MPLAB

    Bonjour

    J'ai fait un essai avec ce que tu nous donnes de code. C'est bien ce qui me semblait, et qui est indiqué par le message d'erreur "121 Illegal label" les declarations Temp, Notemp etc. sont comprises comme des labels, pas des déclarations de variables.

    En second tu ne peux pas avoir de Cblock dans un define donc tes variables doivent être déclarées avec Temp equ 0x20, et le reste à la suite.
    Mais je pense que tu te trompes pour la façon d'utiliser les define ifdef, else et endif.

    Donc à un endroit de ton programme, tu ecris une ligne #define Affiche la consequence c'est que Affiche existe, sans cette ligne Affiche n'existe pas.
    Ensuite tu ecris les affectations conditionnelles avec
    Code:
    	IFDEF 	Afffiche
     	Temp 	equ 	0x20 	; adresse de Temp si Affiche existe
    etc.
    ensuite les affectations si Affiche n'existe pas:
    Code:
    	ELSE				; on pourrait utiliser IFNDEF
     	TEMP 	equ 	0x23  		; adresse de Temp si Affiche n'existe pas
    et on cloture les affectations conditionnelles avec:
    Code:
    	ENDIF
    Gilles

  7. #6
    paulfjujo

    Re : usage de la directive compli IFDEF avec ASM MPLAB

    Citation Envoyé par Aurélien Voir le message
    Peut etre que la directive #ifdef n'est pas acceptée dans le cadre d'un cblock.
    Essaie de le remonter d'un niveau, c'est à dire de mettre ton #ifdef avant un cblock, je pense que ça doit marcher :
    Merci Aurelien de cette judicieuse suggestion, c'est exactement ce que je voulais.

    Code:
                         00076 
                          00077         Cblock      0x020    ; to adapt for PIC10F200  ie : 0x010
      00000020            00078         Temp    ; Temporary Value Used When Sending Out Data
      00000021            00079         NOTemp  ; Temporary Value to "NybbleOutput"
      00000022            00080         Result  ; ADC 8 bits mesure 
      00000023            00081         btmp    ; affichage octet -> decimal 3 digits -> LCD
      00000024            00082         DIVIS   ; diviseur
      00000025            00083         DIVID   ;
      00000026            00084         QUOT    ;quotient
      00000027            00085         REMAIN  ; reste
      00000028            00086         count   ; utilisé par tempos
      00000029            00087         count1  ; compteur
      0000002A            00088         spare1
      0000002B            00089         spare2
                          00090         endc
                          00091 
                          00092 #ifdef Affiche  
                          00093         Cblock  0x02C
                          00094         bcent;
                          00095         bdix;
                          00096         bun;
                          00097         endc
                          00098 #endif
                          00099 
                          00100         Cblock
      0000002C            00101         sparex
                          00102         endc
                          00103 
      0000000C            00104 RamUtilisee EQU (sparex-0x20)           
                          00105         IF ( (RamUtilisee) > .15 )
                          00106                 ERROR   "Attention debordement zone RAM de 16 bytes"
                          00107         ENDIF
                          00108
    fichier LST donne
    RamUtilisee 0000000C


    si "#define Affiche" activé =>
    RamUtilisee 0000000F

Discussions similaires

  1. Réponses: 96
    Dernier message: 15/06/2011, 23h50
  2. Usage nomade avec 2 FAI différents
    Par invite7b57996d dans le forum Internet - Réseau - Sécurité générale
    Réponses: 3
    Dernier message: 11/10/2010, 10h37
  3. antenne directive avec cavité en métamatériau
    Par invite2bfd7c79 dans le forum Électronique
    Réponses: 3
    Dernier message: 18/03/2010, 17h38
  4. message d'erreur avec MPlab avec PIC 16F877A
    Par olivier_elec dans le forum Électronique
    Réponses: 7
    Dernier message: 15/02/2010, 08h32
  5. que faire avec mon perchlo usagé?
    Par nanard dans le forum Électronique
    Réponses: 14
    Dernier message: 24/03/2007, 12h16
Découvrez nos comparatifs produits sur l'informatique et les technologies.