PURPIC, den bärbara PICkit2 klonen (5 / 9 steg)
Steg 5: PIC 12F508 annotated källkoden; om någon har ett problem montering som postat, kommentera gärna
lista över p = 12F508; lista direktiv att definiera processor
#include; processorn varierande definitioner
__CONFIG _MCLRE_OFF & _CP_ON & _WDT_OFF & _IntRC_OSC
; '__CONFIG' direktiv används för att bädda in konfiguration ord inom .asm filen.
; Lables efter direktivet finns i filen respektive inkluderingsfiler.
; Se respektive datablad för mer information om konfiguration word.
; *** VARIERANDE DEFINITIONER
cblock 07h
qw1
qw2
Temp
testa
räknaren
counter2
on_counter
off_counter
endc
; PINUT
stift 1 är makt
; stift 8 är marken
; pin 5 är inte ansluten
knappen equ 3; 4, PIN-kod till knappen. inre pullup ligger
utgång equ 4; pin 3, till P-FET; Det finns ingen inre pullup på detta stift.
Bör har jag lagt en fysisk pullup på utfärda utegångsförbud för P-FET,
; om PIC skulle brownout eller något annat fel.
LEDDE equ 1; stift 6, Hej = på Lo = av
LBI equ 5; stift 2, låg batterinivå indikator produktionen av LT1308 går här.
Om du anger börvärdessignalerna motstånden till 825K och 67K
; normvärdet är 2.9V. Se LT1308 datablad för detaljer.
; Detta stift inte heller har en inre pullup. Jag kom ihåg att sätta detta på pcb. :)
;**********************************************************************
ORG 0X3FF; processorn återställa vektor
; Inre RC kalibreringsvärde placeras på platsen 0x3FF av mikrochip
; som en movlw k, där k är ett värde.
ORG 0X000; Coding börjar här
movwf OSCCAL; Uppdatera registret med fabriken cal värde
initiera
movlw b '00000000'
; 7:lo_enable vakna, 6:lo_enable svag pullups; 5:lo_timer klocka källa är intern
; 4:hi_timer klocka källa aktiverad på fallande kant; 3:lo_prescaler Välj timer (vs WDT)
2-0:prescaler (p22)
alternativet
Start
samtal tydligt; set tristate och produktionen av I/O pins till standard/OFF stat
btfss GPIO, knapp; kontrollera knappen
goto på; om tryckt, gå till på
sömn, om inte, gå till sömn
NOP
På
BSF GPIO, ledde, slå på LED
BCF GPIO, utgång, slå på P-FET
Ring DD; Dämpningstid dröjsmål
btfss GPIO, knapp; kontrollera knappen
gå till $-1; vänta tills det släpps innan du fortsätter huvudloop
Ring DD
loop
btfss GPIO, LBI; här kontrollerna batteriindikatorn låg
goto LB_shutdown; om drog låg, sedan gå till lågt batteri avstängning
btfsc GPIO, knappen, så länge som knappen inte är intryckt, PIC stannar i "loop".
goto loop
avstängning; om knappen trycks, allt stängs av och bilden går för att sova.
; Enheten startar i början av koden när det vaknar, FYI
Ring tydligt;
Ring DD
btfss GPIO, knapp
gå till $-1
Ring DD
sömn
NOP
; Subroutines;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
klart
movlw b "101000"
tris GPIO
movlw b "010000"
movwf GPIO
återvända, denna enhet inte faktiskt har en "retur" kommandot.
; Detta är en pseudo kommando, som faktiskt är monterad som kommandot "retlw 0".
; Vilket betyder att det placeras bokstavlig 0 i W ackumulatorn när det dyker.
DD
movlw 100
movwf qw2
gå till dsub.2
DSUB.2
decfsz qw1
gå till $-1
decfsz qw2
gå till $-3
returnera
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
LB_shutdown; Detta är den fancy-byxor avslutningsproceduren
LB.1
clrf counter
LB.2
btfss GPIO, LBI
gå till LB.3
BSF GPIO, ledde
goto loop
LB.3
gå till $+ 1. bara några extra fördröjning
gå till $+ 1
gå till $+ 1
gå till $+ 1
gå till $+ 1
gå till $+ 1
gå till $+ 1
gå till $+ 1
decfsz counter, f
gå till $+ 2
gå till shutdown_kewl
movf counter, w
movwf qw2
movlw b '000010'
xorwf GPIO, f
Ring DLB
movwf temp
decfsz temp, f
gå till LB.2
gå till avstängning
DLB, förseningen låg batterinivå rutin
btfss GPIO, knapp; ständigt kontrollera status för knappen
retlw 1, om den är intryckt, sedan omedelbart pop med bokstavlig.1 i ackumulatorn,
så vi vet att knappen
; trycktes och förseningen var lämnat tidigt... så vi kan stänga av
; makt istället för att fortsätta fancy pants blinky ljus stänga ned rutin.
gå till $+ 1
decfsz qw1
gå till DLB
decfsz qw2
gå till DLB
retlw.0
shutdown_kewl; tona ut LED, i stället för bara att stänga av
clrf on_counter
movlw 1.
movwf off_counter
shutdown_kewl.1
BSF GPIO, ledde
kalla on_delay
BCF GPIO, ledde
kalla off_delay
INCF off_counter, f
decfsz on_counter, f
gå till shutdown_kewl.1
gå till avstängning
on_delay
movf on_counter, w
movwf qw2
gå till fade
off_delay
movf off_counter, w
movwf qw2
gå till fade
Fade
gå till $+ 1
gå till $+ 1
gå till $+ 1
gå till $+ 1
gå till $+ 1
gå till $+ 1
gå till $+ 1
gå till $+ 1
gå till $+ 1
gå till $+ 1
gå till $+ 1
gå till $+ 1
gå till $+ 1
gå till $+ 1
gå till $+ 1
gå till $+ 1
gå till $+ 1
gå till $+ 1
gå till $+ 1
gå till $+ 1
gå till $+ 1
gå till $+ 1
gå till $+ 1
gå till $+ 1
decfsz qw2, f
gå till fade
returnera
SLUTET; direktivet "slutet av programmet"