Autor Tema: Problema. Led que no se enciende con pulsador.  (Leído 9743 veces)

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

Desconectado edu1989

  • PIC18
  • ****
  • Mensajes: 275
Re: Problema. Led que no se enciende con pulsador.
« Respuesta #30 en: 18 de Noviembre de 2010, 05:29:00 »
Perdona Angel por olvidarme de contestarte al tema de la velocidad. Lei que el modulo usart detectaba automaticamente la velocidad con la que se transmitian los datos por eso no puse nada. Si no es asi, como configuro la velocidad? con el compilador ccs si que se que en el use rs232 especificas los pines y velocidad pero con el hi-tech ni idea. El terminal del proteus tambien hay que configurarlo a esa velocidad para que tengan la misma transmisor y receptor, y ya todo funciona? de ser asi estaria muy contento :)

Tecnic, creo que ese no es el problema porque la variable polsador se va refrescando, no obstante es probable que sea mas claro como dices tu. Lo tendre en cuenta. Muchas gracias

Gracias a todos por vuestra ayuda.

Edito: Acabo de entrar en el proteus para ver como esta configurado el terminal del proteus y por defecto ya viene con vel=9600kbaud/s y en general configurado como creo que tiene que estar: data bits=8, parity=NONE, stop bits=1, send XON/XOFF=NO ( esto no se que es)
Creo que sera question de configurar la velocidad en el programita y listos ( si no me equivoco)
« Última modificación: 18 de Noviembre de 2010, 07:48:19 por edu1989 »

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Problema. Led que no se enciende con pulsador.
« Respuesta #31 en: 18 de Noviembre de 2010, 12:24:00 »
Perdona Angel por olvidarme de contestarte al tema de la velocidad. Lei que el modulo usart detectaba automaticamente la velocidad con la que se transmitian los datos por eso no puse nada. Si no es asi, como configuro la velocidad? con el compilador ccs si que se que en el use rs232 especificas los pines y velocidad pero con el hi-tech ni idea. El terminal del proteus tambien hay que configurarlo a esa velocidad para que tengan la misma transmisor y receptor, y ya todo funciona? de ser asi estaria muy contento :)

.........

Edito: Acabo de entrar en el proteus para ver como esta configurado el terminal del proteus y por defecto ya viene con vel=9600kbaud/s y en general configurado como creo que tiene que estar: data bits=8, parity=NONE, stop bits=1, send XON/XOFF=NO ( esto no se que es)
Creo que sera question de configurar la velocidad en el programita y listos ( si no me equivoco)

  El modo auto sólo funciona en recepción. En el datasheet a partir de la página 241 te explica como calcular y configurar la velocidad.

  Y si mal no recuerdo en el ejemplo que hay en www.microchipc.com también tenía una tabla para configurar la velocidad.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado edu1989

  • PIC18
  • ****
  • Mensajes: 275
Re: Problema. Led que no se enciende con pulsador.
« Respuesta #32 en: 19 de Noviembre de 2010, 07:22:09 »
He hecho una serie de cambios en el programa despues de leer cosas del datasheet:

1. TRISC = 192; //todos los pines del puerto C se van a comportar como salida menos RC7 Y RC6. ( como entrada) 2^6 + 2^7=192 (ESTO NO LO TENIA ANTES).

2. Velocidad:

#define BAUD 9600
#define SPBRG

/*
Synchronous mode: Unused in this mode.
#define BRGH_VALUE 1
*/
   
   #if PIC_CLK==5000000 && BAUD==9600
      #assert SPBRG==129 // Calculado anteriormente . Daba 129.2 pero redondeamos a 129      
   
   #endif

El SPBRG esta calculado con la formula del datasheet. La formula es para una transmision sincrona ( solo quiero ir enviando hola mundo) y es la siguiente:
Baud rate= Fosc/4(n+1) primero de todo calculo N que es el valor de SPBRG. Aislo de la formula n y me da n=129.2 que hay que redondear hacia abajo por tanto 129 ( Calculos hechos con baud rate=9600 y Fosc=5Mhz). Creo que la frequencia de oscilacion es la correcta ya que la de entrada son 20Mhz que se dividen por 4

Sigue sin funcionarme, ahora me sale un error en el proteus
Logic contention(s) detected on net#00023.

Que creen que hago mal? les adjunto el codigo y el proteus en una carpeta
Tambien decirles que me sale un error si activo el bit PIE ( de las interrupciones...)

Ayudenme por favor. muchas gracias!

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Problema. Led que no se enciende con pulsador.
« Respuesta #33 en: 19 de Noviembre de 2010, 10:44:34 »
He hecho una serie de cambios en el programa despues de leer cosas del datasheet:

1. TRISC = 192; //todos los pines del puerto C se van a comportar como salida menos RC7 Y RC6. ( como entrada) 2^6 + 2^7=192 (ESTO NO LO TENIA ANTES).

  ¿Viste que es importante leer el Datasheet?

2. Velocidad:

#define BAUD 9600
#define SPBRG

/*
Synchronous mode: Unused in this mode.
#define BRGH_VALUE 1
*/
   
   #if PIC_CLK==5000000 && BAUD==9600
      #assert SPBRG==129 // Calculado anteriormente . Daba 129.2 pero redondeamos a 129      
   
   #endif

El SPBRG esta calculado con la formula del datasheet. La formula es para una transmision sincrona ( solo quiero ir enviando hola mundo) y es la siguiente:
Baud rate= Fosc/4(n+1) primero de todo calculo N que es el valor de SPBRG. Aislo de la formula n y me da n=129.2 que hay que redondear hacia abajo por tanto 129 ( Calculos hechos con baud rate=9600 y Fosc=5Mhz). Creo que la frequencia de oscilacion es la correcta ya que la de entrada son 20Mhz que se dividen por 4

  No importa que envíes el mismo dato una y otra vez, la transmisión puede ser sincrónica o asincrónica. Para que sea sincrónica uno de los pines funciona como clock  (TX) y el otro como data (RX). En una transmisión asincrónica no necesitás salida de clock.

  En la fórmula, FOSC se refiere a la frecuencia de oscilación, que es justamente a cuanto está oscilando el PIC. Si el cristal es de 20MHz, entonces FOSC es 20MHz.
  Si no querés usar pin de clock entonces tenés que configurar como comunicación asincrónica.

Sigue sin funcionarme, ahora me sale un error en el proteus
Logic contention(s) detected on net#00023.

Que creen que hago mal? les adjunto el codigo y el proteus en una carpeta
Tambien decirles que me sale un error si activo el bit PIE ( de las interrupciones...)

Ayudenme por favor. muchas gracias!

  El error de proteus se debe a mal conexionado y en el nodo que indica el error es porque por ejemplo, el pic está generando un nivel alto y el terminal virtual debe estar generando un nivel bajo y entonces se produce un cortocircuito.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado edu1989

  • PIC18
  • ****
  • Mensajes: 275
Re: Problema. Led que no se enciende con pulsador.
« Respuesta #34 en: 19 de Noviembre de 2010, 11:56:07 »
  En la fórmula, FOSC se refiere a la frecuencia de oscilación, que es justamente a cuanto está oscilando el PIC. Si el cristal es de 20MHz, entonces FOSC es 20MHz.

El asunto de la question es escoger que tipo de oscilador quiero, hay hasta 10 distintos (pg 25 del datasheet). Dentro de la opcion cristal puedo conseguir:
Crystals Used:
4 MHz
8 MHz
20 MHz

Mi pregunta es: para conseguir el reloj tengo que fijarme con los valores de los condensadores que vienen en el datasheet para conseguir cada frequencia y ponerlo en el simulador de proteus? Cual cojo de las tres? con que criterio escojo la frequencia, aparte de para la rapidez del programa claro...

Adjunto otra vez programa + proteus. He corregido el modo, ahora he puesto asincrono ( con los cambios en el programa, pertinentes)

p.d: No he entendido la ultima frase AngelCris, ahora he probado el proteus y no me tira el error aunque no hace nada. No veo el terminal ni nada... voy a seguir probando. Muchas gracias por la ayuda

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Problema. Led que no se enciende con pulsador.
« Respuesta #35 en: 19 de Noviembre de 2010, 13:10:19 »
En la fórmula, FOSC se refiere a la frecuencia de oscilación, que es justamente a cuanto está oscilando el PIC. Si el cristal es de 20MHz, entonces FOSC es 20MHz.

El asunto de la question es escoger que tipo de oscilador quiero, hay hasta 10 distintos (pg 25 del datasheet). Dentro de la opcion cristal puedo conseguir:
Crystals Used:
4 MHz
8 MHz
20 MHz

