Lenguaje ensamblador para PIC desde 0

para Ariel
Cuando se trabaja con todas las interrupciones al mismo tiempo es mejor trabajar con los PIC de la familia 18, los cuales tienen interrupcion de prioridad y asi evitas estos problemas
 
buenas a todos, alguien podria decirme como recibir una cadena de caracteres por rs 232 para luego analizarla?

Gracias
 
buenas a todos, alguien podria decirme como recibir una cadena de caracteres por rs 232 para luego analizarla?

Gracias

Código:
;***************************** Librería "RS232.INC" *************************************
;
;    ===================================================================
;      Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS"
;      E. Palacios, F. Remiro y L. López.        www.pic16f84a.com
;       Editorial Ra-Ma.  www.ra-ma.es
;    ===================================================================
;
; Estas subrutinas permiten realizar las tareas básicas de control de la transmisión
; seríe asincrona según normas RS-232.
;
; Los parámetros adoptados para la comunicación son los siguientes:
; - Velocidad de transmisión de 9600 baudios. La duración de cada bit será 104 µs.
; - Un bit de inicio o Start a nivel bajo.
; - Dato de 8 bits.
; - Sin paridad.
; - Dos bits de final o Stop a nivel alto.
;
; El tiempo entre bit y bit  debe coincidir con el periodo de la señal leída o enviada.
; Como la velocidad de transmisión o recepción es de 9600 baudios, el periodo será:
; 1/9600 Baudios = 104 µs. Se utilizará pues la subrutina Retardos_100micros.

    CBLOCK
    RS232_ContadorBits
    RS232_Dato
    ENDC

#DEFINE  RS232_Entrada    PORTA,4        ; Línea por la que se reciben los datos.
#DEFINE  RS232_Salida    PORTA,3        ; Línea por la que se envían los datos.
;
; Subrutina "RS232_Inicializa" -------------------------------------------------------------
;
; Configura las líneas de salida y entrada del microcontrolador.

RS232_Inicializa
    bsf    RS232_Salida                ; Al principio salida en alto para resposo.
    bsf    STATUS,RP0
    bsf    RS232_Entrada                ; Esta línea se configura como entrada.
    bcf    RS232_Salida                ; Esta línea se configura como salida.
    bcf    STATUS,RP0
    return

; Subrutina "RS232_LeeDato" -------------------------------------------------------------
;
; El microcontrolador lee el dato por la línea de entrada comenzando por el bit de menor
; peso. El dato leído se envía finalmente en el registro de trabajo W.
;
; El ordenador parte siempre de un nivel alto, que es el estado que tiene cuando no 
; envía información. La secuencia utilizada es:
; 1º    Espera que se ejecute el pulso negativo del bit Start o flanco de bajada.
; 2º    Deja pasar un tiempo una y media veces mayor que el periodo de transmisión para
;        saltarse el bit de Start y lee el primer bit en su mitad.
; 3º    Lee el resto de los bits de datos, esperando un tiempo igual a la duración del
;        período entre lectura y lectura para testearlos en mitad del bit.
;
; Salida: En el registro de trabajo W el byte leído.

RS232_LeeDato
    movlw    d'8'                    ; Número de bits a recibir.
    movwf    RS232_ContadorBits
RS232_EsperaBitStart
    btfsc    RS232_Entrada             ; Lee la entrada y espera a que sea "0".
    goto    RS232_EsperaBitStart    ; No, pues espera el nivel bajo.
    call     Retardo_100micros        ; El primer bit debe leerlo un tiempo igual a una
    call     Retardo_50micros         ; vez y media el periodo de transmisión.
RS232_LeeBit
    bcf        STATUS,C                ; Ahora lee el pin. En principio supone que es 0.
    btfsc    RS232_Entrada            ; ¿Realmente es cero?
    bsf        STATUS,C                ; No, pues cambia a "1".
    rrf        RS232_Dato,F            ; Introduce el bit en el registro de lectura.
    call    Retardo_100micros        ; Los siguientes bits los lee un periodo más tarde.
    decfsz     RS232_ContadorBits,F    ; Comprueba que es el último bit.
    goto    RS232_LeeBit            ; Si no es el último bit pasa a leer el siguiente.
    call    Retardo_200micros        ; Espera un tiempo igual al los 2 bits de Stop.
    movf    RS232_Dato,W            ; El resultado en el registro W.
    return    

; Subrutinas "RS232_EnviaDato" y "RS232_EnviaNúmero" -------------------------------------
;
; El microcontrolador envía un dato por la línea de salida comenzando por el bit de menor
; peso. En dato enviado será el que le llegue a través del registro de trabajo W.
; 1º.    Envía un "0" durante un tiempo igual al periodo de la velocidad de transmisión.
;        Este es el bit de "Start".
; 2º.    Envía el bit correspondiente:
;         - Si va a enviar un "0" permanece en bajo durante el periodo correspondiente.
;        - Si va a escribir un "1" permanece en alto durante el periodo correspondiente.
; 3º.    Envía dos bits "1" durante un tiempo igual al período de la velocidad de 
;        transmisión cada uno. Estos son los dos bits de Stop.
;
; Entrada:    En (W) el dato a enviar.

