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
'***********************************************************
'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
'***********************************************************
'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
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. :-/ :-/
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
'===============================================================
'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