Mi pregunta es: para conseguir el reloj tengo que fijarme con los valores de los condensadores que vienen en el datasheet para conseguir cada frequencia y ponerlo en el simulador de proteus? Cual cojo de las tres? con que criterio escojo la frequencia, aparte de para la rapidez del programa claro...

  La verdad que me está mareando un poco la configuración del clock del 18F. La frecuencia que hay que indicar en el Proteus es la frecuencia de trabajo del CPU.
  Fijate en el esquema de la página 24. Para saber a que frecuencia va a trabajar el CPU hay que tener en cuenta el tipo de clock y algunos bits de configuración.
  Por ejemplo para el modo HS (que abarca el rango de cristales que vos mostrás) tendrías que tener en cuenta los bits CPUDIV para saber a qué frecuencia estaría trabajando el CPU. Por defecto los bits CPUDIV están en 00 así que la frecuencia de trabaja del CPU sería la frecuencia del cristal dividido 1. Osea, si usas cristal de 20MHz, el micro trabaja a 20MHz, por ende en el proteus hay que indicar una frecuencia de 20MHz.


p.d: No he entendido la ultima frase AngelCris, ahora he probado el proteus y no me tira el error aunque no hace nada. No veo el terminal ni nada... voy a seguir probando. Muchas gracias por la ayuda

  No ves la pantalla del terminal porque la cerraste. Cuando estés simulando, anda a Debug y tilda para poder ver el "Virtual Terminal"


  Ahora otra cosa, estoy viendo en tu programa lo siguiente

Código: C
  1. #define BAUD 9600
  2.         #define SPBRG
  3.         #define BRGH_VALUE 1 // High Baud Rate Select bit (=1 High Speed)
  4.  
  5.        
  6.         #if PIC_CLK==5000000 && BAUD==9600
  7.                 #assert SPBRG==129 // Calculado anteriormente. Daba 129.2 pero hay que redondear a la baja 129         
  8.                 #assert BRGH_VALUE==1
  9.         #endif

 Para que te tome la línea "#if PIC_CLK ......"  tenés que definir con anterioridad PIC_CLK. Es decir, poner "#define PIC_CLK 5000000" antes de llamar a "serial_setup".

  Me voy a almorzar, luego trataré de ordenar el programa y lo subo.... Así podés ver las diferencias.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Problema. Led que no se enciende con pulsador.
« Respuesta #36 en: 19 de Noviembre de 2010, 14:37:12 »
Acá te dejo una versión que la probé tanto a 19200 como a 9600 y funcionó bien. Por supuesto para que trabaje a distintas velocidades hay que compilar el programa asignando el valor adecuado a "#define BAUD xxxx" y también cambiar la velocidad al terminal virtual del Proteus.

