Autor Tema: Ejemplitos asm para PIC18  (Leído 2244 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado mariano_pic

  • PIC18
  • ****
  • Mensajes: 498
    • Software Electronica Microncontroladores
Ejemplitos asm para PIC18
« en: 19 de Julio de 2007, 18:55:03 »
Hola amigos en este post voy a colocar algunos ejemplitos para PIC18F1220 en ensamblador.

Por que escogí este micro? bueno por que llego a mis manos y me gusto por que tiene 18 pines como el PIC16F84, y es el mas sencillo y pequeño que he podido encontrar para los PIC18. Creo que se podría pensar en el como el PIC16F84 de los PIC18.

Aunque no tiene exactamente la misma distribución de pines que un 16F84, algunos pines si están en el mismo lugar y ahí que tener en cuenta esto antes de armar de memoria cualquier circuito.


Esquema de pines:

Este sera el digrama utilisado en general para estos ejercicios introductorios:


Acá va el primer ejemplo muy sencillo y practico podríamos llamarlo el "hola mundo" de los pic
Lo llamo PortBlink


Código: [Seleccionar]
          LIST        P=18F1220
          INCLUDE     "P18F1220.INC"
          RADIX                HEX
CONFIG OSC = XT, PWRT = On, BOR = ON, BORV = 27, WDT = OFF, MCLRE = OFF, LVP = OFF, DEBUG = OFF;

CBLOCK  0      ;Inicio de las variables. Será la primera dirección libre
PDel0,PDel1,reg
ENDC
       ORG        0
; Aqui comiensa el programa
       banksel trisb
       movlw   0x00
       movwf   trisb
       banksel portb
bucle:
       movlw   0xff
       movwf   portb
       call    delay
       clrf    portb
       call    delay
       goto    bucle


delay   movlw     .156      ; 1 set numero de repeticion  (B)
        movwf     PDel0     ; 1 |
PLoop1  movlw     .213      ; 1 set numero de repeticion  (A)
        movwf     PDel1     ; 1 |
PLoop2  clrwdt              ; 1 clear watchdog
PDelL1  goto      PDelL2    ; 2 ciclos delay
PDelL2 
        decfsz    PDel1, 1  ; 1 + (1) es el tiempo 0  ? (A)
        goto      PLoop2    ; 2 no, loop
        decfsz    PDel0,  1 ; 1 + (1) es el tiempo 0  ? (B)
        goto      PLoop1    ; 2 no, loop
PDelL3  goto      PDelL4    ; 2 ciclos delay
PDelL4  clrwdt              ; 1 ciclo delay
        return              ; 2+2 Fin.


    end    ; fin de el codigo


El delay esta hecho con el programa Picdel, que es un generador de retardos muy preciso

Segundo ejemplo esta ves solo un led titila, utilisaremos algunas instrucciones nuevas para ejemplificar su uso y ver las ventajas que tienen.

A este ejercicio lo llamo LedBlink

Código: [Seleccionar]
     
        LIST            P=18F1220
        INCLUDE         "P18F1220.INC"
        RADIX           HEX
CONFIG OSC = XT, PWRT = On, BOR = ON, BORV = 27, WDT = OFF, MCLRE = OFF, LVP = OFF, DEBUG = OFF;

CBLOCK  0      ;Inicio de las variables. Será la primera dirección libre
PDel0,PDel1,reg
ENDC
       ORG        0
       banksel trisb
       movlw   0x00
       movwf   trisb
       banksel portb
       movlw   b'11110111'
       movwf   reg
       movwf   portb
bucle:
       movff   reg,portb
       btg     reg,3
       call    delay
       goto    bucle


delay   movlw     .156      ; 1 set numero de repeticion  (B)
        movwf     PDel0     ; 1 |
PLoop1  movlw     .213      ; 1 set numero de repeticion  (A)
        movwf     PDel1     ; 1 |
PLoop2  clrwdt              ; 1 clear watchdog
PDelL1  goto      PDelL2    ; 2 ciclos delay
PDelL2 
        decfsz    PDel1, 1  ; 1 + (1) es el tiempo 0  ? (A)
        goto      PLoop2    ; 2 no, loop
        decfsz    PDel0,  1 ; 1 + (1) es el tiempo 0  ? (B)
        goto      PLoop1    ; 2 no, loop
PDelL3  goto      PDelL4    ; 2 ciclos delay
PDelL4  clrwdt              ; 1 ciclo delay
        return              ; 2+2 Fin.

        end    ; fin de el codigo


Ahora uno mejor con mas instrucciones:

Este es LedShift

Código: [Seleccionar]
  LIST                 P=18F1220
        INCLUDE         "P18F1220.INC"
        RADIX                HEX
CONFIG                 OSC = XT, PWRT = On, BOR = ON, BORV = 27, WDT = OFF, MCLRE = OFF, LVP = OFF, DEBUG = OFF;
CBLOCK  0      ;Inicio de las variables. Será la primera dirección libre
PDel0,PDel1,reg
ENDC
       ORG        0
       banksel trisb
       movlw   0x00
       movwf   trisb
       banksel portb
       movlw   1
       movwf   reg
bucle:
       movff   reg,portb
       call    delay
       rlncf   reg,f
       goto    bucle

delay   movlw     .156      ; 1 set numero de repeticion  (B)
        movwf     PDel0     ; 1 |
PLoop1  movlw     .213      ; 1 set numero de repeticion  (A)
        movwf     PDel1     ; 1 |
PLoop2  clrwdt              ; 1 clear watchdog
PDelL1  goto      PDelL2    ; 2 ciclos delay
PDelL2 
        decfsz    PDel1, 1  ; 1 + (1) es el tiempo 0  ? (A)
        goto      PLoop2    ; 2 no, loop
        decfsz    PDel0,  1 ; 1 + (1) es el tiempo 0  ? (B)
        goto      PLoop1    ; 2 no, loop
PDelL3  goto      PDelL4    ; 2 ciclos delay
PDelL4  clrwdt              ; 1 ciclo delay
        return              ; 2+2 Fin.


    end    ; fin de el codigo

Ahora lo mejor FantasticCar:

Código: [Seleccionar]
 
        LIST                 P=18F1220
        INCLUDE         "P18F1220.INC"
        RADIX                HEX
CONFIG  OSC = XT, PWRT = On, BOR = ON, BORV = 27, WDT = OFF, MCLRE = OFF, LVP = OFF, DEBUG = OFF;

CBLOCK  0      ;Inicio de las variables. Será la primera dirección libre
PDel0,PDel1,reg
ENDC
       ORG        0

       banksel trisb
       movlw   0x00
       movwf   trisb
       banksel portb
       movlw   1
       movwf   reg
bucle1:
       movff   reg,portb
       call    delay
       rlncf   reg,f
       btfss   reg,7
       goto    bucle1

bucle2:
       movff   reg,portb
       call    delay
       rrncf   reg,f
       btfss   reg,0
       goto    bucle2
       goto    bucle1


delay   movlw     .156      ; 1 set numero de repeticion  (B)
        movwf     PDel0     ; 1 |
PLoop1  movlw     .213      ; 1 set numero de repeticion  (A)
        movwf     PDel1     ; 1 |
PLoop2  clrwdt              ; 1 clear watchdog
PDelL1  goto      PDelL2    ; 2 ciclos delay
PDelL2 
        decfsz    PDel1, 1  ; 1 + (1) es el tiempo 0  ? (A)
        goto      PLoop2    ; 2 no, loop
        decfsz    PDel0,  1 ; 1 + (1) es el tiempo 0  ? (B)
        goto      PLoop1    ; 2 no, loop
PDelL3  goto      PDelL4    ; 2 ciclos delay
PDelL4  clrwdt              ; 1 ciclo delay
        return              ; 2+2 Fin.

    end    ; fin de el codigo




Que ventajas puede tener la programacion asm con respecto a la programacion en alto nivel en lenguajes como c, basic o pascal?
Yo no veo muchas ventajas ya que para realizar trabajos profecionales es mejor el alto nivel devido a la cantidad de codigo que se puede ver involucrado y a que estos programas compiladores ya tienen solucionado muchos incovenientes a los que nosotros nos podriamos enfrentar.

Pero es deber de todo buen programador pasar por la etapa de aprendizaje del lenguaje asm para saber de lo que es capaz el micro que esta utilizando y ademas que es algo muy gratificante poder entender el codigo asm. Asi tambien a veses ahi que descompilar un archivo para saber lo que esta hasiendo nuestro compilador y que error se esta cometiendo, o que es lo que esperamos que se haga y este deja de haser.

Otra ventaja es la capacidad que tendriamos para traducir el codigo ASM que microchip coloca en sus hojas de datos al lenguaje que manejamos y asi aprovechar caracteristicas o crear funciones que no trae nuestro compilador o las haria muy lentamente de la manera normal.

Bueno asta la proxima entrega y si alguien coloca un ejercicio espero siga la misma metodologia aca iniciada.
Los ejercisios estan comprobados en el propio pic. bye  :mrgreen:

Este post lo ire editando a medida que corrija lo aca escrito.
« Última modificación: 19 de Julio de 2007, 19:15:59 por mariano_pic »
Necesitas ayuda para tu proyecto electronico?
buscame, tal ves pueda colaborarte.
Blog: http://electronicosembebidos.blogspot.com.co/
mail: electronicosembebidos@gmail.com
Mi grupo de facebook: https://www.facebook.com/groups/ProgramandoPics/

Desconectado mariano_pic

  • PIC18
  • ****
  • Mensajes: 498
    • Software Electronica Microncontroladores
Re: Ejemplitos asm para PIC18
« Respuesta #1 en: 20 de Julio de 2007, 11:00:59 »
Es de destacar que estos ejercicios se pueden adactar facilmente a cualquier PIC18

Ahora otro ejemplito: un contador de display del 0 al 9 que se detiene al final:




Código: [Seleccionar]
      LIST       P=18F1220
      INCLUDE    "P18F1220.INC"
      RADIX      HEX
CONFIG       OSC = XT, PWRT = On, BOR = ON, BORV = 27, WDT = OFF, MCLRE = OFF, LVP = OFF, DEBUG = OFF;



CBLOCK  0      ;Inicio de las variables. Será la primera dirección libre
PDel0,PDel1,PDel2, cont
ENDC
           ORG   0
       goto    Start
tabla
       addwf   pcl,f

       retlw   b'00111111';0
       retlw   b'00000110';1
       retlw   b'01011011';2
       retlw   b'01001111';3
       retlw   b'01100110';4
       retlw   b'01101101';5
       retlw   b'01111101';6
       retlw   b'00000111';7
       retlw   b'01111111';8
       retlw   b'01101111';9


Start
       clrf    portb
       banksel trisb
       movlw   0x00
       movwf   trisb
       banksel portb

borra:
       clrf    cont
bucle
       RLNCF   cont,w
       call    tabla
       movwf   portb
       call    delay
       incf    cont,f
       movf    cont,w
       sublw   .10
       btfss   status,z
       goto    bucle
       goto    $

delay:  movlw     .14       ; 1 set numero de repeticion  (C)
        movwf     PDel0     ; 1 |
PLoop0  movlw     .72       ; 1 set numero de repeticion  (B)
        movwf     PDel1     ; 1 |
PLoop1  movlw     .247      ; 1 set numero de repeticion  (A)
        movwf     PDel2     ; 1 |
PLoop2  clrwdt              ; 1 clear watchdog
        decfsz    PDel2, 1  ; 1 + (1) es el tiempo 0  ? (A)
        goto      PLoop2    ; 2 no, loop
        decfsz    PDel1,  1 ; 1 + (1) es el tiempo 0  ? (B)
        goto      PLoop1    ; 2 no, loop
        decfsz    PDel0,  1 ; 1 + (1) es el tiempo 0  ? (C)
        goto      PLoop0    ; 2 no, loop
PDelL1  goto      PDelL2    ; 2 ciclos delay
PDelL2  clrwdt              ; 1 ciclo delay
        return              ; 2+2 Fin.

    end    ; fin de el codigo

« Última modificación: 20 de Julio de 2007, 16:39:22 por mariano_pic »
Necesitas ayuda para tu proyecto electronico?
buscame, tal ves pueda colaborarte.
Blog: http://electronicosembebidos.blogspot.com.co/
mail: electronicosembebidos@gmail.com
Mi grupo de facebook: https://www.facebook.com/groups/ProgramandoPics/

Desconectado Juan_PIC

  • PIC12
  • **
  • Mensajes: 84
Re: Ejemplitos asm para PIC18
« Respuesta #2 en: 20 de Julio de 2007, 11:09:53 »
Una pregunta media colgadita :P. la linea:

CONFIG       OSC = XT, PWRT = On, BOR = ON, BORV = 27, WDT = OFF, MCLRE = OFF, LVP = OFF, DEBUG = OFF;

sirve para los 16F ?

gracias!
Cuando se ponen límites, la mente humana comienza a buscar maneras de romperlos.

Desconectado micro_cadaver

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2102
    • blog microembebidos
Re: Ejemplitos asm para PIC18
« Respuesta #3 en: 20 de Julio de 2007, 11:52:51 »
algunos si. el "borv" no pertenece a la gama 16F.

edito: ups  :? tiene razon maunix, me confundi con el C de hitech. disculpas.
« Última modificación: 20 de Julio de 2007, 12:57:03 por micro_cadaver »
a cosechar!!!... :P
pic32... ahi voy....
aguante el micro 16f84  !!!!

visita mi pagina: http://www.microembebidos.wordpress.com

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Ejemplitos asm para PIC18
« Respuesta #4 en: 20 de Julio de 2007, 12:45:21 »
Una pregunta media colgadita :P. la linea:

CONFIG       OSC = XT, PWRT = On, BOR = ON, BORV = 27, WDT = OFF, MCLRE = OFF, LVP = OFF, DEBUG = OFF;

sirve para los 16F ?

gracias!

No.
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado vszener

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2395
Re: Ejemplitos asm para PIC18
« Respuesta #5 en: 20 de Julio de 2007, 16:40:49 »
El código
Código: ASM
  1. CONFIG

Es para la configuración del microcontrolador, cada micro tiene sus propios fuses, tendrás que ver el data sheet para activar o desactivar según te convenga.


Suerte!!! ;)
· Nos vemos en los bares!!!!!
· Mi Blog: Aqueronte