Curso de programación de PIC en PICBasic Pro

Nano, mirá...aca te subo la simu completa con todos los archivos... En la simulacion, tenes 3 capturas del osciloscopio... fijate que la señal o canal amarillo, es la señal analogica entrante... la del medio convertida y la ultima, la salida del DAC...
Ver el archivo adjunto 114257
En un rato vuelvo con lo que me comento reymi alguna ves para complementar el mensaje y el tema

edit: acá subo parte de lo que alguna ves hablamos con Reimy sobre este proyecto

Bastante interesante lo que has hecho :aplauso: muchas gracias por el aporte amigo, investigando un poco tambien, ya que me gusta la programacion en Arduino, mira lo que consegui.

 
Hola a todos!!!...En este tutorial de proton post#28
el compañero byker2k3 escribio lo siguiente:

"pedasito de codigo que use para generar una portadora de 38Khz 50% Duty con un PIC12f683"

TRISIO.2 = 0 ' CCP1 (GPIO.2 = Output)
PR2 = 25 ' Set PWM Period for approx 38KHz
CCPR1L = 13 ' Set PWM Duty-Cycle to 50%
CCP1CON = %00001100 ' Mode select = PWM
T2CON = %00000100 ' Timer2 ON + 1:1 prescfale

Yo utilizare el clasico PIC16F628A...

Ok...Mi duda es la siguiente: He observado en otros posts que al hacer esta practica activan dos pines uno para SALIDA PWM que en este caso seria (GPIO.2=Out) y otro pin cualquiera para habilitar los pulsos del Led Infrarrojo o Modulacion del Led Infrarrojo es cierto esto?
Alguien que haya trabajado con leds infrarrojos me puede corrobar esto por favor
Si es cierto esto entonces tengo que puentear el Led Infrarrojo con el otro pin que yo habilite claro con su respectiva resistencia?
Entonces si habilito el otro pin donde voy a conectar el otro extremo tengo que manejarlo en estado logico 1 y estado logico 0? es correcto? o estoy errando haber si alguien me puede sacar de estas dudas Gracias...
 
cosmico74 dijo:
Yo utilizaré el clásico PIC16F628A...

Ok. Mi duda es la siguiente: He observado en otros posts que al hacer esta practica activan dos pines uno para SALIDA PWM que en este caso seria (GPIO.2=Out) y otro pin cualquiera para habilitar los pulsos del Led Infrarrojo o Modulación del Led Infrarrojo es cierto esto?
Alguien que haya trabajado con leds infrarrojos me puede corroborar esto por favor
Si es cierto esto entonces tengo que puentear el Led Infrarrojo con el otro pin que yo habilite claro con su respectiva resistencia?
Entonces, si habilito el otro pin ¿dónde voy a conectar el otro extremo tengo que manejarlo en estado lógico 1 y estado lógico 0? ¿Es correcto o estoy errando?
A ver si alguien me puede sacar de estas dudas.
Gracias.
El PIC16F628A no tiene puerto GPIO, el pin de salida HPWM es por el pin 9 (RB3 o PORTB.3)

Y sip, puedes usar el pin de salida de PWM para controlar la base de un transistor NPN, con el pin de salida de pulsos controlas el emisor y colocas los LED's en colector.

Así lo he hecho yo enviando comandos RS-232 sobre una portadora de 38KHz.

Y para que este método funcione se tienen que enviar los datos invertidos.

Suerte.
 
Gracias DarkBytes por contestar tan rapido bueno en si lo que quiero hacer es mandar datos,info,etc. de un pic a otro pic via Infrarrojos con Serout,Serin.,etc.,utilizando logicamente PicBasicPro(PBP) y bueno pues...tocaste mi gran duda dices que:

"EL pin de salida HPWM es por el pin 9 (RB3 o PORTB.3)
Y sip, puedes usar el pin de salida de PWM para controlar la base de un transistor NPN,
con el pin de salida de pulsos controlas el emisor y colocas los LED's en colector.
Así lo he hecho yo enviando comandos RS-232 sobre una portadora de 38KHz.
Y para que este método funcione se tienen que enviar los datos invertidos."

1.-Cuando dices que con el pin de salida controle los pulsos del emisor,¿como lo interpreto o como lo manejo?
puede ser cualquier pin?,¿que se supone que debe de hacer este pin de salida o que estados debe de tomar?esa es mi duda haber si me la puedes resolver.

