Fórum témák

» Több friss téma
Fórum » PIC - Miértek, hogyanok haladóknak
Lapozás: OK   27 / 1318
(#) Frankye válasza Norberto hozzászólására (») Ápr 3, 2007 /
 
Megelőztelek! :hehe:
De azért Te részletesebben leírtad...
(#) unicorn válasza Norberto hozzászólására (») Ápr 3, 2007 /
 
Minkkettőtöknek köszönöm a választ.

Úgy vettem észre, hogy a Global Interrup Enable kikapcsolása nem oldja meg a problémát, mert van úgy, hogy az interrup kezelő rutin olyan gyorsan fut le, hogy utána még megtörténhet a pergés.
Minthogy inkább SW-es vagyok, ezért valószínűleg a PIC-ben fogom megoldani. Minthogy a program főciklusa úgyis csak egy üres végtelen ciklus, ezért valószínűleg abba fogom beleírni:
Ha interrupt érkezik, akkor a GIE-t letiltom. Ezt követően beállítok egy változót 1-re. Egészen addig, amíg ez a változó 1-en van nem fogadok el újabb interruptot az adott nyomógombtól. Közben pedig, ha a program végteleln ciklusában azt látom, hogy a változó 1, akkor elindítok egy ~0.1 mp.-es ciklust, amelynek a végén a változót törlöm.

Persze ettől függetlenűl megpróbálkozok a kapcsolási megoldással is, hiszen a legprofibb mégiscsak az lenne. Van esetleg egy kapcsolásotok (nem lustaságból kérdezem, én is keresni fogok )?
(#) potyo válasza Norberto hozzászólására (») Ápr 3, 2007 /
 
A megszakítási rutin kezdetén felesleges a megszakításokat letiktani, mivel a PIC ekkor automatikusan a GIE bitet nullába billenti. A RETFIE utasítás billenti vissza a megszakítás végén 1-be (egyébként csak ennyi a különbség a RETURN és a RETFIE között).
(#) Norberto válasza potyo hozzászólására (») Ápr 3, 2007 /
 
Köszi, ezt eddig nem tudtam

(Mert nem olvastam el a megszakításos részt még soha, csak próbálkoztam... :yes: )
(#) potyo válasza unicorn hozzászólására (») Ápr 3, 2007 /
 
Ha a nyomógombra nem kötelező azonnal reagálni, hanem mondjuk 8-16ms késés belefér (márpedig beleszokott, mivel nyomógomb), és van egy timer megszakítás, ami mondjuk 1ms időközönként (nagyságrendileg) fut le, akkor érdemes úgy csinálni, hogy minden egyes timer megszakításban növeled egy számláló értékét. Ha változott a gomb állapota az előző olvasáshoz képest, akkor törlöd a számlálót. Amikor a számláló elért mondjuk 16-ra, akkor bebillentesz valahol egy bitet (pl. a számláló 7. bitjét :eplus2: ). Amíg ez bit 1-es, addig a gomb további figyelése a timer megszakításban le van tiltva. A főprogramból pedig lekérdezed, hogyha a bit egyes, akkor feldolgozod a nyomógomb állapotát, és nullázod a számlálót (nem csak a bitet! ), ellenkező esetben nem csinálsz semmit. Így nincs semmilyen késleltetésre szükség, a megszakítási rutin nincs terhelve (nem tart sokáig, így nem befolyásolja egyes további megszakítások kiszolgálását, stb.), mégis megbízható módszer, illetve multiplexelt billentyűzetnél nem is lehet másként.

Hardveresen a dolog úgy néz ki, hogy a pic lába és a gnd közé egy kondenzátor van téve, valamint a láb és a táp közé egy ellenállás. A gomb a kondenzátorral van párhuzamosan. Az RC időállandót úgy kell beállítani, hogy a kondenzátor ne töltődjön fel, a pergés alatt, viszont mondjuk 100ms alatt feltöltődjön, hogy készen álljon a következő gombnyomásra. Tehát pl. R=47kΩ és C=2uF. De ha már van kontroller, akkor inkább azt használjuk a probléma megoldására, ez a kondenzátor+ellenállás megoldás inkább a nem "inteligens" áramköröknél használatos.
(#) potyo válasza Norberto hozzászólására (») Ápr 3, 2007 /
 
Idézet:
„Mert nem olvastam el a megszakításos részt még soha, csak próbálkoztam...”

Sokan nem olvassák el, és aztán jönnek a hülye kérdésekkel, amire legszívesebben az RTFM betűszóval válaszolnék.
(#) watt válasza potyo hozzászólására (») Ápr 3, 2007 /
 
Idézet:
„Sokan nem olvassák el, és aztán jönnek a hülye kérdésekkel, amire legszívesebben az RTFM betűszóval válaszolnék.”

Vagy ezzel a tök jó linkkel, amit szabi86 linkelt be korábban.(nekem nagyon tetszik! )

http://google.uw.hu/
(#) unicorn válasza potyo hozzászólására (») Ápr 3, 2007 /
 
Megosztanád velem (/velünk) a kondenzátor és ellenállás számítási módját? Tehát hogy hogyan jött ki a kétérték a 100ms-ra...
(#) dpeti válasza unicorn hozzászólására (») Ápr 3, 2007 /
 
Huh, sztem tedd félre a PIC-ezést, és vegyél a kezedbe egy HáRe könyvet... miután picit ismerkedtél a hálózatszámítás alapjaival, kevesebb kérdés merül majd fel...
(#) unicorn válasza dpeti hozzászólására (») Ápr 3, 2007 /
 
Az biztosan kéne Esetleg van javaslatod, hogy melyiket érdemes elolvasni?
(#) dpeti válasza unicorn hozzászólására (») Ápr 3, 2007 /
 
attol fugg merre laksz... Ha pesti vagy, akkor pl a muegyetemi konyvesboltbol:
Fodor Gyorgy: Jelek es rendszerek (vagy Halozatok es rendszerek -> tökugyanaz)
vagy szinten tole a Villamosságtan példatár (ezt meg jobban ajanlom), de a ketto egyutt sem art...
plussz tanulj meg alap szinten integralni meg derivalni...
ezek nelkul csak egy darabig boldogulsz, utanna mar nagy szukseged lesz ra
(#) unicorn válasza dpeti hozzászólására (») Ápr 3, 2007 /
 
Igazság szerint én Kandón végeztem informatika szakon, szóval tanultunk bőven mind elektronikát, mind digitális technikát (és persze volt analízis is).
Kösz a címeket, beszerzem őket.
(#) potyo válasza potyo hozzászólására (») Ápr 3, 2007 /
 
Most jutott eszembe, hogy van nekem egy forráskódom C-ben ehhez, de mivel nem bonyolult, átírható asm-be könnyen.
Globális változók:

char szamlalo;

Tehát a megszakítási rutinban ezt kell megcsinálni, ha három gomb van az RA0, RA1 és RA2 lábakon:

if (szamlalo)
{
if ((PORTA&0x07)^GOMB_UJ) szamlalo--;
else GOMB_UJ=(PORTA&0x07), szamlalo=8;
}

A főprogram:
Főprogram lokális változói:

char j,k,kod;

A végtelen ciklusban pedig:

kod=0, j=1;
if (!szamlalo)
{
if (GOMB_UJ^GOMB_REGI)
{
while (!kod)
{
if ((GOMB_UJ^GOMB_REGI)&j)
{
if (GOMB_UJ&j) kod=j;
}
j<<=1;
}
GOMB_REGI=GOMB_UJ;
}
szamlalo=8;
}

switch (kod)
{
case 1: balra=!balra; break;
case 2: if (impuls!=50) impuls++; break;
case 4: if (impuls!=10) impuls--; break;
}>>
(#) potyo válasza potyo hozzászólására (») Ápr 3, 2007 /
 
Tudom, hogy nem valami jól néz ki a kód, de ha bekapcsoltam a CODE gombot, akkor meg egy sorba rakott mindent, nem vette tekintetbe az Entert a sorvégeknél.
(#) unicorn válasza potyo hozzászólására (») Ápr 3, 2007 /
 
Igen, láttam Meg is rettentett Áttanulmányozom a kódodat.

Viszont keresgéltem egy kicsit és találtam egy másik megoldást is a pergésmentesítésre: RS flip-flop -pal:
.

Nagyjából tisztáztam magamban, hogy hogyan működik a dolog: kapcsoláskor a flip-flop egyik bemenete L, másik, H. Így megtörténik az adat írása. Pergéskor mindkét bemenet H állapotú, ami a flip-flop állapotát nem módosítja.

A kérdésem az lenne, hogy hogyan lehet ezt megoldani egy egyszerű mikrokapcsolóval. Ez a kapcsolás ugyanis egy SPDT kapcsolót használ.
(#) potyo válasza unicorn hozzászólására (») Ápr 3, 2007 /
 
Azért kíváncsi vagyok, miért akarod bonyolítani az áramkörödet, amikor szoftveresen néhány sorból áll az egész probléma megoldása. Azt, amit a főprogramhoz írtam, ígyis úgyis meg kell csinálnod a szoftverben, a plusz munka csak a megszakítási rutinban van.

Azt elfelejtettem, hogy a GOMB_UJ és a GOMB_REGI változók is globális változók C-nél.
(#) watt válasza unicorn hozzászólására (») Ápr 3, 2007 /
 
Ugye nem gondolod komolyan, hogy PIC-hez ilyen módon akarsz gombot illeszteni, mert nagyon szomorúak leszünk!
Tessék szépen programból lekezelni az a gombot, ahogy minden rendes programozó teszi! Az ilyen megoldásokat pedig hagyd meg a TTL technikának!
(#) unicorn válasza watt hozzászólására (») Ápr 3, 2007 /
 
potyo, watt: teljes mértékben igazatok van, azonban az ember úgy tanul, ha próbálkozik. Nagy valószínűséggel az életben nem fogok még egyszer ilyen filp-flop megoldást csinálni, de mindent ki kell próbálni egyszer, hiszen csak akkor tudom, hogy valóban meg tudom csinálni.

Teljesen egyértelmű, hogy nem fogok egy IC-t és két ellenállást tenni pluszban a nyákra csak azért, hogy ne kelljen leprogramozni.
(#) Topi válasza unicorn hozzászólására (») Ápr 3, 2007 /
 
Én is csak leszúrni tudnálak, de ha nagyon aggaszt téged a pergés, és nem megfelelő a szoftveres 1-2 ms-es delay vagy sleep, akkor köthetsz rá egy 100nF-os kondit is. Ez annyi ideig őrzi meg / annyi ideig töltődik ami tökéletesen lefedi a pergés idejét.
(#) Norberto válasza potyo hozzászólására (») Ápr 3, 2007 /
 
Idézet:
„aztán jönnek a hülye kérdésekkel”


Ez van...el kell fogadnod, hogy még mindig sok a hülye ember, akik csak hülyeséget tudnak kérdezni vagy mondani...és még lesz egy pár, azt hiszem...én lassan kezdem elfogadni ezt a helyzetet...mást úgyse lehet tenni.

És ami még ennél is nagyobb igazság: itt az oldalon nem ismerjük a kényszermunka fogalmát
(#) dpeti hozzászólása Ápr 3, 2007 /
 
ha mindenáron hardwares megoldást szeretnél, akkor vannak spec. IC-k erre a célra...
gyakorlatilag ugyanugy flip-flopokbol allnak, csak sok van bennuk, es egy tokkal X db kapcsolot tudsz kezelni...
tipusszamot ne kerdezz, egyszer lattam ilyet vmelyik arlistaban, de foloslegesnek tartottam.
Leginkabb csak erdekessegkeppen irtam ide annak, aki nem tudna
(#) unicorn hozzászólása Ápr 4, 2007 /
 
Újra csak azt tudom mondani, hogy teljesen igazatok van. Már meg is csináltam ASM-ben a saját pergéskezelésemet, működik is. Ettől függetlenül viszont a kérdés még érdekel. Kicsit offtopic, hiszen ez a része a dolognak egyáltalán nem PIC-hez kapcsolódik...
(#) Norberto válasza unicorn hozzászólására (») Ápr 4, 2007 /
 
Semmi gond nincs...inkább legyen offtopik, mint OFF az egész topiknak

Viszont ha te nem lennél, meg még a többi sok száz kérdező a "hülye kérdéseivel", akkor asszem, nem itt tartanánk, lehetne moderálni az üres témákat...


Én pedig személy szerint örülök, hogy sikerült összehoznod azt a szoftveres pergésmentesítést.
(#) watt válasza unicorn hozzászólására (») Ápr 4, 2007 /
 
Idézet:
„potyo, watt: teljes mértékben igazatok van, azonban az ember úgy tanul, ha próbálkozik. Nagy valószínűséggel az életben nem fogok még egyszer ilyen filp-flop megoldást csinálni, de mindent ki kell próbálni egyszer, hiszen csak akkor tudom, hogy valóban meg tudom csinálni. Teljesen egyértelmű, hogy nem fogok egy IC-t és két ellenállást tenni pluszban a nyákra csak azért, hogy ne kelljen leprogramozni.”


Ez így más kérdés, és így elfogadható. Nem bántani akartunk, csak a helyes irányba terelni. A hozzászólásodból úgy látszott, hogy egy PIC mellé fel akarsz tenni még jó néhany 7400-át, a gombjaidnak! Ez kicsit bántotta a szépérzékünket! :vigyor4: Egy szakamai fórumon kicsit kötöttebb a stílus, legalább is ez a szokás világszerte, ezt is meg kell tanulni és nem megsértődni(ami természetesen a Te esetedben sem(!) történt meg, remélem!! )
(#) watt válasza unicorn hozzászólására (») Ápr 4, 2007 /
 
Idézet:
„Ettől függetlenül viszont a kérdés még érdekel. Kicsit offtopic, hiszen ez a része a dolognak egyáltalán nem PIC-hez kapcsolódik...”

Az áramkör természetesen tökéletes prellmentességet biztosít! Én ezt úgy oldottam meg, hogy egy 7400-ra ráragasztottam egy mikrokapcsolót, majd fellógattam az ellenállásokat, majd jöttek a zsinórok és a végén bekerült egy zsugorcsőbe az egész(kivágtam a gombnál a csövet). Ha próbák során szükség van egy ilyen prellmentes forrásra(pl. szimulálni egy sebesség jeladót, stb.) akkor csak három vezetékkel bekötöm és kész. Megjegyzem ez így már nem offtopic, mert szerintem a kiegészítő áramkörök a PIC-es program élesztéséhez szükségesek.
(#) bokrosh hozzászólása Ápr 6, 2007 /
 
Sziasztok!

Nekem TMR0-al kapcsolatban lenne kérdésem.
Van egy kicsi program, ami mondjuk 20 ms-os késleltetést csinál, TMR0 számláló segítségével. Belső orajelről veszem a jelet, ésúgy számoltam hogy 20MHz kristálynál éppen 100at kellneki számolni, hogy 20 ms legyen. Na a gondomott van, hogy ha MPLAB SIM-el nézem akkor két utasításonként léptet egyet, ez ok.
De ha ICD2vel debuggolom a 16F874A pic-emet, akkor bizony számol 30-150-28... össze vissza egy parancs végrehajtásakor.

Kérdés: jól számoltam? Miért csinálja ICD-vel azt amit?


Gondoltam arra mivel a program memória egy részén hajtja végre a ICD a parancsokat, lehet máshogy számol. De kipróbáltam egy kb fél másodperces villogtatáts is. És a ledek nem viálgítanak egyáltalán. Nem úgy tűnik mintha gyors lenne a frekvencia.
(#) potyo válasza bokrosh hozzászólására (») Ápr 6, 2007 /
 
20ms-hoz az 100000-et kellene számolni, nem 100-at. Ha 20us-ot akartál írni, akkor jó a 100.

Azt nem tudom, hogy az ICD-vel miért csinálja ezt, nekem is ugyanígy a számlálók egész mást csinálnak vele. Valszeg az a magyarázata, hogy az ICD nem állítja le a számlálókat, hanem azok a kvarcfrekivel futnak továbbra is.

De az ilyen késleltetéseket legjobb az MPLAB SIM-el szimulálni, felesleges az ICD-vel lesni, hogy mi történik.
(#) bokrosh válasza potyo hozzászólására (») Ápr 6, 2007 /
 
Igen, köszi, rájöttem hogy MHz az 3db 0val több, elszámoltam. De aztán rájöttem hogy elég nekem a 32kHz is.És ez nem belső, hanem külső jel, szóval akkor nincs /4.Most elvileg a 32kHzes jelet 128-as előosztóval használom, akkor 0,5 sec-hez, akkor elvileg 125-öt kell számolni. jól számoltam?
(#) potyo válasza bokrosh hozzászólására (») Ápr 6, 2007 /
 
Én úgy számolom, 128-at kellene számolni.
(#) bokrosh válasza potyo hozzászólására (») Ápr 6, 2007 /
 
Hát nemtudom, akkor valamit rosszul csinálok. Elküldöm a progit, ha vna időd fusd át léci, és közöld mi a hiba,mert magamtól nem jövök rá. Bár túl tapasztalt nem vagyok, gondolom ez kiderült.

TMR0.asm
    
Következő: »»   27 / 1318
Bejelentkezés

Belépés

Hirdetés
Lapoda.hu     XDT.hu     HEStore.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem