Last active
December 29, 2015 11:18
-
-
Save davidae1704/7662449 to your computer and use it in GitHub Desktop.
codigo para desafio de guia 11 en ensamblador
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
;*************************************************************************************** | |
; Cálculos | |
;*************************************************************************************** | |
; X: Condición no importa | |
; Baud rate = 8000000/(16 (51 + 1)) | |
; = 9615.3846 = 9615 | |
; Error = (Baud Rate calculado - Baud Rate deseado)/Baud Rate deseado | |
; = (9615 - 9600)/9600 = 0.16% | |
title "PIC18F4550 Comunicación serie" | |
List p=18F4550;Tipo de procesador | |
include "p18F4550.INC" ;Incluye archivo de cabecera | |
;con los símbolos del PIC utilizado. | |
CONFIG FOSC = INTOSCIO_EC | |
CONFIG WDT = OFF | |
CONFIG PBADEN = OFF | |
CONFIG MCLRE = ON | |
CONFIG DEBUG = ON | |
CONFIG LVP = OFF | |
CBLOCK 0x20 ;Bloque de variables de datos en memoria de programa | |
Dato | |
Char ; Variable de conteo de datos en blanco. | |
Cont_char ; Variable que apunta los caracteres. | |
var50us ; Contador de 50 microsegundos | |
var10ms ; Contador para 10 ms | |
var600ms ; Variable de 600 ms para retardos | |
temp | |
ENDC | |
;*************************************************************************************** | |
org 0x00 ;Vector de Reset para el programa principal | |
goto Inicio | |
org 0x08 ;Vector de rutina de servicio | |
goto inttim | |
;*************************************************************************************** | |
; Cadenas de Mensajes | |
ORG 0x20 | |
Msg1 | |
addwf PCL,1 ; Salto indexado, sumar al PC lo que tenga w | |
DT "VOLTIMETRO",0x0D,0x0A, 0x00 | |
DT " Universidad Don Bosco",0x0D,0x0A | |
DT "***********************",0x0D,0x0A | |
DT "Escriba caracteres ASCII:_",0x0D,0x0A,0x00 | |
;*************************************************************************************** | |
ORG 0x150 | |
Inicio | |
bsf OSCCON,6;Divisor de preescala | |
bsf OSCCON,5;fosc= 8Mhz | |
bsf OSCCON,4 | |
clrf PORTC | |
;**********CONFIGURACION DEL EUSART | |
movlw 0xB0 ; Tx Rx | |
movwf TRISC ; Configurar puerto C | |
clrf SPBRGH ; FOSC/[16 (n + 1)] | |
movlw 0x33 ;((8000000/9600)/16)-1 = (833.33/16)-1 = 51 | |
movwf SPBRG; Ver página 245 del Datasheet | |
movlw 0x2C ; CSRC TX9 TXEN(1) SYNC SENDB BRGH TRMT TX9D | |
movwf TXSTA ; X 0 1 0 1 1 0 0 | |
movlw 0x90 ; SPEN RX9 SREN CREN ADDEN FERR OERR RX9D | |
movwf RCSTA; 1 0 X 1 0 0 0 0 | |
movlw 0x00 ; ABDOVF RCIDL RXDTP TXCKP BRG16 - WUE ABDEN | |
movwf BAUDCON ; 0 0 0 0 0 X 0 0 | |
;****************CONFIGURACION DEL ADC | |
clrf ADCON0 ;determina RA0 como canal de entrada para el ADC | |
movlw 0x0E | |
movwf ADCON1 ;Configura en pin RA0 como analógico | |
movlw 0xAC | |
movwf ADCON2 ;configuracion de frecuencia de trabajo (Fosc/4), tiempo de adquisicion (12TAD) | |
; y justificacion del dato(a la derecha) | |
movlw 0x07 | |
movwf CMCON | |
movlw 0xF1 | |
movwf TRISA | |
bsf TRISB,0 ; Configura pin RB0 como entrada para pulsador. | |
movlw 0xFF | |
movwf TRISD ; Configura el puerto D como entradas digitales | |
clrf PORTC | |
clrf var50us ;limpia las variables necesarias para los eventos de tiempo. | |
clrf var10ms | |
clrf var600ms | |
movlw 0x64 ;Registro de período 100 | |
movwf PR2 ;100/2000000 = 50uS | |
movlw 0x04 ;Post y pre escala de 1 | |
movwf T2CON ;Configurar el Timer2 | |
bsf INTCON,GIE ;Habilitación de máscara global | |
bsf INTCON,PEIE | |
bsf PIE1,TMR2IE ;Activación máscara local T2 | |
bsf IPR1,TMR2IP ;Bit de prioridad alto | |
bcf PIR1,ADIF | |
;*************************************************************************************** | |
; Subrutina de control de teclado | |
Init | |
call Mess1 | |
Init2 | |
btfsc PORTB,0 ;Detecta si hubo activación del pulsador | |
goto Lee_PC | |
clrf var50us | |
clrf var10ms | |
clrf var600ms | |
espera | |
btfss var600ms,0 ;Retardo de 600ms | |
goto espera | |
Lee_switchs | |
bsf ADCON0, ADON ;habilita el ADC | |
clrf var50us | |
esperaadc btfss var50us,0 ;Retardo de 50us | |
goto esperaadc | |
bsf ADCON0, 1;inicia la conversion | |
conversion | |
btfsc ADCON0, 1 | |
goto conversion | |
movff ADRESH, temp | |
movf ADRESL, W | |
movwf TXREG ;Envía el dato al buffer de transmisión | |
movwf Dato ;También lo mueve a la variable Dato | |
andlw 0x0F ;Enmascara los bits menos significativos | |
movwf PORTA ;Envía al puerto A los bits menos significativos del dato en puerto D | |
swapf Dato,W ;Intercambia Nibbles en “Dato” y guarda en W | |
andlw 0x0F ;Enmascara los bits menos significativos | |
movwf PORTC ;Envía a puerto C | |
Tx_complete2 | |
clrf var50us | |
espera1 btfss var50us,0 ;Retardo de 50us | |
goto espera1 | |
btfss TXSTA,TRMT ;Verifica si ya se terminó la transmisión | |
goto Tx_complete2 | |
goto Init2 ;Vuelve a verificar pulsador en RB0 | |
;*************************************************************************************** | |
; Subrutinas de mensajes | |
Mess1 | |
movlw h'01' | |
movwf Cont_char | |
Other | |
clrwdt | |
movf Cont_char, w ; Se obtienen datos ASCII | |
call Msg1 ; de la tabla al inicio del código | |
movwf Char | |
movf Char,W ; final del mensaje 0x00? | |
btfsc STATUS,2 | |
goto Outmsg1 | |
movwf TXREG | |
Tx_complete | |
clrwdt | |
clrf var50us | |
espera2 | |
btfss var50us,0 ;Retardo de 50us | |
goto espera2 | |
btfss TXSTA, TRMT ;Se espera a terminar la transmisión. | |
goto Tx_complete | |
Outmsg1 | |
return | |
;*************************************************************************************** | |
; Rutina de servicio de interrupcion del timer 2 para retardos | |
inttim: | |
bcf INTCON,GIE ;Enmascarar interrupciones | |
btfss PIR1,TMR2IF ;Timer flag ? | |
goto fin ;NO, Terminar | |
incf var50us ;Incrementamos var50us | |
movlw d'200' | |
cpfseq var50us ;Se alcanzaron 10ms? | |
goto fin ;NO salte al final | |
clrf var50us ;Limpiar la variable | |
incf var10ms ;Incrementamos var10ms | |
movlw d'60' | |
cpfseq var10ms ;Se alcanzaron 10ms? | |
goto fin ;NO salte al final | |
clrf var10ms ;Limpiar la variable | |
incf var600ms ;Incrementamos var600ms | |
fin: bcf PIR1,TMR2IF ;Limpiar la bandera del timer2 | |
bsf INTCON,GIE ;Habilitación de máscara global | |
retfie | |
END |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment