TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: tapi8 en 03 de Octubre de 2007, 14:51:06
-
Buenas a todos
Llevo unos dias comiendome el coco y no se como hacer esto.A ver si me explico, igual es una tonteria pero por mas vueltas que le doy no hay manera.
En un convertidor A/D en el que voy a tener 1024 valores necesito discriminar gran parte de ellos y que solo unos pocos sean 1.Por ejemplo que sean un 1 logico entre 300 y 350 y que el resto de valores no cuenten como entrada.
se agradeceria cualquier idea, aunque solo fuese para desatascarme y poder empezar.
saludos y gracias por anticipado.
-
¿En qué idioma de programación?
En CCS C:
temperatura=read_adc();
switch(temperatura){
case 300..350:
valor=1;
break;
default:
valor=0;
break;
}
Así puedes insertar mas valores intermedios.
-
Diego, solo por curiosidad, ¿CCS permite usar rangos en los cases o es una "delphización" del código? :mrgreen:
-
que yo sepa no :? pero seria bueno que alguien no los aclare.
edito:
segun el manual de NOviembre 2006 no se puede, ya que nunca hace algo asi, siempre por un valor
-
:shock: pos no no lo creo que se pueda.
-
Bueno yo programo en asm pero estoy aprendiendo C yes posible que migre el programa al C asi que gracias Diego.
Ademas supongo que en asm seria mas complicado.
Saludos.
-
Diego, solo por curiosidad, ¿CCS permite usar rangos en los cases o es una "delphización" del código? :mrgreen:
No, no se puede. :oops:
Estoy tan acostumbrado a usar los rangos que lo he puesto sin pensarlo. Al comentarlo tú he ido a probarlo en CCS y ... me salta un error ; expected. :oops:
Como bien dices, he caído en propia trampa delphinera.
-
Como bien dices, he caído en propia trampa delphinera.
Jeje, me pasa seguido y justamente con los 'case' :) jiji, pero el C por suerte da error, jejeje. :mrgreen: :mrgreen:
También suelo prestar atención al "=" porque en Delphi/Pascal y C son justamente bastante diferentes y ahí no da error!
Saludos
-
Pues fíjate que programo en el trabajo con C++ Builder y PHP sobre todo y en casa con CCS C y Delphi ... y estoy constantemente cometiendo errores en un idioma al usar funciones o sintaxis de otro. :z) :z) :z)
-
Bueno entonces la unica solucion sera hacerlo valor por valor es decir 300,301,302,.....350.
Eso me va ocupar un monton de flash y no ando sobrado de ella.Creo que no me va a valer el 16f877 y por lo que mire es el que mas flash tiene de la gama 16.
bueno saludos y gracias.
-
Bueno entonces la unica solucion sera hacerlo valor por valor es decir 300,301,302,.....350.
Eso me va ocupar un monton de flash y no ando sobrado de ella.Creo que no me va a valer el 16f877 y por lo que mire es el que mas flash tiene de la gama 16.
bueno saludos y gracias.
tapi8 podrías usar una variable que contemple el rango y listo.
Por ejemplo, yendo a un ejemplo burdo
r = 0;
if ((a >= 300) && (a <= 350)) r = 1;
if ((a >= 351) && (a <= 400)) r = 2;
Y luego haces un switch de r
Saludos
-
Pues bien, te contare como ha ido cuando haga la migracion a C porque creo que lo tendre que pasar todo a C para usar algun PIC de la gama 18,24 o DSP, y como lo tengo en asm de 35 instrucciones. No esposible usar ese programa en la gama 18? verdad.
saludos y gracias
-
mira aca tengo una rutina en ensamblador para el 16f877a, que convierte la entrada analógica del canal 0 RA0 a digital y lo muestra en 10 bits por el puerto B y C, dale un vistazo, solom debes configurar el adc y esperar con un retardo de 20us para cargar el muestreo creo y despues tenes el resultado en adresl y adresh, esta tb explicado en la hoja de datos:
INICIO
BANCO_0
CLRF PORTA
CLRF PORTB
CLRF PORTC
CLRF TMR0
MOVLW B'11010000'
MOVWF OPTION_REG
BANCO_1
MOVLW D'0'
MOVWF TRISB
MOVLW D'252'
MOVWF TRISC
MOVLW D'255'
MOVWF TRISA
;SE INICIALIZA MODULO DE CONVERSION A/D
BANCO_0
MOVLW D'193'
MOVWF ADCON0
BANCO_1
MOVLW D'142'
MOVWF ADCON1
;LECTURA CANAL ANALÓGICO
MAIN
BANCO_0
CALL DELAY_20us ; es una rutina de retardo qeu esta en un INC que estaba incluido en este programa
BSF ADCON0,GO
WAIT BTFSC ADCON0,GO
GOTO WAIT
MOVF ADRESH,W
MOVWF PORTC
BANCO_1
MOVF ADRESL,W
BANCO_0
MOVWF PORTB
GOTO MAIN
END
y la misma rutina pero en CCS:
//----------------------------------------------
// P5.c
// El resultado de la conversión A/D del canal0
// se muestra en el puerto b y puerto c
//----------------------------------------------
#include <16F877a.h>
#device adc=10
#fuses XT,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT,NOCPD,NOWRT
#use delay (clock=4000000)
#use fast_io(a)
#use fast_io(b)
#use fast_io(c)
#byte port_a=0x05
#byte port_b=0x06
#byte port_c=0x07
#byte ADRESH=0x1e
#byte ADRESL=0x9e
/*---------------------------------------------------------------------*/
void main()
{
int16 adcValue;
setup_adc_ports(RA0_ANALOG); //RA0 entrada analógica
setup_adc(ADC_CLOCK_INTERNAL); // reloj interno
set_tris_a(0xFF);
set_tris_b(0x00);
set_tris_c(0xBC);
port_b=0x00;
port_c=0x00;
do
{
set_adc_channel(0); // selecciona el canal 0
delay_us(20); // Retardo para carga del cap. de muestreo
adcValue=read_adc(); // Lee el resultado de la conversion
port_c=ADRESH; // Parte alta de la conversion al PORTC
port_b=ADRESL; // Parte baja de la conversion al PORTB
delay_ms(1000);
} while (TRUE);
}
espero te sirva, y si tienes alguna duda acerca del codigo aca te respondemos
ahh y para lo de los rangos en ASM te sugiero que te des una vueltita por el foro del lenguaje ensamblador qeu seguro encontras una respuesta para ello, y bueno si es solo un rango talvez solo sea necesario 8 bits y no los 10 del conversor, date una miradita por ahi en el subforo
un saludo
-
Gracias por la aportacion Cryn, no es exactamente lo que quiero hacer pero me servira para para adaptarlo a lo que quiero hacer.
saludos y gracias