Na uvodnem predavanju smo predstavili potek delavnice, preleteli sistem Š-ARM ter na kratko pogledali bitne pretvorbe ter delovanje izhodnih registrov.
Več o pretvorbah med različnimi zapisi števil in bitnih operacijah si lahko preberete v naslednjem dokumentu:
Pretvorbe so uporabne za razumevanje različnih zapisov števil in za razumevanje programov ki jih pregledujemo (in ki jih nismo napisali sami). Bitne operacije pa so uporabljene tudi v naslednjih programih za operiranje s porti in registri.
Ogledali smo si tudi vhodno izhodne pine ter registre ki jih ARM za to uporablja:
Uporabljene WinIDEA datoteke (delujoči projekti):
porti2 (le uporaba led diod)
porti (uporaba tipk in led diod)
Tu smo uporabljali direkten dostop do portov, kar je pogosta praksa pri manjših krmilnikih ali ko razvijamo program za točno določen krmilnik. Vnaprej bomo uporabljali wrapper (ovojne) funkcije setpindir(), setleds() etc. ki so vsebovane v knjižnici ‘io.c’, te funkcije sicer na isti način kot smo prikazali tu delujejo direktno na registre. Uporabnost teh funkcij se pokaže ko želimo program preseliti na drug krmilnik in se npr. zamenjajo imena registrov. Takrat nam potem če uporabljamo wrapper funkcije ni potrebno spremeniti celega programa (kjer se te funkcije pojavljajo večkrat) ampak le uredimo wrapper funkcijo.
Za predstavitev debuggerja ki je ena izmed bolj naprednih funkcij je žal zmanjkalo časa zato samo na kratko:
WinIDEA datoteka:
Debugger nam omogoča dostop do FLASHa, RAMa ter do notranjih registrov procesorja, prav tako nam omogoča natančno kontrolo poteka izvajanja programa. Tu je predstavljen le najenostavnejši način pregleda spremenljivk z lebdenjem miške nad njimi. Več pa kdaj drugič 😉
——-
pwm.c:
“””
// pwm.c by dejko1 at hotmail dot com
#define PWMIR (*((volatile unsigned long *) 0xE0014000))
#define PWMTCR (*((volatile unsigned long *) 0xE0014004))
#define PWMTC (*((volatile unsigned long *) 0xE0014008))
#define PWMPR (*((volatile unsigned long *) 0xE001400C))
#define PWMPC (*((volatile unsigned long *) 0xE0014010))
#define PWMMCR (*((volatile unsigned long *) 0xE0014014))
#define PWMMR0 (*((volatile unsigned long *) 0xE0014018))
#define PWMMR1 (*((volatile unsigned long *) 0xE001401C))
#define PWMMR2 (*((volatile unsigned long *) 0xE0014020))
#define PWMMR3 (*((volatile unsigned long *) 0xE0014024))
#define PWMMR4 (*((volatile unsigned long *) 0xE0014040))
#define PWMMR5 (*((volatile unsigned long *) 0xE0014044))
#define PWMMR6 (*((volatile unsigned long *) 0xE0014048))
#define PWMPCR (*((volatile unsigned long *) 0xE001404C))
#define PWMLER (*((volatile unsigned long *) 0xE0014050))
void _PWMInit(void){
// pin P0.8 je PWM4 izhod
// PINSEL0= 0b0000000000000000”10”00000000000000;
PINSEL0 &= ~(3<<16);
PINSEL0 |= 1<<17;
PWMPR = 2999; // Load prescaler = 0.2ms
PWMMR0 = 32; // max korakov
PWMMR4 = 0; // izhod
PWMLER = 1+1<<4;
PWMTCR = 2; // reset counter and prescaler
PWMMCR = 2; // reset on PWMMR0
PWMPCR = 1<<12; // enable PWM2 output
PWMTCR = 1 + (1<<3); // enable timer, pwm
}
void _PWMSet(int i)
{
PWMMR4 = i;
PWMLER = 1<<4;
}
//end pwm.c
“””
1. Uporaba PWM:
Napiši program ki omogoča da z držanjem tipke postopoma ugasneš ali prižgeš LED diodo LD3. Eno tipko uporabi za postopno prižiganje do polne svetilnosti in drugo za postopno ugašanje.
2. Sistemi v realnem času:
Spremeni program iz prejšnjega primera. Led dioda LD2 naj utripa vsako sekundo.
b) za hitre: dodaj da dve dodatni tipki sprožita že ob pritisku (ni ju potrebno držati) fade in oz. fade out efekt na led diodi LD3.
—–
Ker smo imeli na prejšnjem terminu težave z določenimi armi ki očitno ne delujejo kot je treba smo pripravili testni projekt:
Uporabljali bomo pine P0.4 do P0.6, zato ne smemo uporabiti funkcije _LEDInit() ki sicer nastavi te pine za uporabo z LED diodami.
Inicializacija pinov:
-pina 4 in 6 (lahko tudi 7) postavimo kot GPI/O pina
-pin 5 postavimo v ADC način
– izhod 4 postavimo na 1, 6 pa na 0
-za AD uporabljamo ukaz _adconvertExt(7)
1) Realiziraj meritev napetosti in upornosti, oboje naj se izpiše na zaslonu.
2) Meritev kapacitivnosti.
// funkcija uraus nam da sistemsko uro v mikrosekundah
int uraus() {
int uraus;
T0TCR = 0;
uraus = T0TC * 1000 + T0PC / 15;
T0TCR = 1;
return uraus;
}
Postopek meritve:
– na izhod damo 0, počakamo da je tudi vhod enak 0
– na izhod damo 1, merimo čas (tau1) in počakamo da je vhod na 63% max. vredn.
– na izhodu še vedno pustimo ena dokler izhod ne pride do 1000 enot.
– na izhod damo 0 in merimo koliko časa traja (tau2) da pride do 63% spremembe od 1000 enot, pasti mora torej na 37%.
– izračunamopovprečje tau=(tau1+tau2)/2 in ga izpišemo, izračunamo tudi kapacitivnost