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

Pridružen-a: Pon 05 Jul 2004 12:17 Prispevkov: 129 Aktiv.: 0.54 Kraj: ljubljana
|
Objavljeno: Ned Apr 30, 2006 11:16 pm Naslov sporočila: Interrupt in problem |
|
|
V Bascom-u sem napisal sledeč program:
Koda: |
Dim A As Byte
Enable Interrupts
Enable Int0
On Int0 C Nosave
Set Tcon.0
A = 0
Reset P1.5
Reset P1.6
Reset P3.2
Do
If A = 1 Then
Gosub F
End If
If A = 2 Then
Gosub G
End If
If A = 3 Then
A = 1
End If
Loop
C:
A = A + 1
Return
F:
Set P1.5
Waitms 250
Reset P1.5
Waitms 250
Return
G:
Set P1.6
Return
|
V datasheet-u piše, da ima mikrokontroler 2051 port za interrupt na p3.2(int0) in p3.3(int1), samo meni ni uspelo sprošti prekinitve z 1 na p3.2.
V Bascom simulatorju program deluje sam če kliknem na gumb Int0(v zgornjem levem kotu) |
|
Nazaj na vrh |
|
 |
Slemi Član

Pridružen-a: Pet 29 Okt 2004 13:29 Prispevkov: 386 Aktiv.: 1.63 Kraj: Hrastnik
|
Objavljeno: Pon Maj 01, 2006 6:29 am Naslov sporočila: |
|
|
Mogoče bi pomagalo, če bi zgoraj pri Enable Int0 dodal še:
Enable Int1
On Int1 X Nosave.
In spodaj recimo:
X:
A = A - 1
Return
Lp _________________ slemi.info - en
slemi.si - slo |
|
Nazaj na vrh |
|
 |
vilko Član



Pridružen-a: Pet 13 Feb 2004 10:26 Prispevkov: 3357 Aktiv.: 14.17 Kraj: Dragomer
|
Objavljeno: Pon Maj 01, 2006 7:55 am Naslov sporočila: Malo sem pogledal |
|
|
Malo sem pogledal tvoj program. Kolikor razumem, bi rad vadil interrupt tehniko na ta način, da po po prekinitvi utripa led na p1.5 po sledeči prekinitvi pa ne. Imam pa sledeče pripombe:
1 .Enable instrukcije se napiše takrat, ko je vse že pripravljeno, da obdelamo prekinitev, torej izza ukazov Set Tcon, On int0, Reset p3.2 itd..
2. Nosave uporabimo samo takrat, kadar podprogram za prekinitev ne uporabi nobenega registra, ali pa ga sam spravi na sklad predno ga uporabi in vrne po uporabi. V dvomu vedno opusti Nosave. Tvoj podprogram C, ki naj bi povečal A za 1 bi se lahko napisal tako, da bi ne koristil registre recimo tako
C:
inc A
return
Boš rekel. "Saj to je pa isti kl...!" Ja, pa ni! Če napišeš
A = A + 1 tedaj bascom čisto drugače generira kodo, saj je lahko A drugačnega tipa kot bajt in 1 je lahko tudi kaj drugega kot 1.
3. Kako prožiš P3.2 na 0? S tipko? Potem se ti bo zgodilo, da bo kontakt tipke odskakoval in boš namesto enega prehoda iz 1 na 0 doživel pri vsakem pritisku na tipko več takih prehodov. Nekako moraš programsko zagotoviti, da neposredno po prekinitvi recimo 100msec ne dopustiš nove prekinitve, in tako daš čas tipki, da se umiri. _________________ Nihče ni za vojno in vsi so za mir,
vsi so za bratstvo, nihče za prepir.
Od same ljubezni vsak čas na granatah
bo vtisnjeno geslo: "Darilo za brata"
Janez Menart |
|
Nazaj na vrh |
|
 |
fbifbi Član

