Microcontrolador PIC 16F628A no Linux

Projeto PiscaLed.
Código fonte corrigido para rodar no MPLAB X IDE v2.26 para Linux
Utilizado como exemplo no livro “Programando microcontroladores pic linguagem c base no pic18f4520 teoria e pratica”, de Renato A. Silva.

;---------------------------------------------------
;PiscaLed.asm
;Faz um led lig. na porta RB0 piscar a 1 Hz.
;
;Elias Andrade - esan_br at yahoo.com.br
;Versao 0.01 - 201401215
;Corrigido o codido para rodar no MPLAB X IDE v2.26 para Linux
;Modelo PIC 16F627 - 16F628
;
;Baseado no exemplo do livro:
;Programando microcontroladores pic linguagem c base no pic18f4520 teoria e 
;pratica. Cod 9788599823170 de Renato A. Silva
;---------------------------------------------------

PROCESSOR 16F627
#include <p16f627a.inc>

    __CONFIG    _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC

ORG 0x0000

;---------------------------------------------------
;variáveis de memórias
miliseg   equ 0x20
nsegundos equ 0x21
;---------------------------------------------------
inicio:
    nop                  ; fica um ciclo sem fazer nada
    movlw   0x00         ; zera o registrador W
    movwf   STATUS       ; coloca o valor de W em Status
    bsf     STATUS, RP0  ; Vai para o banco 1 da RAM
    movlw   b'00000000'  ; coloca 0 no registrador W
    movwf   TRISA        ; determina o modo do PORTA
    movlw   b'00000000'  ; coloca 0000 0001 em W
    movwf   TRISB        ; Bit 0 de PORTB como saída
    bcf     STATUS, RP0  ; retorna ao banco 0
    clrf    PORTB        ; limpa o buffer do PORTB
    clrf    PORTA        ; limpa o buffer do PORTA

loop:
    bsf     PORTB, 0     ; led acendeu na porta RB0
    movlw   0x04         ; carrega W com 4
    movwf   nsegundos    ; carrega o valor para variável
    call    umsegundo    ; chama rotina de um segundo
    bcf     PORTB, 0     ; led apagou na porta RB0
    movlw   0x04         ; carrega W com 4
    movwf   nsegundos    ; carrega o valor para variável
    call    umsegundo    ; chama rotina de um segundo
    goto    loop         ; repete o processo infinitamente

umsegundo:
;---------------------------------------------------
; esta rotina irá executar um loop quantas vezes for
; o valor de nsegundos. ( 4 x 250 ) = umsegundo 1.000035 seg.

    movlw   0xFA            ; carrega W com 250
    call    milisegundos    ; executa loop por 250 milisegundos
    decfsz  nsegundos, F    ; número de segundos = zero ?
    goto    umsegundo       ; não, então repete a rotina
    retlw   0               ; sim, então retorna com 0 em w

;---------------------------------------------------
milisegundos:
    movwf   miliseg
    Delay                       ; total 1000 ciclos
    movlw   0xF8                ; 248
    call    microsegundos       ;( 248 x 4 ) + 2 = 994 microssegundos
    nop                         ; 995
    decfsz  miliseg,    F       ; subtrai 1 e salta se for 0
    goto    Delay               ; ainda não é zero, então continua
    retlw   0                   ; sai desta rotina e volta a rotina
principal

;---------------------------------------------------
microsegundos:
addlw   0xFF                ; subtrai 1 de w ou w = w - 1
btfss   STATUS, Z           ; salta se w = 0
goto    microsegundos       ; ainda não é zero então repete
retlw   0                   ; retorna a rotina principal
;---------------------------------------------------
END;
;---------------------------------------------------
Anúncios
Esse post foi publicado em PIC e marcado . Guardar link permanente.

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s