Página 1 de 2
PROGRAMA PISCA LED EM ASSEMBLER

Enviado:
21 Fev 2015 16:58
por Pask
Amigos, estou tentando fazer um pequeno código em assembly para fazer um led ligado ao pino RA1 do PIC16F819 piscar a cada 1 segundo, mas não estou conseguindo fazer o código funcionar. Alguém poderia me ajudar? O problema está dentro da rotina de interrupção do timer0. O código entra na interrupção mas a inversão do pino RA1 não acontece. Segue o código abaixo para vocês:
asm code
#INCLUDE <P16F819.inc>
__CONFIG _FOSC_INTOSCCLK & _WDTE_OFF & _PWRTE_ON & _MCLRE_ON & _BOREN_OFF & _LVP_OFF & _CPD_OFF & _WRT_OFF & _CCPMX_RB2 & _CP_OFF
;Definição dos bancos de memória:
BANK0 MACRO
BCF STATUS,RP0
BCF STATUS,RP1
ENDM
BANK1 MACRO
BSF STATUS,RP0
BCF STATUS,RP1
ENDM
BANK2 MACRO
BCF STATUS,RP0
BSF STATUS,RP1
ENDM
BANK3 MACRO
BSF STATUS,RP0
BSF STATUS,RP1
ENDM
CBLOCK 0x20 ;Criação de duas variáveis de 8bits no endereço inicial dos GPR's (General Purpose Registers)
W_TEMP
STATUS_TEMP
VAR_1
VAR_2
ENDC
;Vetor de Reset
ORG 0x00
GOTO INICIO
;Vetor de Interrupção
ORG 0x0004
ENTRA_INT
MOVWF W_TEMP ;Salva W em W_TEMP
SWAPF STATUS,W ;Swapf em Status
CLRF STATUS ;Apaga bit RP0 do registrador Status
MOVWF STATUS_TEMP ;Move W para STATUS_TEMP
;Tratamento da Interrupção do TMR0
BTFSC INTCON,TMR0IF ;Ocorreu interrupção do TMR0?
GOTO TRATA_INT_TMR0 ;Sim. Desvia e trata
GOTO SAI_INT ;Não. Então sai.
TRATA_INT_TMR0 ;Contagem de Tempo: Tclk * Prescaler(TMR0)*VAR_1*VAR_2
;Clock do Sistema: 8Mhz/4 = 2Mhz => Tclk= 1/2MHz = 0,5us
;Contagem de Tempo: 0,5us * 255 * 255 * 31 = 1 segundo
BCF INTCON,TMR0IF ;Limpa flag de estouro do TMR0
GOTO CONTA_1
CONTA_1
INCF VAR_1
MOVF VAR_1,W ;DECREMENTA VAR_1.
XORLW .255
BTFSS STATUS,Z ;DEU ZERO? (Z=1)
GOTO SAI_INT ;NÃO.
GOTO CONTA_2 ;SIM. CONTINUA
CONTA_2
INCF VAR_2
MOVF VAR_2,W ;DECREMENTA VAR_2.
XORLW .31
BTFSS STATUS,Z ;DEU ZERO? (Z=1)
GOTO SAI_INT ;NÃO
GOTO LED ;SIM. CONTINUA
LED
BTFSC PORTA,1 ;LED ESTÁ ACESO?
GOTO APAGA_LED ;Não. Então desvia
GOTO ACENDE_LED ;Sim. Então desvia
ACENDE_LED
BSF PORTA,1
GOTO SAI_INT ;ACENDE O LED E SAI DA ROTINA DE INTERRUPÇÃO
APAGA_LED
BCF PORTA,1
GOTO SAI_INT ;APAGA O LED E SAI DA ROTINA DE INTERRUÇÃO
SAI_INT
CLRF TMR0
CLRF VAR_1
CLRF VAR_2
SWAPF STATUS_TEMP,W ;Swapf de Status_Temp em Work
MOVWF STATUS ;Move conteúdo de work para Status
SWAPF W_TEMP,F ;Swapf de W_Temp
SWAPF W_TEMP,W ;Swapf de W_Temp em Work
RETFIE ;Retorna da Interrupção
INICIO
BANK1
CLRF TRISA
CLRF TRISB
MOVLW 0x74
MOVWF OSCCON ;Ajusta registrador osccon para trabalhar com Fclock em 8MHz estável
MOVLW 0x07
MOVWF OPTION_REG ;Ajusta registrador option_reg para operar com tmr0 com prescaler de 1:256
BANK0
CLRF PORTA
CLRF PORTB
MOVLW 0x00
MOVWF CCP1CON ;desabilita módulo ccp1 (capture,compare e pwm internos)
MOVLW 0xE0
MOVWF INTCON ;Liga chave geral das interrupções e dos periféricos e habilita interrupção do tmr0
CLRF TMR0
GOTO MAIN
MAIN
GOTO $
END ;Fim do código
Desde já, agradeço a ajuda!
Re: PROGRAMA PISCA LED EM ASSEMBLER

