Академический Документы
Профессиональный Документы
Культура Документы
IDAS DIGITAIS
#DEFINE LED_VD GPIO, 5 ;Pino 2
#DEFINE LED_AM GPIO, 4 ;Pino 3
#DEFINE LED_VM GPIO, 1 ;Pino 6
;DEFINI C
~
AO DO SELETOR DO BANCO DE MEM
ORIA
#DEFINE Banco STATUS, RP0 ;Bit RP0 do registrador Status (SFR)
;CONFIGURAC
~
AO DOS SFRS
BSF Banco ;Selec~ ao do Banco 1 da Mem oria
MOVLW B00000001 ;Modo anal ogico/digital dos pinos de I/O
MOVWF ANSEL
MOVLW B00001101 ;Direc~ ao dos pinos de I/O digitais
MOVWF TRISIO
BCF Banco ;Selec~ ao do Banco 0 da Mem oria
MOVLW B00000111 ;Desativa c~ ao do comparador de tens~ ao
MOVWF CMCON
;INICIALIZAC
~
AO DO PROGRAMA
BCF LED_VD ;Apaga o LED verde
BCF LED_AM ;Apaga o LED amarelo
BCF LED_VM ;Apaga o LED vermelho
;ROTINA PRINCIPAL, implementa um loop infinito
Principal:
BSF LED_VD ;Acende o LED verde
CALL DELAY_500MS ;Pausa de 500 ms
46 CAPTULO 7. PROGRAMAO ASSEMBLY
BCF LED_VD ;Apaga o LED verde
CALL DELAY_500MS ;Pausa de 500 ms
GOTO Principal ;Salto para o incio da rotina principal
; Rotina de delay de 500ms. Repete 200x a rotina de 2,5ms
DELAY_500MS:
MOVLW .200
MOVWF TEMP500
DL_50
CALL DELAY_2MS ;Pausa de 10ms
DECFSZ TEMP500,F ; decrementa TEMP500, zerou?
GOTO DL_50 ; n~ ao, repete o ciclo
RETURN ; sim, finaliza a rotina
; Rotina de delay de 2,5ms. Repete 250x a rotina de 10us
DELAY_2MS:
MOVLW .250
MOVWF TEMP1
DL_10 ; cada ciclo gasta 10microsegundos
NOP ; gasta um ciclo de tempo
NOP ; gasta um ciclo de tempo
NOP ; gasta um ciclo de tempo
NOP ; gasta um ciclo de tempo
NOP ; gasta um ciclo de tempo
NOP ; gasta um ciclo de tempo
NOP ; gasta um ciclo de tempo
DECFSZ TEMP1,F ; decrementa TEMP1, zerou?
GOTO DL_10 ; n~ ao, repete o ciclo
RETURN ; sim, finaliza a rotina
;FIM DO PROGRAMA
END
7.3.2 Dissecando o Pisca LED
Vamos detalhar os blocos do programa passo a passo:
7.3. EXEMPLOS DE PROGRAMAS 47
Incluso
;INCLUSAO DE ARQUIVOS
#INCLUDE <p12f675.inc> ;Defini c~ oes referentes ao PIC12F675
Nesse bloco, incluimos um arquivo externo, no caso o arquivo p12f675.inc que contm
os nomes dos registradores do microcontrolador em uso.
Congurao
;CONFIGURAC
~
AO DO MODO DE FUNCIONAMENTO
__CONFIG _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CPD_OFF & _CP_OFF &
Nesse bloco, conguramos os fuses internos do microcontrolador, eles funcionam como
chaves internas que podem ser ligadas ou desligadas como, por exemplo:
_INTRC_OSC_NOCLKOUT - o PICutilizar o oscilador interno de 4MHz, o que garante
que cada ciclo de mquina ter 1s de durao.
_WDT_OFF - desliga o WatchDogTime.
_PWRTE_OFF - desliga o reset de power on.
_MCLRE_OFF - desliga o masterclear.
Variveis
;DEFINI C
~
AO DOS NOMES E ENDERE COS DAS VARI
IDAS DIGITAIS
#DEFINE LED_VD GPIO, 5 ;Pino 2
#DEFINE LED_AM GPIO, 4 ;Pino 3
#DEFINE LED_VM GPIO, 1 ;Pino 6
Nesse bloco, associamos nomes signicativos aos pinos do microcontrolador.
Congurao dos registradores
;DEFINI C
~
AO DO SELETOR DO BANCO DE MEM
ORIA
#DEFINE Banco STATUS, RP0 ;Bit RP0 do registrador Status (SFR)
;CONFIGURAC
~
AO DOS SFRS
BSF Banco ;Selec~ ao do Banco 1 da Mem oria
MOVLW B00000001 ;Modo anal ogico/digital dos pinos de I/O
MOVWF ANSEL
MOVLW B00001101 ;Direc~ ao dos pinos de I/O digitais
MOVWF TRISIO
BCF Banco ;Selec~ ao do Banco 0 da Mem oria
MOVLW B00000111 ;Desativa c~ ao do comparador de tens~ ao
MOVWF CMCON
Nesse bloco conguramos alguns registradores internos que sero utilizados no programa.
Perceba que inicialmente colocamos o valor numrico (literal) para o registrador W e, na
sequncia, transferimos o valor de W para o registrador alvo.
Inicializao
;INICIALIZAC
~
AO DO PROGRAMA
BCF LED_VD ;Apaga o LED verde
BCF LED_AM ;Apaga o LED amarelo
BCF LED_VM ;Apaga o LED vermelho
Inicializamos os pinos de sada, apagando todos os LEDs pela imposio de valor zero aos
pinos correspondentes.
7.3. EXEMPLOS DE PROGRAMAS 49
Loop Principal
;ROTINA PRINCIPAL, implementa um loop infinito
PRINCIPAL:
BSF LED_VD ;Acende o LED verde
CALL DELAY_500MS ;Pausa de 500 ms
BCF LED_VD ;Apaga o LED verde
CALL DELAY_500MS ;Pausa de 500 ms
GOTO PRINCIPAL ;Salto para o incio da rotina principal
Implementamos um loop innito criando o label "PRINCIPAL", executando algumas in-
strues e, no nal, efetuando um salto incondicional (GOTO) para o mesmo label.
Iniciamos ligando o LED verde pela imposio de nvel "1"no pino correspondente,
chamamos uma subrotina que provoca um delay de 500ms, colocamos nvel "0"no LED,
chamamos novamente a subrotina de delay de 500ms e recomeamos a mesma sequn-
cia.
Rotinas de Delay
; Rotina de delay de 500ms. Repete 200x a rotina de 2,5ms
DELAY_500MS:
MOVLW .200
MOVWF TEMP500
DL_50
CALL DELAY_2MS ;Pausa de 2,5ms
DECFSZ TEMP500,F ; decrementa TEMP500, zerou?
GOTO DL_50 ; n~ ao, repete o ciclo
RETURN ; sim, finaliza a rotina
; Rotina de delay de 2,5ms. Repete 250x a rotina de 10us
DELAY_2MS:
MOVLW .250
MOVWF TEMP1
DL_10 ; cada ciclo gasta 10microsegundos
NOP ; gasta um ciclo de tempo
NOP ; gasta um ciclo de tempo
NOP ; gasta um ciclo de tempo
NOP ; gasta um ciclo de tempo
NOP ; gasta um ciclo de tempo
50 CAPTULO 7. PROGRAMAO ASSEMBLY
NOP ; gasta um ciclo de tempo
NOP ; gasta um ciclo de tempo
DECFSZ TEMP1,F ; decrementa TEMP1, zerou?
GOTO DL_10 ; n~ ao, repete o ciclo
RETURN ; sim, finaliza a rotina
O delay de 500ms conseguido atravs da repetio de 200 vezes a rotina de atraso
de 2,5ms. Iniciamos colocando o valor 200 na varivel TEMP500 (atravs do registrador W)
e efetuamos sucessivas chamadas rotina de atraso de 2,5ms e vamos decrementando a
varivel TEMP500 at que ela chegue a zero, momento em que haver o retorno (RETURN)
da subrotina.
Analogamente, temos a rotina de atraso de 2,5ms, que obtida pela repetio de 250
vezes de um bloco que consome 10 microsegundos. Esse tempo conseguido atravs de
sete instrues NOP (que no fazem nada e consomem 1 ciclo de mquina), uma instruo
DECFSZ que consome mais 1 ciclo de mquina e a instruo GOTO que consome 2 ciclos
de mquina.
Fim do Programa
;FIM DO PROGRAMA
END
imprescindvel que o programa se encerre com a instruo END.
Resumo
Nesta aula voc aprendeu sobre a programao assembly do PIC12F675 atravs de um
exemplo comentado.
Atividades de aprendizagem
Responda s seguintes questes:
1- Qual a linguagem que o microprocessador entende?
2- O que assembly?
3- O que faz o comando NOP?
4- Como se implementa um loop innito em assembly?
5- Como se efetua a chamada de uma subrotina em assembly?
6- Como se efetua o retorno de uma subrotina em assembly?
Captulo 8
Programao Assembly (continuao)
Objetivos da aula
Expandir os conceitos sobre a programao assembly do microcontrolador PIC12F675
atravs de exemplos.
8.1 Programando Assembly com Interrupo
Assim que ocorrer um evento de interrupo e o bit GIE e a habilitao individual da inter-
rupo estejam ativados, teremos o desvio do programa para o vetor de interrupo 0x0004.
Para se tratar adequadamente a interrupo, deve-se observar o seguinte:
1. Salvamento do contexto atual - procedimento necessrio para se preservar o contedo
dos registradores que estejam sendo utilizados no programa principal e que possam
ser alterados pela sub-rotina de tratamento da interrupo. Normamente deve-se sal-
var os registradores W e STATUS.
2. Vericao do tipo de interrupo que ocorreu - utiliza-se uma sequencia de teste
BTFSC para vericar os ags das possveis interrupes, desviando-se para o trata-
mento individual de cada uma.
3. Tratamento da interrupo - apaga-se o ag da interrupo em questo e procede-se
execuo das aes necessrias ao atendimento da interrupo.
4. Recuperao do contexto e retorno - restaura-se o contedo dos registradores STSUS
e W e executa-se o RETFIE.
8.1.1 Pisca LED com Interrupo
Retomamos o programa anterior em que o LED verde pisca a cada 500ms e acrescentamos
um tratamento de interrupo externa para acender o LED vermelho sempre que a chave 1
passar do nvel baixo para o nvel alto.
51
52 CAPTULO 8. PROGRAMAO ASSEMBLY (CONTINUAO)
;INCLUSAO DE ARQUIVOS
#INCLUDE <p12f675.inc> ;Defini c~ oes referentes ao PIC12F675
;CONFIGURAC
~
AO DO MODO DE FUNCIONAMENTO
__CONFIG _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CPD_OFF & _CP_OFF &
;DEFINI C
~
AO DOS NOMES E ENDERE COS DAS VARI
IDAS DIGITAIS
#DEFINE LED_VD GPIO, 5 ;Pino 2
#DEFINE LED_AM GPIO, 4 ;Pino 3
#DEFINE LED_VM GPIO, 1 ;Pino 6
;DEFINI C
~
AO DO SELETOR DO BANCO DE MEM
ORIA
#DEFINE Banco STATUS, RP0 ;Bit RP0 do registrador Status (SFR)
;CONFIGURAC
~
AO DOS SFRS
BSF Banco ;Selec~ ao do Banco 1 da Mem oria
MOVLW B00000001 ;Modo anal ogico/digital dos pinos de I/O
MOVWF ANSEL
MOVLW B00001101 ;Direc~ ao dos pinos de I/O digitais
54 CAPTULO 8. PROGRAMAO ASSEMBLY (CONTINUAO)
MOVWF TRISIO
BCF Banco ;Selec~ ao do Banco 0 da Mem oria
MOVLW B00000111 ;Desativa c~ ao do comparador de tens~ ao
MOVWF CMCON
MOVLW B10010000 ;Ativa interrupc~ oes GIE e interrupc~ao externa INTE
MOVWF INTCON
;INICIALIZAC
~
AO DO PROGRAMA
BCF LED_VD ;Apaga o LED verde
BCF LED_AM ;Apaga o LED amarelo
BCF LED_VM ;Apaga o LED vermelho
;ROTINA PRINCIPAL, implementa um loop infinito
PRINCIPAL:
BSF LED_VD ;Acende o LED verde
CALL DELAY_500MS ;Pausa de 500 ms
BCF LED_VD ;Apaga o LED verde
CALL DELAY_500MS ;Pausa de 500 ms
GOTO PRINCIPAL ;Salto para o incio da rotina principal
; Rotina de delay de 500ms. Repete 200x a rotina de 2,5ms
DELAY_500MS:
MOVLW .200
MOVWF TEMP500
DL_50
CALL DELAY_2MS ;Pausa de 10ms
DECFSZ TEMP500,F ; decrementa TEMP500, zerou?
GOTO DL_50 ; n~ ao, repete o ciclo
RETURN ; sim, finaliza a rotina
; Rotina de delay de 2,5ms. Repete 250x a rotina de 10us
DELAY_2MS:
MOVLW .250
MOVWF TEMP1
DL_10 ; cada ciclo gasta 10microsegundos
NOP ; gasta um ciclo de tempo
NOP ; gasta um ciclo de tempo
8.1. PROGRAMANDO ASSEMBLY COM INTERRUPO 55
NOP ; gasta um ciclo de tempo
NOP ; gasta um ciclo de tempo
NOP ; gasta um ciclo de tempo
NOP ; gasta um ciclo de tempo
NOP ; gasta um ciclo de tempo
DECFSZ TEMP1,F ; decrementa TEMP1, zerou?
GOTO DL_10 ; n~ ao, repete o ciclo
RETURN ; sim, finaliza a rotina
;FIM DO PROGRAMA
END
8.1.2 Dissecando o Pisca LED com Interrupo
Vamos detalhar, passo a passo, os blocos do programa que foram alterados/acrescentados
no programa anterior:
Variveis
;DEFINI C
~
AO DOS NOMES E ENDERE COS DAS VARI