No tengo casi NINGUNA experiencia en codificación, así que disculpe el estilo burdo y los comentarios detallados. Estoy tratando de muestrear desde 4 sensores (1 cada 15 minutos). Pensé que sería más eficiente tener las funciones delay
y data_write
como funciones separadas para llamar, pero eso no está funcionando muy bien. Recibo constantemente el siguiente error:
Error [1302] no se admiten las declaraciones de funciones de estilo antiguo
al final de la función data_write
no importa dónde ni cómo coloquen las llaves (anidada, misma línea, eliminar, etc.) La función delay
no da el error, ya sea antes o después de data_write
de función.
Por favor, siéntase libre de recomendarme un mejor diseño para mí. Además, realmente no entiendo la memoria de datos, por lo que esta rutina es probablemente una mierda, lo sé. Aunque, extrañamente, no me está dando ningún error, así que no miraré ese caballo de regalo en la boca todavía.
=====================================
#include <stdio.h>
#include <stdlib.h>
#include <p18f452.h>
#include <delays.h>
#include <adc.h>
int result; // used in ADC result handling
int i; // used in delay loop/function
int data_adr=0x64; // used in data_write function. initial=d100
// assuming 4MHz oscillator => 8fosc. Tinst= (4)*Tosc = (4)*(250ns) = 1us
// all 4 sensors should read every minute so each will begin sequentially,
// after 15sec delay from previous ADC conversion completes.
void delay (void); // delay function prototype declaration
void data_write (int, int); // data-write function prototype declaration
main()
{
// I think I need a while (1) loop here to repeat the loop forever???
// 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
delay(); // call the delay function
ConvertADC(); // initiate conversion of sensor1 @ AN0
while(BusyADC()); // waiting to complete conversion
result=ReadADC(); // read the result of sensor1 @ AN0
data_write(); // call data_write function
CloseADC();
// sensor 2 configured to port AN1
OpenADC(ADC_FOSC_8 & ADC_RIGHT_JUST & ADC_5ANA_0REF, ADC_CH1 & ADC_INT_OFF);
//configures ADC for port AN1 = sensor 2 input
delay();
ConvertADC();
while(BusyADC());
result=ReadADC();
data_write ();
CloseADC();
// sensor 3 configured to port AN2
OpenADC(ADC_FOSC_8 & ADC_RIGHT_JUST & ADC_5ANA_0REF, ADC_CH2 & ADC_INT_OFF);
//configures ADC for port AN2 = sensor 3 input
delay();
ConvertADC();
while(BusyADC());
result=ReadADC();
data_write ();
CloseADC();
// sensor 4 configured to port AN3
OpenADC(ADC_FOSC_8 & ADC_RIGHT_JUST & ADC_5ANA_0REF, ADC_CH3 & ADC_INT_OFF);
//configures ADC for port AN3 = sensor 4 input
delay();
ConvertADC();
while(BusyADC());
result=ReadADC();
data_write ();
CloseADC();
return (result);
}
// Delay function sequence
void delay (void)
{ // 15second delay routine
// 15sec/Tinst= 15sec/1us
// = 15*10^6 Tinst = 10K * 1500
// Delay10KTCYx(1)= 0.01sec
// = (10K)*(250)*(6)
i=6;
while(i>0) {
Delay10KTCYx(250); // 2.5sec delay
i=i--; // run 6 times for total 15sec delay loop
}
return;
}
// data write sequence
void data_write (data_adr, result) {
_asm
movlw data_adr // 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,IE,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
data_adr = data_adr+2;
if (data_adr >= 0xC6) // if address >= d'198
data_adr = 0x64; // resets starting point to d'100
return; }