megszakítások !! egy pici elakadás!

Hogyan programozzak AVR chipet? Programozók beállításai...
Bascom nyelvű programok...
Válasz küldése
Avatar
nobody_hun
Bitfaragó
Hozzászólások: 425
Csatlakozott: 2005. november 14. hétfő, 7:00

Hozzászólás Szerző: nobody_hun »

Csak az hibázik, aki dolgozik!
:D
"Az IC-k füsttel működnek. Ha kijön belőlük a füst, nem működnek tovább." - ismeretlen szerző
"Az ID:FFFFFF egyenlő az Atmel még nem kiadott processzorával."
Avatar
Ragen
DrótVégénSzéndarab
Hozzászólások: 17
Csatlakozott: 2010. július 16. péntek, 6:00

Hozzászólás Szerző: Ragen »

Egy kérdés megszakítás kezelésel kapcsolatban:
Ha érkezik egy megszakítás, akkor a program egy adott utasítást is félbehagy? Gondolok itt ha épp fut egy 'Waitms 1000', akkor közben jön az megszakítás pl 234ms-él átvált a proc a Int kezelésére, vagy megvárja a 1000ms végét és utána vált?
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Hozzászólás Szerző: kapu48 »

Igen megszakítja! Kivétel, ha előtte letiltod a megszakítást, utána engedélyezed.
De így pont a megszakítás gyors reagálását rontod le. Ilyenkor addigra már például a portok állapota megváltozhat.
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

Igen. Azért megszakítás.
A waitms sok nem más, mint egy számláló égy várakozás és egy összehasolítás a háttérben, hogy leketyegett-e...

Azaz ez bárhol megszakítható. :)

Próbáld ki, hogy kiadsz egy hangot a sound utasítással, vagy csak egy LED villogást. És közben az INT-en át valami beesik, és várakozást generál. (INT-ben levő program NEM szakítható meg!)
Avatar
winnerbt
Elektronbűvölő
Hozzászólások: 907
Csatlakozott: 2007. március 25. vasárnap, 6:00

Hozzászólás Szerző: winnerbt »

Szia!
Csak úgy a partszélről:
Amióta van mikroproc és mikrokontroller, van megszakítás, régebben csak hardver, tehát fizikai lábon (TMS1000 a világ első uC-je), késöbb "SW" is bejött. Az INT. utasításszinten működik, tehát magasabb szintű nyelven nem látod, mi történik, csak megjön. (ahogy Robi írta, hiába WAIT 100..
ha engedélyezett INT jön, az alap utasításként megszakítja a futó programot.
Viszont azzal vitatkoznék, hogy nem lehet INT-et megszakítani.
Vannak olyan uc-k (uP), amelyek vagy prioritásba rendezik az INT-eket, jól el is lehet menni az erdőbe a megszakítási szintek átállításával, tehát magasabb prioritásu INT meg tudja szakítani az alacsonyabb prioritásút, általában jobb helyeken 3 szintet használnak. AVR-nél nincs ilyen, de ha időkritikus a dolog, akkor az INT rutinodban töröld azt a bitet, ami jelzi a uC-nek, hogy INTben van, akkor megeszi a többi megszakítást is, tehát meg lehet szakítani a megszakítást. Csak érdekességképp, egy általános uP tudásának kb 1/3-át elviszi az INT rendszer, ezért is ilyen vacak az AVR-eké, tettek rá..."majdogynem nincs is". De pl. egy DMA vezérlő bonyolultabb chip mint maga a uP. Bascomnál azonban ésszel kell kezelni a megszakítás átverését, mert a Basic INT-ben a RETURN utasítás az nem igazi RET, hanem húzza vissza a stack-ből a dolgait, no, most ha bejött másik is, akkor a RETURN nevű basic utasítás elkolbászolhat. Tehát nem kell parázni, csak észben kell tartani. Nagyon tanulságos volt disassemblerrel megnézni, milyen dolgok történnek...meg is szívtam anno.
JAni
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

Ops. Pontosítok:
AVR-re írtam és ott is csak az AVR8 családra....

De pl. AVR-XMEGA esetén 3 szint lehet:
http://www.atmel.com/dyn/resources/prod ... oc8043.pdf
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Hozzászólás Szerző: kapu48 »

Nana!
Én ezt nem ajánlanám egy abszolút kezdőnek!
Ráérne, majd ha a 2 – 3 félle stack kezeléssel tisztában lesz. Mert különben fogalma sem lesz hol, mi a hiba oka! Vagyis elmegy a kedve a sok szívás miat!

:!:
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

Igaz. Viszont kezdőként (sem) árt, ha látja mi van más esetekben, milyen lehetőségei vannak... És ez mit és hogyan okoz - hacsak annyira ismeri, hogy "van ilyen, és ez a háttere". Könnyebb az alapokat megértenie... (szerintem)
Avatar
winnerbt
Elektronbűvölő
Hozzászólások: 907
Csatlakozott: 2007. március 25. vasárnap, 6:00

Hozzászólás Szerző: winnerbt »

Sziasztok!
Csak annyit brekegnék még bele, hogy az INT valami miatt (úgy általánosságban) nagyon meg tudja keverni a cuccal ismerkedőket. Azért írtam, hogy nem olyan bonyolult ám (belülről eszement, de kit érdekel), de ezzel nagyon gyorsan el lehet riasztani az embereket egy életre a programozástól. Szerencsére itt nem gépi ciklusonként kell érteni a dolgot, kivéve, ha valami nagyon időkritikus vackot csinál az ember. Azt viszont nem tudtam, hogy már az X-ben van 3 szint, bár honnan tudtam volna, ha nem dolgoztam vele...
Az viszont nagyon igaz(kapu48), hogy a stack-et meg kell érteni előbb, aztán jöhetnek az egymásrafutó INT-ek meg mifenék. Persze a Bascom elfedi a nagyrészét, de félelmetesen jó dolgokat lehet csinálni, ha tudod, mit-hogyan mentett el.
(és még mindig nem tudom, mire jó a Push SP utasítás, egyszer valaki 20 éve elmagyarázta, de azóta hülyültem)
Na, jóebédhez szól a nóta mindenkinek.
JAni
Avatar
szepnorbee
Bitmanipulátor
Hozzászólások: 122
Csatlakozott: 2009. augusztus 31. hétfő, 6:00

Hozzászólás Szerző: szepnorbee »

Sziasztok! Gomb állapot változásra nincs valakinek mintakódja? pl. Ha tartok egy gombot, akkor játszódjon le egy folyamat (de csak egyszer és ne folyamatosan míg nyomom) aztán ha elengedem akkor egy másik folyamat (és az is csa kegyszer). Aztán míg nem történik állapotváltozás, ne történjen semmi, hanem a jelenleg beállt állapot legyen érvényben. Lehet bonyosan fogalmaztam. Küzdök ezzel de nem segít gugli.
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

Ha neked kell ezt végrehajtani, hogyan tennéd meg?

Folyamatábra, amiben:
- elágazás 2 irányban
- lineáris utasításvégrehajtás
- start és stop mező van?


Hol tartasz eddig? :?:
Mintakód/elképzelés?

A adjon vki kódot, az a sültgalamb effektus!

PICBasicban vagy 8051 ASMBen jó a kód? Esetleg 80386DX-40 ASMben? :twisted:

U.i.: Bocsánat ha nyers lett egy kicsit. De tessék erőlködni és legalább elindulni vmi úton...
Ha a Párizs fényeit akarom látni legalább megnézem, hogy mi megy oda (repülő, autó, bringa, gyalog) és szervezkedek. Nem pedig elmondom és várom hogy valaki odavigyen.
Gyalog is el lehet indulni (első lépések, elképzelés) és útközben úgyis segítenek (stoppolás, és kocsival). A gyalogos lennél Te, a sofőrök a stoppolásnál, meg a fórum. Az se visz el végig, de sokat segít a megtett út során... Igaz néha Moszkva fele fog vinni :) ....
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

