Először itt is az assembly kódot érdemes érteni, és ha már minden világos, akkor lehet égetni, kipróbálni, és esetleg megvizsgálni a C kódot.
LIST P=16F877
#INCLUDE "P16F877.INC"
ERRORLEVEL 0, -302 ; suppress bank selection messages
__CONFIG _XT_OSC&_CP_OFF&_WDT_OFF&_LVP_OFF
CBLOCK 0x70 ;A Minden BANK-ból látható GPR kezdőcím
W_SAVE
STATUS_SAVE
ENDC
#include "m_bank.asm"
ORG 0
GOTO MAIN ;Beugrunk a MAIN loopba
ORG 4
; Elmentjük a Work és Status regisztereket
MOVWF W_SAVE ;Először a Work regisztert
MOVFW STATUS ;STATUS-t bele a már lementett Workbe
MOVWF STATUS_SAVE ;Status_save-be beletölti a Worköt
BCF INTCON,T0IF ;Töröljük az RBIF flag bitet (Jelezzük, kezeltük a megszakítást)
MOVLW B'11111111'
XORWF PORTD,F ;XOR PORTD bitjeit
; Visszatöltjük a Work és Status regisztereket
MOVFW STATUS_SAVE
MOVWF STATUS
MOVFW W_SAVE
RETFIE ;Visszajövünk az interruptból
MAIN
BANK1 ;Unit az m_bank.asm-ben
MOVLW B'00000000' ;Betöltjük az akksiba a TRISD-be valót
MOVWF TRISD ;Beletöltjük (mind kimenet a nulla miatt)
MOVLW B'00000111' ;Betöltjük az akksiba az OPTION_REG-be valót
MOVWF OPTION_REG ;Beletöltjük... Előosztó: 1:256
BANK0 ;BANK0-ba visszalépünk
MOVLW B'01010101' ;Betöltjük az akksiba a PORTD-be valót
MOVWF PORTD ;Beletöltjük a PORTD-be
;Beállítjuk a interruptot
BSF INTCON,T0IE ;Engedélyezzük az interruptot a Timer0-ra
BSF INTCON,GIE ;General Interrupt Enable bitet 1-re állítva bekapcsolunk mindent
LOOP
NOP
GOTO LOOP ;Vissza a végtelen ciklusba
END ;Teljes program végét jelentő END
Ha végeztünk, akkor annyit kell látnunk, hogy fix időközönként "invertálódnak" a ledek. Hasonló effekt mint előzőekben, annyi különbséggel, hogy most az időzítőnk vezérel mindent!
Az egész program forráskód, segéd rutinok és a lefordított hex: tmr0_asm.zip
Nézzük a C kódot...
A cikk még nem ért véget, lapozz!
Értékeléshez bejelentkezés szükséges!