Curso de programación de PIC en PICBasic Pro

tienes razon ese pero he intentado hacerlo pero no encuentro la forma de como configurarlo bien tienes alguna idea de como hacerlo por favor gracias
 
tienes razon ese pero he intentado hacerlo pero no encuentro la forma de como configurarlo bien tienes alguna idea de como hacerlo por favor gracias

este ejemplo lo enconre en la red

define osc 4

DEFINE CCP1_REG PORTC '‘Hpwm 1 pin port
DEFINE CCP1_BIT 2 '‘Hpwm 1 pin bit
DEFINE CCP2_REG PORTC '‘Hpwm 2 pin port
DEFINE CCP2_BIT 1 '‘Hpwm 2 pin bit

DEFINE HPWM2_TIMER 1 '‘Hpwm 2 timer select

HPWM 1,127,1000 '‘ envie a 50% ciclo de trabajo PWM a 1kHz
 
este ejemplo lo enconre en la red

define osc 4

DEFINE CCP1_REG PORTC '‘Hpwm 1 pin port
DEFINE CCP1_BIT 2 '‘Hpwm 1 pin bit
DEFINE CCP2_REG PORTC '‘Hpwm 2 pin port
DEFINE CCP2_BIT 1 '‘Hpwm 2 pin bit

DEFINE HPWM2_TIMER 1 '‘Hpwm 2 timer select

HPWM 1,127,1000 '‘ envie a 50% ciclo de trabajo PWM a 1kHz

En este programa no se esta utilizando el CCP sino la instruccion de HPWM de pic basic para ello se tendra que utilizar el PR2 para establer el ciclo util por ejemplo:

Código:
PORTA=0:TRISA=%00000001
PORTB=0:TRISB=%00000000
PORTC=0:TRISC=%00000000
PORTD=0:TRISD=%00000000
ADCON1= %10001110 ‘
T2CON = %00000101
PR2=249
‘—————————————————————–
@ DEVICE PIC16F877A
@ DEVICE PIC16F877A, WDT_OFF
@ DEVICE PIC16F877A, PWRT_OFF
@ DEVICE PIC16F877A, PROTECT_OFF
@ DEVICE PIC16F877A, XT_OSC
‘—————————————————————–
DEFINE OSC 4


‘**************** ADC ************************
DEFINE ADC_BITS 10 ‘ 
DEFINE ADC_CLOCK 1 ‘ 
DEFINE ADC_SAMPLEUS 3 ‘ 

 
‘****************DEFINICION CCP*********************
DEFINE CCP1_REG   PORTC  ‘Hpwm 1 pin port
DEFINE CCP1_BIT     2 ‘Hpwm 1  pin bit
DEFINE CCP2_REG   PORTC  ‘Hpwm 2 pin port

DEFINE CCP2_BIT     1 ‘Hpwm 2 pin bit


 **********VARIABLES**********
HAM var word
X   VAR WORD
DUTY VAR BYTE
‘—————————————————————————

CCP1CON.2=1
CCP1CON.3=1

TIEMPO:
DUTY=50
GOSUB SALIDA

GOTO TIEMPO
SALIDA:
ADCIN 0,HAM
PR2=((1024-HAM)*/5625)/100+24

 X=(PR2+1)* DUTY /25
CCP1CON.4=X.0
CCP1CON.5=X.1
CCPR1L=x>>2
RETURN
 
autotronico
segun lo que lei en la red
HPWM 1,127, 1000
HPWM canal, dutycycle, frecuencia
el canal puede ser 1 o 2 segun el ccp que deseas utilizar
gracias por el codigo que publicaste...
 
muchas gracias amigo genial voy a intentarlo como dije quiero variar la velocidad de un servo trucado disculpen seria posible que me ayuden con un circuitito por favor se puede hacer con el L293D lo voy a compilar ahorita y prubare el funcionamiento con respecto a eso que dice arturouc es verdad he leido que es asi lo que no sabia es como usarlo y activarlo
 
Lo que pasa es que si desea utilizar este modulo por hardware se utilizan los resistros del mismo , los comandos de pic basic facilitan el codigo pero su desarrollo es por software, si deseas debatimos que tengo tiempo.
 
disculpen compile el programa en micro code y no me compila me imagino que pic basic es diferente la sentencia eso en ensamblador lo vi pero no lo entendi bien debemos de ley colocar como salidas estas del micro que estemos usando
 
