TODOPIC

Microcontroladores PIC => Lenguaje Basic para microcontroladores PIC => Mensaje iniciado por: Bregy en 27 de Enero de 2013, 23:51:20

Título: Problemas para controlar led RGB con PWM y ahora también ADC [Solucionado]
Publicado por: Bregy en 27 de Enero de 2013, 23:51:20
Amigos ahora se me presento otro problema, ya había solucionado el del PWM ya casi soluciono el ADC pero ahora estoy frente a otra dificultad y es sobre hardware mi puñetero led RGB es de ánodo común!!!
Osea que el positivo es uno para los 3 colores y cuando quiero usar el PWM en un color individual no puedo me estoy frustrando... :8} :8} :8} :8}
Ayúdenme por favor como puedo hacer para variar el PWM de cada color individualmente!?
Título: Re: Otro problema mas! xD
Publicado por: BrunoF en 28 de Enero de 2013, 00:18:04
La mayoría de los LEDs RGB son ánodo común.

Podrías invertir el valor de cada PWM, logrando invertir el % de duty encendido.
Título: Re: Otro problema mas! xD
Publicado por: Bregy en 28 de Enero de 2013, 00:25:18
Primero gracias por contestar, amigo lo intente asea lo que 255 es 100% de encendido 0 deveria ser lo mas bajo entonces con un poquito de razonamiento supuse que si 205 es digamos el 85%  50 seria el 15 %. Invirtiendo tendríamos que 205 es el 15 % y 50 el 85 % pero eso solo me funcionaba con un led común y no con los RGB :8} :8} :8} :8}
Título: Re: Otro problema mas! xD
Publicado por: BrunoF en 28 de Enero de 2013, 00:40:11
Para LED RGB necesitás generar 3 PWM independientes, uno para cada canal: Rojo, Verde y Azul. Sino no vas a lograr todos los colores.
Título: Re: Otro problema mas! xD
Publicado por: RockLee_89 en 28 de Enero de 2013, 02:45:29
hola amigo Bregy  yo nunca e utilizado leds rgb pero biendo mas o menos como es su configuracion aqui te dejo un dibujo no te burles lo hice en paint y mas dormido que despierto creo que con eso resuelves el problema de los colores.

el funcionamiento es simple le aplicas pwm al anodo que es comuen el los 3 colores y activas el transistor que se encuentra configurado como emisor comun y asi podras activar los 3 leds independientes cada uno.  por ejemplo si activas el 1 transistor podria variar el rojo estos transistores los activas con 0 y 1 osea 0 y 5v y asi endras el control independiente de cada led si quieres leer un poco mas de transistores y configuraciones el libro de teoria de circuitos de boylestard esta muy bueno te lo recomiendo si tienes mas dudas preguntar

saludos

aaa una cosa mas te recomiendo otro transistor configurado igual que los 3 transistores solo que el colector a positivo de la fuente el emisor al anodo de el led rgb y la base le aplicas la señal pwm con sus respectivas resistencias ya que el pic solo puede suministrar 25 ma por salida y si no pones este transistor 1 pin del pic podria pasar a mejor vida ya me paso con un motorsito dc
asi que sobre abiso no hay engaño
Título: Problemas para controlar led RGB con PWM
Publicado por: Bregy en 28 de Enero de 2013, 04:06:12
Hola amigo rocklee, gracias por tu tiempo invertido.
Ya habia pensado esa solucion pero no funciona por que si es anodo comun y le doy 30% pwm al anodo y luego digamos quiero el color rosa que es 70% de rojo y 30% de azul pero el pwm solo esta en 30%.
Quedara 30 % de rojo y 30% de azul lo que dara morado y no rosa
Título: Re: Problemas para controlar led RGB con PWM
Publicado por: dogflu66 en 28 de Enero de 2013, 05:38:28
Puedes utilizar un PWM por hardware para controlar un color y dos PWM  por software para controlar el resto de colores, o bien, puedes utilizar 3 PWM por software.
Título: Re: Problemas para controlar led RGB con PWM
Publicado por: RockLee_89 en 28 de Enero de 2013, 10:20:28
ok Bregy  no savia ups
bueno el amigo dogflu66 te dio una solucion haciendolo por sofware el pwm asi tendras varios pwm por sofware y  hardware
me acorde que me dijiste que usas el pic16f877a el tiene 2 pwm por hardware podrias utilizarlos o por sofware
saludos
Título: Re: Problemas para controlar led RGB con PWM
Publicado por: Bregy en 28 de Enero de 2013, 11:24:13
Buenas a todos, mi problema no es el numero PWM sino que el pwm se conecta al positivo del  led RGB pero mi led RGB es de positivo común osea que es un positivo para los 3 y si le pongo digamos n% de PWM (al positivo) y luego activo el negativo del rojo sera n% de rojo y luego activo el azul sera n% de azul igual pasa con el verde.
En conclucion no tendré mas que 6 colores (el rojo, azul,morado,verde, amarillo, marrón y cyan, creo que me equivoco xD)