Pridružen-a: Pon 05 Jul 2004 12:17 Prispevkov: 129 Aktiv.: 0.54 Kraj: ljubljana
|
Objavljeno: Pon Maj 01, 2006 12:27 pm Naslov sporočila: |
|
|
Citiram: |
C:
inc A
return
Boš rekel. "Saj to je pa isti kl...!" Ja, pa ni! Če napišeš |
Prav imaš, da ni isti kl.. ker z ukazom inc A sploh nedela
mora nujno biti A = A + 1.
Citiram: |
3. Kako prožiš P3.2 na 0? S tipko? Potem |
Ja s tipko na P3.2. ko postavim P3.2 na 1.(upam da ni skregan s programom)
Problem je tudi ker z kakršnem koli sigalom na P3.2 se noče spršti Interrupt. |
|
Nazaj na vrh |
|
 |
strobos Član

Pridružen-a: Sre 24 Sep 2003 12:19 Prispevkov: 726 Aktiv.: 3.07 Kraj: Brežice
|
Objavljeno: Pon Maj 01, 2006 5:59 pm Naslov sporočila: |
|
|
Citiram: |
Boš rekel. "Saj to je pa isti kl...!" Ja, pa ni! Če napišeš
A = A + 1 tedaj bascom čisto drugače generira kodo, saj je lahko A drugačnega tipa kot bajt in 1 je lahko tudi kaj drugega kot 1. |
Pri teh dveh ukazih (inc a in a=a+1) je tudi razlika v času izvajanja-jaz sem z osciloskopom ugotovil, da se ukaz a=a+1 izvrši za 50% hitreje kot pa ukaz inc a.
Še nasvet pri pisanju programa: ne uporabljaj spremenljivk kot so a,b,c..itd, ker so nekatere od teh rezervirane za določene registre in akumulatorje-piše v bascom helpu, katerih ne smeš uporabljati-preveri in malo spremeni imena.
lp |
|
Nazaj na vrh |
|
 |
fbifbi Član

Pridružen-a: Pon 05 Jul 2004 12:17 Prispevkov: 129 Aktiv.: 0.54 Kraj: ljubljana
|
Objavljeno: Pon Maj 01, 2006 7:02 pm Naslov sporočila: |
|
|
Rezrvirana je le črka B. |
|
Nazaj na vrh |
|
 |
RGorazd Član