2.-Y dices para que este método funcione se tienen que enviar los datos invertidos.
osea puedo utilizar el sig.circuito en el lado del Receptor:









DarkBytes haber si pudieras subir un ejemplito o un extracto de programa de la pregunta numero 1 donde manipulas el pin pwm y el pin de pulsos para el control del Led_IR.Gracias...
 

Adjuntos

  • 2fig8.gif
    2fig8.gif
    2.9 KB · Visitas: 23
Gracias D@rkbytes por contestar tan rápido.
Bueno, en sí, lo que quiero hacer es mandar datos, info, etc. de un pic a otro pic via Infrarrojos con Serout, Serin., etc. utilizando lógicamente PicBasic Pro (PBP) y bueno pues, tocaste mi gran duda, dices qué:

1.-Cuando dices que con el pin de salida controle los pulsos del emisor.
¿Cómo lo interpreto o cómo lo manejo?
¿Puede ser cualquier pin? ¿Qué se supone que debe de hacer este pin de salida o que estados debe de tomar?
Esa es mi duda, a ver si me la puedes resolver.

2.-Y dices para que este método funcione se tienen que enviar los datos invertidos.
O sea, ¿puedo utilizar el siguiente circuito en el lado del receptor?

D@rkbytes, a ver si pudieras subir un ejemplito o un extracto de programa de la pregunta numero 1 dónde manipulas el pin PWM y el pin de pulsos para el control del LED IR.
Gracias.
Respuesta a pregunta 1:
Si puedes utilizar cualquier pin que sea salida para controlar al emisor del transistor.
Y esto es posible ya que se puede generar RS-232 por software.
Este pin será la salida de datos RS-232 que controlará al emisor con pulsos negativos.
Como se debe usar PWM por hardware para generar la portadora, el pin de salida es por RB3 (CCP1)
Esta señal de 38KHz. se ingresa a la base del transistor y será la que porte la información.

Respuesta a pregunta 2:
Sip, esa es la configuración, pero se realiza la modulación por el emisor.
Y he aquí un dato curioso:
Cuando yo realicé ese proyecto con RS232 por infrarojo, lo hice en C.
Al hacer el ejemplo en PBP la cosa cambió, ya no fue necesario invertir la transmisión.

Aquí está el ejemplo, no tiene mucho alcance y posiblemente exista un mejor método.
En realidad yo únicamente necesitaba una comunicación de pocos centímetros, pero te dará una idea.

Nota:
El post fue movido aquí, ya que mencionas que usarás PICBasic Pro y estaba en un tema de Proton IDE.

Suerte.
 

Adjuntos

  • 16F628A Comandos RS-232 por IR.rar
    135.7 KB · Visitas: 92
Última edición:
Respuesta a pregunta 1:
Si puedes utilizar cualquier pin que sea salida para controlar al emisor del transistor.
Y esto es posible ya que se puede generar RS-232 por software.
Este pin será la salida de datos RS-232 que controlará al emisor con pulsos negativos.
Como se debe usar PWM por hardware para generar la portadora, el pin de salida es por RB3 (CCP1)
Esta señal de 38KHz. se ingresa a la base del transistor y será la que porte la información.

Respuesta a pregunta 2:
Sip, esa es la configuración, pero se realiza la modulación por el emisor.
Y he aquí un dato curioso:
Cuando yo realicé ese proyecto con RS232 por infrarojo, lo hice en C.
Al hacer el ejemplo en PBP la cosa cambió, ya no fue necesario invertir la transmisión.

Aquí está el ejemplo, no tiene mucho alcance y posiblemente exista un mejor método.
En realidad yo únicamente necesitaba una comunicación de pocos centímetros, pero te dará una idea.

Nota:
El post fue movido aquí, ya que mencionas que usarás PICBasic Pro y estaba en un tema de Proton IDE.

Suerte.

Hola viejo D@rkbytes estuve viendo tu trabajo y lo veo super pero hay algunas cosas que no entiendo y me gustaría sí es posible que nos expliques pues creo que no soy el único que tendrá estas dudas:
1º como sabes en estas lineas que comando usar?:
SerOut PORTB.2,T9600,["$"] ; Se envía el comando $ en modo invertido
SerOut PORTB.2,T9600,["#"] ; Se envía el comando # en modo invertido

2º ahora sí quisiera hacer otras funciones se pueden usar otros comandos? digamos así?
SerOut PORTB.2,T9600,["G"] ; Se envía el comando G en modo invertido

3º como sabes que el comando va invertido?

te agradezco mucho tu aporte(y) y me perdonas la molestadera:oops:
 
Última edición:
Hola viejo, D@rkbytes. Estuve viendo tu trabajo y lo veo súper, pero hay algunas cosas que no entiendo y me gustaría sí es posible que nos expliques, pues creo que no soy el único que tendrá estas dudas:
1º ¿Cómo sabes en estas líneas qué comando usar?:
SerOut PORTB.2,T9600,["$"] ; Se envía el comando $ en modo invertido
SerOut PORTB.2,T9600,["#"] ; Se envía el comando # en modo invertido

2º Ahora sí quisiera hacer otras funciones, ¿se pueden usar otros comandos? digamos así.
SerOut PORTB.2,T9600,["G"] ; Se envía el comando G en modo invertido

3º ¿Cómo sabes que el comando va invertido?
Los comandos pueden ser los que quieras, alfanuméricos o cadenas, para enviar y leer cadenas se usan otras instrucciones.
Ya en el receptor, tan sólo debes esperar los comandos que utilizaste.

Los modos de transmisión están en la ayuda de PBP, tan sólo sitúa el cursor sobre la instrucción de la cual tengas dudas y presiona la tecla F1.
Al hacer eso, aparece la ayuda sobre dicha instrucción con los parámetros requeridos y algún ejemplo.

Modos de transmisión para SerIn y SerOut
Modos de transmisión.jpg
Para usar estos modos se debe incluir el archivo MODEDEFS.BAS
Si no se incluye este archivo, se debe usar su valor numérico. (0 a 15)
Nota:
T9600 equivale a una transmisión a 9600 Bps. en modo normal, pero como estuve haciendo pruebas, olvidé modificar el comentario.
 
Los comandos pueden ser los que quieras, alfanuméricos o cadenas, para enviar y leer cadenas se usan otras instrucciones.
Ya en el receptor, tan sólo debes esperar los comandos que utilizaste.

Los modos de transmisión están en la ayuda de PBP, tan sólo sitúa el cursor sobre la instrucción de la cual tengas dudas y presiona la tecla F1.
Al hacer eso, aparece la ayuda sobre dicha instrucción con los parámetros requeridos y algún ejemplo.

Modos de transmisión para SerIn y SerOut
Ver el archivo adjunto 116134
Para usar estos modos se debe incluir el archivo MODEDEFS.BAS
Si no se incluye este archivo, se debe usar su valor numérico. (0 a 15)
Nota:
T9600 equivale a una transmisión a 9600 Bps. en modo normal, pero como estuve haciendo pruebas, olvidé modificar el comentario.

Que tal amigo, vengo realizando un pequeño proyecto con un sensor PIR, que es lo que hace esto, cuando el PIR cambie su estado logico a 1, osea detecta presencia (si se lo puede llamar asi), este manda una alerta vía RS232 (sin driver) a la pc. Se utliza un comando para activar la seguridad y otro comando para desactivar. La gran pregunta es: la alerta me llega a la pc via hyperterminal (el de microcode), todo bien, pero cuando conecto este circuito a un modem GSM para que me mande por SMS la misma alerta, lo hace pero observo que cada vez que yo mando o recibo un comando serialmente al y desde el modem GSM este hace cambiar el estado de o a 1L al PIR, no se si sea por el pic que estoy usando (18F2550), llevo varias semanas inestigando, leyendo la hoja de datos pero no resuelvo este problema, Por favor ayudame compartiendo algun conocimiento que tengas.

saludos
 
la alerta me llega a la pc via hyperterminal (el de microcode), todo bien, pero cuando conecto este circuito a un modem GSM para que me mande por SMS la misma alerta, lo hace, pero observo que cada vez que yo mando o recibo un comando serialmente al y desde el modem GSM, este hace cambiar el estado de o a 1L al PIR, no se si sea por el pic que estoy usando (18F2550), llevo varias semanas investigando, leyendo la hoja de datos pero no resuelvo este problema. Por favor ayúdame compartiendo algún conocimiento que tengas.
Posiblemente tengas que hacer uso de un filtro más estricto para la recepción de datos.
Revisar que otra parte del código no esté interfiriendo con la rutina de alerta.
Tal vez tengas poco filtraje en el circuito y aparte colocar capacitores de 100nF en los pines de alimentación del PIC. Etc.