RS232_EnviaNumero                    ; Envía el código ASCII de un número.
    addlw    '0'                        ; Lo pasa a código ASCII sumándole el ASCII del 0.
RS232_EnviaDato
    movwf    RS232_Dato                ; Guarda el contenido del byte a transmitir.
    movlw    d'8'                    ; Este es el número de bits a transmitir.
    movwf    RS232_ContadorBits
    bcf        RS232_Salida            ; Bit de Start.
    call    Retardo_100micros
RS232_EnviaBit                        ; Comienza a enviar datos.
    rrf        RS232_Dato,F            ; Lleva el bit que se quiere enviar al Carry para
    btfss    STATUS,C                ; deducir su valor. ¿Es un "1" el bit a transmitir?
    goto    RS232_EnviaCero            ; No, pues envía un "0".
RS232_EnviaUno
    bsf        RS232_Salida            ; Transmite un "1".
    goto    RS232_FinEnviaBit
RS232_EnviaCero
    bcf        RS232_Salida            ; Transmite un "0".
RS232_FinEnviaBit
    call    Retardo_100micros        ; Este es el tiempo que estará en alto o bajo.
    decfsz     RS232_ContadorBits,F    ; Comprueba que es el último bit.
    goto    RS232_EnviaBit            ; Como no es el último bit repite la operación.
    bsf        RS232_Salida            ; Envía dos bits de Stop.
    call    Retardo_200micros
    return
    
;    ===================================================================
;      Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS"
;      E. Palacios, F. Remiro y L. López.        www.pic16f84a.com
;       Editorial Ra-Ma.  www.ra-ma.es
;    ===================================================================
 
Yo aporto un conjunto de plantillas para programar PICs en ensamblador mplab/mpasm. Solo se busca la plantilla que corresponde al modelo de PIC a programar y se rellena. Estas plantillas vienen en el paquete gratuito de MPLAB de Microchip luego no hay problema con los derechos de propiedad intelectual. Salu2.
 

Adjuntos

  • PICTEMP.ZIP
    149.1 KB · Visitas: 291
Última edición por un moderador:
Escribo para agredecer la el trabajo de leon_elec y meta por su trabajo. Su explicacion fue la mejor para estudiar para el primer parcial de micros. Seria bueno q se metieran con los timers ahora :S
 
Bueno el TMR0 tiene un tiempo maximo de 65.536ms, y en el 1er ejemplo q dan lo calculan para 1seg osea 1000ms y sacam un valor nose como...
En el 2do ejemplo lo calculan para el tiempo maximo q puede tener y les da 65.566ms... tampoco entiendo porq, como dije antes... es de 65.536ms el maximo.

Claro todo esto para un cristal de 4Mhz.

Si tuve algun error corriganme q mi examen es mañana :LOL: :cool:
 
Tiene que ser varias veces 65.536 ms si quieres que te salgan muchos segundos e incluso minutos. Para estas cosas mejor usar un Timer de 16 Bits, dura mucho más tiempo.
 
Hola, tengo una duda... Puedo manejar el registro W como si fuera otro registro mas de la ram? y asi poder ejecutar insctrucciones con él? Por ejemplo...

COMF W,W; Complementa W y lo guarda en W
 
Hola, tengo una duda... Puedo manejar el registro W como si fuera otro registro mas de la ram? y asi poder ejecutar insctrucciones con él? Por ejemplo...

COMF W,W; Complementa W y lo guarda en W

El W no tiene nada que ver como registro de la RAM, funciona en modo independiente. Pero puedes meter los datos que desees desde el registro a la RAM y al revés.
 
buenas tengo una duda con un programa donde tengo que rotar 8 leds conectados en el puerto b cada segundo pero con timer 0 el programa lo acabe de hacer y pues no tengo el mplab para saber si esta bien el programa es el sgte:

Código:
LIST		P=16F84A
	INCLUDE		<P16F84A.INC>


             CBLOCK 0x0C
             REGISTRO50ms
             ENDC

             TMR0_CARGA50ms   EQU d'256'-d'195'
             CARGA_1S    EQU  d'20'

             ORG  0
             GOTO INICIO
             ORG  4
             GOTO TIMER0_INTERRUPCION		

INICIO              
             BSF STATUS,5
             CLRF TRISB
            ;MOVLW b'00000001'
            ;MOVWF TRISA
             MOVLW b'00000111'
             MOVWF OPTION_REG
             BCF STATUS,5
             MOVLW TMR0_CARGA50ms
             MOVWF TMR0
             MOVLW CARGA_1S
             MOVWF REGISTRO50ms
             MOVLW b'10100000'
             MOVWF INTCON
