alvaroluiz2@yahoo.com.br
http://www.alvieletronica.blogspot.com
=======================================
SoftWare com 16F628 bem fácil.
"SEU PRIMEIRO SOFTWARE PISCA-PISCA
de 1 segundo COM LED"
;==================================================
; só pisca um LED, tem saida 1Mhz e 244Hz
;ESTUDOS DO 16F628
;por alvaroluiz2008-site@yahoo.com.br
;
;==================================================
; 16F628A
;
; RA2----(LED)----gnd (1Hz)
;
; RA3-------------> 244Hz
;
; RA6-----> 1MHz
;
;
;
;-------------------------------------
nolist
#include "p16f628A.inc"
;#include "alvi6.mac"
list
__CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_CLKOUT & _LVP_OFF ;
; -------------------------------------------------------------------------
status equ STATUS
c equ C
z equ Z
; --------------
down1 equ 0x30
; ---------------
wr equ 0x43
st equ 0x44
fsrr equ 0x45
; ==============================
org 0
goto start
; ===============================
org 4
goto isr_timer0
;===============================
start:
movlw 0x07
movwf CMCON
bsf STATUS,RP0 ;bank1 passando para a página 1 (de 0x80-0xFF)
movlw b'10100000'
movwf TRISA
; ============================================================
; habilitando interrupt para timer0
; trabalhando com _INTRC_OSC_CLKOUT = 4MHz/4=1MHz
; ============================================================
bsf status,RP0
movlw b'00000011' ;1MHz/16/256=244
movwf OPTION_REG
;
bcf status,RP0
movlw b'10100000'
movwf INTCON
;=============================================
loop:
movf down1,f
btfss status,z
goto loop
movlw .244 ;1MHz/16/256=244/244=1Hz
movwf down1
movf PORTA,w
xorlw b'00000100'
movwf PORTA
goto loop
;========== INTERRUPT =============================================
isr_timer0: ; ;1MHz/16/256=244 monitorado em RA3
bsf PORTA,3
;
movwf wr ;salvar o reg W
swapf STATUS,W ;preservando de STATUS, pegamos este invertido
movwf st ;e o salvamos invertido
clrf STATUS ;aqui salvamos wr,status e FSR
movf FSR,W ;esta inscrução altera STATUS, mas este já foi salvo
movwf fsrr ;podemos salvar FSR, e deixa-lo livre para ISR usa-lo
bcf INTCON,T0IF
; =============================================================================
movf down1,f
btfss status,z
decf down1,f
; ===================================================
intf:
movf fsrr,W
movwf FSR
swapf st,W
movwf STATUS
swapf wr,F
swapf wr,W
bcf PORTA,3
retfie
end
;=============================================================================
Outro jeito de fazer só que agora com 12F675
Compare os 2 jeitos ache as diferenças
; Pisca 1 LED COM O 16F675
;===================================
; ___ ___
; k a vcc -| |_| |- gnd
; |-LED-/\/\/-- gp5 <-| 12F675 |<- gp0 (dados prog)
; | gp4 ->| |-> gp1 (CLK prog)
; --- (MCLR) gp3-->|_________|-> gp2
;
; ============================================
include "p12f675.inc"
include "alvi.mac"
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_OFF & _INTRC_OSC_CLKOUT & _MCLRE_OFF & _CPD_OFF
;=======================================================
cblock 0x20
ra,rb,rc,rd,ria,rib,ric,rid,wr,st,fsrr
endc
; ===================================================
org 0
goto inicio ;start
org 4
goto isr_timer0
; =========================================
; ========== S T A R T P R O G =========
; =========================================
inicio
clrf STATUS ;bank0
call H'3ff' ;ajuste RC interno
bsf STATUS,RP0
movwf OSCCAL
clrf STATUS
movlw 0x07 ;comparador off
movwf CMCON
bsf STATUS,RP0 ;bank1
; movlw b'01100100' ;fosc/64 e analogic inp ans2
; movwf ANSEL
movlw b'11001001'
movwf TRISIO
movlw b'00000110' ;pull up
movwf WPU
movlw b'10000010'
movwf OPTION_REG
clrf STATUS ;garantir bank 0
bsf INTCON,T0IE ;
bsf INTCON,GIE ;habilitar isr geral
; ================================
;======== I N I C I A L I Z A D O R ======
; =========================================
loop:
goto loop
; =======================
; ==== interrupt ======
; =======================
isr_timer0:
movwf wr
swapf STATUS,W
movwf st
clrf STATUS
bcf INTCON,T0IF
; =====================
incf rid,f
jnz intf
movlw 0x20
xorwf GPIO,f
; ====================
intf:
swapf st,W
movwf STATUS
swapf wr,F
swapf wr,W
retfie
;================================================
end
ALVI.MAC
;###############################
;# Macros e Definições #
;# Alvaro Luiz Stendardi Fontes#
;# alvaroluiz2@yahoo.com.br #
;# set 2004 mod maio 2005 #
;# ALVI8.MAC #
;###############################
#define c C ; #
#define z Z ; #
#define f F ; #
#define w W ; #
;###############################
;# jump se bit/byte = 1 p/label
;#
jbs macro byte,bit,label;
btfsc byte,bit;
goto label;
endm;
;##############################
;# jump se bit/byte = 0 p/label
;#
jbc macro byte,bit,label;
btfss byte,bit;
goto label;
endm;
;##############################
; jump se z=1
;
jz macro label;
btfsc STATUS,Z;
goto label;
endm;
;##############################
; jump se z=0 para o label
;
jnz macro label;
btfss STATUS,Z;
goto label;
endm;
;##############################
; jump se c=1 p/ o label (;
jc macro label;
btfsc STATUS,C;
goto label;
endm;
;##############################
; jump se c=0 p/ o label (>)
;
jnc macro label ;
btfss STATUS,C ;
goto label;
endm ;
;##############################
; movlf reg,value
;
movlf macro reg,value;
movlw value;
movwf reg;
endm;
;##############################
; cpi r,n C Z
; r = n -> 1 1
; r > n -> 0 0
; r < n -> 1 0
;
cpi macro r,n;
movf r,W;
sublw n;
endm;
;##############################
;# cp r1,r2 C Z
;# r1 = r2 -> 1 1
;# (ri:r2) r1 > r2 -> 0 0
;# r1 < r2 -> 1 0
;#
cp macro r1,r2;
movf r1,W ;
subwf r2,W ;
endm ;
;##############################
;# mov r1,r2 (r1=r2)
;
mov macro r1,r2;
movf r2,W;
movwf r1;
endm;
;##############################
;# addi r,n (r=r+v)
;#
addi macro r,n;
movf r,W;
addlw n;
movwf r;
endm;
;##############################
;# add r1,r2 (r1=r1+r2)
;
add macro r1,r2;
movf r2,W;
addwf r1,F;
endm;
;##############################
;# subi reg,n (reg=reg-n)
;
subi macro reg,n;
movlw n;
subwf reg,F;
endm;
;##############################
; sub r1,r2 (r1=r1-r2)
;
sub macro r1,r2;
movf r2,W;
subwf r1,F;
endm;
;##############################
; andi reg,n (reg=reg & n)
;
andi macro reg,n;
movlw n;
andwf reg,F;
endm;
;##############################
;# and r1,r2 (r1=r1 & r2)
;
and macro r1,r2;
movf r2,W;
andwf r1,F;
endm;
;##############################
;# ori r1,n
;#
ori macro r1,n;
movlw n;
iorwf r1,F;
endm;
;##############################
;# or r1,r2 (r1=r1|r2)
;
or macro r1,r2;
movf r2,W;
iorwf r1,F;
endm;
;##############################
;# bank0
;
bank0 macro;
bcf STATUS,5;
bcf STATUS,6;
endm;
;##############################
;# bank1;
;#
bank1 macro ;
bsf STATUS,5;
bcf STATUS,6;
endm;
;##############################
;soma 16bits rab=rab+rcd AN526
;#
add16 macro ;
add rb,rd ;
btfsc STATUS,C ;
incf ra,F ;
add ra,rc ;
endm ;
;##############################
;# sub 16 bits rab=rab-rcd
;#
sub16 macro ;
comf rd,F ;
incf rd,F ;
btfsc STATUS,Z ;
decf rc,F ;
comf rc,F ;
add16 ;
endm ;
;##############################
,
INDEX: outros estudos