Enviado:
21 Fev 2015 20:29
por andre_luis
Um dos cuidados que temos de tomar em programar o PIC em assembly é ter de trocar manulamente o banco dos registradores. Estou sem o MPLAB instalado aqui, mas como uma sugestão para voce debugar e conferir se o que citei pode ser o motivo, modifica o seu programa, alterando o estado do LED na inicialização para o oposto ( se começava acêso, muda para apagado - ou vice versa ).
Re: PROGRAMA PISCA LED EM ASSEMBLER

Enviado:
21 Fev 2015 20:43
por Pask
Estou tentando fazer a simulação, mas o pc counter não aparece na tela e eu não consigo ver onde o cursor de simulação está. Os valores dos registradores mudam normalmente indicando que a simulação está rodando. Você saberia me dizer por que eu não consigo ver o cursor na tela?
Re: PROGRAMA PISCA LED EM ASSEMBLER

Enviado:
21 Fev 2015 23:01
por andre_luis
Não mexo faz muito tempo com o Assmebly do PIC, mas confesso que não entendi as linhas 116-119 :
- Código: Selecionar todos
GOTO MAIN
MAIN
GOTO $
Se não estou enganado, me parece que fica travado indefinicamente nesse ponto, exceto por alguma interrução, mas pelo menos no meu tempo, interrupção não funcionava muito bem na simulação com o MPLAB, mas como no seu caso é MPLABX, não sei opinar a respeito do funcionamento.
Re: PROGRAMA PISCA LED EM ASSEMBLER