PRINCIPAL
             GOTO $

;SUBRUTINA "TIMER0_INTERRUPCION"


TIMER0_INTERRUPCION
             BSF STATUS,C
             MOVLW TMR0_CARGA50ms
             MOVWF TMR0
             DECFSZ REGISTRO50ms,F
             GOTO FININTERRUPCION
             RLF PORTB,F
             GOTO TIMER0_INTERRUPCION

FININTERRUPCION
             BCF INTCON,TOIF
             RETFIE
 
Última edición por un moderador:
hola dcastibl1 este programa esta haciendo lo que quieres solo le modifique tres lineas de código ya que en lugar de rotar agregaba otro uno cada segundo
 

Adjuntos

  • rotacion.txt
    1.2 KB · Visitas: 73
Hola soy nuevo en el foro, pero tengo que agradecerles que este tutorial me ha servido de mucho, pero hay una duda que no he podido resolver y espero que me ayuden y es sobre las instrucciones sublw y subwf y como afectan el flag DC ya que no entiendo exactamente que hace el programa para activar y desactivar este flag. Por ejemplo: cuando resto 0xF - 0xF= 0 la bandera se activa, pero cuando hago 0x10-0x10=0 no se activa y no entiendo por que. Gracias por anticipado
 
Hola soy nuevo en el foro, pero tengo que agradecerles que este tutorial me ha servido de mucho, pero hay una duda que no he podido resolver y espero que me ayuden y es sobre las instrucciones sublw y subwf y como afectan el flag DC ya que no entiendo exactamente que hace el programa para activar y desactivar este flag. Por ejemplo: cuando resto 0xF - 0xF= 0 la bandera se activa, pero cuando hago 0x10-0x10=0 no se activa y no entiendo por que. Gracias por anticipado

Hola SERCH17 las restas tanto sublw y subwf en los micros utilizan complemento a dos de un número binario es el número resultante de invertir los UNOS y CEROS de dicho número. Por ejemplo si: N = 0000110100101 obtenemos su complemento a uno invirtiendo ceros y unos, con lo que resulta: C1N = 1111001011010 y para su complemento a dos es: C2N = C1N + 1 = 1111001011011 si te das cuenta al esta operacion realizar ese complemento afecta tanto el bit deDigit Carry "DC" como el Zero "Z" y el carry "C" ya que se puede decir que hace parte del registro que se modifica colocando a uno.
saludos
 
Última edición:
Hola a todos, me acabo de registrar y me gustaría preguntarles a los que llevan mas tiempo en este foro si habéis tratado con ASM de algún microprocesador (aun que este tema sea de microcontroladores pero creo que es lo mas parecido que e encontrado por aquí, a lo mejor no he buscado suficiente) y cómo programarlos , o si sabéis de la existencia de otro foro en la web que encaje mas con lo que digo.
Mi objetivo es saber la utilidad que tiene programar en ensamblador y como hacerlo sin ningún software que sea un emulador del µP(alguna utilidad más que aplicaciones matemáticas y código ASCII) con respecto a periféricos de la misma familia del microprocesador. Y donde probarlo ¿en una placa de trabajo compatible con el microprocesador, en una placa madre...?
Un saludo a todos.
 
Hola Antcamgar,

Yo he trabajado un poco con ASM x86, para programar en este no necesitas nada más que tu propio computador (siempre y cuando sea compatible IBM) y algun compilador y debbuger como el TASM. De esta forma puedes llegar a usar todos los recursos que tiene tu computador (creo que esta es la mejor placa de prueba que hay je je je). Con respecto a su utilidad... yo se la encuentro más a programación de microcontroladores ya que ahí los recursos son muy limitados y en algunas ocasiones críticas es necesario aprovecharlos al máximo.

Si lo que quieres es aprender a programar y en específico ASM x86 te recomiendo este libro: IBM PC Assembly Language and Programming de Peter Abel.

Saludos,

Biker12
 
Bueno despues de un tiempo ausente voy a subir una pequeña introducción del temas y yo creo que en uno o dias empezare a subir el primer bloque de instrucciones. Mi idea es dividir este documento en 3 partes: registros especiales, las instrucciones y ejemplos, y cada vez ire actualizando cada una de estas partes para que quede completo y despues pasar a los DSPIC's.

PD. Para cualquier duda estoy a su disposicion...

Saludos
 

Adjuntos

  • Introduccion(Parte 1).pdf
    594.5 KB · Visitas: 280
Última edición:
ayuda con el comanda incf
al pulsar una entrada, en la salida debe incrementarse y prender un led de forma secuensial.


Rotación con intervalos de retardo de 1 segundo.
 
Atrás
Arriba