www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 

PIC16F877(a) prekinitve, assembler
Pojdi na stran 1, 2  Naslednja
 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Microchip PIC
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
Hector1
Član
Član



Pridružen-a: Čet 23 Feb 2012 11:54
Prispevkov: 98
Aktiv.: 0.60
Kraj: Primorska

PrispevekObjavljeno: Čet Jun 14, 2012 11:24 am    Naslov sporočila:  PIC16F877(a) prekinitve, assembler Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Hector1
Član
Član



Pridružen-a: Čet 23 Feb 2012 11:54
Prispevkov: 98
Aktiv.: 0.60
Kraj: Primorska

PrispevekObjavljeno: Čet Jun 14, 2012 11:38 am    Naslov sporočila:  Priročnik Odgovori s citatom

Dodajam še priročnik.

Klik na priročnik
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
dule26
Član
Član



Pridružen-a: Tor 28 Sep 2010 7:30
Prispevkov: 26
Aktiv.: 0.15
Kraj: Murska Sobota

PrispevekObjavljeno: Čet Jun 14, 2012 11:43 am    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Highlag
Član
Član



Pridružen-a: Pet 23 Jan 2004 20:42
Prispevkov: 4034
Aktiv.: 17.03
Kraj: Črnuče

PrispevekObjavljeno: Čet Jun 14, 2012 11:43 am    Naslov sporočila:   Odgovori s citatom

Koda:
movlw 0x0e0


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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
Hector1
Član
Član



Pridružen-a: Čet 23 Feb 2012 11:54
Prispevkov: 98
Aktiv.: 0.60
Kraj: Primorska

PrispevekObjavljeno: Čet Jun 14, 2012 12:01 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Borza
Član
Član



Pridružen-a: Ned 19 Avg 2012 14:46
Prispevkov: 21
Aktiv.: 0.13
Kraj: Slovenija

PrispevekObjavljeno: Ned Avg 19, 2012 2:50 pm    Naslov sporočila:   Odgovori s citatom

pozdravljeni!

mi lahko kdo na preprost način razloži zakaj se prekinitev proži ravno vsakih 46us
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
matjazkariz
Član
Član



Pridružen-a: Sre 03 Nov 2004 18:09
Prispevkov: 1026
Aktiv.: 4.33

PrispevekObjavljeno: Ned Avg 19, 2012 3:01 pm    Naslov sporočila:   Odgovori s citatom

Daj, povej še koliko MHz kvarc uporabljaš, da nam ne bo treba še tega računat...
_________________
LP, Matjaž
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Borza
Član
Član



Pridružen-a: Ned 19 Avg 2012 14:46
Prispevkov: 21
Aktiv.: 0.13
Kraj: Slovenija

PrispevekObjavljeno: Ned Avg 19, 2012 3:07 pm    Naslov sporočila:   Odgovori s citatom

4mhz
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
igo
Član
Član



Pridružen-a: Sre 11 Okt 2006 19:11
Prispevkov: 3641
Aktiv.: 16.01

PrispevekObjavljeno: Ned Avg 19, 2012 3:09 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
matjazkariz
Član
Član



Pridružen-a: Sre 03 Nov 2004 18:09
Prispevkov: 1026
Aktiv.: 4.33

PrispevekObjavljeno: Ned Avg 19, 2012 3:14 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Borza
Član
Član



Pridružen-a: Ned 19 Avg 2012 14:46
Prispevkov: 21
Aktiv.: 0.13
Kraj: Slovenija

PrispevekObjavljeno: Ned Avg 19, 2012 3:55 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
matjazkariz
Član
Član



Pridružen-a: Sre 03 Nov 2004 18:09
Prispevkov: 1026
Aktiv.: 4.33

PrispevekObjavljeno: Ned Avg 19, 2012 4:27 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Borza
Član
Član



Pridružen-a: Ned 19 Avg 2012 14:46
Prispevkov: 21
Aktiv.: 0.13
Kraj: Slovenija

PrispevekObjavljeno: Ned Avg 19, 2012 4:31 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
igo
Član
Član



Pridružen-a: Sre 11 Okt 2006 19:11
Prispevkov: 3641
Aktiv.: 16.01

PrispevekObjavljeno: Ned Avg 19, 2012 4:38 pm    Naslov sporočila:   Odgovori s citatom

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 Exclamation

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
Borza
Član
Član



Pridružen-a: Ned 19 Avg 2012 14:46
Prispevkov: 21
Aktiv.: 0.13
Kraj: Slovenija

PrispevekObjavljeno: Ned Avg 19, 2012 4:46 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Microchip PIC Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Pojdi na stran 1, 2  Naslednja
Stran 1 od 2

 
Pojdi na:  
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