Última edición:
autotronico
esto lo acabo de leer el dia de hoy, todavia no he probado el funcionamiento, lo que lei es que con esta instruccion HPWM trabaja el modulo del pic PWM mientras tu programa puede realizar otras tares..

tendras algun codigo de ejemplo sobre utilizar el timer1 en modo de captura?
asi podre leer el encoder del servo, conrolar su velocidad y realizar otras tareas

yo lo compile y todo bien 159 palabras usadas...

en el codigo de autotronico son los apostrofos '
 
Última edición:
disculpen compile el programa en micro code y no me compila me imagino que pic basic es diferente la sentencia eso en ensamblador lo vi pero no lo entendi bien debemos de ley colocar como salidas estas del micro que estemos usando

que error aparece

autotronico
esto lo acabo de leer el dia de hoy, todavia no he probado el funcionamiento, lo que lei es que con esta instruccion HPWM trabaja el modulo del pic PWM mientras tu programa puede realizar otras tares..

tendras algun codigo de ejemplo sobre utilizar el timer1 en modo de captura?
asi podre leer el encoder del servo, conrolar su velocidad y realizar otras tareas

yo lo compile y todo bien 159 palabras usadas...

en el codigo de autotronico son los apostrofos '

ya realizaremos el codigo
 
Última edición:
debes estarlo compilando en otro porque yo en microcode no lo he logrado hacer tienes mucha razon al contrario del PWM el HPWM se pude hacer otras tareas sin necesidad de ingresarla de nuevo es muy util si se desea hacer algo con el modulo

sale este miralo
 

Adjuntos

  • Dibujo.GIF
    Dibujo.GIF
    36.4 KB · Visitas: 87
Última edición:
quita los fuses es problema del @ device

Atricio aqui esta el codigo la simulacion y el .hex

Esta muy interesante lo que has publicado pero podrias poner con explicaciones y detalles cada linea de la programacion en codigo PBP, aparte que describas que significa eso de PR2 o CCP1 la verdad quiero aprender a manejar esos codigos pero ni idea de como se hace.:confused:
 
Principalmente estas lineas de código sirven para realizar proyectos con motores el amigo mecatrodatos menciono esto el control PID en algunas lineas de este post y coloco algunos circuitos pero no lo termino seria por tiempo...

¿Tendrás algún código de ejemplo sobre utilizar el timer1 en modo de captura?

Aquí esta el código para utilizar el timer 1 del pic 16f877A como contador o modulo de captura
Código:
CLEAR 
DEFINE OSC 4 
DEFINE LCD_DREG PORTD 
DEFINE LCD_RSREG PORTE 
DEFINE LCD_RSBIT 0 
DEFINE LCD_EREG PORTE 
DEFINE LCD_EBIT 1 
DEFINE LCD_RWREG PORTE 
DEFINE LCD_RWBIT 2 
DEFINE LCD_BITS 8 
DEFINE LCD_LINES 2 
DEFINE LCD_COMMANDUS 2000 
DEFINE LCD_DATAUS 50 

DEFINE CCP1 REG PORTC
DEFINE CCP1_BIT 2 

DEFINE ADC_BITS 8 
DEFINE ADC_CLOCK 3 
DEFINE ADC_SAMPLEUS 50 

ADCON1 = %00000111 
TMR1 VAR WORD 
ADVAL0 VAR BYTE 
ADVAL1 VAR BYTE

ADVAL2 VAR BYTE 
X VAR WORD  
Y VAR WORD  
PAUSE 500 
LCDOUT $FE, 1 

TRISC = %11110001 
CCP1CON = %00000101 
T1CON = %00000011 
PORTC.3 = 0 
PORTC.2 = 1

LOOP: 

ADCIN 0, ADVAL0 
ADCIN 1, ADVAL1 
ADCIN 3, ADVAL2 

IF ADVAL0>20 THEN 
HPWM 2, ADVAL0, 32000 
LCDOUT $FE, $C0, "PWM = ",DEC ADVAL0," " 
ELSE 
LCDOUT $FE, $C0, "PWM TOO LOW ",DEC ADVAL0," "
ENDIF

TMR1H = 0 
TMR1L = 0 
T1CON.0 = 1 
PAUSE 100

