20 feb 2013

MULTIMETRO DIGITAL


MONTAJE EN ISIS 7.7 SP2



MICROCONTROLADOR :   PIC16F877
LCD 2x16

FUNCIONES :
  1. VOLTIMETRO
  2. AMPERIMETRO
  3. CONTADOR
  4. FRECUENCIA
  5. PERIODO
  6. CICLO UTIL
  7. OHMETRO
  8. CAPACIMETRO


CODIGO :


; MULTIMETRO DIGITAL
    Device 16F877           ;SE SELCCIONA EL PIC
    Declare XTAL    20      ;SE CONFIGURA UN CRISTAL DE 20MHZ
PORTB_PULLUPS = 1       ;SE CONFIGURAS LAS RESISTENCIAS INTERNAS PULL-UP DEL PUERTO B
          
'***************************CONFIGURACION CONVERTIDOR ANALOGICO DIGITAL ******************
    Declare ADIN_RES 10                     'CONFIGURA EL ADC A 10 BIT DE RESOLUCION
    Declare ADIN_TAD FRC                    'ASIGNA EL OSCILADOR INTERNO PARA EL MUESTREO 
    Declare ADIN_STIME 50                   ' CONFIGURA A 50uSEG EL TIEMPO DE MUESTREO
    ADCON1 = %10000010                      ' Se CONFIGURA EL ADC TODO ANALOGICO
    
;******************************************************************************************************
;CONFIGURACION DE PUERTOS

   TRISD=001111          ;SE CONFIGURA EL PUERTO  D 
   TRISC=000000          ;SE CONFIGURA EL PUERTO  C 
   TRISB=000001          ;SE CONFIGURA EL PUETO B   
   TRISA=011111          ;SE CONFIGURA EL PUERTO A 
   TRISE=000001          ;SE CONFIGURA EL PUERTO E
   
   Clear PORTD              ; LIMPIA EL PUERTO D
   Clear PORTB              ; LIMPIA EL PUERTO B
   Clear PORTC              ; LIMPIA EL PUERTO C
   Clear PORTE              ; LIMPIA EL PUERTO E


'INICIALIZACON DE PANTALLA LCD

Declare LCD_TYPE 0             ;PANTALLA ALFANUMERICA
    Declare LCD_DTPIN PORTB.4      ;SE USAN 4 LINEAS DE DATOS
    Declare LCD_RSPIN PORTB.3      ;SE CONFIGURA EL PIN RB3 PARA EL RS DEL LCD 
Declare LCD_ENPIN PORTB.2      ;SE CONFIGURA EL PIN RB2 PARA EL PIN EN DEL LCD
    Declare LCD_LINES 2            ;LCD DE DOS LINEAS
  
    
'DECLARACION DE VARIABLES

   Dim Frec As Word                ;SE DECLARA LA VAR FREC DE 16 BITS
   Dim Cont As Byte
   Dim var1 As Byte

   Dim volt As Float
   Dim OHM As Float
   Dim CAD  As Word
   Dim amper As Float
   Dim temp As Float
   Dim periodo As Float
   Dim ciclo_h As Word
   Dim ciclo_l As Word
   Dim porc_ciclo_util As Float
   Dim capacitancia2 As Word
   Dim capacitancia As Float
  
;SE ALMACENAN LOS SIMBOLOS ESPECIALES EN LA MEMORIA CGRAM DE LA PANTALLA LCD
       ' CARGANDO EL 1ER. CARACTER PERSONALIZADO EN LA CGRAM   BORDE ESQUINA SUPE IZ - CARACTER 0
        Print 254,64, $1F,$1E,$1C,$1C,$18,$18,$10,$00
       'CARGANDO EL 2DO. CARACTER PERSONALIZADO EN LA CGRAM    BORDE ESQUINA INF IZQ- CARACTER 1
        Print 254,72, $00,$10,$18,$18,$1C,$1C,$1E,$1F
        'CARGANDO EL 3RO. CARACTER PERSONALIZADO EN LA CGRAM   SUPER DER - CARACTER 2
        Print 254,80, $1F,$0F,$0F,$07,$07,$03,$03,$01
        'CARGANDO EL 4TO. CARACTER PERSONALIZADO EN LA CGRAM    INF DER - CARACTER 3
        Print 254,88, $01,$03,$03,$07,$07,$0F,$0F,$1F
        'CARGANDO EL 5TO. CARACTER PERSONALIZADO EN LA CGRAM    SIGNO MENOS  - CARACTER 4
        Print 254,96, $00,$00,$00,$1F,$1F,$00,$00,$00
       'CARGANDO EL 6TO. CARACTER PERSONALIZADO EN LA CGRAM    FLECHA DER  - CARACTER 5
        Print 254,104, $00,$10,$18,$1C,$1C,$18,$10,$00
        'CARGANDO EL 7MO. CARACTER PERSONALIZADO EN LA CGRAM    FACHA ARRIBA - CARACTER 6
        Print 254,112, $00,$00,$00,$04,$0E,$0E,$1F,$1F
        'CARGANDO EL 8VO. CARACTER PERSONALIZADO EN LA CGRAM     FLECHA ABAJO - CARACTER 7
        Print 254,120, $1F,$1F,$0E,$0E,$04,$00,$00,$00  

        Cls     ;LIMPIA EL LCD
       
        Print At 1,1,0, "  MULTIMETRO  ",2     ;
        Print At 2,1,1, "    DIGITAL   ",3

        DelayMS 3000
        Cls