Código: C
  1. #include <htc.h>
  2.  
  3.  
  4. /*
  5. ;******** Configuracion del Oscilador **********
  6. CONFIG FOSC = XT_XT         ;Osc XT, XT usado para el USB
  7.  
  8. ;******** Otros bits de configuracion **********
  9. CONFIG PWRT = ON ;PWRT habilitado
  10. CONFIG BOR  = OFF ;Brown out resete deshabilitado
  11. CONFIG WDT = OFF ;Watch dog deshabilitado
  12. CONFIG  MCLRE = OFF ;MCLR como entrada
  13. CONFIG PBADEN = ON ;Todos los pines como entradas analogicas
  14. CONFIG LVP = OFF ;programacion en bajo voltaje deshabilitado
  15.  
  16. ;********* Bits de proteccion ******************
  17. CONFIG CP0 = OFF ;los bloques del codigo de programa
  18. CONFIG CP1 = OFF ;no estan protegidos
  19. CONFIG CP2 = OFF
  20. CONFIG CP3 = OFF
  21. CONFIG CPB = OFF ;Sector Boot no esta protegido
  22. CONFIG CPD = OFF ;La EEPROM no esta protegida
  23. */
  24.  
  25. /*
  26.  Hay que definir BAUD y PIC_CLK para que compile bien y a su vez para poder asignar el valor de velocidad
  27. PIC_CLK tiene que ser la frecuencia de trabajo del CPU y es el mismo que hay que asignar desde Proteus
  28. */
  29.  
  30. #define BAUD  19200                     // velocidad en baudios
  31. #define PIC_CLK 20000000    // 20MHz de oscilación
  32.  
  33.  
  34. void serial_setup(void);
  35. void putch(unsigned char);
  36.  
  37. unsigned char dummy;
  38.  
  39. void main (void)
  40. {
  41.  char c = 'G'; //cuando es un valor char tiene que ir entre comillas simples (') y no dobles (")
  42.  TRISC = 192; //todos los pines del puerto C se van a comportar como salida menos RC7 Y RC6. ( como entrada) 2^6 + 2^7=192
  43.  serial_setup();
  44.  while(1)
  45.  {
  46.   putch(c);
  47.   }
  48.  
  49. }
  50.  
  51.  
  52.  
  53. void serial_setup(void)
  54. {
  55.  
  56. /*
  57.   Te agrego lo siguiente para que se configure la velocidad automáticamente,
  58. basandose en el valor definido a PIC_CLK y el valor definido a BAUD
  59.  
  60.   Que esta basado en la formula del DataSheet para BRG16 = 0 y BRGH = 1
  61. */
  62.  
  63. #define SPBRG_VALUE ((PIC_CLK/(16UL*BAUD)) -1) // Valor que hay que asignar al registro SPBRG
  64.  
  65.        
  66.         // En nuestro caso la Fosc=5MHZ y baud rate 9600kbaud/s
  67. /*
  68.         #define BAUD 9600
  69.         #define SPBRG
  70.         #define BRGH_VALUE 1 // High Baud Rate Select bit (=1 High Speed)
  71.  
  72.        
  73.         #if PIC_CLK==5000000 && BAUD==9600
  74.                 #assert SPBRG==129 // Calculado anteriormente. Daba 129.2 pero hay que redondear a la baja 129         
  75.                 #assert BRGH_VALUE==1
  76.         #endif
  77. */
  78. /*
  79.   Anulé todo lo anterior, porque no voy a hacer uso de ello
  80. */     
  81.  
  82.  
  83. BRGH = 1;
  84. BRG16 = 0;
  85.  
  86. SPBRG = SPBRG_VALUE; //esté es el valor caldulado y lo podés corroborar con las tablas del DataSheet
  87.  
  88.  
  89.  
  90. SPEN=1; // Enable serial port
  91. SYNC=0; // Asincrono
  92.  
  93. /*Transmision*/
  94. TXIE=0; // Desactivar interrupciones de tx
  95. TXEN=1; // Enable the transmitter
  96. TX9=0; // 8 bits transmission
  97.  
  98. /*Recepcion*/
  99. RCIE=1; // Interrupciones en recepcion
  100. RX9=0; // 8 bits receiver
  101. CREN=1; // Enable reception
  102.  
  103.  
  104. //Using interruptions...
  105. GIE=1;
  106. PEIE=1;
  107.  
  108.  
  109. // Para configurar como asincrono
  110.  
  111. /*
  112. 1. Initialize the SPBRGH:SPBRG registers for the
  113. appropriate baud rate. Set or clear the BRGH
  114. and BRG16 bits, as required, to achieve the
  115. desired baud rate.
  116. 2. Enable the asynchronous serial port by clearing
  117. bit, SYNC, and setting bit, SPEN.
  118. 3. If the signal from the TX pin is to be inverted, set
  119. the TXCKP bit.
  120. 4. If interrupts are desired, set enable bit, TXIE.
  121. 5. If 9-bit transmission is desired, set transmit bit,
  122. TX9. Can be used as address/data bit.
  123. 6. Enable the transmission by setting bit, TXEN,
  124. which will also set bit, TXIF.
  125. 7. If 9-bit transmission is selected, the ninth bit
  126. should be loaded in bit, TX9D.
  127. 8. Load data to the TXREG register (starts
  128. transmission).
  129. 9. If using interrupts, ensure that the GIE and PEIE
  130. bits in the INTCON register (INTCON<7:6>) are
  131. set.
  132.  
  133. */
  134.  
  135.  
  136. /*
  137. To set up an Asynchronous Reception:
  138. 1. Initialize the SPBRGH:SPBRG registers for the
  139. appropriate baud rate. Set or clear the BRGH
  140. and BRG16 bits, as required, to achieve the
  141. desired baud rate.
  142. 2. Enable the asynchronous serial port by clearing
  143. bit, SYNC, and setting bit, SPEN.
  144. 3. If the signal at the RX pin is to be inverted, set
  145. the RXDTP bit.
  146. 4. If interrupts are desired, set enable bit, RCIE.
  147. 5. If 9-bit reception is desired, set bit, RX9.
  148. 6. Enable the reception by setting bit, CREN.
  149. 7. Flag bit, RCIF, will be set when reception is
  150. complete and an interrupt will be generated if
  151. enable bit, RCIE, was set.
  152. 8. Read the RCSTA register to get the 9th bit (if
  153. enabled) and determine if any error occurred
  154. during reception.
  155. 9. Read the 8-bit received data by reading the
  156. RCREG register.
  157. 10. If any error occurred, clear the error by clearing
  158. enable bit, CREN.
  159. 11. If using interrupts, ensure that the GIE and PEIE
  160. bits in the INTCON register (INTCON<7:6>) are
  161. set
  162.  
  163. */
  164.  
  165.  
  166. #define clear_usart_errors_inline       \
  167. if (OERR)                                                                                                       \
  168. {                                                                                                                                       \
  169.         TXEN=0;                                                                                                 \
  170.         TXEN=1;                                                                                                 \
  171.         CREN=0;                                                                                                 \
  172.         CREN=1;                                                                                                 \
  173. }                                                                                                                                       \
  174. if (FERR)                                                                                                       \
  175. {                                                                                                                                       \
  176.         dummy=RCREG;                                                                            \
  177.         TXEN=0;                                                                                                 \
  178.         TXEN=1;                                                                                                 \
  179. }
  180.  
  181.  
  182.  
  183. }
  184.  
  185. void putch(unsigned char c)
  186. {
  187.         while(!TXIF) // 1 si el registro esta vacio
  188.         {
  189.                 clear_usart_errors_inline;
  190.                 CLRWDT();
  191.         }
  192.         TXREG=c;
  193.  
  194. }
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado edu1989

  • PIC18
  • ****
  • Mensajes: 275
