Interrupt?

Hogyan programozzak AVR chipet? Programozók beállításai...
Bascom nyelvű programok...
Avatar
Meschu
Tranzisztorgyógyász
Hozzászólások: 163
Csatlakozott: 2009. december 3. csütörtök, 7:00

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

Köszi skacok nagyon.

Most persze át kell gyurnom az egészet és kiprobállgatnom.

Kapu, ja rémlik még de mint látod igen ritkán kell ilyesmikkel foglalkoznom és igy mindig kopik ahelyett hogy gyarapodna :(

Az interrupt körűl forgolódok (avval megy) és igen nem akarom bevenni még, hogy egy egyutasitásos részletben a poling megoldás ne lenne gyorsabb. Ezért csak a (számomra) lehető legegyszerűbb példát hoztam amit igy is próbállok ki, ha megy akor már fejleszthetem mert tudom, hogy ez a rész tuti OK. Nekem igy átláthatóbb, megérthetőbb nektek talán nem de azt meg én honnan tudhatnám, akkor nem lenne ez a proglémám már rég:-) Ugyhogy legyetek elnézőek. Nem véletlen a névvállastás Meschu:-)

Itt meg emigyen filóztam:

Do
If Szenzor = 1 Then Ujszenzor = 0 Else Ujszenzor = 1

Olvastam valahol, hogy ez igy egy sorban megy. Most tehát biztos hogy nem lehetnek egyenlőek gondoltam akármi is a Szenzor állapota jelenleg.
namost bekapcs

Portd.5 = 1

Loop Until Szenzor = Ujszenzor

most megnéz mi a helyzet a Szenzorral, az meg válltozott de az Ujszensor nem, tehát most egyenlőeknek kell lenniők.

Gyanitottam persze hogy megint ujra az Ujszenzort is átirja de miért, erre nem volt itt ennél a lépésnél utasitva?

Mivel nyilvánvalóan nem igy van fordúltam hozzátok.

Persze a flagokat nem egyenként kell, de az itt esetleges hibát is ki akartam eleve kerülni, biztos ami biztos jeligére. A Próbálgatásra és megértésre nekem igy tünt biztossabbnak.
Avatar
kovacsna
Pákabűvész
Hozzászólások: 208
Csatlakozott: 2008. június 3. kedd, 6:00

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

"most megnéz mi a helyzet a Szenzorral, az meg válltozott de az Ujszensor nem, tehát most egyenlőeknek kell lenniők.

Gyanitottam persze hogy megint ujra az Ujszenzort is átirja de miért, erre nem volt itt ennél a lépésnél utasitva? "

A loop until, az az egész ciklusra vonatkozik! Magyarul, visszaugrik a do-ra és végrehajtja megint! Addig, amíg nem lesz meg az egyenlőség!

Tehát, ha változik a szenzor, változik az ujszenzor is! Érted?

Ha leírod ezt a szenzorosdit, hogy mit kell valójában csinálni, mik a feltételek, akkor jobban tudunk segíteni!
Avatar
Meschu
Tranzisztorgyógyász
Hozzászólások: 163
Csatlakozott: 2009. december 3. csütörtök, 7:00

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

A loop until, az az egész ciklusra vonatkozik! Magyarul, visszaugrik a do-ra és végrehajtja megint! Addig, amíg nem lesz meg az egyenlőség!

Tehát, ha változik a szenzor, változik az ujszenzor is! Érted?

Ezt tapasztaltam, gyanitottam ill. nem volt más magyarázatom rá de nem látom be ill. nem ismerem miként lehetne ezt interrupt nélkül megoldani hiszen csak egy egyetlen változót kéne figyelnie és mindig az egyetlen parancs után (az én speciállis esetemben) tehát biztos hogy gyorsaban lehetetlen lenne közbeszolni mivel egy taktus van csak és nem az egész interrupt lépéssorozatot végrehajtania.

Talán nem do Loop until ide a nyerő de az egésznek mégis egy subban kell majd helyet foglalnia végül, mert más feladatok is vannak. Ha ez a soros akkor a többiekre nem kell figyelni egyáltalán. Várhatnak nyugodtan:-)

Analog vagy mehanikus módon pofonegyszerű lenne elvileg.

Ha leírod ezt a szenzorosdit, hogy mit kell valójában csinálni, mik a feltételek, akkor jobban tudunk segíteni![/quote]