T1CON.0 = 0 
TMR1.BYTE0 = TMR1L 
TMR1.BYTE1 = TMR1H 
TMR1 = TMR1 - 11 
IF TMR1 = 65525 THEN NOSIGNAL 
LCDOUT $FE, $80, DEC5 TMR1," COUNTS" 

PAUSE 10 
GOTO LOOP 

NOSIGNAL: 
LCDOUT $FE, $80, "NO SIGNAL " 
GOTO LOOP 
END
 
Última edición por un moderador:
excelente!!!! autotronico
muchas gracias....lo voy a analizar para entenderlo

le faltara esto para el HPWM?
DEFINE CCP2 REG PORTC
DEFINE CCP2_BIT 1

pregunta
se esta utiizando el ccp1 para captura? RC2 deberia estar en 1
o la captura se hace en la patita RC0 timmer1 como lo necesito
estoy tratando de comprender...
 
Última edición:
USO TIMER1 como un contador

La operación de Timer1 como contador es similar a la operación de TIMER0.
Sin embargo, el Timer1 es un temporizador de 16 bits, puede ser manipulado y cuenta a mayor velocidad. También se puede control con rutinas TimerLoop y Blinker Loop si el programa está diseñado para hacerlo. Sin embargo, la puesta en marcha de Timer1 es más complicada debido a las opciones más numerosas disponibles.

Las diferencias entre el uso de los dos temporizadores tienen que ver con la configuración del control de registros. Timer1 es controlado por seis registros, en comparación con tres del TIMER0. Los registros del Timer1son los siguientes:

INTCON interrupción registro de control
PIR1 registro periférica de interrupción 1
PIE1 Habilita el registro de interrupción 1
TMR1L byte bajo del contador de registro
TMR1H byte alto del registro del temporizador
T1CON Timer1 control de la interrupción


EL Modo de contador se selecciona mediante el establecimiento del bit TMR1CS. En este modo, los incrementos del contador de tiempo en cada flanco ascendente se establecen en la entrada de reloj del pin RC1/T1OSI/CCP2 , cuando el bit T1OSCEN se establece, o en el pin RC0/T1OSO/T1CKI, cuando el T1OSCEN se borra.

Tres de los pines en el 16F877A se puede utilizar como insumos para el modulo TIMER1 como contador:

1. Pin PORTA.4, la entrada de reloj externo (pin 6 en el PIC)
2. Pin PORTC.0, seleccionados mediante el establecimiento de TIOSCEN = 1
3. Pin PORTC.1, seleccionados mediante el establecimiento de TIOSCEN = 0

EL Timer1 se habilita estableciendo T1CON.0 = 1. Se detiene cuando este Bit esta apagado o con discapacidad.

El reloj que usará Timer1 es seleccionado por T1CON.1. El reloj externo
seleccionados mediante el establecimiento de este a 1. La entrada para este reloj externo debe estar en PORTA.4.

En resumen, ocho bits del registro de control del Timer 1 (T1CON), proporciona las siguientes funciones :

􀁎 Bit 7: No se utiliza y que se lea como un 0
􀁎 Bit 6: No se utiliza y que se lea como un 0
􀁎 Bit 5: Entrada pre-escalador
􀁎 Bit 4: Entrada de pre-escalador
􀁎 Bit 3: oscilador permite Timer1
􀁎 Bit 2: sincronización de reloj externo Timer1
􀁎 Bit 1: Timer1 selección de reloj
􀁎 Bit 0: Timer1 permite

Si las interrupciones no se van a utilizar todos los demás registros se puede ignorar y podemos establecer:

T1CON a % 00110001

El valor de estos bits se describe en detalle en el código que poste anteriormente para el amigo arturoau.


En primer lugar vamos a definir todos los define que vamos a necesitar. Aquí todos los define se incluyen como ejemplo, pero no todos son necesarios.

Timer1 como contador. Timer1 cuenta las señales de un codificador del servomotor.

‘DEFINICIONES PARA EL FUNCIONAMIENTO DEL LCD

CLEAR
DEFINE OSC 4
DEFINE LCD_DREG PORTD
DEFINE LCD_RSREG PORTE
DEFINE LCD_RSBIT 0
DEFINE LCD_EREG PORTE
DEFINE LCD_EBIT 1
DEFINE LCD_RWREG PORTE
DEFINE LCD_RWBIT 2
DEFINE LCD_BITS 8
DEFINE LCD_LINES 2
DEFINE LCD_COMMANDUS 2000
DEFINE LCD_DATAUS 50

