Segítséget kérek PIC programhoz
Miko Imre
imre.miko at siemens.com
Thu Aug 7 10:02:30 CEST 2003
Hello,
Csihar Zoltán wrote:
> GP2-õn egy LED-et szeretnék 60-40% kitöltéssel meghajtani, majd 6 óra múlva
> sleep-be tenni. Újraindulás ki-be kapcsolásra. Ennyi. A 6 óra idõzítére is
> valami frappánsabb ötlet jó lenne, mint az egymásbaágyazott hurkok sora!?
Par dolog ami elsore szembetuno:
1. A 675-ben van AD, es amiben van, ott bekapcsolas utan az analogkent hasznalhato
bemenetek, analognak is vannak konfiguralva. Lasd ANSEL register.
Ezert a program elejen mindenkepp kellenek a kovetkezo sorok, hogy digitalis
bemenet-kimenetnek hasznald a PORT labat:
bsf STATUS, RP0 ; bank1
clrf ANSEL
bcf STATUS, RP0 ; bank0
2. A valtozok definialasahoz nem eleg a #define <valtozonev>,
itt cimet is meg kellene adnod pl:
#define JEL1 20h
#define SZUNET1 21h
#define IDO1 22h
Itt konnyu teveszteni, ezert sokkal jobb, ha a cblock-al adod meg a valtozokat:
cblock 20h
JEL1
SZUNET1
IDO1
endc
3. Hosszuideju kesleltetesre hasznald a Timer1-et.
A foprogramban:
Allits be egy 2 byte-bol allo valtozot. Nevezzuk COUNTER-nek.
Nullazz egy masik valtozot, ami jelzi, hogy letelt az ido.
(Ez lehet egy bit is, egy valtozoban), nevezzuk FLAG-nek.
Az eloosztot allitsd a legnagyobbra, engedelyezd a megszakitast,
a Timer1-re. Timer1 clock source legyen az internal clock (orajel/4)
Torold a Timer1-et. (TMR1H:TMR1L)
Inditsd el a Timer1-et. (TMR1ON)
Engedelyezd a megszakitast. (GIE)
Villogtasd a LED-et, es nez ra minden ciklusban, hogy
a FLAG, mar be lett-e allitva, azaz az ido mar letelt-e.
A megszakitasban:
Mentsd a valtozokat (W, STATUS).
Ellenorizd a FLAG-et, ha nincs beallitva, akkor
csokkentgess a 2 byte-os valtozot.
Ha az eleri a nullat, akkor allitsd be a FLAG-et.
Torlod a TMR1IF bitet.
Allitsd vissza a valtozokat (W, STATUS).
Ha 4Mhz-rol jaratod, akkor a internal clock 1Mhz.
8-as eloosztoval 125khz jut a timer1-re,
annak a reciproka: 8uS
Tehat 8uS-onken no a Timer1 1-el. A timer1 16 bites,
igy 65536 -ot kell rajta novelni a ket tulcsordulas
megszakitas kozott.
Azaz a megszakitasod 0,524288 masodpercenkent
valtodik ki.
6 ora = 360 perc = 21600 masodperc.
21600 / 0,524288 = 41199
Azaz 41199-re kell allitanod kezdetben a 2 byte-os
valtozot.
2 byte-os valtozo definialasa:
cblock 0x20
COUNTER:2
endc
kezdoertek beallitasa:
#define COUNTER_START 41199
movlw high(COUNTER_START)
movwf COUNTER
movlw low(COUNTER_START)
movwf COUNTER
csokkentese:
movf COUNTER+1,f
skipnz
decf COUNTER,f
decf COUNTER+1,f
osszehasonlitasa constans ertekkel:
#define COUNTER_OUT 0
movlw high(COUNTER_OUT)
subwf COUNTER,w
movlw low(COUNTER_OUT)
skipnz
subwf COUNTER+1,w
Ennek eredmenyekent beallitodik a Z flag, ha a
valtozo egyenlo a konstanssal. (nalad nullaval.)
Udv.
Imre
More information about the Elektro
mailing list