;INICIO PROGRAMA PRINCIPAL

Cont = 0                     ; CONTADOR DE INDICADOR DE FUNCION A SELECCIONAR

INICIO:

     If PORTD.1 = 1 Then
        DelayMS 300
        Cont= Cont + 1
        If Cont = 7 Then
            Cont = 6
        End If
     End If 
     
     If PORTD.0 = 1 Then
        DelayMS 300
        Cont= Cont - 1
        If Cont = 255 Then
            Cont = 0
        End If
     End If 
     
; SE SELECCIONA UNA OPCION DEPENDIENDO DEL VALOR DE LA VARIABLE CONT
     Select Case Cont 
         Case 0 :
             Print At 1,1,"1-",5, $FE, $0C,  "VOLTIMETRO   "  
             Print At 2,1,"2-", " AMPERIMETRO ",7
             If PORTD.2=1 Then
                Call VOLTIMETRO
             End If
                          
         Case 1 :
             Print At 1,1,"2-",5, "AMPERIMETRO ",6
             Print At 2,1,"3-", " MED. FREC   ",7
             If PORTD.2=1 Then
                Call AMPERIMETRO
             End If
         Case 2 :
             Print At 1,1,"3-",5, "MED. FREC   ",6
             Print At 2,1,"4-", " MED. PERIODO",7
             If PORTD.2=1 Then
                Call FRECUENCIMETRO
             End If             
         Case 3 :
             Print At 1,1,"4-",5, "MED. PERIODO",6
             Print At 2,1,"5-", " % CICLO UTIL",7
             If PORTD.2=1 Then
                Call MED_PERIODO
             End If
         Case 4 :          
             Print At 1,1,"5-",5, "% CICLO UTIL",6
             Print At 2,1,"6-", " OHMETRO     ",7        
             If PORTD.2=1 Then
                Call CICLO_UTIL
             End If                
         Case 5 :       
             Print At 1,1,"6-",5, "OHMETRO     ",6
             Print At 2,1,"7-", " CAPACIMETRO ",7       
             If PORTD.2=1 Then
                Call OHMETRO
             End If         
         Case 6 :        
              Print At 1,1,"7-",5, "CAPACIMETRO ",6
              Print At 2,1,"  ", "              "        
             If PORTD.2=1 Then
                Call Capacimetro
             End If              
     End Select 

GoTo INICIO                                     ; REGRESA A LA ETIQUETA INICIO
;;FIN DEL PROGRAMA PRNCIPAL
    

;;****************** RUTINA PARA EL FRECUENCIMETRO ***********************************
FRECUENCIMETRO:
Cls
    Repeat
        Frec = Counter PORTB.0,200                 ;RELIZA UN CONTEO DE PULSOS EN EL PUERTO B PIN 0  POR UN PERIODO DE 200 MS
        Frec = Frec * 5
        Print At 1,1, " FREC = ",Dec Frec , " HZ        "  
    Until PORTD.3=1       ;SE EJECUTA LA RUTIMA HASTA QUE SE PRESIONES SALIR       

Return


;*********** RUTINA PARA LA MEDICION DE PERIODOS ************************************
MED_PERIODO:
Cls
    Repeat
        Frec = Counter PORTB.0,200                 ;RELIZA UN CONTEO DE PULSOS EN EL PUERTO B PIN 0  POR UN PERIODO DE 200 MS
        Frec = Frec * 5
        periodo = 1000 / Frec
        Print At 1,1, " T = ",DEC2 periodo , " mSeg        "  
    Until PORTD.3=1              ;SE EJECUTA LA RUTIMA HASTA QUE SE PRESIONES SALIR