Még mindig a régi téma (megy interruptal) mágnesek sorban ezek elött kell a tárgyat amin a szenzor van elvonultatni a mágnesek egymás utáni bekapcsolásával. A szenzor allapállása ismeretlen ezt gondolom ki kell először olvasni de minden egyes mágnes elérésekkor változik. Álló helyzetből (mágnes 1) gyorsitani kell mágnes x ig. Ekkor vissza az elsőhöz mert a következő cuc ha belépett azt jelenti a kapcsoló és most azt kell ugyanugy továbbitani. Ha ez megy már akkor egy időfigyelés is majd kell amely feladata hogy, ha valami akadály miatt a cuc nem egy megszabott időn belűl éri el a következő mágnest akkor meg kell állitani az egészet mert a mágnesek nem huzamos bekapcsolásra vannak tervezve és rögtön leéghetnek.
E folyamat alatt semmi másnak sem szabad történnie.
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

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

Az elgondolásod jó. Csak átkel rendezni!

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

' Elöször megvizsgálod a szenzort...
 If Szenzor = 1 Then 
          Ujszenzor = 0 
          Else 
          Ujszenzor = 1 
       End If 
Do   'És megvárod amig megváltozik az állapota
        Portd.7 = 1 
 Loop Until Szenzor = Ujszenzor
Avatar
Meschu
Tranzisztorgyógyász
Hozzászólások: 163
Csatlakozott: 2009. december 3. csütörtök, 7:00

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

Hát nagy kavics esett le a ketyegőmrűl mondhatom.
Má aszitem anyi a viztornyomnak:-)

Köszi most el kell rohannom de még éjjel kiprószállom.
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

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

Állapotváltozásra a Bitwait utasítás is jó. Nem kell do-loop-untillal játszani...
Avatar
kovacsna
Pákabűvész
Hozzászólások: 208
Csatlakozott: 2008. június 3. kedd, 6:00

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

Amiről te beszélsz, azt lépéslánc vezérlésnek hívják! Így működik a mosógép elektronika is! Ha teljesül a feltétel, következik a második lépés. Így tovább!

Ha elfogadsz egy jó tanácsot, akkor fogsz egy papírt, és szépen rajzolsz egy folyamatábrát. Mikor, mit és milyen feltételekkel kell végrehajtani. Hidd el sokkal kevesebb idő alatt lesz kész a programod és a hibákat is egyből látni fogod!

Használj állapotjelző biteket, amiket csak egy helyen állítasz be és törölsz! Aztán ezeket vizsgálod! (bocsi de PLC-s múltat nem tudom levetkőzni)

Feltételezem a mágnesek külön-külön kimenetről vannak vezérelve.

Ezeket induláskor végig kapcsolgatod és ahol megjön a szenzor jeled, ott van a tárgy! Ha van szenzor jel, akkor meg ahol megszűnik, ott a tárgy!

Az időzítés is egyszerű. Csinálsz egy timert, mondjuk 100 ms-es megszakítással. A timer megszakítás rutinjába újra beírod a timer lánc kezdő értékét, illetve növelsz egy változót 1-el. ( incr Mtimer100ms_tmp)

A programodban mikor lépteted a tárgyat egyik mágnesről a másikra akkor ezt csináld: (feltételezzük, hogy az 1-es mágnesnél áll, tehát a 2-t kell megvezérelned és max 500 ms alatt kell lezajlódnia):



Készíts egy startot jelző bit-et. Pl dim leptet_start as bit


lepes = 2 ' Itt mondod meg, hogy a másod mágnes következik

set leptet_start ' itt inditod


If lepetet_start = 1 and szenzor = 1 then 'vizsgálod a start jelet

timer1 = kezdőérték. (ki kell számolnod)

Mtimer100ms_tmp = 0

start timer1

set leptet_start_tmp

reset leptet_start

set kimenet.lepes

End if

Hiba vizsgálat:

If leptet_start_tmp = 1 then

If Mtimer100ms_tmp >= 5 and szenzor = 0 then

reset kimenet.lepes

stop timer 1

Mtimer100ms_tmp = 0

Set hiba

reset leptet_start_tmp

End if

End if

If szenzor = 1 and kimenet.lepes = 1 then

reset kimenet.lepes

stop timer 1

Mtimer100ms_tmp = 0

reset leptet_start_tmp

incr lepes

End if

If hiba = 1 Then

Print "Gáz van Babám"

Reset hiba

End if


Ezt az egészet szépen ciklusba rendezed , hogy ne kelljen annyiszor leírni, ahány mágnesed van.

Valami ilyesmi. Így a programod sosem áll, hanem pörög.
Robert-nek igaza van a bitwait-el, csak az a hátránya, hogy onnan csak akkor lép a programod, ha teljesül! Mi van ha közben valami hiba jel jön?

Az elv az egésznek:

Üzemi feltételek vizsgálata

Hiba jelek vizsgálata

Vezérlés indítása


Remélem segítettem.






