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 

Interrupt in problem

 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> AVR, LPC900, x51
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
fbifbi
Član
Član



Pridružen-a: Pon 05 Jul 2004 12:17
Prispevkov: 129
Aktiv.: 0.54
Kraj: ljubljana

PrispevekObjavljeno: Ned Apr 30, 2006 11:16 pm    Naslov sporočila:  Interrupt in problem Odgovori s citatom

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
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo MSN Messenger - naslov
Slemi
Član
Član



Pridružen-a: Pet 29 Okt 2004 13:29
Prispevkov: 386
Aktiv.: 1.63
Kraj: Hrastnik

PrispevekObjavljeno: Pon Maj 01, 2006 6:29 am    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo AIM - AOL Instant - naslov MSN Messenger - naslov
vilko
Član
Član



Pridružen-a: Pet 13 Feb 2004 10:26
Prispevkov: 3358
Aktiv.: 14.18
Kraj: Dragomer

PrispevekObjavljeno: Pon Maj 01, 2006 7:55 am    Naslov sporočila:  Malo sem pogledal Odgovori s citatom

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



Pridružen-a: Pon 05 Jul 2004 12:17
Prispevkov: 129
Aktiv.: 0.54
Kraj: ljubljana

PrispevekObjavljeno: Pon Maj 01, 2006 12:27 pm    Naslov sporočila:   Odgovori s citatom

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
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo MSN Messenger - naslov
strobos
Član
Član



Pridružen-a: Sre 24 Sep 2003 12:19
Prispevkov: 726
Aktiv.: 3.07
Kraj: Brežice

PrispevekObjavljeno: Pon Maj 01, 2006 5:59 pm    Naslov sporočila:   Odgovori s citatom

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



Pridružen-a: Pon 05 Jul 2004 12:17
Prispevkov: 129
Aktiv.: 0.54
Kraj: ljubljana

PrispevekObjavljeno: Pon Maj 01, 2006 7:02 pm    Naslov sporočila:   Odgovori s citatom

Rezrvirana je le črka B.
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo MSN Messenger - naslov
RGorazd
Član
Član



Pridružen-a: Čet 20 Maj 2004 15:57
Prispevkov: 1714
Aktiv.: 7.24
Kraj: Ig

PrispevekObjavljeno: Pon Maj 01, 2006 9:40 pm    Naslov sporočila:   Odgovori s citatom

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



Pridružen-a: Pet 13 Feb 2004 10:26
Prispevkov: 3358
Aktiv.: 14.18
Kraj: Dragomer

PrispevekObjavljeno: Pon Maj 01, 2006 9:45 pm    Naslov sporočila:   Odgovori s citatom

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



Pridružen-a: Pet 13 Feb 2004 10:26
Prispevkov: 3358
Aktiv.: 14.18
Kraj: Dragomer

PrispevekObjavljeno: Tor Maj 02, 2006 7:33 am    Naslov sporočila:  ni problem bascom Odgovori s citatom

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



Pridružen-a: Čet 20 Maj 2004 15:57
Prispevkov: 1714
Aktiv.: 7.24
Kraj: Ig

PrispevekObjavljeno: Tor Maj 02, 2006 12:24 pm    Naslov sporočila:  Re: ni problem bascom Odgovori s citatom

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 Smile

LP Gorazd

_________________
.
._. _ _ ._. _.__. _|
[ (_](_)[ (_] /_(_]
._|
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
marko11
Član
Član



Pridružen-a: Ned 14 Dec 2003 17:47
Prispevkov: 893
Aktiv.: 3.77
Kraj: Dobrepolje

PrispevekObjavljeno: Tor Maj 02, 2006 8:11 pm    Naslov sporočila:   Odgovori s citatom

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

 
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