Sin código es muy difícil poder saber porque está ocurriendo eso.
 
lo hace pero observo que cada vez que yo mando o recibo un comando serialmente al y desde el modem GSM este hace cambiar el estado de o a 1L al PIR,

hay algo raro en lo que dices, donde esta conectado el PIR supongo es de entrada, si esta en modo de entrada no le puede cambiar el estado a menos que lo cambies con alguna instruccion por salida.
 
Última edición:
hay algo raro en lo que dices, donde esta conectado el PIR supongo es de entrada, si esta en modo de entrada no le puede cambiar el estado a menos que lo cambies con alguna instrucción por salida.
Me supongo que a lo que se refiere que cambia de estado, es la salida del sensor PIR.

Ese que muestro en la imagen lo usé hace muchos años y recuerdo que tuve que hacer una cadena de amplificación con filtros para hacerlo funcionar correctamente.
 

Adjuntos

  • DSC00079.JPG
    DSC00079.JPG
    108 KB · Visitas: 24
Me supongo que a lo que se refiere que cambia de estado, es la salida del sensor PIR.

exacto Dark, ahi es lo que se me hace raro, venden modulitos ya con los amplificadores que envian un solo pulso (creo que 1, 2 seg o hasta 20min de pulso) al detectar a alguien, pero nada que ver con que el pic le cambie el estado.

estaria bien que aclarara de que PIR habla, y como es que esta amplificando y acoplando al PIC, si no es un modulo.
 
Última edición:
Posiblemente tengas que hacer uso de un filtro más estricto para la recepción de datos.
Revisar que otra parte del código no esté interfiriendo con la rutina de alerta.
Tal vez tengas poco filtraje en el circuito y aparte colocar capacitores de 100nF en los pines de alimentación del PIC. Etc.

Sin código es muy difícil poder saber porque está ocurriendo eso.

Agradezco mucho tu pronta respuesta, te comento que logré solucionarlo, aqui la aclaración: Al tratarse de un modem que utiliza la tecnología GSM, esta emite y recibe ondas electromagneticas que cuando están cerca en mi caso del sensor PIR, provocaban una interferencia al parecer debido al ruido que estas emanan y hacía que el PIR tenga una lectura erronea, al alejar el modem de este sensor se solucionó el problema.

saludos
 
corrijanme si me estoy equivocando.... pero me parece que estoy metiendo la pata en ADCON1... ¿puede ser?
ya llegue a una altura que me estoy mareando y seguro que es algun bit mal configurado...estoy tratando de leer una tension y corriente en el pic16F877A con PORTA.0 y PORTA.1... se me ocurrio probarlo en proteus antes de grabar el micro y... me sale el error que el puertoa.1 no esta configurado, y directamente no me lee y arroja ningun resultado en el display...quizas ustedes vean lo que se me chispoteo...asi lo configure:
Código:
DEFINE OSC 4

@ DEVICE pic16F877A
@ DEVICE pic16F877A, WDT_off
@ DEVICE pic16F877A, PWRT_ON
@ DEVICE pic16F877A, PROTECT_OFF
@ DEVICE pic16F877A, XT_OSC

;ADCON0=%10001110 
ADCON1=%10000010
TRISA=%11111111              
TRISB=%11111111
TRISC=%00000000
TRISD=%00000000
       
OPTION_REG=%10000010        
INTCON=%10100001           
TMR0=0 
T2CON = %00000110
PR2=124     

DEFINE CCP1_REG   PORTC 
DEFINE CCP1_BIT   2

DEFINE    ADC_BITS    10      
DEFINE    ADC_CLOCK    3      
DEFINE    ADC_SAMPLEUS 50

Chas gracias :)
 
saludos.

Estoy realizando un contador ascendente descendente, que puede que sea un tema demasiado gastado, pero es mi proyecto final de materia en la universidad, esto es lo que salio.