Nem kell félni a sok lépéstől. Már 1MHz-en is bőven van ideje még sörözni is a kontrollernek!
Avatar
Meschu
Tranzisztorgyógyász
Hozzászólások: 163
Csatlakozott: 2009. december 3. csütörtök, 7:00

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

Huha srácok tavaszodik:-)

Igen, a papir az igazi találmány a tűz után.
a feleségem már rég ismerti (mindig zetliket akar rámdumálni ha vásárolni küld de annak az a hátránya, hogy ugyse olvasom el:-)

Persze ugy kell igazatok nagy. Gondoltam kikerülhetem ha igen apróra taglalom a részleteket és ezekből ha már magukban mennenk ésszekopirozom majd.
De belátom a régi bevált módszer a nyerő.

Egyébbként ha valami kapcsolást bütykölök, vagy mechanikán filózok mindig is igy csinálom.
A progirásnál már tudom miért nem akaródzott.

Az egésztől alapjábavéve valahogy fáztam. Nem sikerélményel kezdődöt:-)

Tegnap anyira felbuzdultam, hogy majden valóraváltottam könyelmű igéretem, hogy még éjjel nekilátok de az aszonynek az ilyen heveny rohamok lekezelésére bevált módszere van:-)

Köszi mindyájatoknak.

Remélem nem követtetek el itt valami szarvashibát mert akkor még mielőtt kihevertétek jövök könyörtelenűl megint:-)
Avatar
Meschu
Tranzisztorgyógyász
Hozzászólások: 163
Csatlakozott: 2009. december 3. csütörtök, 7:00

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

Sziasztok.

Mi itt (már megint) a hiba:-)

Ha én egy portx et initializálokk kimenetre igy


$regfile = "m8def.dat"
$crystal = 1000000


Config Portb.0 = Output
Portb.0 = 1

Akkor ennek a progi inulásakkor a meghatározott állapotot kéne mutatnia nem?
De nem teszi hanem kb. 1,54V t mérek rajta.

Egy másik szintén mint Output de Nullára initializálva (Portd.6=0) pedig k.b 3,6V t mutat

Namost ha a főprogiban
Do
Portb.0 =1 : Portd.6=0
Szintén ezt közvetlen a Do után beirom akkor is mig egy kapcsoló amely majd az egész folyamatot ezután meg nem intitja be nics kapcsolva tartják a helytellen értékeket.
Mihelyt bekapcs felveszik a korekt állapotokat és tovább megy minden ahogy kéne.

If Pinc.4 = 0 Then Do megtörténik megy a Blabla korekt értékekel

De csak mig a kapcsoló ki nem lessz kapcsolva.
Mihely kikapcs megint felveszik a helytelen értékeket.
Miért ill. mit csinállok itt megint mint általában mindig rosszúl???:-)
Mit kell itt tenni mert a korekt állapotok állóhelyzetben is nagyon fontossak lennének.
Avatar
kovacsna
Pákabűvész
Hozzászólások: 208
Csatlakozott: 2008. június 3. kedd, 6:00

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

Mi van ezekre a lábakra kötve?
Avatar
Meschu
Tranzisztorgyógyász
Hozzászólások: 163
Csatlakozott: 2009. december 3. csütörtök, 7:00

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

A mérés alatt semmi. Valszi, hogy itt volt a bibi,
Most (több portról van szó) és most ezekre kis ledeket akasztottam és ezek állapota vlóban korekt.
A félelmem meg azért volt mert ezek most (más ügy) amire használnám végül egy mostet félhidakból álló sort kapcsolnának és egy egybenyitást mindenféleképpen meg kell akadályozni bármily rövid legyen is.
Már fogyóban vannak lassan.
Igen nagyokat pukkantak, sokat kellett szellőztetni:-)

Más, ha én egy egyenáramról meghajtott szinkronmotor felvételét PWM el szeretném szabizni elegendő ha azt csak egy Tranyóval a bemeneten teszem vagy minden egyes fázist külön külön a bekapcsolásukkor buzerálni kell. Ha igen akkor miért?
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

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

Az összes GND és az összes Vcc/VccA be van kötve?
AVR-en ott van a 100nF szűrőkondi?
Aref és a GND közt ott a 100nF kerámiakondi?

A chip igaz nem ATMega8PA ATMega8 helyett?
Avatar
Meschu
Tranzisztorgyógyász
Hozzászólások: 163
Csatlakozott: 2009. december 3. csütörtök, 7:00

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

0916G 16-CPU
Ez áll rajta.

Minden úgy räkötve mint mondod plusz kis induktivitás még.
1As szintén minden ahogy illik kondizva LM 7805 ről táplálva ami 12V akkuról kapja a feszt.
Semmi se terhelt ezen még.
Válasz küldése