Autor Tema: Ayuda con proyecto con pic 16f877  (Leído 2173 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Mejido

  • PIC10
  • *
  • Mensajes: 15
Ayuda con proyecto con pic 16f877
« en: 06 de Agosto de 2009, 05:52:23 »
Hola, estoy haciendo un proyecto en el que tengo que recibir la señal analogica de unos sensores, en concreto son 7 sensores. Dichos sensores entran al PIC con señales entre 0 y 5 voltios. Posteriormente debo de transformar esas señales analogicas en digitales, mediante el conversor A/D.  Posteriormente una vez realizada la conversion a digital, tengo que enviar el resultado de la misma, es decir, de cada conversion por el puerto serie. El programa que presento a continuacion es el que estoy yo programando y tengo una duda a la hora de llamar las conversiones, ya que deberia de hacer un bucle cuando llamo a la rutina conversion1 por ejemplo, esto es donde trae  " Aqui deberia poner instruccion para esperar hasta que haya interrupcion A/D"  ¿Que deberia poner? . ¿Alguien me puede ayudar? Muchas gracias. A continuacion presento el programa



;Necesito comprobar lo del tiempo que espero cuando lanzo conversion, es decir, al llamar call conversion y cuando retorno esperar como se hace

list p=16f877

#include<P16F877.INC>

TEMP   equ   20h   ; Variable de almacenamiento temporal


      org   0X00   ;Vector Reset
      goto Inicio
      
      
      org   0x04  ;Vector Interrupcion
      goto Servicio_interrupcion
      
      
      
      org 0x10

Inicio
      
      movlw 0x2F  ; Para configurar como entradas las entradas del registro A
      
      bsf STATUS,RP0  ; Para ir al banco uno a configurar el TRISB
      movwf TRISA ; Ya he configurado las entradas de A como analógicas
      
      
      movlw 0x0E
      movwf TRISE ; Configuro tambien las entradas de E como analogicas
      
      
      bcf STATUS,RP0  ; vuelvo al banco 0 que es donde esta mi programa
      
      call IniciaConversion; llamo a la rutina para iniciar conversion
      

bucle   
      ;Aqui codigo que envio antes por txreg
           call Conversion0
                ;Aqui deberia poner instruccion para esperar hasta que haya interrupcion A/D
      call BucleRetardo
      
      ;Aqui codigo que envio antes por txreg
      call Conversion1
      ;Aqui deberia poner instruccion para esperar hasta que haya interrupcion A/D
      call BucleRetardo
      
      ;Aqui codigo que envio antes por txreg
      call Conversion2
      ;Aqui deberia poner instruccion para esperar hasta que haya interrupcion A/D
      call BucleRetardo
      
      ;Aqui codigo que envio antes por txreg
      call Conversion3
      ;Aqui deberia poner instruccion para esperar hasta que haya interrupcion A/D
      call BucleRetardo
      
      ;Aqui codigo que envio antes por txreg
      call Conversion4
      ;Aqui deberia poner instruccion para esperar hasta que haya interrupcion A/D
      call BucleRetardo
      
      ;Aqui codigo que envio antes por txreg
      call Conversion5
      ;Aqui deberia poner instruccion para esperar hasta que haya interrupcion A/D
      call BucleRetardo
      
      ;Aqui codigo que envio antes por txreg
      call Conversion6
      ;Aqui deberia poner instruccion para esperar hasta que haya interrupcion A/D
      call BucleRetardo
      
      ;Aqui codigo que envio antes por txreg
      call Conversion7
      ;Aqui deberia poner instruccion para esperar hasta que haya interrupcion A/D
      call BucleRetardo
      call bucle ; vuelvo a iniciar la conversion del canal 0


Servicio_interrupcion

      btfss PIR1,ADIF  ; comprobar si hubo interrupcion en A/D
      retfie  ; retornamos si no la hubo   
      
      movf ADRESH,TXREG ; Hubo interrupcion cojo el dato y lo envio al puerto serie
      bcf PIR1,ADIF ; reseteo el flag de interrupcion A/D
      
      call BucleRetardo; Para asegurarnos tiempo entre conversiones
      call BucleRetardo;
      retfie
         
IniciaConversion
            
      bsf   STATUS,RP0  ; voy al banco 1 para configurar el adcon1
      movlw b'00000000' ; configuracion todo entradas analogicas, justifico izquierda
      movwf ADCON1
      
      bsf PIE1,ADIE  ; Para habilitar las interrupciones de A/D
      bcf STATUS,RP0 ; vuelvo al banco 0 para configurar adcon0
      
      bcf PIR1,ADIF  ; Limpio el flag de interrupcion
      bsf INTCON,PEIE  ; Habilito interrupcion de perifericos
      bsf INTCON,GIE   ; Habilito interrupciones globles
      
      return

Conversion0

      bcf STATUS,RP0
      movlw b'11000001' ; preparo conversion para canal 0
      movwf ADCON0
      call BucleRetardo  ; para que de tiempo a procesar
        bsf ACON0,GO
        return


Conversion1

      bcf STATUS,RP0 ; vuelvo al banco 0
      movlw b'11001001' ; preparo conversion para el canal 1
      movwf ADCON0
      bsf ADCON0,GO  ; Lanzo conversion
      return

Conversion2

      bcf STATUS,RP0 ; vuelvo al banco 0
      movlw b'11010001' ; preparo conversion para el canal 1
      movwf ADCON0
      bsf ADCON0,GO  ; Lanzo conversion
      return

Desconectado jhozate

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1698
Re: Ayuda con proyecto con pic 16f877
« Respuesta #1 en: 06 de Agosto de 2009, 12:16:46 »
hola
bueno no mire a profundidad el codigo pero podrias ahorrarte la interrupcion por finalizacion de la conversion A/D testeando el bit GO/DONE o el bit ADIF

Revisar el bit GO/-DONE esperando que sea de nuevo 0 -lógico
O esperar al flag de ADIF sea 1-lógico (puedes testear el bit y no utilizar la interrupcion), independientemente que utilices interrupcion el bit ADIF se pondra 1

saludos
Ser Colombiano es un Premio, Saludos desde CALI-COLOMBIA