Cuantos PWM en un Pic16Fxx puedo implementar?

Maco1717 dijo:
Hola mira esto:

http://ww1.microchip.com/downloads/en/AppNotes/01074A.pdf

no es en esamblador, esta en c pero para mi es mejor.
suerte

________________________________________________________
PWM Period = [(PR2) + 1] • 4 • TOSC • (TMR2 Prescale Value)

Basicamente lo que necesito es saber que valores debo cargar el los registros:
PR2=?
TMR2 Prescaler=?
TMR2 Proscaler=?
PWM Pperiodo

aunque me parese interesante como camviar de color un led.
 
Hola Yo tambien hice un programa en ccs para manejar leds Rrgb con el pic 16f877 saque señales pwm por los tres puertos de este pic por el portb,portc,portd, y me funciono perfectamente, el unico punto es que mientras vallas utilizando mas pines con señales pwm pierdes precision. pero con un oscilador de 20mhz no tuve problemas
 
Hola, escribo aqui por no abrir tema nuevo. A1q espero q alguien q pueda ayudarme lea esto. Estoy haciendo una lampara RGB con un programa q encontre por internet, q con algunas modificaciones conseguí hacer funcionar y la verdad q va perfectamente(los PWM son por software y sacados por el portB), solo que ahora qeria añadir un pulsador al circuito para que una vez lo pulse, se pare el color en el que este hasta nueva pulsacion. He estado probando con interrupciones, pero no consigo hacer q se pare en el color que esta, sino que me pone uno de los tres colores RGB y la verdad esq no se q hacer. Si quereis os puedo pasar el codigo para que alguien me diga como implementarlo o me aconseje un poco.

En fin, espero alguna respuesta. Muchas gracias de antemano.

Saludos a todos!
 
Luis Quintero dijo:
hola,yo hice lo mismo de controlar un led rgb por medio de pwm y lo hice con un pic 16f84a a 4 Mhz, de hecho hice una lampara para controlar la intensidad de 4 leds rgb usando 12 salidas de pwm,el hecho es que cada led lo controlo por el mismo ciclo y periodo,pero haciendo modificaciones se pueden manejar independientemente las 12 salidas,les pego el programa por si a alguien le sirve.

Código:
//proyec
#include <16f84a.h>
#fuses XT,NOWDT,NOPROTECT
#use delay(clock=4000000)
#define periodo 125      //125 * 80microS =~10mS
#define duty    125      //parte del periodo que encenderan las lamparas
#define Tiempo_int   30 //50 * 125 * 80microS =~500mS entre cambio y cambio de intensidad


int  c1=0;        //rojo
int  c2=0;        //azul
int  c3=0;        //verde
int i2;          //variable control de ciclo de retardo en intensidades
int i;           //variable que controla el ciclo del periodo del pwm  
int d = 0;   //control porta
int z = 0;   //control portb

                     





            




//////////////////////////////////////////////////////////////////////////////////////////////////
void tiempo()
              {
              delay_ms(4000);
              }
              //led1_portb_0
             
          
void  ciclo_PWM_10mS(){


                                  for (i=1;i<periodo; i++)   //control periodo
                                    {                                                
                                      
                                    if (i<=c1)           //control intensidad  rojo 
                                    {                    
                                     bit_set(z,0);       //led1_portb_0   //Led2=port_b_bits_543(var) 
                                     bit_set(z,3);       //led2_portb_3  //Led3=port_a&portb_bits_a&1_(v)b&76(ar)
                                     bit_set(z,6);       //led3_portb_6    //Led4=port_a_bits_320(var)
                                     bit_set(d,0);       //led4_porta_0
                                    }
                                    else
                                    {
                                    bit_clear(z,0);      //led1_portb_0
                                    bit_clear(z,3);      //led2_portb_3  
                                    bit_clear(z,6);      //led3_portb_6
                                    bit_clear(d,0);      //led4_porta_0
                                    }
                                 
                                    if (i<=c2)           //control intensidad azul
                                    {
                                    bit_set(z,1);       //led1_portb_1     
                                    bit_set(z,4);       //led2_portb_4 
                                    bit_set(z,7);       //led3_portb_7       
                                    bit_set(d,2);       //led4_porta_2
                                    }
                                    else
                                    {
                                    bit_clear(z,1);    //led1_portb_1 
                                    bit_clear(z,4);   //led2_portb_4
                                    bit_clear(z,7);   //led3_portb_7
                                    bit_clear(d,2);   //led4_porta_2
                                    }
                                 
                                    if (i<=c3)           //control intensidad verde
                                    {
                                    bit_set(z,2);        //led1_portb_2    
                                    bit_set(z,5);        //led2_portb_5
                                    bit_set(d,1);        //led3_porta_1 
                                    bit_set(d,3);        //led4_porta_3
                                    }
                                    else
                                    {
                                    bit_clear(z,2);     //led1_portb_2  
                                    bit_clear(z,5);     //led2_portb_5 
                                    bit_clear(d,1);     //led3_porta_1 
                                    bit_clear(d,3);     //led4_porta_3
                                    }
                                    output_b(z);
                                    output_a(d);
                                 
                                   }
                                    delay_us(40);                                  
                                                              
                                                       
                                 }