Las siguientes dos líneas definen el pin que se va a utilizar para la señal de HPWM que controlara la velocidad del motor.

DEFINE CCP1 REG PORTC ‘definir la configuración de HPWM
DEFINE CCP1_BIT 2 ‘pin C1

Las siguientes tres líneas definen la lectura de los tres potenciómetros en el tablero.

Sólo el potenciómetro primero se utiliza en el programa, pero los otros son definidos de forma que los puede utilizar cuando se modifica el programa. Los potenciómetros son para cambiar el tiempo real.

Definir los valores de A2D

DEFINE ADC_BITS 8; número determinado de bits en el resultado
DEFINE ADC_CLOCK 3; ajustar fuente de reloj interno (3 = rc)
DEFINE ADC_SAMPLEUS 50, el tiempo de muestreo establecidos en Us

A continuación, ponemos ADCON1 para que el MCU lo establezca como modo digital.

, Establecer el registro de control analógico a digital

ADCON1 =% 00000111; necesarios para el funcionamiento del LCD

, creamos las variables que van a necesitar

TMR1 VAR WORD; establecer la variable para el temporizador
ADVAL0 VAR BYTE, crear ADVAL para almacenar resultado
ADVAL1 VAR BYTE, crear ADVAL para almacenar resultado

ADVAL2 VAR BYTE, crear ADVAL para almacenar resultado
X VAR WORD; variable de repuesto para la experimentación
Y VAR WORD; variable de repuesto para la experimentación
PAUSA 500 ; pausa para la pantalla LCD para la puesta en marcha
LCDOUT $ FE, 1; pantalla clara y ubicación del cursor

, configurar el registro de E / S

TRISC =% 11110001; PORTC.0 va a ser la entrada
CCP1CON =% 00000101; capturar cada flanco de subida
T1CON =% 00000011; no pre-scale/osc / señal externa
; TMR1 en marcha el motor, utilizando un
; codificador para la entrada
PORTC.3 = 0; habilita el motor
PORTC.2 = 1, establecer el sentido de rotación

A continuación, vamos a entrar en el cuerpo del programa. El ciclo del programa comienza con la lectura de tres potenciómetros a pesar de que está utilizando sólo el primero para establecer el poder y por tanto la velocidad del motor.

LOOP:
ADCIN 0, ADVAL0; lea el canal 0 a ADVAL0
ADCIN 1, ADVAL1; leer el canal 1 a ADVAL1
ADCIN 3, ADVAL2; leer el canal 3 de ADVAL2

Si el ciclo de trabajo del motor es inferior a 20 sobre un total de 255, el motor se moverá, así que hacemos u alinea de código para eso y ver el estado en la pantalla LCD.

IF ADVAL0>20 THEN ;
HPWM 2, ADVAL0, 32000 ;
LCDOUT $FE, $C0, "PWM = ",DEC ADVAL0," " ;
ELSE ;
LCDOUT $FE, $C0, "PWM TOO LOW ",DEC ADVAL0," ";
ENDIF

Luego leemos los dos registros de contador de tiempo para ver cuantas cuentas pasaron.

Sin embargo, si usted tiene una entrada de conteo rápido, es posible que desee agregar esta información a la lectura


TMR1H = 0; claro Timer1 alta de 8 bits
TMR1L = 0; claro Timer1 baja de 8 bits
T1CON.0 = 1; iniciar el temporizador de 16 bits
PAUSA 100; captura de 100 m de la entrada
; Frecuencia de reloj

T1CON.0 = 0; parada de 16 bits del temporizador
TMR1.BYTE0 = TMR1L; lectura baja de 8 bits
TMR1.BYTE1 = TMR1H; lectura de alta de 8 bits
TMR1 = TMR1 - 11; Corrección de captura
SI = TMR1 = 65.525 THEN NOSIGNAL; ver el libro de PBP
; explicación.
LCDOUT $ FE, $ 80, DEC5 TMR1, "COUNTS", la frecuencia
; pantalla
PAUSA 10; lento
GOTO BUCLE; hacerlo de nuevo
;
NOSIGNAL:
LCDOUT $ FE, $ 80, "NO SIGNAL";
GOTO BUCLE;
END;

Nota: Con el programa comentado se puede desarrollar el circuito
 
Atrás
Arriba