Return



;**************** RUTINA DEL VOLTIMETRO*************************
VOLTIMETRO:
Cls
    Repeat    
        CAD = ADIn 1       ; DEVUELVE UN VALOR ENTRE 0 Y 1023   PORQUE ES 10 BIT
        volt = CAD * 10/1023
        Print At 1,1, "Volt = ", DEC2 volt , " VDC    "  ;
    Until PORTD.3=1          ;SE EJECUTA LA RUTIMA HASTA QUE SE PRESIONES SALIR

Return

;*********RUTINA PARA LA MEDICION DE RESISTENCIA ******************************* 
OHMETRO:
Cls
;SE UTILIZA UN DIVISOR DE TENSION VOUT = R2*VIN/(R1+R2)
    Repeat    
        CAD = ADIn 3
        volt = CAD * 5000/1023
        OHM = (volt * 10000 )
        OHM = OHM /( 5000 - volt)
       Print At 1,1, " RES = ", DEC2 OHM , " OHM      "  ;
    
    Until PORTD.3=1       ;SE EJECUTA LA RUTIMA HASTA QUE SE PRESIONES SALIR
Return

;*********************** RUTINA PARA EL AMPERIMETRO*********************************
AMPERIMETRO:
Cls    
     Repeat
        CAD = ADIn 2
        amper= CAD  * 20 /1023
        Print At 1,1, " Corr = ", DEC2 amper , " mA     "  ;
    Until PORTD.3=1   ;SE EJECUTA LA RUTIMA HASTA QUE SE PRESIONES SALIR
Return  
       
;******************************* RUTINA PARA LA MEDICION DE CICLO UTIL****************
CICLO_UTIL:
Cls    
     Repeat
        ciclo_l = PulsIn PORTB.0,0       ;CUENTA EL TIEMPO DE DURACION DEL UN PULSO EN ESTADO BAJO
        DelayMS 10
        ciclo_h = PulsIn PORTB.0,1       ;CUENTA EL TIEMPO DE DURACION DEL UN PULSO EN ESTADO ALTO
        porc_ciclo_util = (ciclo_h*100)
        porc_ciclo_util= porc_ciclo_util /(ciclo_l + ciclo_h)
        Print At 1,1, "Ciclo Ut= ", DEC1  porc_ciclo_util ,"     "  ;
    Until PORTD.3=1       
Return



;************************* RUTINA PARA CALCULAR LA CAPACITACIA **********************
Capacimetro:
Cls
    Repeat    
        For var1   = 1 To 100
            High PORTE.0                  ' Discharge the cap 
            DelayMS 10           
            capacitancia2 = RCIn PORTE.0 , High            ;CALCULA EL TIEMPO DE DESCARGA DEL CAPACITOR
            capacitancia = (capacitancia2/64) + capacitancia     ; SE SUMA EL RESULTADO EN LA VARIABLE 100 VECES
        Next
        capacitancia= capacitancia /100   ; SE DIVIDE ENTRE 100 PARA SACAR EL PROMEDIO
        Print At 1,1, " Cap = ", Dec  capacitancia , 223, " uF      "  ;
    Until PORTD.3=1                
Return


15 feb 2013

Identificadores y Etiquetas

Identificadores

        Un identificador es simplemente un nombre. Son usados en Pronto Basic como etiquetas de líneas y nombres de variables. Un identificador es cualquier secuencia de letras, dígitos y símbolos, aunque no deben comenzar con un dígito. Los identificadores no distinguen las letras mayúsculas de las minúsculas, por lo que etiqueta, ETIQUETA, Etiqueta son todas tratadas como equivalentes. Aunque las etiquetas pueden tener cualquier número de caracteres de longitud, Protón Basic solamente reconoce los primeros 32.


Etiquetas

       Para marcar líneas que el programa puede desear referenciar con comandos GOTO ó GOSUB, Proton BAsic usa tiquetas de línea y no permite número de línea y no requiere que cada línea sea etiquetada. Cualquier línea puede comenzar con una etiqueta de línea que es simplemente un identificador seguido por dos puntos (:)

ejemplo

            etiqueta1:


            Goto etiqueta1