Enviado:
22 Fev 2015 13:08
por nagkiller
Além de incompleto o código goto $, na saída da interrupção ele está zerando a contagem, então esta contagem fica em 0,1 e logo em seguida 0 novamente!!!
- Código: Selecionar todos
#INCLUDE <P16F819.inc>
__CONFIG _FOSC_INTOSCCLK & _WDTE_OFF & _PWRTE_ON & _MCLRE_OFF & _BOREN_OFF & _LVP_OFF & _CPD_OFF & _WRT_OFF & _CCPMX_RB2 & _CP_OFF
errorlevel -302
;Definição dos bancos de memória:
BANK0 MACRO
BCF STATUS,RP0
BCF STATUS,RP1
ENDM
BANK1 MACRO
BSF STATUS,RP0
BCF STATUS,RP1
ENDM
BANK2 MACRO
BCF STATUS,RP0
BSF STATUS,RP1
ENDM
BANK3 MACRO
BSF STATUS,RP0
BSF STATUS,RP1
ENDM
CBLOCK 0x20 ;Criação de duas variáveis de 8bits no endereço inicial dos GPR's (General Purpose Registers)
W_TEMP
STATUS_TEMP
VAR_1
VAR_2
ENDC
;Vetor de Reset
ORG 0x00
GOTO INICIO
;Vetor de Interrupção
ORG 0x0004
ENTRA_INT
MOVWF W_TEMP ;Salva W em W_TEMP
SWAPF STATUS,W ;Swapf em Status
CLRF STATUS ;Apaga bit RP0 do registrador Status
MOVWF STATUS_TEMP ;Move W para STATUS_TEMP
;Tratamento da Interrupção do TMR0
BTFSC INTCON,TMR0IF ;Ocorreu interrupção do TMR0?
GOTO TRATA_INT_TMR0 ;Sim. Desvia e trata
GOTO SAI_INT ;Não. Então sai.
TRATA_INT_TMR0 ;Contagem de Tempo: Tclk * Prescaler(TMR0)*VAR_1*VAR_2
;Clock do Sistema: 8Mhz/4 = 2Mhz => Tclk= 1/2MHz = 0,5us
;Contagem de Tempo: 0,5us * 255 * 255 * 31 = 1 segundo
BCF INTCON,TMR0IF ;Limpa flag de estouro do TMR0
GOTO CONTA_1
CONTA_1
INCF VAR_1,F
MOVF VAR_1,W ;DECREMENTA VAR_1.
XORLW .10
BTFSS STATUS,Z ;DEU ZERO? (Z=1)
GOTO SAI_INT ;NÃO.
MOVLW 0x00
MOVWF VAR_1
GOTO CONTA_2 ;SIM. CONTINUA
CONTA_2
INCF VAR_2,F
MOVF VAR_2,W ;DECREMENTA VAR_2.
XORLW .31
BTFSS STATUS,Z ;DEU ZERO? (Z=1)
GOTO SAI_INT ;NÃO
MOVLW 0x00
MOVWF VAR_2
GOTO LED ;SIM. CONTINUA
LED
BTFSC PORTA,1 ;LED ESTÁ ACESO?
GOTO APAGA_LED ;Não. Então desvia
GOTO ACENDE_LED ;Sim. Então desvia
ACENDE_LED
BSF PORTA,1
GOTO SAI_INT ;ACENDE O LED E SAI DA ROTINA DE INTERRUPÇÃO
APAGA_LED
BCF PORTA,1
GOTO SAI_INT ;APAGA O LED E SAI DA ROTINA DE INTERRUÇÃO
SAI_INT
MOVLW 0xF0
MOVWF TMR0
SWAPF STATUS_TEMP,W ;Swapf de Status_Temp em Work
MOVWF STATUS ;Move conteúdo de work para Status
SWAPF W_TEMP,F ;Swapf de W_Temp
SWAPF W_TEMP,W ;Swapf de W_Temp em Work
RETFIE ;Retorna da Interrupção
INICIO
BANK1
CLRF TRISA
CLRF TRISB
MOVLW 0xF0
MOVWF TMR0
MOVLW 0x74
MOVWF OSCCON ;Ajusta registrador osccon para trabalhar com Fclock em 8MHz estável
MOVLW B'10000001'
MOVWF OPTION_REG ;Ajusta registrador option_reg para operar com tmr0 com prescaler de 1:256
MOVLW B'10100100' ; 7=GIE 6=PEIE 5=T0IE 4=INTE 3=RBIE 2=T0IF 1=INTF 0=RBIF
MOVWF INTCON ;Liga chave geral das interrupções e dos periféricos e habilita interrupção do tmr0
MOVLW 0x00
MOVWF CCP1CON ;desabilita módulo ccp1 (capture,compare e pwm internos)
BANK0
CLRF PORTA
CLRF PORTB
GOTO MAIN
MAIN
NOP
GOTO $-1
END ;Fim do código
Agora só corrigir a logica para acender e apagar o LED!!!
Flw...
Re: PROGRAMA PISCA LED EM ASSEMBLER

Enviado:
22 Fev 2015 13:58
por ze
o andré mexe com asm há muito menos tempo que eu. Mas achei curiosa esta sequencia:
- Código: Selecionar todos
goto X
X
continua
sei lá parece um inutil goto. Não tem nada a ver com seu caso. Só quis observar (pra notar que sou um observador)...
Vc parece estar começando agora. Permita-me umilh... ops mostrar este pisca pra ver se não te coça o C. (linguagem c)
- Código: Selecionar todos
#define led RB0
void delay(insigned char dl)
{ while (dl--);}
void main(void)
{
for(;;)
{
led^⁼1;
delay(255);
}
}
a propósito, vc não está usando led verde, está?
abç
Re: PROGRAMA PISCA LED EM ASSEMBLER

Enviado:
22 Fev 2015 14:46
por Pask
Consegui debugar o meu código usando o MPLAB 8.92 e o mesmo está entrando na rotina de interrupção normalmente. O problema é que as variáveis de contagem VAR1 e VAR2 parecem não estar sendo incrementadas corretamente.
Re: PROGRAMA PISCA LED EM ASSEMBLER

Enviado:
22 Fev 2015 14:56
por andre_luis
Pask escreveu:O problema é que as variáveis de contagem VAR1 e VAR2 parecem não estar sendo incrementadas corretamente.
Mas voce está recarregando o Zero nessas variaveis nas rotinas que parece ser as que as incrementam, ou estou enganado ?
asm code
MOVLW 0x00 ; 00->W
MOVWF VAR_1 ; W->VAR1
...
MOVLW 0x00 ; 00->W
MOVWF VAR_2 ; W->VAR2
Re: PROGRAMA PISCA LED EM ASSEMBLER

