TODOPIC
Microcontroladores PIC => * PROYECTOS * => Mensaje iniciado por: tessla_1 en 06 de Noviembre de 2004, 10:27:00
-
Saludos a todos desde Bogotá, Colombia
Este foro es el mejor de todos en PIC´s. He estado observandolo desde hace un mes y hasta ahora participo. Su filosofía la comparto a pleno. Sus ayudas son interesadas y a mi tambien me han servido.
ahora al punto.
Estoy construyendo un contador de energía eléctrica utilizando el pic 16f877A.
lo tengo ya pensado. lo compilado en MPLAB y todas las rutinas que utilizo funcionan en la simulación.
El problema es que al montar las partes del programa no funcionan.
1. El conversor A/D
2. El temporizador.
3. La comunicación serie. (aunque esta ya nos transmite)
Sobre el conversor les quería mostrar el codigo que he realizado.. lo hago por partes para montarlo y luego probarlo. potenciometro a la entrana ANA0 y leds a la salida del puerto B. pero nada no funciona. Este es pues el codigo.
LIST P=16F877A
RADIX HEX
INCLUDE <P16F877A.INC>
ORG 0x00
;CONVERSION SIN TEMPORIZACION, RESULTADO EN PUERTO
INICIO ;B Y PUERTO C, ENTRADA ANALOGA (PIN 2)
bsf STATUS,RP0 ;Seleccion banco 1
bcf STATUS,RP1
movlw b"10001111" ;Configuracion entradas Anal (ADCON1)
movwf ADCON1 ;PUERTA 0 COMO ENTRADA ANALOGA
movlw B"11111111" ;Configuracion de puerta A como entrada
movwf TRISA
clrf TRISB ;Puerta B y C como salidas
clrf TRISC
movlw b"10000111" ;Configuracion del TMR0
movwf OPTION_REG ;con predivisor de 256
BUCLE bcf STATUS,RP0 ;Seleccion banco 0
movlw b"10000001" ;Activacion del A/D y TAD=32Tosc
movwf ADCON0 ;activacion canal 0 analogo (ADCON0)
bsf ADCON0,02 ;Comienza a convertir señal TC (GO/DONE#)
wait btfsc ADCON0,02 ;Salta si termina la conversion
goto wait
movf ADRESH,0 ;w=ADRESH
movwf PORTC ;PUERTOC
bsf STATUS,RP0 ;Seleccion banco 1
movf ADRESL,0 ;w=ADRESL
bcf STATUS,RP0 ;BANCO 0
movwf PORTB ;PUERTOB
goto BUCLE
END
Ese es solo una parte. pues la idea es utilizar el conversor con temporizacion de un segundo. así que probé apagar y prender un led en un segundo con el siguiente codigo.. guiandome del libro Microcontroladores PIC 16f84
Este es:
LIST P=16f877A
RADIX HEX
INCLUDE <P16f877A.INC>
ORG 0x00
INICIO
VARTIME EQU 0X23 ;ESTE PROGRAMA ENCIENDE LOS LEDS DEL
;PUERTO B, ESPERA UN SEGUNDO Y LOS APAGA
bsf STATUS,RP0 ;CAMBIO A BANCO 1
bcf STATUS,RP1
movlw b"10000110"
movwf ADCON1 ;CONFIGURO PUERTAS I/O DIGITALES
clrf TRISB ;PUERTA B COMO SALIDA
movlw b"10000111" ;Predivisor de 256 al TMR0
movwf OPTION_REG ;pulsos de reloj 4Tosc
bcf STATUS,RP0 ;CAMBIO BANCO 0
movlw b"11111111"
movwf PORTB
CALL TEMPORIZADOR
clrf PORTB
goto INICIO
TEMPORIZADOR
movlw .20 ;CARGA 20 A VARTIME
movwf VARTIME
DELAY_1 movlw ~.195 ;CARGA COMPLEMETNO 195 A
movwf TMR0 ;TMR0
bcf INTCON,T0IF
DELAY_2 clrwdt
btfss INTCON,T0IF ;
goto DELAY_2
decfsz VARTIME,1
goto DELAY_1
bcf STATUS,RP0 ;BANCO 0
RETURN
END
bueno como pueden ver necesito su extensa y caritativa colaboración.
Su tiempo es valioso para mi .. GRACIAS POR SUS RESPUESTAS.
Si alguien quiere saber más sobre este proyecto me puede escribir a:
plcarranzag@unal.edu.co ó también pedluis_1@yahoo.com.ar
-
la verdad q parece interesante la idea de contar energia, como lo haras? seria muy bueno q pongas parte del circuito de como mediras o q al menos te explayes en la idea...
con respecto a las rutinas.... la del conversor a primera vista parece buena.... pero si no anda... habra q mirarla mas...
la segunda, diria q siempre veras los leds prendidos, a menos q mires con un osciloscopio, creo q te faltaria una llamada al retardo luego de borrar el portB, pq sino, lo apaga y muy rapidamente, unos pocos microsegundos ( si estas a 4MHz) y lo prende de nuevo por el loop....
prueba eso y avisa como fue.....
y cuentanos algo mas del circuito...
Suerte.
-
Me gustaría que me ayudaran con la etapa de temporización.. no entiendo a que se refieren con el loop... supuestamente este codigo temporiza a un segundo.. y me apaga los leds... no veo el inconveniente que me mencionan...
Muy pronto te enviare mejor explicado el proyecto y los problemas que tengo.. por lo pronto me gustaría que me ayudaran con el temporizador de un segundo y problemas que creen que hayan en el codigo del conversor..
gracias wqtrp por tu tiempo
-
fijate de intercalar un llamado entre el clrf del portB y el goto inicio
clrf PORTB
CALL TEMPORIZADOR
goto INICIO
eso te dara el tiempo necesario para q veas cuando el led esta apagado.
-
hey wqtrp gracias por la ayuda.. ya areglé los inconvenientes... definitivamente no estaba viendo nada .. pero todo solucionado.. de nuevo GRACIAS..
El contador de energía utiliza el 16f877A .. la señal de tensión se adquiere con un tranfromador de cargador de celular (120/5V) la señal de corriente se adquiere con un trafo de corriente de un balasto, colocando al final una resistencia y calculando esta para obtener maximo 5 voltios.
esas señales, cada una, entra a un circuito sencillo de valor RMS.. que nos entregará unal señal DC de 0 - 5 Voltios...
luego entrarán, intercalando los canales, al conversor A/D.
La señal de 10 bits se almacena en registros de proposito general y luego se envía por USART al PC..
Allí el LabView se encarga de la multiplicación de las dos señales ó simplemente de la visualización del resultado...
Es aquí donde necesito otra vez ayuda
... la idea es utilizar el PIC.. por eso estoy buscando una rutina de multiplicación de dos registros de 16Bits en Assembler.. para obtener potencia (V*I) ... la energía la tendré sumando en tiempos de un segundo estas multiplicaciones y luego enviandolas al USART.
GRACIAS POR LA AYUDA
-
Hola amigo:
te adjunto una rutina que multiplica dosnúmeros de 16Bits. Espero que te sirva
Fermin
;Mul16x16: Esta rutina multiplica sin signo dos números de 16 bits (DatoB_H
atoB_L *
;DatoA_H
atoA_L) el resultado de 32 bits se deposita en (DatoD_H
atoD_L y DatoC_H
atoC_L)
Mul16x16 movlw .16
movwf Contador ;Inicia contador
clrf DatoD_H
clrf DatoD_L ;Borra parte alta del resultado
Mul_Loop rrf DatoB_H,F
rrf DatoB_L,F
btfss STATUS,C ;El bit LSB es "1" ?
goto No_suma ;No
movf DatoA_L,W
addwf DatoD_L,F ;Suma octeto de menos peso
btfsc STATUS,C
incf DatoD_H,F
movf DatoA_H,W
addwf DatoD_H,F ;Suma octeto de más peso
No_suma rrf DatoD_H,F
rrf DatoD_L,F
rrf DatoC_H,F
rrf DatoC_L,F
decfsz Contador,F
goto Mul_Loop
return
-
Hola!
No averiguaste, para hacer todo lo que queres hacer y mas, con el ADE7753 de Analog Device?
Para que reinventar la rueda.
Bajate y leete el PDF de este interesante IC y replanteate nuevamente el proyecto.
-
hey gracias JacoPastorius2004 por la respuesta .. esa idea ya la había pasado por mi cabeza.. el problema creo es el costo.. aquí puedes conseguir uno de estos IC (que te hacen todo) por mas de US$30. la idea es abaratar la cosa con el pic.. y ademas entrenarme en estos micros que de por sí hacen de todo..
GRACIAS!