 |
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
Hector1 Član

Pridružen-a: Čet 23 Feb 2012 11:54 Prispevkov: 98 Aktiv.: 0.60 Kraj: Primorska
|
Objavljeno: Čet Jun 14, 2012 11:24 am Naslov sporočila: PIC16F877(a) prekinitve, assembler |
|
|
Lep pozdrav,
Spodaj je program napisan za omenjeni mikrokontroler in sicer naj bi tvoril prekinitve na Timer0. Gre za PIC16F877
Koda: |
void interrupt(){
asm{
movlw 0xe0
movwf TMR0
bcf INTCON,T0IF
incf PORTD,1
}
}
//timer0 uporablja notranji izvor ure
//aktivira prekinitve priblizno vsakih 46 mikro sekund
//upostevati moramo frekvenco kvarc kristala - 4 MHz
// vkljuci delilnik frekvence
void timer0_ini0(){
asm{
bsf STATUS,RP0
bcf OPTION_REG,T0CS
bsf OPTION_REG,PSA ; delilnik frekvence izključen
bcf OPTION_REG,PS0 ; vsi so 0 -> deli frekvenco z 2
bcf OPTION_REG,PS1
bcf OPTION_REG,PS2
bcf STATUS,RP0
}
}
// inicializira prekinitve na timer0
void timer0_int_ini(){
asm{
bsf INTCON,T0IE
bsf INTCON,GIE
movlw 0x0e0
movwf TMR0
}
}
void main(){
TRISD=0;
PORTD=0;
timer0_ini0();
timer0_int_ini();
while(1){
}
}
|
funkcija "void timer0_ini0()" je jasna, zatakne se pri funkciji "void timer0_int_ini()" in sicer ni mi jasno kaj pomeni ta vrstici:
Koda: |
bsf INTCON,GIE
movlw 0x0e0
|
"bsf INTCON,GIE" naj bi bila za globalno omogočanje prekinitev?
Med tem ko mi ni jasen ukaz "movlw 0x0e0".
Prosim za pomoč.
Hvala za odgovore. |
|
Nazaj na vrh |
|
 |
Hector1 Član

Pridružen-a: Čet 23 Feb 2012 11:54 Prispevkov: 98 Aktiv.: 0.60 Kraj: Primorska
|
Objavljeno: Čet Jun 14, 2012 11:38 am Naslov sporočila: Priročnik |
|
|
Dodajam še priročnik.
Klik na priročnik |
|
Nazaj na vrh |
|
 |
dule26 Član

Pridružen-a: Tor 28 Sep 2010 7:30 Prispevkov: 26 Aktiv.: 0.15 Kraj: Murska Sobota
|
Objavljeno: Čet Jun 14, 2012 11:43 am Naslov sporočila: |
|
|
S prvim ukazom omogočiš globalne prekinitve.
Z drugim ukazom pa vpišeš v register TMR0 vrednost 0xE0, to pa zato da dosežeš željeni časovni interval prekinitve. Prekinitev se sproži takrat, kadar vrednost registra TMR0 preide iz 0xFF na 0x00. Če se npr. TMR0 povečuje vsako ms moraš nastaviti začetno vrednost TMR0 registra na 0xF6, da dobiš prekinitev na 10ms. |
|
Nazaj na vrh |
|
 |
Highlag Član


Pridružen-a: Pet 23 Jan 2004 20:42 Prispevkov: 4034 Aktiv.: 17.03 Kraj: Črnuče
|
Objavljeno: Čet Jun 14, 2012 11:43 am Naslov sporočila: |
|
|
Move literal to W register 0x0e0 pa je hex številka
Torej v delovni register (W) naloži številko, ki je za ukazom.
Pri picih je potrebno v prekinitveni rutini shraniti stanja nekaterih registrov, in jih po izvedbi prekinitve naložiti nazaj, drugače ti program ne bo deloval.
Močno svetujem, da detajlno pregledaš datasheet za tvoj procesor. Je precej dobro razloženo kako uporabljati takšne stvari. _________________ If at first you don't succeed, destroy all evidence that you tried. |
|
Nazaj na vrh |
|
 |