Ah por cierto el mensaje de arriba lo escribí con mi celular y no pude terminarlo así que ese mensaje no vale.

PSDT: Dogflu como hago que el PWM por software sea variable, ahí te dejo un código haber dime si vale.

Código: [Seleccionar]
Define CONF_WORD = 0x3f50

TRISA = 0xff
TRISB = 0
AllDigital
PORTB.0 = 0

inicio:
If RA0 = 0 Then Goto pwm1
If RA0 = 1 Then Goto pwm2
Goto inicio

pwm1:
PORTB.0 = 1
WaitUs 25
PORTB.0 = 0
WaitUs 125
Goto inicio

pwm2:
PORTB.0 = 1
WaitUs 125
PORTB.0 = 0
WaitUs 25
Goto inicio

Gracias a todos! :-/ :-/ :-/
Título: Re: Problemas para controlar led RGB con PWM
Publicado por: dogflu66 en 28 de Enero de 2013, 11:42:04
Código: FreeBasic
  1. '***********************************************************
  2. 'Pruebas para inciarse en el control de iluminación led por PWM
  3. 'Tres PWM por software
  4. 'Placa Pic EBasic con Pic16F88
  5. '***********************************************************
  6. 'Configuración de fuses y reloj
  7. Define CONF_WORD = 0x2f50
  8. Define CONF_WORD_2 = 0x3ffc
  9. Define CLOCK_FREQUENCY = 8
  10. 'Define SIMULATION_WAITMS_VALUE = 1  'Aumenta la velocidad de las pausas
  11. 'Configuración de módulos
  12. AllDigital  'Los pin analogicos/digitales trabajaran como digitales
  13. CMCON = 0x07  'Comparador a off
  14. OSCCON = 0x7e  'Set intrc To 8mhz, se usara reloj interno a 8Mhz
  15. TRISA = 0  'Puerto A configurado como salidas, execto RA5 que solo trabaja como entrada
  16. TRISB = 0  'Puero B configurado como salidas
  17. PORTB = 0  'Puerto B puesto a cero todos sus pin
  18. 'Rutina principal
  19. main:
  20.         Dim cont As Word 'Contador incremento potencia de los PWMs
  21.         Dim pwm0 As Byte 'Potencia PWM 0
  22.         Dim pwm1 As Byte 'Potencia PWM 1
  23.         Dim pwm2 As Byte 'Potencia PWM 2
  24.         Const cont_s = 5 'Intervalo incremento Potencias
  25.         Dim x As Bit 'Variable auxiliar
  26.         pwm0 = 0 'Potencia inicial 0% PWM0
  27.         pwm1 = 255 'Potencia inicial 100€ PWM1
  28.         pwm2 = 127 'Potencia inicial 50% PWM2
  29.         x = 0
  30.  
  31.         While x = 0  'Bucle principal
  32.        
  33.                 Call _pwm_rb(pwm0, pwm1, pwm2) 'Controla y actualiza los PWMs
  34.                 If cont >= cont_s Then 'Intervalo del incremento de potencias
  35.                         pwm0 = pwm0 + 1
  36.                         pwm1 = pwm1 - 1
  37.                         cont = 0
  38.                 Endif
  39.                 cont = cont + 1
  40.  
  41.         Wend
  42.  
  43. End                                              
  44. 'Funcion para practicas con control de potencia con 3 PWM (software)
  45. 'Para control con positivo comun
  46. 'Pin utilizado RB0 a RB2 del puerto B
  47. 'Frecuencia aproximada 230Hz a 8Mhz de CLK.
  48. 'Tres valores de entrada mediante _pwm0 a _pwm2
  49. 'Con valores comprendidos entre 0 a 255 pasos de potencia
  50. Proc _pwm_rb(_pwm0 As Byte, _pwm1 As Byte, _pwm2 As Byte)
  51.         Const periodo = 255  'Periodo de la señal
  52.         Dim ctrl As Byte  'Lleva el tiempo transcurrido del periodo
  53.         If _pwm0 > 0 Then RB0 = 0  'Pin a OFF
  54.         If _pwm1 > 0 Then RB1 = 0  'Pin a OFF
  55.         If _pwm2 > 0 Then RB2 = 0  'Pin a OFF
  56.         ctrl = 0  'Comienza ciclo
  57.         While ctrl < periodo  'Mientras no se complete el periodo
  58.                 If ctrl >= _pwm0 Then RB0 = 1  'Pin a ON
  59.                 If ctrl >= _pwm1 Then RB1 = 1  'Pin a ON
  60.                 If ctrl >= _pwm2 Then RB2 = 1  'Pin a ON
  61.                 ctrl = ctrl + 1  'Tiempo transcurrido del periodo
  62.         Wend
  63. End Proc