Pridružen-a: Čet 20 Maj 2004 15:57 Prispevkov: 1714 Aktiv.: 7.24 Kraj: Ig
|
Objavljeno: Pon Maj 01, 2006 9:40 pm Naslov sporočila: |
|
|
Živjo!
Nevem sicer več, kako je v Bascomu8051, vendar v BascomAVR lahko kot prvo nastaviš način proženja INTx. Lahko je LowLevel (interupt se bo izvajal vse dokler bo INTx pin na "0"), lahko je na Rising, ali Falling, tu pa ti gleda prednjo ali zadnjo "planko" ali fronto ali ivico, kot temu pravijo elektroniki starejšega kova, kateri so osnove dobili iz knjig tehničke knjige beograd. Vsekakor je dobrodošlo gledanje prehoda iz 1>0 ali iz 0>1 (se pravi ko se stanje spremeni iz +5V na +v ali obratno). Interrupt se zgodi, ko je na njem 0V, se pravi priklop +5v na INTx pin medtem, ko je pin v zraku ti bo povzročalo samo motnje in nič drugega. Na INTx pin daj 10-100k Pull up upor, ter ga s tipko vleci na maso. To je najprej kar moraš narediti. V Interrupt handler pa daj tole:
C: ' ali karkoli že imaš za servisni program
DISABLE INT0 ' ko se zgodi prekinitev, za trenutek onemogočiš nadaljno postavljanje zastavice za interupte
WAITMS 50 ' počakaš še malenkost da se kontakt popolnoma umiri
INCREMENT A, ali A=A+1 ali (#asm INC {A} #end asm) pač povečaš tvojo spremenljivko, podal sem ti 3 načine ki jih bascom prebavi
ENABLE INT0 ' ponovno omogočiš postavljanje zastavice, drugače nadalnje prekinitve ne bodo več mogoče
RETURN ' izstopiš iz handler programa
To je nekako na kratko vse. Sam sem imel na začetku s tem precej problemov, še posebej zato, ker sem imel +5V-----tipka------INTx pin. V bistvu je bil INTx pin v zraku, nanj sem proipeljal direkt 5v...pogosta začetniška napaka. To je vedno delalo po svoje. Pin mora biti preko 100k upora vezan na +5v, ti ga pa moraš preko tipke povleči na maso, to deluje 100%.
LP Gorazd[/b] _________________ .
._. _ _ ._. _.__. _|
[ (_](_)[ (_] /_(_]
._| |
|
Nazaj na vrh |
|
 |
vilko Član



Pridružen-a: Pet 13 Feb 2004 10:26 Prispevkov: 3357 Aktiv.: 14.17 Kraj: Dragomer
|
Objavljeno: Pon Maj 01, 2006 9:45 pm Naslov sporočila: |
|
|
Citiram: |
Prav imaš, da ni isti kl.. ker z ukazom inc A sploh nedela
mora nujno biti A = A + 1.
|
Se ti to ne zdi čudno? Razlaga je v tem, da je inc assemblerska instrukcija, ki smatra a za akumulator in ne spremenljivko a nekje v ramu.
Citiram: |
Pri teh dveh ukazih (inc a in a=a+1) je tudi razlika v času izvajanja-jaz sem z osciloskopom ugotovil, da se ukaz a=a+1 izvrši za 50% hitreje kot pa ukaz inc a. |
Spremenimo imena spremenljivk, namesto a bodi aa
To bom preveril, čim bom mogel, sedaj ne morem. inc aa je ena sama assemblerska instrukcija, ostalo pa je kar nekaj instrukcij in bi moralo biti hitrejše, a pri tem primeru je to nepomembno, saj hitrost ni kritična. Ko bom spet imel bascom, bom disassembliral obe varianti, in bom obe varianti prikazal na forumu, če bo še smiselno. Smiselni bi bilo sedaj, a sedaj ne morem.
Citiram: |
Ja s tipko na P3.2. ko postavim P3.2 na 1.(upam da ni skregan s programom) |
Seveda to ni skregano s programom. Poznati je le potrebno čisto mehansko obnašanje tipke: ko pritisneš na tipko ali ko skleneš rele, kontakti tipke ali releja udarijo skupaj, se odbijejo, in spet udarijo skupaj, to lahko večkrat. In tako boš pri enem pritisku na tipko doživel 2, morda 3 ali celo 4 interupte, no morda včasih tudi samo enega. To si lahko dokažeš sam sebi tako, da si narediš program, ki 'šteje' pritiske na tipko in stanje števca prikazuje. In potem, ko pritisneš na tipko enkrat, vidiš, da gre števec naprej včasih za 1 včasih za 2 včasih za 3 .
V programu se temu izognemo tako, da ko zaznamo prvi pritisk na tipko, programsko izklopimo odtipavanje tipke za nekaj časa enostavno za waitms 100 ukazom. in tako preslišimo odskakovanje kontaktov. _________________ Nihče ni za vojno in vsi so za mir,
vsi so za bratstvo, nihče za prepir.
Od same ljubezni vsak čas na granatah
bo vtisnjeno geslo: "Darilo za brata"
Janez Menart |
|
Nazaj na vrh |
|
 |
vilko Član



Pridružen-a: Pet 13 Feb 2004 10:26 Prispevkov: 3357 Aktiv.: 14.17 Kraj: Dragomer
|
Objavljeno: Tor Maj 02, 2006 7:33 am Naslov sporočila: ni problem bascom |
|
|
Citiram: |
Nevem sicer več, kako je v Bascomu8051, vendar v BascomAVR lahko kot prvo nastaviš način proženja INTx. |
Ni problem bascom temveč sam mikroprocesor. Družina 8051 proži interupt samo pri prehodu iz 1>0, če je postavljen bit TCON.0 kot ga je postavil fbifbi. Če je ta bit na 0, se mikroprocesor kar naprej vrti v prekinitveni rutini ves čas, ko je vhod P3.2 = 0.
Tudi jaz ne vem, v čem je smisel le tega.
Sicer pa imaš popolnoma prav. Tako kot si napisal, bi moral program 'preslišati' odskakovanje kontakta. _________________ Nihče ni za vojno in vsi so za mir,
vsi so za bratstvo, nihče za prepir.
Od same ljubezni vsak čas na granatah
bo vtisnjeno geslo: "Darilo za brata"
Janez Menart |
|
Nazaj na vrh |
|
 |
RGorazd Član


Pridružen-a: Čet 20 Maj 2004 15:57 Prispevkov: 1714 Aktiv.: 7.24 Kraj: Ig
|
Objavljeno: Tor Maj 02, 2006 12:24 pm Naslov sporočila: Re: ni problem bascom |
|
|
Citiram: |
Ni problem bascom temveč sam mikroprocesor. Družina 8051 proži interupt samo pri prehodu iz 1>0, če je postavljen bit TCON.0 kot ga je postavil fbifbi. Če je ta bit na 0, se mikroprocesor kar naprej vrti v prekinitveni rutini ves čas, ko je vhod P3.2 = 0.
Tudi jaz ne vem, v čem je smisel le tega. |
Ja, smisel ima. Odvisno od aplikacije. Enkrat sem na ta način delal mazanje enega starega stroja ki mu je že zdavnaj odpovedala funkcija centralnega mazanja. Sistem ima mikrostikalo, ki daje 24V vse dokler je v sistemu prisoten nek pritisk olja. Ko ta pade, je treba pognati pumpo centralnega mazanja. To sem rešil, da sem ta signal privedel na INT0 in dokler je bil na 24V, je program izvajal druge operacije, ki so še odpovedale stroju, ko pa je padel na 0, je pognal pumpo in jo držal vklopljeno toliko časa, dokler ni spet stikalo preklopilo. No, to je sicer že off-topic, samo vsekakor ima vsaka faunkcija svojo uporabnost. Po drugi strani pa pogrešam to pri ostalih GPIO pinih, saj bi mi včasih marsikatero prišparali. Sicer detektorja planke ni težko narediti, a vseeno ti pobere nekaj včasih še tako premajhnega FLASha
LP Gorazd _________________ .
._. _ _ ._. _.__. _|
[ (_](_)[ (_] /_(_]
._| |
|
Nazaj na vrh |
|
 |
marko11 Član



Pridružen-a: Ned 14 Dec 2003 17:47 Prispevkov: 893 Aktiv.: 3.77 Kraj: Dobrepolje
|
Objavljeno: Tor Maj 02, 2006 8:11 pm Naslov sporočila: |
|
|
Razlaga Tcon:
TCON = Timer/counter control
SET TCON.0 falling edge generates interrupt for INT0.
RESET TCON.0 low signal generates interrupt for INT0.
SET TCON.2 falling edge generates interrupt for INT1.
RESET TCON.2 low signal generates interrupt for INT1.
When TCON.x is RESET the interrupts keep on occurring while the input is low.
When TCON.x is SET the interrupt only occurs on the falling edge.
To test if a hardware interrupt is generated you can test the TCON.1 and TCON.3
flags. These flags are set by hardware when an external interrupt edge is detected.
They are reset by the RETURN statement of the interrupt service routine or
subroutine. TCON.1 must be tested for INT0 and TCON.3 must be tested for INT1.
LP _________________ Če ne veš kam greš, se ne moreš zgubiti. |
|
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: 491 dni
Powered by phpBB © 2001, 2005 phpBB Group
|