28 feb 2016

LCD, Interrupción RB0 INT, ADC y Transmision RS232 por Software



    Cada vez que se produce la interrupción RB0_INT por flanco de subida en RB0, se transmite vía serial RS232 datos correspondientes a los valores del puerto B y del Convertidor Analógico Digital, a su vez se puede observar la información en el LCD,  representados como altura (puerto B)  y peso (ADC).

    El ejemplo muestra en forma sencilla y ordenada como deben ser configurados y ubicados los codigos correspondientes a las  interrupciones; así como de el resto de los periféricos.


'****************************************************************

Device 16F877
Xtal 20
PortB_Pullups FALSE      'DESHABILITA LAS RESISTENCIAS PULL-UP DEL PUERTO B
On_Interrupt GoTo INTERRUPCION

; DEFINICIONES PARA LA CONFIGURACION INTERUPCIONES

Symbol INTEDG = OPTION_REG.6     ' BIT  SELECCION DEL FALNCO DE INTERRUPCION
Symbol GIE =  INTCON.7           ' BIT HABILITADOR GLOBAL DE INTERRUPCIONES
Symbol INTE =  INTCON.4          ' BIT DE HABILITACION DE LA INTERRPCION RB0/INT
Symbol INTF =  INTCON.1          ' BIT DE HABILITACION DE LA INTERRPCION RB0/INT

;CONFIGURACION DEL CONVERTIDOR ANALOGICO DIGITAL


 Declare Adin_Res 10       '  Resultado ADC - 10 bit

 Declare Adin_Tad FRC      ' RC OSC 
 Declare Adin_Stime 50     ' 50us sample time 


 TRISA = 000001         ' Configura AN0 (PORTA.0) como entrada

 ADCON1 = %10000000        ' Configura PORTA.0 Analogico

;CONFIGURACION DEL LCD 

Declare LCD_Type 0      
Declare LCD_DTPin PORTD.4
Declare LCD_ENPin PORTD.3 
Declare LCD_RSPin PORTD.2 

;CONFIGURACION DEL PUERTO SE COMUNICACION SERIAL

 Declare SERIAL_DATA 8       ' 8 bits de datos
 Symbol  RS232 = 84                 ' 9600 bps/sin bit de paridad
 Symbol  tx_pin = PORTC.6
 Symbol  rx_pin = PORTC.7

' Declaracion de Variables


Dim ADC As Word

Dim PESO As Float
Dim ALTURA As Byte
Dim flag As Byte
Dim cont As Word
Symbol BUZZER = PORTD.0

;EL CÓDIGO DE LA INTERRUPCIÓN SIEMPRE DEBE SER COLOCADO  EN ESTA UBICACIÓN 

;(NO COLOCAR DEBAJO DEL PROGRAMA PRINCIPAL ESTO SE DEBE A QUE LA DIRECCIÓN 
; DE MEMORIA DE PROGRAMA DE ATENCIÓN DE INTERRUPCIONES ES LA ORG 0x004)

GoTo Salta_Int

INTERRUPCION:
    flag = 1
    INTF = 0
Context Restore
Salta_Int:


'CONFIGURACION DE PUERTOS
TRISA = %11111111
TRISB= %11111111
TRISC = %10111111
TRISD.0  = 0
TRISD.1  = 1

;CONFIGURACIÓN DEL LA INTERRUPCIÓN POR FLANCO DE SUBIDA DEL PIN RBO (RB0/INT)

GIE=1                ;HABILITADOR GLOBAL DE INTERRUPCIONES 
INTEDG = 1     ;SELECCIÓN DE FLANCO DE SUBIDA PARA INTERRUPCION RB0/INT
INTE = 1           ; HABILITADOR DE INTERRUPCION RB0/INT
INTF = 0           ; BANDERA DE INTERRUPCION RB0/INT

cont = 0

flag = 0 
BUZZER = 0 
PESO =0
ALTURA =0 

Print At 1,1,"Peso   : ", Dec2 PESO, "  "

Print At 2,1,"Altura : ", Dec ALTURA, "  "

'Inicio del programa principal 

 While 1 = 1
    
    If flag = 1 Then
        
        DelayMS 2700 
        
        ALTURA = PORTB

        BUZZER = 1

        DelayMS 300 
        BUZZER = 0

        ADC = ADIn 0                                ' Efectua la conversion ADC y almacena el resultado en la variable ADC

        PESO = ADC 

  Select Case PORTB

        Case 1 : ALTURA = 1
        Case 3 : ALTURA = 2
        Case 7 : ALTURA = 3
        Case 15 : ALTURA = 4
        Case 31 : ALTURA = 5
        Case 63 : ALTURA = 6
        Case 127 : ALTURA = 7
        Case Else: ALTURA = 0 
        
    End Select
        
        cont = cont + 1 
        
        SerOut tx_pin, RS232, [Dec cont, ".- Peso: ", Dec2 PESO, " - ALTURA : " ,Dec ALTURA, 13]    ' envio rs232
        flag = 0
        Print At 1,1,"Peso   : ", Dec2 PESO, "  "
        Print At 2,1,"Altura : ", Dec ALTURA, "  "
   End If

 Wend