Ha már kinn állsz a ház előtt, az első sofőr én lennék. Mondjuk elviszlek az országhatárig.
Bascom: BitWait utasítás....
Avatar
szepnorbee
Bitmanipulátor
Hozzászólások: 122
Csatlakozott: 2009. augusztus 31. hétfő, 6:00

-

Hozzászólás Szerző: szepnorbee »

Bocsi, jogos amit mondasz. Próbálkozom összehozni és egyedül, de sajna sikertelenül.

Itt tartok:

Kód: Egész kijelölése

$regfile = "attiny45.dat"
$crystal = 8000000

Dim A As Bit
Dim Ok As Bit
Dim Feny As Integer
A = 0


Config Portb.1 = Output                                     'pwm
Config Pinb.2 = Input                                       'kapcs

Config Timer0 = Pwm , Prescale = 64 , Compare B Pwm = Clear Up
Enable Timer0

Main:

Do
   If Pinb.2 = 0 Then
   Waitms 200
      Do
         If Pinb.2 = 0 And A = 0 Then
            A = 1
            Goto M1
         End If
         If Pinb.2 = 1 Then Ok = 0
         A = 1
      Loop Until Ok = 0
   End If

   If Pinb.2 = 1 Then A = 0
   Goto M2
Loop


M1:
Do
Feny = Feny + 1
Pwm0b = Feny
If Feny > 255 Then Goto Main
Waitms 8

Loop

Goto Main

M2:
Do
Feny = Feny - 1
Pwm0b = Feny
If Feny = 0 Then Goto Main
Waitms 8

Loop

Goto Main
A probléma az, hogy a program az indulásakor már az M2: részt (halványítás) ismétli folyamatosan. A gombot figyelmen kívül hagyja. A B.2 por fel van húzva az 5 V tápfeszre és a kapcsoló a GND-hez érinti a port B.2-t. Biztos az IF.... THEN résznél van a galiba, de nem látom, hogy mi.
Avatar
nobody_hun
Bitfaragó
Hozzászólások: 425
Csatlakozott: 2005. november 14. hétfő, 7:00

Hozzászólás Szerző: nobody_hun »

Első látásra:

A Do-Loop-on belüli

Kód: Egész kijelölése

If Pinb.2 = 1 Then A = 0 
Goto M2 
okozza a galibát, ami a csökkentés rutinja (M2) és feltétel nélkül odaugrik.

Mondjuk 1 gombbal én úgy oldanám meg, hogy első gombnyomásra növeli, ha elérte a 255-öt, onnan csökkenti a fényerőt.
"Az IC-k füsttel működnek. Ha kijön belőlük a füst, nem működnek tovább." - ismeretlen szerző
"Az ID:FFFFFF egyenlő az Atmel még nem kiadott processzorával."
Avatar
szepnorbee
Bitmanipulátor
Hozzászólások: 122
Csatlakozott: 2009. augusztus 31. hétfő, 6:00

Hozzászólás Szerző: szepnorbee »

Köszi! A cél az lenne hogy míg nyomva tartom a gombot, addig a fényerő nő, majd maxon marad míg tartom. Majd ha elengedem csökken és zérőn marad míg meg nem nyomom.
Válasz küldése