Título: Re: Problemas para controlar led RGB con PWM
Publicado por: Bregy en 28 de Enero de 2013, 17:09:29
Tengo una idea ya que tengo 3 pics 16f877a y un 16f628 creo que ya se como hare, quiero saber como se pueden enviar datos de un pic a otro osea que el 16f877a envie 3 datos a los 3 pics a la ves y que cada pic use un dato, adjunto una imagen (Tecnica robada del amigo rocklee xD)
(http://k39.kn3.net/DEBCAF549.jpg)
Título: Re: Problemas para controlar led RGB con PWM
Publicado por: RockLee_89 en 28 de Enero de 2013, 18:59:43
hola amigo Bregy como tu lo planteas esta bien, solo que para mi gusto no. como lo quieres hacer te puedes comunicar por varias formas creo 1 podria ser 12c pero creo que es muy complicado otra seria por comunicacion serial ya sea el 877 se comunique  serialmente por sofware y los demas por hardare pero usar 4 pic para generar colores. no me gusta mejor usa este nuevo circuito que posteo asi con el programa que el amigo dogflu66 te posteo en el cual generas 3 señales pwm por sofware se los aplicas tranquilamente las bases de los transistores y podras generar los colores

por ejemplo si le generas señal de pwm1 de un % al azul y una señal pwm2 al rojo de un % generas el morado del led y claro la señal pwm3 se desactiva para que no se mescle otro color el cual no es deseado y asi es la idea espero y me entiendas checa la imagen y hecha a volar la imaginacion
saludos
Título: Re: Problemas para controlar led RGB con PWM
Publicado por: dogflu66 en 28 de Enero de 2013, 21:55:54
En realidad si el led no necesita más de 25mAmp. por pin no son necesarios los transistores ya que el pic es capaz de llegar a suministrar alrededor de los 25mAmp. por pin. De todas formas es recomendable colocar resistencias limitadoras tanto si se usan los transistores como si se usa el pic de forma directa o nos arriesgamos a quemar algo.
Título: Re: Problemas para controlar led RGB con PWM
Publicado por: RockLee_89 en 28 de Enero de 2013, 21:57:32
tienes rason dogflu66 pero mas vale prevenir que quemar el pic

 ((:-)) ((:-)) ((:-)) ((:-)) ((:-)) ((:-))
Título: Re: Problemas para controlar led RGB con PWM
Publicado por: Bregy en 28 de Enero de 2013, 21:59:08
Amigos creen que esto esta bien?:
Código: [Seleccionar]
'***********************************************************
'Codigo original de dogflu66
'Tres PWM por software
'No entiendo donde tengo que variar el duty?
'***********************************************************
'Configuración de fuses y reloj
Define CONF_WORD = 0x2f50
Define CLOCK_FREQUENCY = 4
'Configuración de módulos
AllDigital  'Los pin analogicos/digitales trabajaran como digitales
TRISA = 0  'Puerto A configurado como salidas, execto RA5 que solo trabaja como entrada
TRISB = 0  'Puero B configurado como salidas
PORTB = 0  'Puerto B puesto a cero todos sus pin
'Rutina principal
main:
Dim cont As Word  'Contador incremento potencia de los PWMs
Dim pwm0 As Byte  'Potencia PWM 0
Dim pwm1 As Byte  'Potencia PWM 1
Dim pwm2 As Byte  'Potencia PWM 2
Dim x As Bit  'Variable auxiliar
pwm0 = 0  'Potencia inicial 0% PWM0
pwm1 = 0  'Potencia inicial 100€ PWM1
pwm2 = 0  'Potencia inicial 50% PWM2
x = 0

While x = 0  'Bucle principal

Call _pwm_rb(pwm0, pwm1, pwm2)  'Controla y actualiza los PWMs
pwm0 = cont
pwm1 = cont
pwm1 = cont
Endif
cont = cont + 1
If Count > 900 Then cont = 0
Wend

End                                               
'Funcion para practicas con control de potencia con 3 PWM (software)
'Para control con positivo comun
'Pin utilizado RB0 a RB2 del puerto B
'Frecuencia aproximada 230Hz a 8Mhz de CLK.
'Tres valores de entrada mediante _pwm0 a _pwm2
'Con valores comprendidos entre 0 a 255 pasos de potencia
Proc _pwm_rb(_pwm0 As Byte, _pwm1 As Byte, _pwm2 As Byte)
Const periodo = 255  'Periodo de la señal
Dim ctrl As Byte  'Lleva el tiempo transcurrido del periodo
If _pwm0 > 0 Then RB0 = 0  'Pin a OFF
If _pwm1 > 0 Then RB1 = 0  'Pin a OFF
If _pwm2 > 0 Then RB2 = 0  'Pin a OFF
ctrl = 0  'Comienza ciclo
While ctrl < periodo  'Mientras no se complete el periodo
If ctrl >= _pwm0 Then RB0 = 1  'Pin a ON
If ctrl >= _pwm1 Then RB1 = 1  'Pin a ON
If ctrl >= _pwm2 Then RB2 = 1  'Pin a ON
ctrl = ctrl + 1  'Tiempo transcurrido del periodo
Wend
End Proc                             
Título: Re: Problemas para controlar led RGB con PWM
Publicado por: dogflu66 en 29 de Enero de 2013, 19:54:30
pwm0, pwm1 y pwm2 son las variables que controlan la potencia o duty de cada pin PWM.
pwm0, pwm1 y pwm2 son variables de tipo Byte, por lo que solo pueden contener valores comprendidos entre 0 y 255
Call _pwm_rb(pwm0, pwm1, pwm2) actualiza los tres PWM al mismo tiempo, porque si se realizara una funcion para
controlar o actualizar cada pwm por separado no funcionaria bien, los colores harian parpadeos extraños.

Código: [Seleccionar]
'***********************************************************
'Codigo original de dogflu66 (no es el codigo original)
'Tres PWM por software
'No entiendo donde tengo que variar el duty?
'Pic16F628A
'***********************************************************
'Configuración de fuses y reloj
Define CONF_WORD = 0x3f50  '0x2f50
Define CLOCK_FREQUENCY = 4
'Configuración de módulos
AllDigital  'Los pin analogicos/digitales trabajaran como digitales
TRISA = 0  'Puerto A configurado como salidas, execto RA5 que solo trabaja como entrada
TRISB = 0  'Puero B configurado como salidas
PORTB = 0  'Puerto B puesto a cero todos sus pin
'Rutina principal
main:
Dim cont As Byte  'word  'Contador incremento potencia de los PWMs
Dim pwm0 As Byte  'Potencia PWM 0
Dim pwm1 As Byte  'Potencia PWM 1
Dim pwm2 As Byte  'Potencia PWM 2
Dim x As Bit  'Variable auxiliar
pwm0 = 0  'Potencia inicial 0 PWM0
pwm1 = 0  'Potencia inicial 0 PWM1
pwm2 = 0  'Potencia inicial 0 PWM2
x = 0

While x = 0  'Bucle principal

Call _pwm_rb(pwm0, pwm1, pwm2)  'Controla y actualiza los PWMs
pwm0 = cont
pwm1 = cont
pwm1 = cont
cont = cont + 1
'If cont > 900 Then cont = 0

Wend

End                                               
'Funcion para practicas con control de potencia con 3 PWM (software)
'Para control con positivo comun
'Pin utilizado RB0 a RB2 del puerto B
'Frecuencia aproximada 230Hz a 8Mhz de CLK.
'Tres valores de entrada mediante _pwm0 a _pwm2
'Con valores comprendidos entre 0 a 255 pasos de potencia
Proc _pwm_rb(_pwm0 As Byte, _pwm1 As Byte, _pwm2 As Byte)
Const periodo = 255  'Periodo de la señal
Dim ctrl As Byte  'Lleva el tiempo transcurrido del periodo
If _pwm0 > 0 Then RB0 = 0  'Pin a OFF
If _pwm1 > 0 Then RB1 = 0  'Pin a OFF
If _pwm2 > 0 Then RB2 = 0  'Pin a OFF
ctrl = 0  'Comienza ciclo
While ctrl < periodo  'Mientras no se complete el periodo
If ctrl >= _pwm0 Then RB0 = 1  'Pin a ON
If ctrl >= _pwm1 Then RB1 = 1  'Pin a ON
If ctrl >= _pwm2 Then RB2 = 1  'Pin a ON
ctrl = ctrl + 1  'Tiempo transcurrido del periodo
Wend
End Proc
Título: Re: Problemas para controlar led RGB con PWM
Publicado por: Bregy en 29 de Enero de 2013, 23:21:32
Amigo dogflu:
- Esa variable "x" que declaras no tiene mas funcion que hacer que el bucle funcione?

Esta linea que es lo que hace?
- Proc _pwm_rb(_pwm0 As Byte, _pwm1 As Byte, _pwm2 As Byte)

Por lo poco que se para hacer PWM por soft tienes que invocar a el timer0 y no veo donde lo invoques... si me equivoco dime entonces como se invoca...

Gracias amigo dogflu. :-/ :-/
Título: Re: Problemas para controlar led RGB con PWM
Publicado por: RockLee_89 en 30 de Enero de 2013, 00:29:33
hola amigo Bregy en este ejemplo no uso ningun taimer
y en caso que quieras activar un taimer tienes que ir al registro itcon del pic el cual se encuentra en el datashet del pic

las funciones proc y function
hay no te puedo ayudar mucho ya aque apenas unos dias se que existen y mas o menos para que se pueden utilizar el amigo dogflu66 me explico el funcionamiento de las 2 pero aun no las leo como se debe para entenderlo

pero hablando buerdamente la instruccion proc funciona basicamente como si fuera una subrutina pero esta se llama mediante la instruccion cal y esta sirve para realizar alguna accion como el encendido o apgado de las salidas pwm

si quieres leer lo que me explico el amigo dogflu66  se encuentra en el ejemplo donde pedi ayuda es sobre multiplexacion de displey de 7 segmentos si quieres leerlo para ver si lo entiendes mejor que yo  :mrgreen: :mrgreen: :mrgreen:
Título: Re: Problemas para controlar led RGB con PWM
Publicado por: dogflu66 en 30 de Enero de 2013, 05:47:56
Amigo dogflu:
- Esa variable "x" que declaras no tiene mas funcion que hacer que el bucle funcione?

Esta linea que es lo que hace?
- Proc _pwm_rb(_pwm0 As Byte, _pwm1 As Byte, _pwm2 As Byte)

Por lo poco que se para hacer PWM por soft tienes que invocar a el timer0 y no veo donde lo invoques... si me equivoco dime entonces como se invoca...

Gracias amigo dogflu. :-/ :-/


La variable x es para que el bucle funcione.

***************************************
'------------------------------------------------------
Proc _pwm_rb(_pwm0 as Byte, _pwm1 as Byte, _pwm2 as Byte)

... cuerpo de la función

End Proc 'Terminación de la función
'-------------------------------------------------------

Todo eso es equivalente a la siguiente subrutina:
'----------------------------------
Dim _pwm0 as Byte
Dim _pwm1 as Byte
Dim _pwm2 as Byte

_pwm_rb:

.... cuerpo de la subrutina

Return 'Terminación de la subrutina
'----------------------------------

Vamos por pasos:

¿Qué es mejor; el freno de tambor o los frenos de disco?
¿Qué es mejor, la frenada normal o con abs?

Lo mejor para ilustrar los casos anteriores no es buscar la diferencia, si no la igualdad, y es que en todos los casos frenas. Solo cuando buscas una frenada más corta es cuando se verifican las diferencias entre unos métodos y otros.

Pues lo mismo pasa con las interrupciones, si la rutina principal de tu programa no demanda controlar la función de los pwm por interrupciones, mejor sigues sin usar las interrupciones hasta que tengas la necesidad. Las interrupciones por si solas son complicadas así que te recomiendo que no te metas a mayores hasta tener claro el código actual. Más adelante tendrás tiempo de mejorar el código con interrupciones y con comunicación entre pic, ya tendrás tiempo de correr.

Hace más de 30 años que no se usa el comando goto en la programación del lenguaje Basic, fue sustituido por las subrutinas, concretando; por el gosub/return, y el siguiente paso son las funciones que sustituyen a las subrutinas.
Título: Re: Problemas para controlar led RGB con PWM
Publicado por: Bregy en 30 de Enero de 2013, 13:28:37
Hola de nuevo y gracias por toda la ayuda tengo una duda...

El codigo fue tomado de uno de los tutoriales de dogflu y lo intente modificar para un 16f877a...

Código: [Seleccionar]
Define CONF_WORD = 0x2f10
Define CLOCK_FREQUENCY = 4
'********************************** PIC Entrenadora BASIC (PicEBasic)******************************
'NOMBRE: 16F88_Pic_EBasic_Ejemplo_27
'MICRO: PIC16f877a
'FECHA/AUTOR: 08/07 - By COS
'Version: 1.0
'Estudio del modulo ADC
'xD Se lo robe a Dogflu66 y lo intente pasar a 16f887A
'*****************************************************************************************************
'Define SIMULATION_WAITMS_VALUE = 1  'suprime los tiempos de espera Waitms, solo para el simulador
'******************************************************************************************************
'_____Variables
Dim contenedor As Word  'contendra el valor de la entrada del ADC
'_____ASIGNACION DE I/O y valores de inicio de las salidas, configracion ADC

ADCON0 = %11000001
ADCON1 = %00001110

CMCON = 0x07  'comparador a off
TRISA = 0x00  'Puerto A como salidas
TRISB = 0x00  'puerto B como salidas
TRISA.0 = 1  'como entrada (RA0, adc)
TRISC = 0

'_____Main Programa
WaitMs 25
main:
ADCON0.GO = 1  'A/D conversion en progreso
While ADCON0.GO = 1  'pausa hasta terminar la conversion
Wend
contenedor.HB = ADRESH  'asignacion de valores, tiene la conversion a 8Bit
contenedor.LB = ADRESL  'asignacion de valores
'adc_4 y adc_4.LB no tendran valores utilies, solo el byte alto de adc_4

If contenedor.HB > 150 Then
PORTC.1 = 1
WaitMs 500
PORTC.1 = 0
Endif

Goto main
End                                 

No quiero que me den todo un nuevo codigo solo que me aclaren unas dudas como que entre que valores me va a arrojar el adc por que pongo 500 no me deja pongo 2000 tampoco me deja y mientras escribia esto me di cuenta de que creo que es por que la variable contenedor esta declarada como byte, pero igual solo diganme que esta mal...

El programa solo hace que cuando la lectura supere tal valor se encienda un led...

Les estoy muy agradecido por ayudarme mucho cada dia aprendo mas gracias a ustedes. :) :) :) :)
Título: Re: Problemas para controlar led RGB con PWM
Publicado por: dogflu66 en 30 de Enero de 2013, 20:03:26
Define CONF_WORD = 0x3f71
Define CLOCK_FREQUENCY = 4
'********************************** PIC Entrenadora BASIC (PicEBasic)******************************
'NOMBRE: 16F88_Pic_EBasic_Ejemplo_27
'MICRO: PIC16f877a
'FECHA/AUTOR: 08/07 - By COS
'Version: 1.0
'Estudio del modulo ADC
'xD Se lo robe a Dogflu66 y lo intente pasar a 16f887A
'*****************************************************************************************************
'Define SIMULATION_WAITMS_VALUE = 1  'suprime los tiempos de espera Waitms, solo para el simulador
'******************************************************************************************************
'_____Variables
Dim contenedor As Word  'contendra el valor de la entrada del ADC
'_____ASIGNACION DE I/O y valores de inicio de las salidas, configracion ADC
'ADCON1 = %00000111  'Puerto A como digital
'ADCON1 = %11000000  'Salida lectura 10Bit, F/64, Todo el puerto A analogico, Vdd, Vss
ADCON1 = %01000000  'Salida lectura 8Bit, F/64, todo el puerto A analogico, Vdd, Vss
ADCON0 = %10000001  'F/64, Modulo On, lectura en canal AN0 (Pin 2)