/////////////////////////////////////////////////////////////////////////////////////////////////////

void  tonos_mas(){                                  
                 
                         
                           for (c1=1,c2=1,c3=0; c1<duty ; c1++,c2++) //;control de tono magenta
                           {
                              
                               for (i2=1; i2<Tiempo_int; i2++)      //;espera entre incrementos de intensidad                              
                              ciclo_PWM_10mS()  ;                                                
                              
                       }
               }
                  
            


void  tonos_2_mas(){
                                          

                 for (c3=1,c1=1,c2=0; c3<duty; c3++,c1++)         //;control de tono amarillo
                 {       
                 
                           for (i2=1; i2<Tiempo_int; i2++)      //;espera entre incrementos de intensidad
                              
                              ciclo_PWM_10mS()  ;                                                        
                              
                          
                  }
                  
               }   



void  tonos_3_mas(){
                                          

                 for (c3=1,c1=0,c2=1; c3<duty; c3++,c2++)         //;control de tono cyan
                 {       
                 
                           for (i2=1; i2<Tiempo_int; i2++)      //;espera entre incrementos de intensidad
                              
                              ciclo_PWM_10mS()  ;                                                        
                              
                          
                  }
                  
               }   



void  tonos_menos(){                                  
                 
                         
                           for (c1=duty,c2=duty,c3=0; c1>1 ; c1--,c2--) //;control de tono magenta
                           {
                              
                               for (i2=1; i2<Tiempo_int; i2++)      //;espera entre incrementos de intensidad
                              
                              ciclo_PWM_10mS()  ;                                                
                              
                       }
               }




void  tonos_2_menos(){                                  
                 
                         
                           for (c1=duty,c2=0,c3=duty; c1>1 ; c1--,c3--) //;control de tono amarillo
                           {
                              
                               for (i2=1; i2<Tiempo_int; i2++)      //;espera entre incrementos de intensidad
                              
                              ciclo_PWM_10mS()  ;                                                
                              
                       }
               } 
                                   
            
void  tonos_3_menos(){
                                          

                 for (c3=duty,c1=0,c2=duty; c3>1; c3--,c2--)         //;control de tono cyan
                 {       
                 
                           for (i2=1; i2<Tiempo_int; i2++)      //;espera entre incrementos de intensidad
                              
                              ciclo_PWM_10mS()  ;                                                        
                              
                          
                  }
                  
               }          
            
            




void negro()                //color negro                                      
               {
                z=0;
                d=0;
                output_b(z);
                output_a(d);
                tiempo();
                }


void blanco()             //color blanco
                {
                     
                           
                     z=d=255;
                     output_b(z);
                     output_a(d);
                     tiempo();
                     z=d=0;
                     output_b(z);
                     output_a(d);
                     
                        
                }
                
                
                                                            
                                                            
                
                                                         //b%76543210  //b%76543210
                                                         //B%arvarvar  //A%xxxxvavr                
  void rojo()                     //color rojo           //b%01001001  //a%xxxx0001
                {
                 
                   
                  output_b(0x49);         
                  output_a(0x01);
                  tiempo();
                  z=d=0;
                  output_b(z);
                  output_a(d);
                                              
                }              
                
 void   verde()        //color verde                           
                                                         //b%76543210  //b%76543210
                                                         //B%arvarvar  //A%xxxxvavr    
                                                         //B%00100100  //A%xxxx1010
               {
                  output_b(0x24);        
                  output_a(0x0a);
                  tiempo();
                  z=d=0;
                  output_b(z);
                  output_a(d);
               }
                
void   azul()             //color azul


                                                            
                                                         //b%76543210  //b%76543210
                                                         //B%arvarvar  //A%xxxxvavr    
                                                         //B%10010010  //A%xxxx0100               
                {
                  output_b(0x92);         
                  output_a(0x04);
                  tiempo();
                  z=d=0;
                  output_b(z);
                  output_a(d);
               }


void  amarillo()         //color amarillo

                                                         //b%76543210  //b%76543210
                                                         //B%arvarvar  //A%xxxxvavr    
                                                         //B%01101101  //A%xxxx1011     


                  {
                  output_b(0x6d);         
                  output_a(0x0b);
                  tiempo();
                  z=d=0;
                  output_b(z);
                  output_a(d);
                  }
                  
void  cyan()         //color cyan
                                              //b%76543210  //b%76543210
                                              //B%arvarvar  //A%xxxxvavr    
                                              //B%10110110  //A%xxxx1110     



                  {
                  output_b(0xb6);         
                  output_a(0x0e);
                  tiempo();
                  z=d=0;
                  output_b(z);
                  output_a(d);
                  }              
                  
 void  magenta()         //color magenta
 
                                  
                                              //b%76543210  //b%76543210
                                              //B%arvarvar  //A%xxxxvavr    
                                              //B%11011011  //A%xxxx0101     
                  {
                  output_b(0xdb);         
                  output_a(0x05);
                  tiempo();
                  z=d=0;
                  output_b(z);
                  output_a(d);
                  }                               
                  
///////////////////////////////////////////////////////////////////////////////////////////////////////////






 int  main ()
           
                    {                          //salida al puerto b=0
         
                  while (true)
                           {
                           
                           
                         //   negro();                 //(0, 0, 0) es negro
                            blanco();                //(255, 255, 255) es blanco  
                            rojo();                  //(255, 0, 0) es rojo
                            tonos_mas();
                            tonos_menos();
                            verde();                 //(0, 255, 0) es verde
                            tonos_2_mas(); 
                            tonos_2_menos(); 
                            azul();    
                            tonos_3_mas();
                            tonos_3_menos();
                            amarillo();            //(255, 255, 0) es amarillo
                            cyan();                //(0, 255, 255) es cyan
                            magenta();             //(255, 0, 255) es magenta
                           
                            
                           
                            z=d=0;
                            output_b(z);
                            output_a(d);
                           }
                              return(0);
                           
                   }
saludos.

perdon por mi ignorancia, soy nuevo en esto de los pics y ando de autodidacta... por que medio controlas los leds RGB es decir, como introduces los valores para obtener un resultado en tus leds?

muchas gracias de antemano, si alguien me contesta
 
¿Alguien me puede dar una opcion para que al pulsar un boton (pulsador) el cambio de colores q estaba haciendo automatico, se pare y se quede en el color que estuviera en el momento de pulsarlo? Os puedo pasar el codifo .asm que estoy utilizando por si os sirve de referencia, pero esq como yo lo tengo ya he probado con interrupciones y no funciona, solo se me para en el verde, el rojo o el azul, no en el color del momento de pulsar.

Saludos!
 
Sería bueno tener el diseño del circuito usado para el software que vemos aquí...... en un principio utilice el PIC en su puertoB = 0,1,2 con sus respectivas resistencias limitadoras... la conexion a VSS & VDD... pero no funcionó....

En tu software seria bueno anexar (aunque no es mandatorio..) la linea correspondiente al "bit configuration".... yo usé la siguiente configuración..:

__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _INTRC_OSC_NOCLKOUT



Saludos..!

Mejor utiliza un pic de bajo coste como un pic16f628, tengo un programa que puede manejar tres pwm, sin utilizar ninguno de los que trae por hardware. Con esto te quiero decir, que puedes tener mas de 10 PWM independientes. Todo por Software. Lo que haace este circiuto, es un juego de tres luces que encienden gradualmente una despues de otra.