A la hora de comenzar a descontar pues no lo hace de la forma como debería, haber si alguien me pudiera ayudar a identificar mi error, se lo agradecería mucho.
 

Adjuntos

  • contador up-down.rar
    21.9 KB · Visitas: 56
ononononono...para para... acá hay algo raro... si saco la parte del pwm por hardware (interrupciones y demases), funciona el voltimetro y amperimetro...

Ver el archivo adjunto 116916

mirá, este es el programa:

Código:
'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2014 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 03/09/2014                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************

DEFINE OSC 4

@ DEVICE pic16F877A
@ DEVICE pic16F877A, WDT_off
@ DEVICE pic16F877A, PWRT_ON
@ DEVICE pic16F877A, PROTECT_OFF
@ DEVICE pic16F877A, XT_OSC

ADCON1=%10000010
TRISA=%11111111              
TRISB=%11111111
TRISC=%00000000
TRISD=%00000000
       
OPTION_REG=%10000010        
INTCON=%10100001           
TMR0=0 
T2CON = %00000110
PR2=124     
cmcon=6

DEFINE LCD_DREG      PORTD    
DEFINE LCD_DBIT      4        
DEFINE LCD_RSREG  PORTD    
DEFINE LCD_RSBIT  2    
DEFINE LCD_EREG      PORTD    
DEFINE LCD_EBIT   3        
DEFINE LCD_BITS      4    
DEFINE LCD_LINES  4

DEFINE CCP1_REG   PORTC 
DEFINE CCP1_BIT   2

DEFINE    ADC_BITS    10        
DEFINE    ADC_CLOCK    3        
DEFINE    ADC_SAMPLEUS 50        

SYMBOL SUMAR_DUTY  = PORTB.0
SYMBOL RESTAR_DUTY = PORTB.1 
SYMBOL FREC_SUBIR  = PORTB.2   
SYMBOL FREC_BAJAR  = PORTB.3   
SYMBOL TIPO_CELDA  = PORTB.4
SYMBOL PARAR       = PORTB.5
SYMBOL MOD_SUBIR   = PORTB.6
SYMBOL MOD_BAJAR   = PORTB.7

CAMBIO_CELDA  VAR PORTC.3
LED1  VAR PORTC.1
LED2  VAR PORTC.0

MODS     VAR BIT
T_SALIDA_C      VAR BIT
VOLT     VAR  WORD
HAM      VAR  WORD
HVD      var  word
AMPER    var  word
MV       VAR  BYTE
MA       VAR BYTE
U        VAR BYTE
W        VAR BYTE
ADR      VAR BYTE
CONTADOR VAR BYTE
DUTY     VAR BYTE
I        VAR WORD
HAM_DUTY VAR WORD
TIEMPO   VAR WORD

AUXILIAR1 VAR BYTE
AUXILIAR2 VAR BYTE
AUXILIAR3 VAR BYTE    
AUXILIAR4 VAR BYTE     
AUXILIAR5 VAR BYTE     



FRECUENCIA  VAR WORD
PORTB=0
PORTC=0
PORTD=0
ON INTERRUPT GoTo CORTAR
PAUSE 200
LCDOUT $FE,1

ARRANQUE:
LCDOUT $fe,$c0,"HHO PWM CONTROL"
LCDOUT $fe,$90,"BioEEA TorresAM"

PAUSE 500
LCDOUT $FE,1
VOLT=0
DUTY=0:LED1=0:LED2=1

GOSUB FREC_LEER    
GOSUB DISPLAY_LCD
GOSUB CTRL_DUTY
GOSUB PWM_ON

;--------------------------------------------------------------
;--------------------------------------------------------------
INICIO:

IF DUTY>0 THEN
IF TIPO_CELDA=0 AND T_SALIDA_C=0 THEN
  T_SALIDA_C=1
  AUXILIAR3=DUTY 
  GOTO CAMBIO
ENDIF

IF TIPO_CELDA=0 AND T_SALIDA_C=1 THEN
T_SALIDA_C=0
AUXILIAR3=DUTY
GOTO CAMBIO_1
ENDIF
ENDIF

IF PARAR=0 and duty>0 THEN
GOTO DETENER
ENDIF

IF MOD_BAJAR=0  THEN
AUXILIAR1 = 1
GOSUB RESTAR_TIEMPO
ENDIF