CMCON = 0x07  'comparador a off
TRISA = 0x00  'Puerto A como salidas
TRISB = 0x00  'puerto B como salidas
TRISC = 0  'Puerto C como salidas
TRISA.0 = 1  'como entrada (RA0, adc)

'_____Main Programa
WaitMs 20  'Espera que el modulo ADC se configure
main:
   ADCON0.GO = 1  'A/D conversion en progreso
   While ADCON0.GO = 1  'pausa hasta terminar la conversion
   Wend
   contenedor.HB = ADRESH  'asignacion de valores, tiene la conversion a 8Bit
   contenedor.LB = ADRESL  'asignacion de valores
   'adc_4 y adc_4.LB no tendran valores utilies, solo el byte alto de adc_4
   
   If contenedor.HB > 150 Then
      PORTC.1 = 1
      WaitMs 500
      PORTC.1 = 0
   Endif
   
Goto main
End


Corregido; en teoría tendría que funcionar en la realidad, no tengo para probarlo fisicamente.
Para trabajar con el simulador con el ADC estando la salida de su lectura configurada a 8bit tienes que realizar la siguiente conversión:
(150x1023)/255 = 602 puntos del potenciómetro del simulador. If contenedor.HB > 150 esto son aproximadamente 602 puntos en el simulador porque las escalas no son las mismas.
El simulador tendría que tener la posibilidad de cambiar la escala de la resolución de entrada y poder ponerla a 8bit, pero no tiene la opción.
Pero ten en cuenta que solo pasa en el simulador.
Título: Re: Problemas para controlar led RGB con PWM
Publicado por: Bregy en 30 de Enero de 2013, 23:26:46
Dogflu entonces mi código para 16f877a estaba bien por que lo acabo de probar y si funciona... :-/ :-/ :-/
Gracias por ayudarme...

