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
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
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
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:
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
Este post lo ire editando a medida que corrija lo aca escrito.