IF MOD_SUBIR=0  THEN
AUXILIAR2 = 1
GOSUB SUMAR_TIEMPO
ENDIF

GOSUB FREC_LEER
GOSUB DUTY_CONTROL
GOSUB CTRL_FREC
PAUSE TIEMPO
IF AUXILIAR1 = 1 THEN GOSUB PWM_OFF 
IF AUXILIAR2 = 1 THEN GOSUB PWM_OFF
PAUSE TIEMPO
GOSUB PWM_ON
ADCIN 0,HAM 
IF ADCON0.2=1 THEN INICIO
PAUSE 5 
GOSUB LECTURA_V
ADCIN 1,HAM
PAUSE 5
GOSUB LECTURA_A
GOTO INICIO
;--------------------------------------------------------------
;--------------------------------------------------------------
LECTURA_V: 
       HVD=((HAM+1)*/875)/10 
       RETURN
LECTURA_A:
       HVD=(HAM+1)*/250
       AMPER=HVD/100
       MA=HVD//100
       RETURN               

;--------------------------------------------------------------
;--------------------------------------------------------------
;--------------------------------------------------------------
;--------------------------------------------------------------
SUMAR_TIEMPO:
IF TIEMPO= 900 THEN RETURN
TIEMPO=TIEMPO + 100
RETURN

RESTAR_TIEMPO:
IF TIEMPO= 0 THEN RETURN
TIEMPO=TIEMPO - 100
RETURN


CTRL_FREC:
IF FREC_SUBIR=0 THEN
WHILE FREC_SUBIR=0:WEND
PR2=PR2-1
gosub CTRL_DUTY
IF PR2<5 THEN PR2=5
ENDIF

IF FREC_BAJAR=0 THEN
WHILE FREC_BAJAR=0:WEND
PR2=PR2+1
gosub CTRL_DUTY
IF PR2>124 THEN PR2=124
ENDIF
GOSUB DISPLAY_LCD
RETURN

;----------------------------------------------------------------
;----------------------------------------------------------------

DUTY_CONTROL:
IF SUMAR_DUTY =0 THEN
CONTADOR=0
DUTY=DUTY+1
IF DUTY=101 THEN DUTY=100
gosub CTRL_DUTY:GOSUB DISPLAY_LCD
 WHILE SUMAR_DUTY=0
 W=1
 IF CONTADOR=>50 THEN
   W=0:CONTADOR=50
   DUTY=DUTY+1:GOSUB DELAY 
   IF DUTY=101 THEN DUTY=100
 ENDIF
 GOSUB CTRL_DUTY
 GOSUB DISPLAY_LCD
 WEND
 W=0:CONTADOR=0
 ELSE 
 W=0:CONTADOR=0
ENDIF

IF RESTAR_DUTY=0 THEN
CONTADOR=0
DUTY=DUTY-1
IF DUTY=255 THEN DUTY=0
GOSUB CTRL_DUTY
GOSUB DISPLAY_LCD
 WHILE RESTAR_DUTY=0
 W=1
 IF CONTADOR=>30 THEN
   W=0:CONTADOR=30
   DUTY=DUTY-1:GOSUB DELAY 
   IF DUTY=255 THEN DUTY=0
 ENDIF
 GOSUB CTRL_DUTY
 GOSUB DISPLAY_LCD
 WEND
 W=0
 ELSE 
 W=0:CONTADOR=0
ENDIF
  
RETURN

;----------------------------------------------------------------
;----------------------------------------------------------------

CAMBIO:
DUTY=DUTY-1:GOSUB DELAY
IF DUTY>100 THEN 
CAMBIO_CELDA=1:LED1=1:LED2=0
GOTO DUTY_SUBIR
ENDIF
GOSUB CTRL_DUTY:GOSUB DISPLAY_LCD
GOTO CAMBIO

;----------------------------------------------------------------
;----------------------------------------------------------------

DUTY_SUBIR:
DUTY=DUTY+1:GOSUB DELAY
GOSUB CTRL_DUTY:GOSUB DISPLAY_LCD
IF DUTY=AUXILIAR3 THEN
GOTO INICIO
ENDIF
GOTO DUTY_SUBIR

;----------------------------------------------------------------
;----------------------------------------------------------------