Re: Problema. Led que no se enciende con pulsador.
« Respuesta #37 en: 23 de Noviembre de 2010, 06:08:00 »
Muchas gracias AngelCris! te lo agradezco mucho. Al principio no me funcionaba pero me di cuenta que en el PIC de la simulacion tenia que ponerle el clock adequeado osea 20MHz ( estaba en 4MHz por defecto). Mas tarde te explico mi nuevo programita... voy a intentar-lo yo primero.

Muchas gracias de verdad.
Saludos

Desconectado edu1989

  • PIC18
  • ****
  • Mensajes: 275
Re: Problema. Led que no se enciende con pulsador.
« Respuesta #38 en: 24 de Noviembre de 2010, 07:16:04 »
Hola de nuevo. Estoy haciendo un programa para apagar y encender leds con la novedad del timer. El asunto es que cuando se pulse el pulsador el led este encendido durante 5s ( a traves del timer 0). El código he intentado organizarlo mucho, para seguir los consejos de mi director de proyecto. Como pueden ver, esta hecho a partir de estados. Los dos estados que hay son:

Idle_Low: Apagado ( es como un estado de sleep). Cuando se pulsa el pulsador sale de este estado.

Idle_High: Cuando se pulsa el pulsador se viene a este estado, se cuentan 5s ( en estos 5s el led permanece encendido) y después vuelve al estado de Low.

Un diagrama muy sencillo.

No se porque pero no me acaba de funcionar. Les agradecería que le echaran un ojo a ver que es lo que pasa. Les adjunto el código con el circuito proteus.

Muchas gracias por la ayuda!

Desconectado stk500

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4919
Re: Problema. Led que no se enciende con pulsador.
« Respuesta #39 en: 24 de Noviembre de 2010, 08:05:18 »
Hola edu1989,
yo te recomendaria que abriera otro hilo si resolviste el problema del LED con pulsador, es que asi queda muy ogorroso para aquellos que busca informacion. no cree?  de todas forma te paso un archivo que debe editarlo para lo que tu quieres.

Saludos



Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Problema. Led que no se enciende con pulsador.
« Respuesta #40 en: 24 de Noviembre de 2010, 09:30:31 »
  Estoy de acuerdo con el compañero stk500.
Yo ya te lo había comentado cuando empezaste a preguntar sobre la comunicación serie.
Es más prolijo abrir un nuevo tema por esta duda, incluso lo era con respecto al tema de la comunicación.

Imaginate a alguien que recién comienza y usa el buscador para encontrar algo sencillo como es encender un led. Se encuentra con este topic que tiene un montón de agregados innecesarios para el simple hecho del led. Entonces esa persona se va a marear un poco.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado edu1989

  • PIC18
  • ****
  • Mensajes: 275
Re: Problema. Led que no se enciende con pulsador.
« Respuesta #41 en: 24 de Noviembre de 2010, 09:35:08 »
Ya esta! Realmente teneis razon, sino sera un lio para las otras personas...

Nos vemos en el otro post.