Haber dime si esta bien mi razonamiento para convertir señales de micrófono a ADC:

Primero tendría que amplificar el micrófono hasta el voltaje de referencia osea 5v, verdad?
Luego tengo que hacer el programa como enantes y listo ya esta listo para ser usado en aplicaciones?

Si obvie un paso hasmelo saber...
Título: Re: Problemas para controlar led RGB con PWM y ahora también ADC
Publicado por: dogflu66 en 31 de Enero de 2013, 09:38:10
En teoria sí.

Si tienes algun problema pegunta en el foro tecnico a ver si alguien ha trabajado con acondicionador de señal de microfono a pic.
Título: Re: Problemas para controlar led RGB con PWM y ahora también ADC
Publicado por: Bregy en 01 de Febrero de 2013, 02:08:40
Amigos como puedo reducir este codigo?:
Código: [Seleccionar]
'===============================================================
'Codigo de ADC aplicado al pic 16f877a
'No tengo placa entrenadora solo mi proteus y mi protoboard
'No es codigo robado de nadie xD, por fin!
'===============================================================

'Defino parametros del microcontrolador
Define CONF_WORD = 0x3f71
Define CLOCK_FREQUENCY = 4

'Configuro puertos
TRISA = 0
TRISB = 0
TRISC = 0
TRISD = 0
ADCON1 = 0x0e

'Declaro una variable an0
Dim an0 As Word

'Programa:
'Analisa el valor del ADC
'Si cumple la condicion enciende un led
loop:
Adcin 0, an0
If an0 > 50 Then
RB0 = 1
Else
RB0 = 0
Endif
If an0 > 100 Then
RB1 = 1
Else
RB1 = 0
Endif
If an0 > 150 Then
RB2 = 1
Else
RB2 = 0
Endif
If an0 > 200 Then
RB3 = 1
Else
RB3 = 0
Endif
Goto loop
End                                               
Título: Re: Problemas para controlar led RGB con PWM y ahora también ADC
Publicado por: RockLee_89 en 01 de Febrero de 2013, 10:22:10
hola Bregy y cual es el motivo para reducir este codigo
saludos
Título: Re: Problemas para controlar led RGB con PWM y ahora también ADC
Publicado por: Bregy en 01 de Febrero de 2013, 11:59:27
Hola Ernestoes que yo creo que se puede recucir aun mas :D y si no es posible esta bien.