Enviado:
22 Fev 2015 16:07
por nagkiller
Sim!!!
Depois que satisfez a contagem, voce tem que zerar as contagens, como se faz em linguagem c ou outra que use, para que comece a contar novamente!!! Se não ele continuará a contagem ate 255, zerar e contar novamente (no caso de uma variavel de 8bits).
Quando há uma interrupção, não tem que zerar os registradores da interrupção (FLAGs)??? Sim, tem que zerar!!!
Quando o programa entra na interrupção, ele verifica o estado do timer0 e sai... ao sair, no codigo original, ele estava zerando as variaveis, então as variaveis nunca saiam do zero!!!
Esse goto $-1 é só pra perder tempo voltando uma linha acima!!! Como se fosse o loop While. Se não tivesse, o programa terminaria, pois a proxima instrução é o END!!! De fato poderia ter colocado um goto main, mas as duas funcionam.
Uma das logicas que estava errada era a de zerar as variaveis na saida da interrupção e não no final da contagem desejada.
A outra logica que ainda está errada no metodo de ligar e desligar o led, mas esta vamos ver se ele ou alguem consegue identificar. (criar uma variavel e fazer seu tratamento e configurações invalidas)
Flw...
Re: PROGRAMA PISCA LED EM ASSEMBLER

Enviado:
22 Fev 2015 16:58
por Pask
Amigos, agradeço a todos pela ajuda mas já resolvi o problema. Aparentemente, foram dois:
1) O cálculo da contagem de tempo do TMR0 estava incorreto.
2) Parece que o meu PIC16F819 está ruim. Refiz o código para o PIC16F628A e funcionou beleza.
Segue o código para vocês com os comentários!
Um abraço a todos.
asm code
#INCLUDE <P16F628A.inc>
__CONFIG _FOSC_INTOSCCLK & _WDTE_OFF & _PWRTE_ON & _MCLRE_OFF & _BOREN_OFF & _LVP_OFF & _CPD_OFF & _CP_OFF
;DEFINIÇÃO DOS BANCOS DE MEMÓRIA:
BANK0 MACRO
BCF STATUS,RP0
BCF STATUS,RP1
ENDM
BANK1 MACRO
BSF STATUS,RP0
BCF STATUS,RP1
ENDM
BANK2 MACRO
BCF STATUS,RP0
BSF STATUS,RP1
ENDM
BANK3 MACRO
BSF STATUS,RP0
BSF STATUS,RP1
ENDM
CBLOCK 0x20 ;GPR's DO USUÁRIO
W_TEMP
STATUS_TEMP
CONTA
ENDC
;VETOR DE RESET
ORG 0x00
GOTO INICIO
;VETOR DE INTERRUPÇÃO
ORG 0x0004
ENTRA_INT
MOVWF W_TEMP ;SALVA W EM W_TEMP
SWAPF STATUS,W ;SWAPF EM STATUS
CLRF STATUS ;APAGA BIT RP0 DO REGISTRADOR STATUS
MOVWF STATUS_TEMP ;MOVE W PARA STATUS_TEMP
;TRATAMENTO DA INTERRUPÇÃO DO TMR0
BTFSC INTCON,T0IF ;OCORREU INTERRUPÇÃO DO TMR0?
GOTO TRATA_INT ;SIM. DESVIA.
GOTO SAI_INT ;NÃO. DESVIA.
TRATA_INT ;CONTAGEM DE TEMPO: T * CONTAGEM DO TMR0 * PRESCALER(TMR0)* CONTA
;CLOCK DO SISTEMA: 4MHZ/4 = 1MHZ => T = 1/1MHZ = 1us
;CONTAGEM DE TEMPO: 1us * 255 * 255 * 15 = 1 segundo
BCF INTCON,T0IF ;LIMPA FLAG DE ESTOURO DO TMR0
GOTO CONTAGEM
CONTAGEM
INCF CONTA
MOVF CONTA,W ;DECREMENTA VAR1.
XORLW .15
BTFSS STATUS,Z ;DEU ZERO? (Z=1)
GOTO SAI_INT ;NÃO.
GOTO LED ;SIM. CONTINUA
LED
BTFSC PORTA,1 ;LED ESTÁ ACESO?
GOTO APAGA_LED ;NÃO. DESVIA
GOTO ACENDE_LED ;SIM. DESVIA
ACENDE_LED
BSF PORTA,1
CLRF CONTA
GOTO SAI_INT ;ACENDE O LED E SAI DA ROTINA DE INTERRUPÇÃO
APAGA_LED
BCF PORTA,1
CLRF CONTA
GOTO SAI_INT ;APAGA O LED E SAI DA ROTINA DE INTERRUÇÃO
SAI_INT
CLRF TMR0
SWAPF STATUS_TEMP,W ;SWAPF DE STATUS_TEMP EM WORK
MOVWF STATUS ;MOVE CONTEÚDO DE WORK PARA STATUS
RETFIE ;RETORNA DA INTERRUPÇÃO
INICIO
BANK1
CLRF TRISA
CLRF TRISB
MOVLW 0x08
MOVWF PCON ;AJUSTA OSCILADOR INTERNO PARA 4MHz
MOVLW 0x07
MOVWF OPTION_REG ;AJUSTA REGISTRADOR OPTION_REG PARA OPERAR COM TMR0 COM PRESCALER DE 1:256
BANK0
CLRF PORTA
CLRF PORTB
MOVLW 0x07
MOVWF CMCON ;DESABILITA COMPARADORES INTERNOS
MOVLW 0x00
MOVWF CCP1CON ;DESABILITA MÓDULO CCP1 INTERNO
MOVLW 0xE0
MOVWF INTCON ;LIGA CHAVE GERAL DAS INTERRUPÇÃES E DOS PERIFÉRICOS E HABILITA INTERRUPÇÃO DO TMR0
CLRF TMR0
CLRF CONTA
GOTO MAIN
MAIN
GOTO $ ;LOOPING ETERNO. AGUARDA INTERRUPÇÃO OCORRER
END ;FIM DO CÓDIGO
Re: PROGRAMA PISCA LED EM ASSEMBLER