DETENER:
DUTY=DUTY-1:GOSUB DELAY
GOSUB CTRL_DUTY:GOSUB DISPLAY_LCD
IF DUTY=0 THEN 
GOTO INICIO
ENDIF
GOTO DETENER

;----------------------------------------------------------------
;----------------------------------------------------------------

CAMBIO_1:
DUTY=DUTY-1:GOSUB DELAY
IF DUTY>100 THEN 
CAMBIO_CELDA=0:LED1=0:LED2=1
GOTO DUTY_SUBIR
ENDIF
GOSUB CTRL_DUTY:GOSUB DISPLAY_LCD
GOTO CAMBIO_1

;----------------------------------------------------------------
;----------------------------------------------------------------

DELAY: 
  FOR I=0 TO 255:NEXT
RETURN
DELAY1:
  FOR I=0 TO 150:NEXT
RETURN

;----------------------------------------------------------------
;----------------------------------------------------------------

FREC_LEER:
FRECUENCIA=62500/(PR2+1)     ;FRECUENCIA=62500/(PR2+1) = 500Hz
RETURN

;----------------------------------------------------------------
;----------------------------------------------------------------

CTRL_DUTY:
HAM_DUTY=(PR2+1)*DUTY/25
CCP1CON.4=ham_DUTY.0
CCP1CON.5=HAM_DUTY.1
CCPR1L=HAM_DUTY>>2
return

;----------------------------------------------------------------
;----------------------------------------------------------------

PWM_ON:
CCP1CON.2=1
CCP1CON.3=1 
RETURN

;----------------------------------------------------------------
;----------------------------------------------------------------

PWM_OFF: 
CCP1CON.2=0
CCP1CON.3=0
RETURN

;----------------------------------------------------------------
;----------------------------------------------------------------

DISPLAY_LCD:
LCDOUT $FE,$80,"Duty %",#DUTY
IF DUTY<100 THEN 
GOSUB CONFIG_DIGITO1
LCDOUT $FE,ADR,$20
ENDIF
lcdout $fe,$C0,"FREC.=",#FRECUENCIA
GOSUB CONFIG_DIGITO2
LCDOUT $fe,$90,"VOLT =",DEC VOLT,",",DEC1 MV 
LCDOUT $fe,$D0,"AMPER=",DEC2 AMPER,",",DEC2 MA 
RETURN

;----------------------------------------------------------------
;----------------------------------------------------------------

CONFIG_DIGITO1:
IF DUTY<100 OR DUTY>9 THEN ADR=$88
IF DUTY<10 THEN ADR=$87
RETURN
CONFIG_DIGITO2:
IF FRECUENCIA>10000 THEN LCDOUT $FE,$CD,"Hz"
IF FRECUENCIA<10000 AND FRECUENCIA>999 THEN LCDOUT $FE,$CC,"Hz "
IF FRECUENCIA<1000 THEN LCDOUT $FE,$CB,"Hz "
RETURN

;*****************************************************************
;++++++++++++++++++++++++ INTERRUPCION +++++++++++++++++++++++++++
;*****************************************************************

DISABLE
CORTAR:
IF W=1 THEN
      CONTADOR=CONTADOR+1 
      IF CONTADOR=101 THEN CONTADOR=0         
ENDIF
INTCON.2=0    
RESUME
ENABLE

END
;*****************************************************************
;*****************************************************************

Re leyendo el programa, le voy acomodar de posicion igualmente la parte en la que salto a las rutinas de lectura de los puertos... pero fijate que no necesito configurar referencia externa...
lo mas gracioso, es que si corto el programa... me anda por separado todo... por ejemplo, si le saco el voltimetro amperimetro...me funciona el pwm a la perefccion...

Ver el archivo adjunto 116917

si le saco el pwm... me anda el voltimewtro y APERIMETRO :D
estan en mi contra :LOL: queres que te pase el archivo de proteus? en que formato? 7.10? o 7.0?
saludos
 
Ahí lo acomode un poco y mejora la performance de la estructura y lo hace un pocquito mas ligero pero...sigo con el problema de que no tengo lectura.... voy a descargar por las dudas las articulos de Ricardo.... creo que alguna vez citaba la configuracion de los 16F877... no me acuerdo bien... voy a revolver las 141 paginas, salutaciones en general
 
Atrás
Arriba