Hay varias formas de hacerlo, pero creo que Esta podria ser la mas simple y general para lo que quieras hacer.Código: C
int8 Salida[5] = {0b00001,0b00010,0b00100,0b01000,0b10000}; int8 Indice; void main(void) { //Aca configurar el ADC y seleccionar el canal while(1) { if(read_adc()<512) { Indice++; if(Indice>4) Indice=0; } else { if(Indice == 0) Indice=5; Indice--; } output_c(Salida[Indice]); delay_ms(500); } }
El if solo controla el indice del array, esto te puede permitir cambiar cuando quieras el valor de la secuencia sin ningun problema.
La instruccion de Salida y delay es igual para todos. Y utilizo el read_adc para poder leer el valor del ADC, si este es de 10bits, entonces son 1024 posiblidades, o mejro dicho de 0 a 1023.
Te faltaria el codigo para el setup del ADC, yo no uso CCS, asi que ahi no te puedo ayudar.
Bien pero el A1 pertenece a otro puerto, hacer ouput_c() solo cambia el puerto C. Ademas es todo 8 bitsCódigo: C
#include<16f876A.h> #device adc=10 #use standard_io(C) #use standard_io(A) #fuses XT,NOWDT #use delay(clock=4000000) int16 lectura; int8 cont; int8 salida[9] = {0b00000001,0b00000010,0b00000100,0b00001000,0b00010000,0b00100000,0b01000000,0b10000000}; void main(void) { setup_adc_ports(AN0); setup_adc(ADC_CLOCK_INTERNAL); set_adc_channel(0); delay_us(20); while(true) { lectura=read_adc(); //lectura del canal 0 if(lectura<500) { cont++; if(cont>8) cont=0; } else { if(cont==0) cont=9; cont--; } if(contador<8) { output_c(salida[cont]); } else { output_a(0b10); } delay_ms(500); } }
//f(nº a incrementar,llegada a total,devolver)
f(1,500,0);
f(-1,-10,-9);
signed int8 f(signed incre,int16 signed total,signed fin){
signed co;
if(incre>0){//incremento
for(co=0;total>co;co+=incre){
......//lo que sea
delay_ms(500);
}
} else { //decremento
for(co=0;total<co;co+=incre){
delay_ms(500);
}
return fin;
}No lo e probado el incremento 0 es erroneo y puede ser total>= en vez de total> pero me da que funcionaria