Hector1 Član

Pridružen-a: Čet 23 Feb 2012 11:54 Prispevkov: 98 Aktiv.: 0.60 Kraj: Primorska
|
Objavljeno: Čet Jun 14, 2012 12:01 pm Naslov sporočila: |
|
|
Citiram: |
Move literal to W register 0x0e0 pa je hex številka
Torej v delovni register (W) naloži številko, ki je za ukazom. |
Kaj pomeni movlw vem, ni mi bil jasna številka "0x0E0" pravzaprav me je zmedla ničla pred E.
Hvala za odgovore. |
|
Nazaj na vrh |
|
 |
Borza Član

Pridružen-a: Ned 19 Avg 2012 14:46 Prispevkov: 21 Aktiv.: 0.13 Kraj: Slovenija
|
Objavljeno: Ned Avg 19, 2012 2:50 pm Naslov sporočila: |
|
|
pozdravljeni!
mi lahko kdo na preprost način razloži zakaj se prekinitev proži ravno vsakih 46us |
|
Nazaj na vrh |
|
 |
matjazkariz Član


Pridružen-a: Sre 03 Nov 2004 18:09 Prispevkov: 1026 Aktiv.: 4.33
|
Objavljeno: Ned Avg 19, 2012 3:01 pm Naslov sporočila: |
|
|
Daj, povej še koliko MHz kvarc uporabljaš, da nam ne bo treba še tega računat... _________________ LP, Matjaž |
|
Nazaj na vrh |
|
 |
Borza Član

Pridružen-a: Ned 19 Avg 2012 14:46 Prispevkov: 21 Aktiv.: 0.13 Kraj: Slovenija
|
Objavljeno: Ned Avg 19, 2012 3:07 pm Naslov sporočila: |
|
|
4mhz |
|
Nazaj na vrh |
|
 |
igo Član

Pridružen-a: Sre 11 Okt 2006 19:11 Prispevkov: 3641 Aktiv.: 16.01
|
Objavljeno: Ned Avg 19, 2012 3:09 pm Naslov sporočila: |
|
|
Znotraj podsklopa Osnove programiranja PIC-a v assemblerju je tema Timer1, primerjalni način delovanja. Preberi jo!
Za svoj PIC si v datasheetu poglej strukturo prekinitve. Pa napiši še v čem programiraš! Zbirnik, C, Basic,...? _________________ Teoretično je praksa posledica teorije, praktično je pa ravno obratno. (igo 2001)
LP, Igor |
|
Nazaj na vrh |
|
 |
matjazkariz Član


Pridružen-a: Sre 03 Nov 2004 18:09 Prispevkov: 1026 Aktiv.: 4.33
|
Objavljeno: Ned Avg 19, 2012 3:14 pm Naslov sporočila: |
|
|
Hm, sem hotel preračunat in opažam, da imaš PSA napačno določen. Vrednost 1 pomeni, da je T0 dodeljen WDTju. WDT tudi ne pozabi izklopit v fuse bitih.
Ko to porihtaš, bi moral imeti prekinitve na 16us. _________________ LP, Matjaž |
|
Nazaj na vrh |
|
 |
Borza Član

Pridružen-a: Ned 19 Avg 2012 14:46 Prispevkov: 21 Aktiv.: 0.13 Kraj: Slovenija
|
Objavljeno: Ned Avg 19, 2012 3:55 pm Naslov sporočila: |
|
|
Gledal sem zgoraj postan napisan program, in mi ni bilo jasno kako dobim čas v katerem se prekinitev ponovi. Napisan je očitno v asemblerju a ne razumem kaj ima to veze z ponovitvijo prekinitev.
Če prav razumem se v zgornjem primeru prekinitev zgodi ko se zapolni tmr0, ki pa je trenutno nastavljen na vrednost b'11100000', torej ima do konca še 33 korakov(?)
ker je frekvenca 4mhz in jo delilnik deli z 2, znese to 2mhz, torej čas enega cikla traja 2us??
ni mi jasno kako točno to poteka |
|
Nazaj na vrh |
|
 |