Código:
;***********************************
;	         Hurive Sis	               
;      
;      
;	  Juego de 3 Luces por PWM       
;							
;Salida leds:Rb0,Rb1,Rb2		
;	   Oscilador Interno del Pic	
;Visitar la pagina electronica para
;lo relacionado con este circuito	                
;									                                                
;	Compilado en MPLAB IDE v7.31	
;	Mexico DF. Octubre del 2006	
;***********************************  
LIST P=16C628A
#INCLUDE <P16F628A.INC>	

PH0		EQU		0X20 ;aqui va el numero de intensidad del PWM1
PH1		EQU		0X21 ;aqui va el numero de intensidad del PWM2
PH2		EQU		0X22 ;aqui va el numero de intensidad del PWM3

CONT		EQU		0X23
CONT2		EQU		0X24

C21		EQU		0X25 ;registros para retardos
C22		EQU		0X26
C23		EQU		0X27


#DEFINE		TIEMPO2A 	0XFF ;TIEMPOS PARA RETARDO 2
#DEFINE		TIEMPO2B	0XFF
#DEFINE		TIEMPO2C	0X7F

#DEFINE		PMW0	PORTB,0
#DEFINE		PMW1	PORTB,1
#DEFINE		PMW2	PORTB,2

		ORG	0X00

		MOVLW	0X00
		MOVLW	0X07
		MOVWF	CMCON
		BSF	STATUS,5
		CLRF	TRISA
		CLRF	TRISB
		BCF	STATUS,5
		CLRF	CONT2
		CLRF	PORTB

;*****	PROGRAMA MAIN	********
MAIN		CALL	RETARDO
		MOVLW	0XFF
		MOVWF	PH2
		CLRF	PH0
		CLRF	PH1

MAIN1		CALL	F13  ;Prende gradualmente PWM1, almismo tiempo
		INCF	PH0  ; que apaga PWM3
		BSF	PMW0
		DECFSZ	PH2
		GOTO 	MAIN1
		CALL 	RETARDO

MAIN2		CALL	F12
		INCF	PH1
		BSF	PMW1
		DECFSZ	PH0
		GOTO	MAIN2
		CALL	 RETARDO

MAIN3		CALL	F23
		INCF	PH2
		BSF	PMW2
		DECFSZ	PH1
		GOTO	MAIN3
		CALL	MAIN

;*****	RETARDO	******

RETARDO		MOVLW	TIEMPO2A
			MOVWF	C23
CICLO23		MOVLW 	TIEMPO2B
			MOVWF	C22
CICLO22		MOVLW	TIEMPO2C
			MOVWF	C21
CICLO21		DECFSZ	C21
			GOTO	CICLO21
			DECFSZ	C22
			GOTO	CICLO22
			DECFSZ	C23
			GOTO 	CICLO23
			RETLW	0

;*****	SUBRUTINAS	******
F13		MOVLW	0X00
		MOVWF	CONT
		BSF		PMW0
		BSF		PMW2
UNO		MOVF	CONT,W
		SUBWF	PH0,W
		BTFSS	STATUS,0
		BCF		PMW0
		MOVF	CONT,W
		SUBWF	PH2,W
		BTFSS	STATUS,0
		BCF		PMW2
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP

		INCF	CONT
		MOVF	CONT,W
		XORLW	0XFF
		BTFSS	STATUS,2
		GOTO	UNO
		RETLW	0

F12		MOVLW	0X00
		MOVWF	CONT
		BSF		PMW0
		BSF		PMW1
DOS		MOVF	CONT,W
		SUBWF	PH0,W
		BTFSS	STATUS,0
		BCF		PMW0
		MOVF	CONT,W
		SUBWF	PH1,W
		BTFSS	STATUS,0
		BCF		PMW1
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP

		INCF	CONT
		MOVF	CONT,W
		XORLW	0XFF
		BTFSS	STATUS,2
		GOTO	DOS
		RETLW	0

F23		MOVLW	0X00
		MOVWF	CONT
		BSF		PMW1
		BSF		PMW2
TRES	MOVF	CONT,W
		SUBWF	PH1,W
		BTFSS	STATUS,0
		BCF		PMW1
		MOVF	CONT,W
		SUBWF	PH2,W
		BTFSS	STATUS,0
		BCF		PMW2
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP

		INCF	CONT
		MOVF	CONT,W
		XORLW	0XFF
		BTFSS	STATUS,2
		GOTO	TRES
		RETLW	0

		END

Saludos de Hurive Radik Zidaemon Uribe
 
Atrás
Arriba