Autor Tema: PIC18 - Problema ADC y PUTC  (Leído 2323 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado victor1080

  • PIC10
  • *
  • Mensajes: 3
PIC18 - Problema ADC y PUTC
« en: 29 de Mayo de 2015, 20:23:36 »
Hola, soy nuevo en el foro.

Estoy haciendo un programa en CCS C 5.025 para el microcontrolador PIC18F4550.

Tengo un problema al leer el ADC, guardar las lecturas en un vector y después enviarlas por el puerto serie.

Hay un LED conectado en la terminar E1 el cual parpadea y me indica que el programa está corriendo.
Al recibir un '1' el PIC responde con 250 lecturas del ADC canal 0, funciona correctamente la primera vez, pero después algo pasa que el LED conectado en E1 deja de parpadear si le envío otro dato cualquiera
Código: C
  1.  
.

Código: C
  1. #include <18f4550.h>
  2. #device ADC=8
  3. #use delay (clock=48M)
  4. #use rs232(baud=460800, parity=N, xmit=PIN_C6, rcv=PIN_C7, bits=8)
  5. #build (reset=0x02000,interrupt=0x02008)
  6. #org 0x0000, 0x1FFF { }
  7. #define S0  PIN_C0
  8. #define S1  PIN_E1
  9. int1 RUN=0;
  10. void main(void){
  11.    output_drive(S0);
  12.    output_drive(S1);
  13.       enable_interrupts(INT_RDA);
  14.       enable_interrupts(GLOBAL);
  15.       setup_adc_ports(AN0_TO_AN1);
  16.       setup_adc(ADC_CLOCK_DIV_64 | ADC_TAD_MUL_4);
  17.       SET_ADC_CHANNEL(0);
  18.       delay_us(500);
  19.       int16 i;
  20.       int8 AN[255];
  21.    while(true){
  22.       if(RUN){
  23.          for(i=0;i<250;i++)
  24.             AN[i] = READ_ADC();                                
  25.          for(i=0;i<250;i++)
  26.             putchar(AN[i]);
  27.        RUN=0;
  28.       }
  29.       output_bit(S0,RUN);
  30.       output_toggle(S1);
  31.       delay_ms(150);
  32.    }
  33. }
  34. #INT_RDA
  35. void RDA_isr(void) {  
  36.    if(getc()=='1'){
  37.       RUN = !RUN;
  38.    }
  39.    clear_interrupt(INT_RDA);
  40. }


Le agradecería si me pueden orientar o decirme cuál es el problema.
De antemano gracias.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: PIC18 - Problema ADC y PUTC
« Respuesta #1 en: 29 de Mayo de 2015, 20:42:48 »
No veo que exista ningun problema.

Lo que si yo cambiaria 2 cosas,

1- Seria no tener un array de 255 valores, sino tomar el dato y enviarlo. Asi los 250 valores.

2- En la interrupcion, preguntar tambien si RUN esta en 0 antes de cambiarle de valor. Lo que me parece es que esta tardando muchisimo en enviar esas 250 muestras a traves de la UART.


Ahora vienen las preguntas
El otro pin que es C0 cambia de estado ?. O tambien queda fijo ? Aunque el programa haria que jamas cambie de estado ya que siempre al salir del IF es 0, y nunca se pondria en 1, ya que si esta en 1 RUN entraria al if.

Podrias ponerlo en distintos lugares, por ejemplo cuando entra en la interrupcion para ver si entra y sale y no vuelve a entrar continuamente
ponerlo dentro del for cuando envia para ver si sigue enviando, etc.

Desconectado victor1080

  • PIC10
  • *
  • Mensajes: 3
Re: PIC18 - Problema ADC y PUTC
« Respuesta #2 en: 30 de Mayo de 2015, 17:02:44 »
Gracias por la ayuda.

Encontré este tema:
http://www.todopic.com.ar/foros/index.php?topic=21226.40

Ahora creo que es un bug del compilador.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: PIC18 - Problema ADC y PUTC
« Respuesta #3 en: 30 de Mayo de 2015, 18:26:33 »
podrias probar como dice en el post con #use fast_io(c) y usar el set_tris_c() para definirlo como salida o entrada.

Es que el CCS si no le pones eso de fast_io , si vos lees el puerto este le agrega el codigo como para pasarlo a entrada, y si luego escribis, le agrega el codigo para hacerlo salida. creo que eso esta definido como standart_io en el manual de CCS.
Proba si es eso y luego comenta. Aunque sea el puerto C.

Desconectado victor1080

  • PIC10
  • *
  • Mensajes: 3
Re: PIC18 - Problema ADC y PUTC
« Respuesta #4 en: 30 de Mayo de 2015, 20:06:18 »
podrias probar como dice en el post con #use fast_io(c) y usar el set_tris_c() para definirlo como salida o entrada.

Es que el CCS si no le pones eso de fast_io , si vos lees el puerto este le agrega el codigo como para pasarlo a entrada, y si luego escribis, le agrega el codigo para hacerlo salida. creo que eso esta definido como standart_io en el manual de CCS.
Proba si es eso y luego comenta. Aunque sea el puerto C.

Ya lo hice, funciona bien al inicio (~las primeras 5 veces) y después ya no responde, el LED permanece en el último estado que se quedó.
Modificación:
Código: C
  1. #include <18f4550.h>
  2. #device ADC=8
  3. #use delay (clock=48M)
  4. #use rs232(baud=460800, parity=N, xmit=PIN_C6, rcv=PIN_C7, bits=8)
  5. #use fast_io(c)
  6. #build (reset=0x02000,interrupt=0x02008)
  7. #org 0x0000, 0x1FFF { }
  8. #define S0  PIN_C0
  9.  
  10. int1 RUN=0;
  11.  
  12. void main(void){
  13.    set_tris_c(0xFE);
  14.       enable_interrupts(INT_RDA);
  15.       enable_interrupts(GLOBAL);
  16.       setup_adc_ports(AN0);
  17.       setup_adc(ADC_CLOCK_DIV_64 | ADC_TAD_MUL_4);
  18.       SET_ADC_CHANNEL(0);
  19.       delay_us(500);
  20.       int16 i;
  21.       int8 AN[255];
  22.    while(true){
  23.       if(RUN){
  24.          for(i=0;i<250;i++)
  25.             AN[i] = READ_ADC();                                
  26.          for(i=0;i<250;i++)
  27.             putchar(AN[i]);
  28.        RUN=0;
  29.       }
  30.    }
  31. }
  32. #INT_RDA
  33. void RDA_isr(void) {  
  34.    if(getc()=='1'){
  35.       RUN = !RUN;
  36.    }
  37.    clear_interrupt(INT_RDA);
  38.    output_toggle(S0);
  39. }