Programa para una balanza con pic16f877

Saludos a la comunidad, necesiito su ayuda por favor, estoy haciendo un programa con el pic 16f877, el cual el me sensará una señal analógica de 10v a 0v, yo necesito ver las variaciones en una lcd de 16x2, cuando él vea 10Vdc su salida sea 100mil kilos o 100 toneladas y cuando vea 0Vdc su salida sea de 0 kilos; si alguien gustozamente me pueda ayudar con éste programa, de verdad lo necesito. Saludos y gracias
 
alexander carrero dijo:
saludos a la comunidad nesecito su ayuda por fa, estoy haciendo un prog con el pic 16f877, el cual el me sensara una señal analogica de 10v a 0v yo nesesito ver las variaciones en una lcd de 16x2, cuando el vea 10vdc su salida sea 100mil kilos o 100 toneladas y cuando vea 0vdc su salida sea de 0 kilos si alguien gustoamente me pueda ayudar con este prog de verda lo nesecito saludos y gracias

alexander, no hace falta que postees tantas veces seguidas sobre el mismo tema. Si no te responden de inmediato ten paciencia.
 
disculpa, mauricio es la primera ves que entro a este foro y estava un poco confundido, en este momento estoy trabajando en este proyecto y estoy un poco apurado por q nesesito entrgarlo lo mas rapido posible, si ta a tu alcanse y tienes suficiente tienpo para ayudarme te lo agradesere, espero tu pronta respuesta y gracias.
 
La señal que vas a sensar proviene de una celda de carga? de ser asi previememte tendrias que amplificar la señal y filtrarla. Establecer despues el rango en que vas a trabajar el adc. si ya tienes esto, te puedo porner una rutina para manejar un LCD de 16X2. Y otra para menejar el adc, es con el pic 16f873a. puedes acomodarla al que vayas a usar.
 
SI CON UNA CELDA DE CARGA Y LA AMPLIFICACION LO PUEDO HACER CON UN OPAN PERO DIME COM LA FILTRO, EL RANGO LO PIENSO HACER DE 30 KILOS A 100MIL KILOS XQ ES UNA ROMANA PARA PESAR CAMIONES Y EL RANGO DONDE VA A TRABAJAR LA ADC NO LO "SE",SI ME PUEDES AYUDAR Y ENVIARME LAS RUTINA DE LA LCD Y LA RUTINA DEL ADC, GRACIAS COMPAÑERO
 
Te deseo mucha suerte, hacer una bascula no es nada facil, tienes que determinar la sensibilidad con la que va ha trabajar tu bascula ej: 10 Kg, que es lo que generalmnte trabaja una bascula camionera.

Yo trabaje mas o menos 5 años con equipos de pesaje y lo mejor es que compres un indicador de peso y se lo adecues a la celda, intente hacer el medidor, pero es muy inestable o queda con muy poca resolucion.

sin embargo aqui pongo el codigo para el lcd. no lo pude adjuntar no se como es asi que lo pego.


LIST p=16F873A ; Se emplea el PIC 16F873A



;-------------------------------- ETIQUETAS DEL PROGRAMA


INCLUDE P16F873A.INC ; Etiquetas genericas para los PIC 16f873A


RESUL EQU 0x20
TEMPO1 EQU 0x21
OFFSET EQU 0x22
LCD_VAR EQU 0x23
CONTADOR EQU 0X24


;-------------------------------- PROGRAMA PRINCIPAL

ORG 0 ; El programa comienza en la direcci¢n 0 y salta a la
goto INICIO ; direcci¢n 5 para sobrepasar el vector de interrupci¢n
ORG 5
INCLUDE lcd_cxx.ASM

INICIO
BSF STATUS,RP0
MOVLW 0X06
MOVWF ADCON1
BCF STATUS,RP0

call UP_LCD ; Configura el PIC para el uso del LCD
bsf STATUS,RP0 ; Selecci¢n del banco 1
movlw b'10000111'
movwf OPTION_REG ;Asigna preescaler al TMR0
bcf STATUS,RP0
call LCD_INI ;Inicializa el LCD

INICIO_1 call BORRA_Y_HOME
call DISPLAY_ON_CUR_OFF
movlw 0x80 ; Primera posici¢n de primera fila
call LCD_REG
movlw b'00000110' ; Entry Mode Set. Inc de cursor
call LCD_REG
clrf OFFSET ; Direcci¢n del mensaje
call MENS
call DISPLAY_ON_CUR_OFF
movlw 0xC0 ; Primera posici¢n de SEGUNDA fila
call LCD_REG
clrf OFFSET ; Direcci¢n del mensaje
CALL MENS1

BUCLE goto BUCLE ; El programa acaba en un bucle infinito


;RUTINA MENS: Esta rutina saca mensajes por la pantalla LCD,
;siendo el primer caracter aquel que esta  en la posici¢n apuntada
;por OFFSET, y debiendo ser el ultimo 0x00


