Problema de funcionamiento interno del ensamblaje c18. etiqueta no identificada (nombres de bits)

Aquí está la función data_write que estoy viendo. Me dijeron que este método (del libro de texto) no es bueno y que debería usar el método C (que actualmente está comentado). Cuando se usa el método Cbits, cualquier argumento después de _asm/_endasm, el compilador no reconoce los nombres de los bits (no se vuelven verdes).

Si uso solo el método de ensamblaje, obtengo una cadena de errores [1111] sobre la etiqueta indefinida (WR, GIE, EECON1, etc.) dentro de esta función. ¿Tengo que volver a definir de alguna manera el ADC.h dentro de la función? Básicamente, todos los nombres de registros (EECON1, etc.) y nombres de bits (WR, WREN, etc.) no se reconocen dentro de la función "data_write" si están dentro de las etiquetas de ensamblaje (_asm/_endasm). Si utilizo el método Cbits.BIT, obtengo un error de sintaxis genérico y los bits que siguen a _endasm no se identifican (se vuelven verdes).


#include <stdio.h>
#include <stdlib.h>
#include <p18f452.h>
#include <delays.h>
#include <adc.h>

int result;                         // used in ADC result handling
int write_point=0x64;               // used in data_write function. initial=d100

void data_write (int write_point, int result);   // declare prototype

void main(void)  // <==should this be 'int main (void)' b/c i'm passing result to another function ?
{
    while (1) {
    // sensor 1 configured to port AN0
        OpenADC(ADC_FOSC_8 & ADC_RIGHT_JUST & ADC_5ANA_0REF, ADC_CH0 & ADC_INT_OFF);
                            //configures ADC for port AN0 = sensor 1 input
            ConvertADC();               // initiate conversion of sensor1 @ AN0
            while(BusyADC());           // waiting to complete conversion
            result=ReadADC();           // read the result of sensor1 @ AN0
            data_write(result, write_point);
        CloseADC();
                    }
        }

void data_write (int write_point, int result) {

/*        EECON1bits.EEPGD = 0       // points to data memory
         EECON1bits.CFGS = 0        // access data eeprom
         EECON1bits.WREN = 1        // enable write to data eeprom
         INTCONbits.GIE=0           // disable interrupt
** if I substitute this method of bit control, this 2nd portion belongs after 
 * the asm arguments, but the bits (WR, GIE, WREN) will not be identified
 * either an I get a syntax error. (of course commenting out the bcf/bsf statements)
        EECON1bits.WR = 1       // enable bit to start the write operation
        INTCONbits.GIE = 1      // re-enable interrupt
        EECON1bits.WREN = 0    // restores the write command to =disabled */

_asm
 movlw  write_point        // starting data memory address = data_adr
 movwf  EEADR,A
 movlw  result              // gets data stored in "result" variable
 movwf  EEDATA,A            // places data into data memory holder
 bcf    EECON1,EEPGD,A      // points to data memory
 bcf    EECON1,CFGS,A       // access data eeprom
 bsf    EECON1,WREN,A       // enable write to data EEPROM
 bcf    INTCON,GIE,A         // disable interrupt
 movlw  0x55                // start flash erase sequence
 movwf  EECON2,A
 movlw  0xAA
 movwf  EECON2,A            // end flash erase sequence
 bsf    EECONN1,WR,A        // enable bit to start the write operation
 bsf    INTCON,GIE,A        // re-enable interrupt
 bcf    EECON1,WREN         // restores the write command to =disabled
 _endasm



 write_point = write_point+2;  // increment address by 2
 if (write_point >= 0xC6)      // if address >= d'198
     write_point = 0x64;       // resets starting point to d'100

}

Respuestas (1)

Para la parte C comentada, no parece tener ningún punto y coma final (por ejemplo, la primera línea debería ser EECON1bits.EEPGD = 0;), por lo que al compilador ciertamente no le gustará eso.

Para el ensamblaje en línea, IIRC, los nombres de registro deberían ser utilizables, pero creo que debe especificar los operandos por completo (por ejemplo, en lugar de movwf EECON2,Ahacerlo movwf EECON2,0)
. Es posible que los nombres de los bits también deban especificarse por número en lugar de nombre, por ejemplo, en lugar de bcf EECON1,EEPGD,Ahacerlo bcf EECON1, 7, 0(EEPGD es el bit 7 de EECON1) ADe todos modos, el final no es correcto, debería ser 1 o 0 (o W o F en MPASM) Ha
pasado un tiempo desde que usé el ensamblado en línea para algo como esto, por lo que la memoria es borrosa. pero pruébalo y cuéntanos cómo te va.

¡Hurra! ¡Bajar esos ",A" a ",0" funcionó! Gracias @oli!!!