Autor Tema: No me funciona delay_ms en PIC18F4525  (Leído 4741 veces)

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

Desconectado yiyeyo

  • PIC10
  • *
  • Mensajes: 8
No me funciona delay_ms en PIC18F4525
« en: 18 de Julio de 2006, 15:47:01 »
Hola a todos. En el proyecto que estoy realizando con 16F877, se me ha quedado corta la memoria, y estoy realizando la migración a un 18F4525. Salvando algunos problemillas iniciales, ahora no me funciona la pantalla LCD, y he llegado a la conclusión que el problema radica en la función delay_ms(). Así que he realizado el siguiente ejemplito, y efectivamente esta función no va.
¿¿¿Alguien podría decirme porqué no funciona???

Código: C++
  1. #device adc=8
  2.  
  3. #fuses NOWDT,lP, NOPROTECT, IESO, NOBROWNOUT, BORV46, NOPUT, NOCPD, STVREN, NODEBUG, NOLVP, NOWRT, NOWRTD, NOEBTR, NOCPB, NOEBTRB, NOWRTC, NOWRTB, FCMEN, XINST, PBADEN, LPT1OSC, MCLR
  4.  
  5.  
  6. #use delay(clock=4000000)
  7.  
  8. #byte puertod=0xf83
  9. #bit a=puertod.0
  10.  
  11.  
  12. void main()
  13. {
  14.    int1 i=0;
  15.  
  16.    setup_adc_ports(NO_ANALOGS|VSS_VDD);
  17.    setup_adc(ADC_OFF);
  18.    setup_psp(PSP_DISABLED);
  19.    setup_spi(FALSE);
  20.    setup_wdt(WDT_OFF);
  21.    setup_timer_0(RTCC_INTERNAL);
  22.    setup_timer_1(T1_DISABLED);
  23.    setup_timer_2(T2_DISABLED,0,1);
  24.    setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
  25.    setup_comparator(NC_NC_NC_NC);
  26.    setup_vref(FALSE);
  27.  
  28.    set_tris_d(0);
  29.  
  30.    while(1)
  31.    {
  32.       a=~a;
  33.       delay_ms(5000);
  34.    }
  35.  
  36. }


Lo que hace tanto en el PIC como simulandolo con proteus, es "ignorar" dicha función, y el pin_d0 oscila a una frecuencia independiente del valor que le pongas a delay_ms().

Muchas gracias de antemano. Utilizo CCS 3.43

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: No me funciona delay_ms en PIC18F4525
« Respuesta #1 en: 18 de Julio de 2006, 18:05:08 »
Un posible problema puede ser que la función delay_ms acepte como argumentos valores de 8 bits (0 a 255) .

¿Has leído el datasheet de dicha función a ver que dice?



- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: No me funciona delay_ms en PIC18F4525
« Respuesta #2 en: 18 de Julio de 2006, 19:33:50 »
1º ¿Está todo el código completo del programa? porque no veo el #include <18f4525.h> que le indica al compilador el PIC que estas utilizando.

2º ¿Los fuses los has puesto todos sabiendo para qué sirven? porque veo que tienes declarado el fuse LP (Low power osc < 200 khz) cuando creo que para un cristal de 4 Mhz deberias usar el fuse XT

Maunix:

En CCS C delay_ms acepta como argumento o una variable 0-255 o una constante 0-65535



Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado yiyeyo

  • PIC10
  • *
  • Mensajes: 8
Re: No me funciona delay_ms en PIC18F4525
« Respuesta #3 en: 18 de Julio de 2006, 20:40:13 »
Gracias por responder tan pronto.

Siento mucho haberme equivocado poniendo el código incompleto. El asistente genera un fichero .h donde se encuentra la línea #include <18f4525>, pero al copiar el contenido de este fichero (para que estuviera todo el código aquí) se me pasó copiar esta línea. Lo siento si he creado confusión.

Respecto a lo de los fuses, esto si que se me había pasado por completo. De todas formas cuando grababa el pic (con winpic800) elejía en oscillator "xt oscillator". No se si de esta forma debería funcionar adecuadamente.

Ahora he cambiado el fuse lp por xt y sigue funcionando igual. Incluyo el programa completo.

Programa principal
Código: C++
  1. #include "F:\Peces\prueba.h"
  2.  
  3.  
  4. #use delay(clock=4000000)
  5.  
  6. #byte puertod=0xf83
  7. #bit a=puertod.0
  8.  
  9.  
  10. void main()
  11. {
  12.    setup_adc_ports(NO_ANALOGS|VSS_VDD);
  13.    setup_adc(ADC_OFF);
  14.    setup_psp(PSP_DISABLED);
  15.    setup_spi(FALSE);
  16.    setup_wdt(WDT_OFF);
  17.    setup_timer_0(RTCC_INTERNAL);
  18.    setup_timer_1(T1_DISABLED);
  19.    setup_timer_2(T2_DISABLED,0,1);
  20.    setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
  21.    setup_comparator(NC_NC_NC_NC);
  22.    setup_vref(FALSE);
  23.  
  24.    set_tris_d(0);
  25.  
  26.    while(1)
  27.    {
  28.       a=~a;
  29.       delay_ms(5000);
  30.    }
  31.  
  32. }


Archivo prueba.h

Código: C++
  1. #include <18F4525.h>
  2. #device adc=8
  3.  
  4. #fuses NOWDT,xt, NOPROTECT, IESO, NOBROWNOUT, BORV46, NOPUT, NOCPD, STVREN, NODEBUG, NOLVP, NOWRT, NOWRTD, NOEBTR, NOCPB, NOEBTRB, NOWRTC, NOWRTB, FCMEN, XINST, PBADEN, LPT1OSC, MCLR