matjazkariz Član


Pridružen-a: Sre 03 Nov 2004 18:09 Prispevkov: 1026 Aktiv.: 4.33
|
Objavljeno: Ned Avg 19, 2012 4:27 pm Naslov sporočila: |
|
|
Uh, zdaj vidim, da nisi ti avtor prvega posta. Sem nekako mislil, da si.
No torej, če uporabljaš tisto kodo, je prekinitev nastavljena tako, da ima še 32 korakov do sprožitve, pri čemer je delilnik ( pri PSA = 0 in PS2:PS0 = 000) enak 2. Pri 4MHz je čas enega cikla 250ns (1s/4000000Hz). Prej sem pozabil upoštevat, da je T0 gnan s četrtino tega clocka (glej datasheet za T0CS = 0), torej traja en tick 1us. To zmnožiš s preddelilnikom (2) ter s številom preostalih korakov, ki so potrebni, da pride do overflowa T0 (torej 32) in dobiš 64us.
Tebi pa se proži na 46us? _________________ LP, Matjaž |
|
Nazaj na vrh |
|
 |
Borza Član

Pridružen-a: Ned 19 Avg 2012 14:46 Prispevkov: 21 Aktiv.: 0.13 Kraj: Slovenija
|
Objavljeno: Ned Avg 19, 2012 4:31 pm Naslov sporočila: |
|
|
Najlepša hvala
Tako piše v kodi, naj bi se prožila vsakih 46us, to me je zmedlo.
Bi bil kdo v prihodnosti mogoče pripravljen ponuditi par ur inštrukcij? za plačilo seveda |
|
Nazaj na vrh |
|
 |
igo Član

Pridružen-a: Sre 11 Okt 2006 19:11 Prispevkov: 3641 Aktiv.: 16.01
|
Objavljeno: Ned Avg 19, 2012 4:38 pm Naslov sporočila: |
|
|
Ker pišem s telefonom, ti ne morem prilepiti povezave.
Tema Timer1, primerjalni način delovanja je trenutno čisto na vrhu podsklopa Programiranje PIC-a v assemblerju.
Daj preberi moje odgovore tam, saj so v njih odgovori na čisto vsa vprašanja, ki si jih doslej zastavil v tej temi
Potem pa še ti odgovori na moje vprašanje iz prispevka malo višje.
In ne zmrduj se nad Zbirnikom, saj je to temelj programiranja PICev, zato ga moraš vsaj malo poznati, ne glede na jezik, v katerem programiraš.
Napiši od kod si, in če se misliš bolj resno lotiti programiranja, kupi Biblijo (oziroma knjigo: Programirajmo PIC mikrokontrolerje). Cenejših začetnih ur instrukcij ne boš dobil nikjer. Naprej ti pa lahko pomagam, če boš programiral v Zbirniku. _________________ Teoretično je praksa posledica teorije, praktično je pa ravno obratno. (igo 2001)
LP, Igor |
|
Nazaj na vrh |
|
 |
Borza Član

Pridružen-a: Ned 19 Avg 2012 14:46 Prispevkov: 21 Aktiv.: 0.13 Kraj: Slovenija
|
Objavljeno: Ned Avg 19, 2012 4:46 pm Naslov sporočila: |
|
|
Sem iz ljubljane. Fasal sem popravca iz asemblerja, zato bi rabil instrukcije. Sicer mi samo razumevanje kar gre, ampak zelo težko kaj sam napišem...
Temo o tmr1 sem že pregledal.. |
|
Nazaj na vrh |
|
 |
|
|
Ne, ne moreš dodajati novih tem v tem forumu Ne, ne moreš odgovarjati na teme v tem forumu Ne, ne moreš urejati svojih prispevkov v tem forumu Ne, ne moreš brisati svojih prispevkov v tem forumu Ne ne moreš glasovati v anketi v tem forumu Ne, ne moreš pripeti datotek v tem forumu Ne, ne moreš povleči datotek v tem forumu
|
Uptime: 492 dni
Powered by phpBB © 2001, 2005 phpBB Group
|