Variables (Tipos de datos)


        Las variables son donde los datos temporales se almacenan en un programa BASIC. Ellos son creados usando la palabra clave DIM. Debido a que la RAM  disponible en en microPIC es algo limitado en tamaño, la elección de los tipos o tamaños de  variables adecuados para cada tarea específica es de suma importancia. Las variables pueden ser del tipo  BIT, BYTE, WORD, DWORD, FLOAT o STRING.

   El espacio para cada variable se asigna automáticamente en el área de la memoria RAM del microcontrolador. El formato para crear una variable es el siguiente: -

                      DIM Identificador AS Tipo

Identificador, cualquiera (a excepción de palabras clave).

Tipo :  bit, byte, word, dword o float.

Algunos ejemplos de la creación de variables son: -


   DIM  perro As  Byte           '8 bits sin signo 
                                               '(0 a 255)

  DIM  cat     As  Bit            'un solo bit (0 ó 1)

  DIM  rata   As  Word         '16 bits sin signo (0 a 65535)

  DIM  L_Rat  As DWord      '32 bits con signo
                                               '(-2147483647 a 2147483647)

  DIM  P_Rat As Float         '32 bits en coma flotante

 DIM ST As secuencia * 20    'Crear una variable STRING 
                                                 'capaz de contener 20 caracteres




          El número de variables disponibles depende de la cantidad de RAM en un dispositivo en particular y el tamaño de las variables en el programa Proton BASIC puede reservar aproximadamente 26 ubicaciones de memoria RAM para su propio uso. También puede crear nuevas variables temporales  para utilizarlas en el cálculo de ecuaciones complejas , especialmente si los cálculos de punto flotante se llevan a cabo.

      Hay ciertas palabras reservadas que no se pueden utilizar como nombres de variables, estas son las variables del sistema utilizados por el compilador.

         Las siguientes palabras reservadas no se debe utilizar como nombres de variables, como el compilador creará estos nombres cuando sea necesario: -

PP0, PP0H, PP1, PP1H, PP2, PP2H, PP3, PP3H, PP4, PP4H, PP5, PP5H, PP6, PP6H, PP7, PP7H, PP8, PP9H, GEN, GENH, GEN2, GEN2H, GEN3, GEN3H, GEN4, GEN4H, GPR, BPF, BPFH.


         Cada tipo de variable requiere diferentes cantidades de memoria RAM para su asignación. La lista de abajo ilustra esto.

          FLOAT      requiere 4 bytes de RAM.
          DWORD    requiere 4 bytes de RAM.
          Word          requiere 2 bytes de RAM.
          BYTE         requiere 1 byte de RAM.
          Bit               requiere 1 byte de RAM  para cada 8 variables bits utilizadas.


       
         Cada tipo de variable puede contener un mínimo diferente y el valor máximo:

FLOAT

          Teóricamente puede tener un valor de 1-1e37 hasta e38, así como los valores fraccionarios, haciendo de este el más exacto de los tipos de variables. Sin embargo, más que los tipos  DWORD, esto tiene un precio ya que los cálculos y las comparaciones FLOAT  utilizan más espacio de código en el PIC. Utilice este tipo de variable con moderación y sólo cuando sea estrictamente necesario. Los valores más bajos de punto flotante ofrecen más precisión.

DWORD

         Puede contener un valor entre  -2147483647   y    2147483647.   Esto tiene un precio sin embargo, ya que los cálculos y las comparaciones DWORD usarán más espacio de código dentro de la PICmicro, al igual que FLOAT, utilice este tipo de variable con moderación y sólo cuando sea necesario.

WORD

          Podrá contener a un valor entre 0 y 65535, que suele ser lo suficientemente grande para la mayoría de aplicaciones. Se sigue utilizando más memoria, pero no tanto como un tipo DWORD.


BYTE

          Puede tener un valor de 0 a 255, y son los caballos de trabajo habituales de la mayoría de los programas. El Código producido por las variables de tamaño BYTE es muy bajo en comparación con los tipos WORD, FLOAT o DWORD, y se debe tomar en cuenta  si el programa requiere un funcionamiento más rápido, o más eficiente.

BIT
         Puede tener un 0 o un 1. Estos se crean 8 a la vez, por lo tanto, si declara una sola variable de tipo BIT en el programa no guardará espacio de memoria RAM, solo ahorrará espacio de código, ya que las variables de tipo bit producen el uso más eficiente de código para las comparaciones etc