Gracias por adelantado

Desconectado fastyx

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 353
Re: No me funciona delay_ms en PIC18F4525
« Respuesta #4 en: 18 de Julio de 2006, 22:46:25 »
fijate en el datasheet como se llama el puerto d porque me parece que estas definiendo el bit a como puertod y tendrias que poner portd.0

otra cosa , fijate como configuras el tris para el puerto d, imagino que por lo que pones en el while estas viendo como cambia el estado del bit a cada 5 segundos (5000 ms ) , deberas configurarlo como salida en el trisd

espero sea de ayuda...

Desconectado yiyeyo

  • PIC10
  • *
  • Mensajes: 8
Re: No me funciona delay_ms en PIC18F4525
« Respuesta #5 en: 19 de Julio de 2006, 06:44:53 »
Hola fastyx

No creo que sea ese el problema. Precisamente en el datasheet del 18F4525 se define el puerto D con la dirección F83h. Además, con "set_tris_d(0)" estoy configurando el puerto D completo como salidas. No se si te refieres a eso.

El programa funciona en la simulación, y en el PIC creo que funciona ya que un diodo led conectado al pin0 del puerto D parece tener menor intensidad que otro conectado a 5V. Mi problema es que parece ser que la orden "delay_ms" la ignora, ya que como tu bien dices, debería cambiar el estado del pin0 cada 5 segundos, y lo hace muchísimo mas rápido.

Y eso es lo que no entiendo.
He probado a crearme una rutina de retardo, y el programa responde como bien. Lo que no he probado es este mismo programa en un 16F876, pero estoy casi seguro que ahí me funcionará. Entonces, ¿¿ es problema de la versión del CCS ?? o es por otro motivo.

Muchas gracias

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: No me funciona delay_ms en PIC18F4525
« Respuesta #6 en: 19 de Julio de 2006, 09:53:46 »
Compila, prueba y dime (imagino que efectivamente tienes un cuarzo de 4 Mhs):

Código: C
  1. #include <18F4525.h>
  2.  
  3. #device adc=8
  4.  
  5. #fuses XT, MCLR, NOWDT, NOPROTECT, NOPUT, NOBROWNOUT, NOPBADEN, NOLVP, NOCPD, NODEBUG, NOWRT, NOSTVREN
  6.  
  7. #use delay(clock=4000000)
  8.  
  9. #byte puertod = 0xf83
  10. #bit  a = puertod.0
  11.  
  12. void main(){
  13.    int1 i=0;
  14.    setup_adc_ports(NO_ANALOGS|VSS_VDD);
  15.    setup_adc(ADC_OFF);
  16.    setup_psp(PSP_DISABLED);
  17.    setup_spi(FALSE);
  18.    setup_wdt(WDT_OFF);
  19.    setup_timer_0(RTCC_INTERNAL);
  20.    setup_timer_1(T1_DISABLED);
  21.    setup_timer_2(T2_DISABLED,0,1);
  22.    setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
  23.    setup_comparator(NC_NC_NC_NC);
  24.    setup_vref(FALSE);
  25.    set_tris_d(0);
  26.    while(1){
  27.       a=~a;
  28.       delay_ms(5000);
  29.    }
  30. }
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado Manofwar

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 156
Re: No me funciona delay_ms en PIC18F4525
« Respuesta #7 en: 19 de Julio de 2006, 10:29:29 »
Hola Yiyeyo

He compilado y el bit del puerto d cambia de estado cada 5 segundos.

Como te ha dicho RedPic, ¿tienes un cristal de 4MHz?
Saludos desde Almería, España

Desconectado yiyeyo

  • PIC10
  • *
  • Mensajes: 8
Re: No me funciona delay_ms en PIC18F4525
« Respuesta #8 en: 19 de Julio de 2006, 11:20:03 »

Acabo de compilar, y tanto en la simulación con Proteus como en el PIC me sigue ocurriendo lo mismo.

Tengo un cristal de 4MHz, pero como dije antes, con una rutina de retardo casera me funciona.

Gracias

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: No me funciona delay_ms en PIC18F4525
« Respuesta #9 en: 26 de Julio de 2006, 07:15:12 »
Yo no creo que el problema lo tengas en el delay_ms, sino en esto:  a=~a;

¿porqué no cambias esa línea por esta otra?
output_bit ( PIN_D0, !input(PIN_D0));

Ya nos dirás qué tal

Desconectado yiyeyo

  • PIC10
  • *
  • Mensajes: 8
Re: No me funciona delay_ms en PIC18F4525
« Respuesta #10 en: 27 de Julio de 2006, 04:29:58 »
Hola a todos.

Creo que el problema se ha podido solucionar con un cambio de versión. No se cual tengo ahora mismo instalada porque estoy en el trabajo, pero el mismo programa me funciona con una versión y con la otra no. Pero como no soy experto en esto, no puedo afirmar que el problema se haya solucionado así, y que ese sea el motivo de haberse solucionado. De todas formas, con la nueva versión instalada, me ha dejado de funcionar el bus I2C (todo esto para el PIC18F4525, ya que con el PIC16F877 funciona), y ahora no se si estoy enfrentándome al mismo problema que cuando lo tenía con el delay_ms().

Por descartar que la fuente de todos mis problemas sea la versión del compilador, alguien podría decirme si utiliza alguna que no le de problemas y donde conseguirla.

Cuando esté en mi casa pondré el nuevo programa y la versión del compilador que estoy utilizando.

Muchas gracias.


 

anything