Aquí está la función data_write que estoy viendo. Me han dicho que este método (del libro de texto) no es bueno y que debería estar usando el método C (que actualmente está comentado). Cuando se usa el método Cbits, cualquier argumento después del _asm / _endasm el compilador no reconoce los nombres de los bits (no se vuelven verdes).
Si utilizo solo el método de ensamblaje, obtengo una serie de errores [1111] sobre la etiqueta no definida (WR, GIE, EECON1, etc.) dentro de esta función. ¿Tengo que redefinir de alguna manera el ADC.h dentro de la función? Básicamente, todos los nombres de registros (EECON1, etc.) y los 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 uso el método Cbits.BIT, aparece un error de sintaxis genérica 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
}