MENS clrf RESUL ;Inicializa contador de caracteres
MENS_1 movf OFFSET,W ;Coge el desplazamiento
addwf RESUL,W ;Calcula el caracter a coger
call DATOS ;Coge el caracter
iorlw 0 ;Actualiza flags
btfsc STATUS,2 ;Comprueba si es el £ltimo
return ;Si es el £ltimo vuelve
call LCD_DATO ;Visualiza el caracter
incf RESUL,F ;Incrementa contador de caracteres
movlw d'10'
movwf TEMPO1
goto MENS_1


;TABLA CON LOS DATOS A SACAR POR EL LCD


DATOS addwf PCL,1
retlw 'R' ; OFFSET = 0x00
retlw 'P'
retlw 'M'
retlw ':'
retlw ' '
retlw ' '
retlw ' '
retlw ' '
retlw 'T'
retlw 'E'
retlw 'M'
retlw ':'
retlw ' '
retlw ' '
retlw ' '
retlw ' '
retlw 0x00



MENS1 clrf RESUL ;Inicializa contador de caracteres
MENS_11 movf OFFSET,W ;Coge el desplazamiento
addwf RESUL,W ;Calcula el caracter a coger
call DATOS2 ;Coge el caracter
iorlw 0 ;Actualiza flags
btfsc STATUS,2 ;Comprueba si es el £ltimo
return ;Si es el £ltimo vuelve
call LCD_DATO ;Visualiza el caracter
incf RESUL,F ;Incrementa contador de caracteres
movlw d'10'
movwf TEMPO1
goto MENS_11

DATOS2 addwf PCL,1
retlw '0' ; OFFSET = 0x00
retlw '0'
retlw '0'
retlw ' '
retlw 'R'
retlw 'P'
retlw 'M'
retlw ' '
retlw '0'
retlw '0'
retlw '0'
retlw ' '
retlw 0F
retlw 'C'
retlw 0x00

END

Esta es la libreria

;LCD_CXX.ASM


;El conjunto de rutinas que se presentan a continuaci¢n permiten realizar
;las tareas b sicas de control del m¢dulo de visualizaci¢n LCD. Se emplean
;con los PIC 16f873a. En el programa principal se deber  reservar memoria
;para el bloque de variables que utiliza el LCD del modo:
; LCD_VAR EQU dir_inicio_del_bloque

;BLOQUE DE ETIQUETAS


#define ENABLE bsf PORTA,2 ;Activa E
#define DISABLE bcf PORTA,2 ;Desactiva
#define LEER bsf PORTA,1 ;Pone LCD en Modo RD
#define ESCRIBIR bcf PORTA,1 ;Pone LCD en Modo WR
#define OFF_COMANDO bcf PORTA,0 ;Desactiva RS (modo comando)
#define ON_COMANDO bsf PORTA,0 ;Activa RS (modo datos)
CBLOCK LCD_VAR
LCD_TEMP_2 ;Inicio de las variables. Ser  la primera direcci¢n libre
; disponible
LCD_TEMP_1
ENDC


;RUTINA UP_LCD: Con esta rutina se configura el PIC para que trabaje con el LCD.


UP_LCD bsf STATUS,RP0 ;Banco 1
clrf PORTB ;RB <0-7> salidas digitales
clrf PORTA ;RA <0-4> salidas digitales
bcf STATUS,RP0 ;Banco 0
OFF_COMANDO ;RS=0
DISABLE ;E=0
return


;RUTINA LCD_BUSY: Con esta rutina se chequea el estado del
;flag BUSY del m¢dulo LCD, que indica, cuando est  activado, que el
;m¢dulo a£n no ha terminado el comando anterior. La rutina espera a
;que se complete cualquier comando anterior antes de retornar al
;programa principal, para poder enviar un nuevo comando.


LCD_BUSY LEER ;Pone el LCD en Modo RD
bsf STATUS,RP0
movlw H'FF'
movwf PORTB ;Puerta B como entrada
bcf STATUS,RP0 ;Selecciona el banco 0
ENABLE ;Activa el LCD
NOP
NOP
NOP
NOP
NOP
L_BUSY btfsc PORTB,7 ;Chequea bit de Busy
goto L_BUSY
DISABLE ;Desactiva LCD
bsf STATUS,RP0
clrf PORTB ;Puerta B salida
bcf STATUS,RP0
ESCRIBIR ;Pone LCD en modo WR
return


;RUTINA LCD_E: Se trata de una peque¤a rutina que se encarga de generar
;un impulso de 1æ s (para una frecuencia de funcionamiento de 4 Mhz)
;por la patita de salida de la Puerta A RA2, que se halla conectada
;a la se¤al E (Enable) del m¢dulo LCD. Con esta rutina se pretende activar
;al m¢dulo LCD.


LCD_E ENABLE ;Activa E
NOP
NOP
NOP
NOP
NOP
DISABLE ;Desactiva E
return


;RUTINA LCD_DATO: Es una rutina que pasa el contenido cargado en el
;registro W, el cual contiene un car cter ASCII, a la PUERTA B, para
;visualizarlo por el LCD o escribirlo en la CGRAM.


