desktop

Curso de programación de PIC en PICBasic Pro

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
 
Hola amigo, me parece que meti la pata en la cconfiguracion de los registros, por que me parece raro que funcione por separado, y junto no funcione....
ahi en el programa, configure la interrupcion por timer, el pwm por hardware y entre ahora en duda si configure bien los dos puertos analogicos para leer ...
Se me chispoteo algo seguro, pero a simple vista no lo veo, y eso me pone mas de los pelos



mira Ricardo.... quiero probar estas configuraciones
Código:
ADCON0=%11000000       
ADCON1=%10000000     
TRISA=%11111111                    
TRISB=%11111111
TRISC=%00000000
TRISD=%00000000
       
OPTION_REG=%10000010        
INTCON=%10100001           
TMR0=0 
T2CON = %00000110
PR2=124     
DEFINE    ADC_BITS    10        
DEFINE    ADC_CLOCK    3        
DEFINE    ADC_SAMPLEUS 50

y ahora no puedo... mepa que despues del escaner antivirus me borro algo por que me sale esto al compilar:

errores.jpg

Ahora si que estoy por romper la maquina :(
 
Última edición:
Hola amigo, me parece que metí la pata en la configuración de los registros, por que me parece raro que funcione por separado, y junto no funcione.
Ahí en el programa, configuré la interrupción por timer, el pwm por hardware y entré ahora en duda si configuré bien los dos puertos analógicos para leer.
Se me chispoteo algo seguro, pero a simple vista no lo veo, y eso me pone más de los pelos
Mira el ejemplo que dejo adjunto, en él se hace uso de interrupciones, ADC, LCD y PWM por hardware.

El programa realiza lo siguiente:
.- Se leen dos canales analógicos a 10 bits.
.- Se muestra el valor de ambos canales sobre una pantalla LCD 16x2.
.- Se realiza una interrupción por desborde del Timer0 y otra por cambio de estado en el puerto B <RB4,RB7>
.- Se genera una señal PWM por hardware de 5000Hz.

Esto se realiza en el ejemplo sin conflicto alguno.

Mira las configuraciones realizadas.
Espero te sirvan para comprender y analizar en dónde pueden estar los errores de tu programa.

Suerte.
 

Adjuntos

  • 16F877A Ints, ADC, PWM, LCD.rar
    42.1 KB · Visitas: 117
Última edición:
uuuuuu, excelente, ahi lo mire desde el TXT y despues simule; Me gusto mucho la manera en que lo haces mucho mas liviano al programa :aplauso:... Al parecer, y si no mal entendi tu ejemplo, le pifie con mi configuracion:

ADCON1=%10000010
OPTION_REG=%10000010

pero lo uqe no me cierra es que con mi configuracion An0 y 1 estan habilitados al igual que tu ejemplo...

ADCON1 = %10000000 ; Conversión con justificación a la derecha (AN1, AN0)

mirá, dejame ver si saco algo en limpio con tu ejemplo y lo que escribi yo... El registro de ADCON1 seria entonces:

bit7 _ justificacion a la derecha (1 activa - 0 apaga)
bit6 _ implementacion del reloj en la lectiura / conversion
bit5 _ no se usa
bit4 _ no se usa
bit3-2-1-0 _ se configura los puertos de los cuales, esta seria la tabla de configuracion:

0000 = A7 :An / A6:An / A5:An / A4:An / A3:An / A2:An / A1:An / A0:An

0001 = A7 :An / A6:An / A5:An / A4:An / A3:Vref / A2:An / A1:An / A0:An

0010 = A7Dig / A6Dig / A5Dig / A4:An / A3:An / A2:An / A1:An / A0:An

0011 = A7Dig / A6Dig / A5Dig / A4:An / A3:Vref / A2:An / A1:An / A0:An

0100 = A7Dig / A6Dig / A5Dig / A4:An / A3:An / A2Dig / A1:An / A0:An

0101 = A7Dig / A6Dig / A5Dig / A4:An / A3:Vref / A2ig / A1:An / A0:An

011x = A7Dig / A6Dig / A5Dig / A4Dig / A3Dig / A2Dig / A1:ADig / A0ig

1000 = A7:An / A6:An / A5:An / A4:An / A3:Vref / A2:Vref / A1:An / A0:An

1001 = A7Dig / A6Dig / A5:An / A4:An / A3:An / A2:An / A1:An / A0:An

1010 = A7Dig / A6Dig / A5:An / A4:An / A3:Vref / A2:An / A1:An / A0:An

0011 = A7Dig / A6Dig / A5:An / A4:An / A3:Vref / A2:Vref / A1:An / A0:An

1100 = A7Dig / A6Dig / A5Dig / A4:An / A3:Vref / A2:Vref / A1:An / A0:An

1101 = A7Dig / A6Dig / A5Dig / A4Dig / A3:Vref / A2:Vref / A1:An / A0:An

1110 = A7ig/ A6ig / A5ig / A4ig / A3ig / A2ig / A1ig / A0:An

1111 = A7ig/ A6ig / A5ig / A4ig / A3:Vref / A2:Vref / A1ig / A0:An


:unsure: ahora tengo que resolver el tema este que no me compila... y despues voy a tomar parte de tu idea y ejemplo para hacerlo mas funcional al programa y te comento como me fue... de paso, ya con el compilador funcionando, quizas pueda ver con mas exactitud donde esta el error viendo tu ejemplo.
Gracias amigazo (y)
 
Saludos... estoy haciendo un transmisor de presión, caudal, volumen con un 16F876A y se me complico en la etapa del conteo de volumen.

Tr_Pres_Cau_Vol.jpg

El sensor de presion (Nuova FIMA ST1 ), es un transmisor con salida opcional 4-20mA / 0-5V/ 0-10V; Yo opte por la salida 4-20mA.
El controlador del sensor de caudal (FlowMeet FM-500), me da una salida 4-20mA para caudal (100L/m max.) y una salida de pulsos para Volumen con factor K programable (yo pienso setearlo a 1 pulso por unidad de volumen). Esta ultima parte es un poco engorrosa, ya que en el manual dice:

Es común contar con la necesidad de tener una salida proporcional al volumen medido, la serie FM-500 resuelve esto de la siguiente manera:

se dividen los pulsos de entrada por un factor independiente, con este resultado se generan pulsos de salida, en lo que sigue la explicacion ttrataremos con dos factores
FACTOR_K: factor calibrado para el sensor mecanico
FACTOR_Kout: valor programado para obtener pulsos de salida deseados.
Si el fabricante entrega un equipo con FACTOR_K=125.400, esto quiere decir que el elemento mecanico genera 125.4 pulsos por unidad de volumen, al ser el FACTOR_Kout podemos obtener todas las combinaciones de pulsos posib les a la salida, por ejemplo:

1 pulso de salida por cada pulso de entrada FACTOR_Kout= 00001.000
1 pulso de salida por cada unidad de volumen FACTOR_Kout=00125.400
10 pulso de salida por cada unidad de volumen FACTOR_Kout=00012.540
etc.


La salida de pulsos tiene un ciclo de trabajo de 50% (frec max 200Hz) y funciona en tiempo real, no genera trenes de pulsos, si no que constantemente actualiza la salida, esto permite que el equipo sea prover-fiendly, esta característica es muy importante ya que permite controlar la totalidad del sistema mediante un prover.
a lo cual supongo e interpreto que me da un pulso por cada unidad de volumen y contándolos por segundo, los voy sumando y con esto saco el volumen instantáneo... El tema esta en como realizar el conteo y que no se me desborde la variable puls (byte) y se me ponga en cero... Calculo yo que puedo llegar a contabilizar como max. un volumen de 9.900Lts.
Esto es lo que tengo hasta el momento:

Código:
count PORTB.1,1000,puls
temp3 = temp3 + puls

ADCIN 0, ent420_presion                            ;600bar/1024=presion
TEMP1 = 488 * ent420_presion                       ; 1024*488=499712
VAL1 = DIV32 10
LCDOUT $fe,1,"P:",DEC VAL1 DIG 3,DEC VAL1 DIG 2,".",DEC VAL1 DIG 1, DEC VAL1 DIG 0,"Bar"

PAUSE 5

ADCIN 1, ent420_caudal                            ;1000ltsM/1024=caudal
TEMP2 = 488 * ent420_caudal                       ; 1024*488=499712
VAL2 = DIV32 10
lcdout $fe,$C0,"C:",DEC VAL2 DIG 3,DEC VAL2 DIG 2,"L/m Vol",dec temp3

PAUSE 5
Creería que puede llegar a funcionar la lectura de todo, pero estaría el error de desbordamiento en la sección del conteo de volumen histórico; Alguien me da alguna idea... Saludos a todos

---------- Actualizado después de 36 minutos ----------


bueno... :unsure: Por el momento, tendré que hacer que la variable puls sea del tipo word para que haga el conteo hasta 9999... después veré si hay alguna otra manera para no tener que partir el word en dos byte y enviar ese dato a la PC y desde el soft juntar los dos byte :oops:
 
Última edición por un moderador:
¡Hola,feliz año 2015 a todos!
Bueno pues con la novedad de que necesito un poco de ayuda de ustedes
y quiero que me ayuden a resolver algunas dudas sobre una practica que quiero realizar y es la siguiente:

controlar y visualizar 3 entradas ADC con el PIC16f887 atravez de tres potenciometros a 10 bits o a 8 bits(cualquiera)

saben ya lo he realizado pero con un solo canal ADC y funciona bien pero aqui mi duda es como configurar
los registros ADCON0 y ADCON1 para que pueda manejar las 3 entradas analogicas y mostrarlas en un display lcd
ya le eche una leida al datasheet PIC16F887 pero no le hallo la manera lo unico que rescate es que este pic usa
los ANSEL (parte baja) ANSELH (PARTE ALTA) para configurar cuales pines seran digitales y cuales analogicos.
en los pic que he trabajado el PIC16F877A y el PIC16F819 en sus datasheet ya traen una tabla para seleccionar
cuantos canales y cuales se van van a utilizar pero como tengo 2 PIC16F887 los quiero poner a trabajar

En resumen quiero por favor quien haya manejado este pic que me ayude a configurar el ADCON0 y el ADCON1,o que me de alguna
idea o algun ejemplo,logicamente cuando ya se manejan mas de 2 potenciometros o sensores analogicos.
el programa esta en pic basic pro.

Otra duda que tengo es que este pic trabaja a 10 bits de resolucion ADC y por ahi he leido que si pongo en el ADCON1
el bit 7 justificado a la derecha trabajara a 10 bits y si pongo justificado a la izquierda trabajara a 8 bits es cierto
o me equivoco? bueno esto fue lo que entendi.

Aqui el programa y diagrama en proteus.
 

Adjuntos

  • ADC_PIC16F887.rar
    15.3 KB · Visitas: 55
  • ADC_PIC16F887.jpg
    ADC_PIC16F887.jpg
    136.9 KB · Visitas: 35
En resumen, quiero por favor quien haya manejado este pic que me ayude a configurar el ADCON0 y el ADCON1, o que me de alguna idea o algún ejemplo, lógicamente cuando ya se manejan mas de 2 potenciometros o sensores analógicos.
El programa está en pic basic pro.
Pues así como tienes tu programa, tan sólo te hace falta usar los otros canales, no has configurado los registros ANSEL y ANSELH, así que se encuentran todos sus bits en 1.
ANSEL = ANS 7<>0 y ANSELH = ANS 13<>8
Entonces los pines donde tienes conectados los potenciómetros, serán análogos.
Así que si usas ADCIn 0, 1 y 2, debes obtener las lecturas de esos canales.
Pero si quieres que los canales sobrantes sean digitales, entonces configuras ANSEL y ANSELH de esta forma:
ANSEL = %00000111
ANSELH = 0

Como ya usaste algunas configuraciones usando las definiciones de PBP para el conversor ADC, entonces sale sobrando que configures el registro ADCON0.

ADCON1 no quedará bien configurado usando las definiciones de PBP para 10 bits y es donde entra esta parte...
Otra duda que tengo es que este pic trabaja a 10 bits de resolución ADC y por ahí he leído que si pongo en el ADCON1 el bit 7 justificado a la derecha trabajara a 10 bits y si pongo justificado a la izquierda trabajara a 8 bits. ¿Es cierto o me equivoco?
Bueno, esto fue lo que entendí.
Lo que hace el bit 7 (ADFM = A/D Conversion Result Format Select bit) del registro ADCON1, es lo siguiente...
1 = Justificación a la derecha. Los 6 bits más significativos de ADRESH se leerán como "0"
0 = Justificación a la izquierda. Los 6 bits menos significativos de ADRESL se leerán como "0"

Y por eso se pone el bit 7 en 1 cuando se usan los10 bits, pues resulta más sencilla la lectura de los registros ADRESL y ADRESH con el resultado de ADRESH justificado a la derecha.

Así que nada más te resta la configuración de los registros ANSEL y ANSELH para convertir los pines con ADC no usados, en digitales.

Nota, algo importante:
Cuando muestras valores con más de un dígito usando DEC Valor, es mejor que lo hagas tomando en cuenta cuantos dígitos máximo serán mostrados.
Esto lo haces usando DECX (Donde X será la cantidad de dígitos a mostrar)
Así evitas que valores anteriores que queden en la CGRAM, alteren la visualización del resultado actual.

Entonces si usas 10 Bits = 1023, usas Dec4 y de esta forma cuando la lectura decremente, se observaran ceros a la izquierda.
 
Última edición:
Atrás
Arriba