PROGRAMA PISCA LED EM ASSEMBLER

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

PROGRAMA PISCA LED EM ASSEMBLER

Mensagempor Pask » 21 Fev 2015 16:58

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!
Pask
Word
 
Mensagens: 600
Registrado em: 22 Dez 2006 19:19

Re: PROGRAMA PISCA LED EM ASSEMBLER

Mensagempor andre_luis » 21 Fev 2015 20:29

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 ).
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Re: PROGRAMA PISCA LED EM ASSEMBLER

Mensagempor Pask » 21 Fev 2015 20:43

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?
Pask
Word
 
Mensagens: 600
Registrado em: 22 Dez 2006 19:19

Re: PROGRAMA PISCA LED EM ASSEMBLER

Mensagempor andre_luis » 21 Fev 2015 23:01

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.
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Re: PROGRAMA PISCA LED EM ASSEMBLER

Mensagempor nagkiller » 22 Fev 2015 13:08

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...
Nagkiller
Avatar do usuário
nagkiller
Bit
 
Mensagens: 40
Registrado em: 21 Jul 2007 09:38

Re: PROGRAMA PISCA LED EM ASSEMBLER

Mensagempor ze » 22 Fev 2015 13:58

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ç
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Re: PROGRAMA PISCA LED EM ASSEMBLER

Mensagempor Pask » 22 Fev 2015 14:46

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.
Pask
Word
 
Mensagens: 600
Registrado em: 22 Dez 2006 19:19

Re: PROGRAMA PISCA LED EM ASSEMBLER

Mensagempor andre_luis » 22 Fev 2015 14:56

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
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Re: PROGRAMA PISCA LED EM ASSEMBLER

Mensagempor nagkiller » 22 Fev 2015 16:07

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...
Editado pela última vez por nagkiller em 22 Fev 2015 19:54, em um total de 1 vez.
Nagkiller
Avatar do usuário
nagkiller
Bit
 
Mensagens: 40
Registrado em: 21 Jul 2007 09:38

Re: PROGRAMA PISCA LED EM ASSEMBLER

Mensagempor Pask » 22 Fev 2015 16:58

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
Pask
Word
 
Mensagens: 600
Registrado em: 22 Dez 2006 19:19

Re: PROGRAMA PISCA LED EM ASSEMBLER

Mensagempor Pask » 22 Fev 2015 19:31

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
Pask
Word
 
Mensagens: 600
Registrado em: 22 Dez 2006 19:19

Re: PROGRAMA PISCA LED EM ASSEMBLER

Mensagempor nagkiller » 22 Fev 2015 19:47

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...
Nagkiller
Avatar do usuário
nagkiller
Bit
 
Mensagens: 40
Registrado em: 21 Jul 2007 09:38

Re: PROGRAMA PISCA LED EM ASSEMBLER

Mensagempor EvandrPic » 22 Fev 2015 23:25

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...
EvandrPic
Dword
 
Mensagens: 2116
Registrado em: 31 Mar 2010 15:05

Re: PROGRAMA PISCA LED EM ASSEMBLER

Mensagempor nagkiller » 23 Fev 2015 06:11

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!!!
Nagkiller
Avatar do usuário
nagkiller
Bit
 
Mensagens: 40
Registrado em: 21 Jul 2007 09:38

Re: PROGRAMA PISCA LED EM ASSEMBLER

Mensagempor Pask » 23 Fev 2015 08:48

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.
Pask
Word
 
Mensagens: 600
Registrado em: 22 Dez 2006 19:19

Próximo

Voltar para PIC

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

x