LCD_DATO OFF_COMANDO ;Desactiva RS (modo comando)
movwf PORTB ;Valor ASCII a sacar por PORTB
call LCD_BUSY ;Espera a que se libere el LCD
ON_COMANDO ;Activa RS (modo dato)
call LCD_E ;Genera pulso de E
return


;RUTINA LCD_REG: Rutina parecida a la anterior, pero el contenido de W
;ahora es el c¢digo de un comando para el LCD, que es necesario pasar
;tambi‚n a la PUERTA B para su ejecuci¢n.


LCD_REG OFF_COMANDO ;Desactiva RS (modo comando)
movwf PORTB ;C¢digo de comando
call LCD_BUSY ;LCD libre?.
call LCD_E ;S¡. Genera pulso de E.
return


;RUTINA LCD_INI: Esta rutina se encarga de realizar la secuencia de
;inicializaci¢n del m¢dulo LCD de acuerdo con los tiempos dados por
;el fabricante (15 ms). Se especifican los valores de DL, N y F,
;as¡ como la configuraci¢n de un interfaz de 8 l¡neas con el bus
;de datos del PIC, y 2 l¡neas de 16 caracteres de 5 x 7 pixels.


LCD_INI movlw 0x38
call LCD_REG ;C¢digo de instrucci¢n
call RETARDO ;Temporiza
movlw 0x38
call LCD_REG ;C¢digo de instrucci¢n
call RETARDO ;Temporiza
;movlw b'00111000'
;call LCD_REG ;C¢digo de instrucci¢n
;call RETARDO ;Temporiza
return


;RUTINA BORRA_Y_HOME: Borra el display y retorna el cursor a la posici¢n 0.


BORRA_Y_HOME movlw b'00000001' ;Borra LCD y Home.
call LCD_REG
return


;RUTINA DISPLAY_ON_CUR_OFF: Control del display y cursor.
;Activa el display y desactiva es cursor

DISPLAY_ON_CUR_OFF movlw b'00001100' ;LCD on, cursor off.
call LCD_REG
return


;RUTINA LCD_DELAY: Se trata de un rutina que implementa un retardo
;o temporizaci¢n de 5 ms XT 20 Mhz. Utiliza dos variables llamadas LCD_TEMP_1
;y LCD_TEMP_2, que se van decrementando hasta alcanzar dicho tiempo.


RETARDO MOVLW .5
MOVWF CONTADOR ;CANTIDAD DE VECCES QUE SE REPITE EL RETARDO

RETARDOT MOVLW .235 ;RETARDO DE 1 mS
MOVWF TMR0
EXPLORAR BTFSS INTCON,2
GOTO EXPLORAR
BCF INTCON,2
DECFSZ CONTADOR,F
GOTO RETARDOT
RETURN
 
buenas espero poder ayudarte.

para manejar la convercion analogica del pic debes tener en cuenta como le entragas la señal que quieres pasar de analoga a digital, por ejemplo, el rango, de entrada de voltaje de un pic para una señal analogia es de 0-5 voltios, o de -vref a vref, pero el segundo estoy seguro que no es el tuyo. no debes introducirle valores por encima de este nivel o puedes qumar el pic.
mira la resolucion del convertidor es de 5Voltios/1024 = 4.88mV/bit. es decir que por cada incremento en la señal de entrada del convertidor analogo en un valor de 4.88mVolt, tendras un incremento en el registro que maneja la convercion digital del PIC.
ejemplo. entrada = 9.78mv. resultado de la convercion= 00 0000 0010 = 02hex.
entrada + 4.8mv resultado.. incremnta en 1 bit. 03hex. por lo que el pic no detectara cambios en la señal de entrada que sean menores que 4.88mv.
apartir de hay tu puedes hacer tus propias regla de tres.


te adjunto como configurar el conversor analogico en el pic.
Puerto A0.




;********************************************
;*----------CONVERSOR ANALOGO---------------*
;********************************************
BSF STATUS,5 ;paso al banco 1. para configurar el puerto a
BSF TRISA,0 ;Configura los pines del Puerto A0 como entrada
movlw b'10000100' ;
movwf ADCON1 ;
BCF STATUS,5
MOVLW B'10000001' ;ESCOJO EL CANAL DEL CONVERSOR, frecuencia de conv.
MOVWF ADCON0
GOTO NEXT

listo ya esta configurado el conversor.

rutina para tomar el dato del conversor analogico del pic.

Next BSF ADCON0,2 ;INICIO LA CONVERCIÓN.
CALL DEMORA ;llamas a una demora el tiempo la defines tu
DENUEVO BTFSC ADCON0,2 ; ESPERO QUE TERMINE LA CONVERCIÓN .
GOTO DENUEVO ;

una vel salta la instruccion GOTO DENUEVO el resultado de la convercion esta en los registros.
ADRESL y ADRESH, el resto depende de como lo manejes en tu programa.



Espero haber podido ayudado.
 
Atrás
Arriba