Enviado:
22 Fev 2015 19:31
por Pask
Amigos, eu afirmei no post anterior que o meu PIC16F819 estaria com um defeito, mas não. Na verdade, eram as configurações de bits que estavam incorretas para o oscilador interno. Segue abaixo o outro código em assembly para este MCU para quem quiser experimentar:
#INCLUDE <P16F819.INC>
__CONFIG _INTRC_CLKOUT & _WDTE_OFF & _PWRTE_OFF & _MCLRE_OFF & _BOREN_OFF & _LVP_OFF
;DEFINIÇÃO DOS BANCOS DE MEMÓRIA:
BANK0 MACRO
BCF STATUS,RP0
BCF STATUS,RP1
ENDM
BANK1 MACRO
BSF STATUS,RP0
BCF STATUS,RP1
ENDM
BANK2 MACRO
BCF STATUS,RP0
BSF STATUS,RP1
ENDM
BANK3 MACRO
BSF STATUS,RP0
BSF STATUS,RP1
ENDM
CBLOCK 0x20 ;GPR's DO USUÁRIO
W_TEMP
STATUS_TEMP
CONTA
ENDC
;VETOR DE RESET
ORG 0x00
GOTO INICIO
;VETOR DE INTERRUPÇÃO
ORG 0x0004
ENTRA_INT
MOVWF W_TEMP ;SALVA W EM W_TEMP
SWAPF STATUS,W ;SWAPF EM STATUS
CLRF STATUS ;APAGA BIT RP0 DO REGISTRADOR STATUS
MOVWF STATUS_TEMP ;MOVE W PARA STATUS_TEMP
;TRATAMENTO DA INTERRUPÇÃO DO TMR0
BTFSC INTCON,TMR0IF ;OCORREU INTERRUPÇÃO DO TMR0?
GOTO TRATA_INT ;SIM. DESVIA.
GOTO SAI_INT ;NÃO. DESVIA.
TRATA_INT ;CONTAGEM DE TEMPO: T * CONTAGEM DO TMR0 * PRESCALER(TMR0)* CONTA
;CLOCK DO SISTEMA: 8MHZ/4 = 2MHZ => T = 1/2MHZ = 0,5us
;CONTAGEM DE TEMPO: 0,5us * 255 * 255 * 31 = 1 segundo
BCF INTCON,TMR0IF ;LIMPA FLAG DE ESTOURO DO TMR0
GOTO CONTAGEM
CONTAGEM
INCF CONTA
MOVF CONTA,W ;DECREMENTA VAR1.
XORLW .31
BTFSS STATUS,Z ;DEU ZERO? (Z=1)
GOTO SAI_INT ;NÃO.
GOTO LED ;SIM. CONTINUA
LED
BTFSC PORTA,1 ;LED ESTÁ ACESO?
GOTO APAGA_LED ;NÃO. DESVIA
GOTO ACENDE_LED ;SIM. DESVIA
ACENDE_LED
BSF PORTA,1
CLRF CONTA
GOTO SAI_INT ;ACENDE O LED E SAI DA ROTINA DE INTERRUPÇÃO
APAGA_LED
BCF PORTA,1
CLRF CONTA
GOTO SAI_INT ;APAGA O LED E SAI DA ROTINA DE INTERRUÇÃO
SAI_INT
CLRF TMR0
SWAPF STATUS_TEMP,W ;SWAPF DE STATUS_TEMP EM WORK
MOVWF STATUS ;MOVE CONTEÚDO DE WORK PARA STATUS
RETFIE ;RETORNA DA INTERRUPÇÃO
INICIO
BANK1
CLRF TRISA
CLRF TRISB
MOVLW 0x74
MOVWF OSCCON ;AJUSTA OSCILADOR INTERNO PARA 8MHz
MOVLW 0x06
MOVWF ADCON1 ;CONFIGURA PINOS DO PORTA COMO I/O DIGITAIS
MOVLW 0x00
MOVWF PCON
MOVLW 0x07
MOVWF OPTION_REG ;AJUSTA REGISTRADOR OPTION_REG PARA OPERAR COM TMR0 COM PRESCALER DE 1:256
BANK0
CLRF PORTA
CLRF PORTB
MOVLW 0x00
MOVWF ADCON0 ;DESABILITA COMPARADORES INTERNOS
MOVLW 0x00
MOVWF CCP1CON ;DESABILITA MÓDULO CCP1 INTERNO
MOVLW 0xE0
MOVWF INTCON ;LIGA CHAVE GERAL DAS INTERRUPÇÃES E DOS PERIFÉRICOS E HABILITA INTERRUPÇÃO DO TMR0
CLRF TMR0
CLRF CONTA
GOTO MAIN
MAIN
GOTO $ ;LOOPING ETERNO. AGUARDA INTERRUPÇÃO OCORRER
END ;FIM DO CÓDIGO
Re: PROGRAMA PISCA LED EM ASSEMBLER

Enviado:
22 Fev 2015 19:47
por nagkiller
Muito bem, agora só falta deixar o código com identação!!!
Não se esqueça tambem que a instrução END não pode ficar na primeira coluna!!!
Apenas os LABELs, #defines, macros, #includes...
Flw...
Re: PROGRAMA PISCA LED EM ASSEMBLER

Enviado:
22 Fev 2015 23:25
por EvandrPic
nagkiller, não tem nada a ver isso que você disse sobre a "posição" da diretiva
END.
Outra observação é que
END não é uma instrução do microcontrolador e sim uma diretiva do compilador MPASM.
nagkiller escreveu:Não se esqueça tambem que a instrução END não pode ficar na primeira coluna!!!
Apenas os LABELs, #defines, macros, #includes...
Flw...
Re: PROGRAMA PISCA LED EM ASSEMBLER

Enviado:
23 Fev 2015 06:11
por nagkiller
Oia... Diretiva!!! Huuuummm... Termos técnicos!!! Muito bem!!!
E o que eh uma diretiva??? Nao eh um conjunto de instruçoes???
Aqui eu recebia avisos ao estar na primeira coluna!!! Por isso ficou automatico não a deixar na primeira coluna!!!
Re: PROGRAMA PISCA LED EM ASSEMBLER

Enviado:
23 Fev 2015 08:48
por Pask
Alguns esclarecimentos:
INDENTAÇÃO E NÃO "IDENTAÇÃO" => Os avisos sobre esta ou aquela instrução estar na primeira ou na segunda coluna realmente aparecem após a compilação do código, mas isto é apenas um aviso e não constitui erro de compilação e não prejudica em nada o bom funcionamento do código. A posição das palavras depende apenas do "gosto do freguês" ou do seu capricho em ajeitar os termos para uma boa apresentação visual do código.
DIRETIVA => Trata-se de uma indicação ou instrução dada. END em assembler não é instrução é sim um comando obrigatório da linguagem assembly para indicar ao compilador o ponto onde o seu código terminou. MOVWF SFR, isto sim é uma diretiva que move o conteúdo de work para um registrador especial em um endereço na memória RAM do MCU.
Um abraço.