Fórum témák
» Több friss téma |
Fórum » Bascom-AVR
És itt kerülnek képbe mondjuk az ipari vezérlések, ahol nem biztos, hogy szerencsés, ha a program bármire való várakozás miatt nem fut...
Az előző hsz-emben leírt program remekül használható pl. gépi lemezolló, terménydaráló, vagy bármilyen alkalmazás indítására-megállítására, ahol szigorúan meg kell akadályozni, hogy az ember működés közben kézzel benyúlhasson a gépbe. Ezen alkalmazások esetében természetesen a két gombot olyan távolságra helyezik el, ahol szigorúan mindkét kéz igénybevételével lehet csak indítani. (ugyebár a program úgy működik jelen állapotban, hogy ha 0.2mp-en belül nem nyomja meg a két gombot, akkor nem indul a gép. hameg elindult és bármelyik gombot elengedi, akkor leáll, és csak akkor indul újra, ha elengedte és újra megnyomta mindkét gombot a delikvens)
HIBAJAVÍTÁS!!! ->
IF sorba (16. osr) kell egy AND A = 0 feltétel is! Elnézést
A felhasználási példa teljesen jó, én is ilyenre gondoltam elsőre.
Viszont a programot én mindenképpen megszakításokkal írnám meg, mert ez a beolvasás egyből bizonytalanná válik hogyha van valami több időt igénylő programrész, és nem jár épp ott a kontroller. Amúgy a bitwait utasításról tudtok írni? Nem alkalmaztam még soha. A másik: gombot úgy kötök be hogy felhúzóellenállással a pozitív tápra megy a port, és a gomb a port és a gnd közé. Azt figyelem mikor 0. Ez eddig világos. De hogy kapcsolom be a belső felhúzóellenállást, hogy ne kelljen plusz, külsőt alkalmazni?
Köszönöm a példa progit, de ha lehetne, akkor megszakításokkal szeretném, ha megoldanád.
A megszakítások, és a timer használatával. Szerintem a két legnehezebben megérthető rész.
( Egy port bit kiolvasása mindig a Pinx.y-al történik.)
Ez akkor is igaz, ha a portc1, és a portc.2 kimenet, és én a két kimenetet figyelem? Én idáig úgy tudtam, hogy a pinx.y csak akkor használjuk, ha bemenetet figyelünk.
Két lehetőség is van a portok irányának beállítására.
1.
Ebben az esetben ugyebár a B portod összes lába bemenetként funkcionál. Ha ilyenkor azt mondod, hogy
akkor az összes belső felhúzóellenállást aktiválod. Magyarán, ha az adott láb INPUTként van definiálva (pl.: Config Pinb.0 = Input), akkor az adott portláb '1'-re állításával lehet a hozzá tartozó felhúzóellenállást bekapcsolni. (PortB.0 = 1) Lehet, hogy így érthetőbb:
A fenti példában célszerűbb a bináris megadást használni, mivel átláthatóbb, hogy melyik bithez tartozó fh.ellenállásokat kell bekapcsolni. Ez azért jobb, mert ha pl azt írjuk véletlenül, hogy PORTB = 31, akkor a PortB 0. bitjének is '1'-et adunk meg értékként ami nem szerencsés, figyelembevéve, hogy azt kimenetként definiáltuk, és ezzel valamit bekapcsolhatunk (vagy éppen ki). 2. megoldási lehetőség:
Ebben az esetben a DDRx kódot használva adhatjuk meg, hogy az adott port (jelen esetben a B) egyes lábai kimenetek (Output -> '1'), vagy bemenetek (Input -> '0') legyenek. Ezután a felhúzóellenállások bekapcsolása már az ismert módon történik. Ugyanakkor hozzá kell, hogy tegyem, hogy tapasztalatom szerint ha lehet, célszerűbb a külső (10k) felhúzóellenállás alkalmazása, mert az úgymond "TUTI".
Nagyon jól magyarázod a dolgokat! Csak ne hagyd abba!
A feladat megoldva és kommentelve.
Időzítő alkalmazása:
Timer (azaz időzítő) használatánál, a használt frekvencia megadása mindíg fontos! Ebből lehet kiszámolni az időzítéseket. Mégpedig a következőképpen: Prescale/Crystal=időzítő 1 lépésének ideje. 1024/8000000=0,000128s Tudni kell, hogy a Timer0 egy 8bites időzítő (a Timer1 pedig 16bites), ami azt jelenti, hogy 256 lépést tesz meg (0-255) a túlcsordulásig, amikor is elugrik az On Timer0 Letelt sorban deklarált Letelt cimkével jelzett rutinhoz és megcsinálja amit mondunk neki. Tehát 1 lépést 0,000128 másodperc alatt tesz meg. Ha ezt megszorozzuk 256-al, akkor megkapjuk, hogy a Start Timer0 után mennyi idő múlva fog elugrani a Letelt cimkéhez. 0,000128*256=0,032768s De mi azt szeretnénk, hogy 0,2s-onként csináljon valamit a programunk, ezért egy változó értékét növeljük 1-el minden túlcsorduláskor a kellő ideig (Incr Cnt). És mennyi az a kellő idő? 0,2/0,032768=6,1035 Ez azt jelenti, hogy 6,1035-ig kellene elszámolni nagyjából, ha pontosan 200ms-nál akarunk csinálni valamit. De nekünk csak egész számokkal számol az a bizonyos változónk. Ezért közelítünk: 0,032768*6=0,19668 másodperc múlva fogja a program megvizsgálni, hogy megnyomódott-e a másik gomb is. A Start TimerX-et mindenképpen ki kell adni valahol a programban, mert különben nem indul el az időzítő. A Stop TimerX-el bármikor megállíthatjuk az időzítőt. Az időzítőt természetesen be is állíthatjuk egy kezdőértékre, ha pontos időt akarunk elérni. Pl.: 1 másodperces időzítést szeretnénk. Timer1-et használva az előző gondolatmenet alapján: Crystal=4000000 Prescale=64 64/4000000=0,000016s 0,000016*65536=1,048576s (mivel Timer1 - 16bites így 0-65535-ig számol, azpedig 65536 lépést jelent ) Ezzel kiszámoltuk, hogy Timer1 valamivel több, mint 1 másodperc után okoz megszakítást. De nekünk pontosan 1mp kell! Megoldás: 1(mp)/0,000016(mp)=62500 62500 lépést kell megtennie az időzítőnek, hogy pont egy mp teljen el. De az időzítő mindíg 65535-nél okoz megszakítást. Megoldás: 65535-62500=3035
3035-től 65535-ig pont 62500 lépést kell megtenni. Lehet kérdezni
Köszönöm! Te melyik egyetemen tanítasz? Akkor teszek fel még sok kérdést. HA megtanulok programozni, a Te segítségeddel, akkor viszek 1 láda sőrt, mert láttam, az egyik üveged üres már.
Kezdőknek ajánlott oldal:
http://avr.tavir.hu/ Innen töltsd le a Bascom magyarnyelvű leirást Valamint a forum részben szinte minden kérdésedre válasz kaphatsz.
Igazán nem tesz semmit
Köszi, de azt is olvasom. Viszont hpmaster egy általam kitalált feladatra adta meg a megoldást, nagyon érthetően elmagyarázva minden részt.
Ennek továbbgondolására írtam egy stopperórát lcd-re.
Int0-on van egy gomb amivel megállítani meg elindítani lehet, int1-en meg amivel lenullázni. Azthiszem maradt benne hiba, nem nagyon teszteltem, de működik az biztos, és az elv megértéséhez elég.
Ahogy időm engedi csinálok még példaprogramot, csak írjátok le hogy miről.
Ha tudom megírom.
Gifr = 64
Ez mire való, és mit csinál a programban? Ha lehetne, kommentezhetnéd a sorokat, ha nem nagy kérés. Úgy könnyebb megérteni szegény halandóknak.
Lehet hogy hülyeséget írok, de van egy GIFR nevű regiszter az AVR - ben (General Interrupt Flag Register). Az INT0 és INT1 megszakítások jelzőbitjei találhatóak itt. Szerintem azzal az utasítással egy konstans van beírva ebbe a regiszterbe.
Amikor elkezdtem ide föltenni a mintaprogramokat még fölkommenteztem, de sajnos a forummotor eléggé furán értelmezi a kommentet, és belekeveri a programba, így csak átláthatatlanabb lesz tőle. Megoldás ha fölteszem külön a .bas-t is és abba írom a kommentet. Legközelebb így lesz.
GIFR: Általános MegszakításJelző Regiszter (General Interrupt Flag Register) A Gifr regiszter nyolc bitet tartalmaz, ahol a hatodik és a hetedik van fenntartva az Int0 illetve az Int1 számára. Amikor a kontrollerünk egy megszakításrutinban dolgozik, tiltva van a az újabb megszakítás. De ez jelzésre kerül ezen a bizonyos két jelzőbiten. A megszakítások bejegyzései alaphelyzetben nulla állapotban vannak a Gifr regiszterben. Viszont a gombunk prellegése miatt több megszakítás is érkezhet egy megnyomásra. Ez egyböl nem hajtódik végre csak eltárolódik. Mikor viszatérünk a főprogramba ( return ) egyböl végrehajtódik az eltárolt megszakítás, így kétszer történek meg, az egy helyett. Amit meg kell tennünk, hogy a problémát orvosoljuk, az hogy a kérdéses bitet a Gifr regiszterben 1-re állítjuk mielőtt a Return utasítással visszatérnénk a főprogramba. Ezzel a módszerrel, ha a program visszatér a normál futási mederbe - a megelőző (régebbi) megszakítások kitörlődnek. www.avr.tavir.hu
Köszi
Alap parancsok a bascomban:
alapadatok: $regfile = "m8def.dat" /a vezérlő megnevezése (mega8) $crysral = 8000000 /használt órajel (8MHz) config PortD = Output /D-port kimenetre állítása Config PortB = Input /B-port bemenetre állítása Config Pinc.5 = Input /C-porton csak az 5ös láb bemenet Config Pinc.4 = Output /C-porton csak a 4es láb kimenet ( egy adott porton a lábakat különféle irányokkal lehet ellátni, egyesével ) Config LCD = 24*2 /24*2-es lcd használatad Config Lcdmode = Port /LCD használatad portrendszerben Config LCD = Pin, Db4=PortB.0 stb... / Az Lcd helyének megadása Config ADC= Single, Prescal = Auto /AnalaogDigital átalakító konfigurálása. Start ADC /ADC elindítása Config Int0= Falling /Megszakítás konfigurálása On Int0 akarmi / Az akarmi cimkére ugrás megszakitáskor ( cimke szanálata akarmi: kódrész return ) Enable Interrupts /Megszakítás engedélyezése Enable Int0 / Int0 engedélyezése PWM: Cinfig Timer1 = PWM, Compare A PWM = Clear Down, Prescal = 64 Parancs ehez: Pwm1a Változó deklarálás: Dim akarmi As Bit vagy Byte vagy World ( nézz utána a különbségeknek ) Ciklusok: do általában a fóprogra loop (Ezt végtelen ciklusnak is nevezzük mert a kontroller végtelenszer ismétli a benne lévő dolgot ( alap esetben ). Persze több módszerrel is ki lehet lépni a ciklusból: If-es feltétellen, goto-val.) For A (változó)= 1 To 10 Step 1 valami végrehajtandó next további program (Ezt a ciklust jelen esetben 10 szer hajtja végre, majd továbblép.) Feltételek: If "akarmi" = "valamennyi" Then ha igaz végrehajtja ezt Else ha nemigaz ezt hajtja végre EndIf további program Lcd: Cls ( törlés, konfigurálás, mindig ezzel kezdődik a kiiratás ) LCD "Kiirt szöveg" / Szöveg kiiratása Locate 2,1/ Szöveg második sor 1. karakterétöl kezdve kiirás Cursor Off / Cursor kikapcsolása Várakozás: Wait 1 / 1mp várakozás waitms 500 / 500milisek várakozás Goto akarhova / A program az akarhova cimkéhez küldése akarhova: további program / akarhova cimke (utána kettőspont !) 'Megjegyzés a program írójának / ( megjegyzést a ' karakter után írhatunk) ( a lista természetesen erősen hiányos, aki kedvet érez egészítse ki ) Amit nem részleteztem azt ITT megtalálod.
Szia! Meg tudnád nekem mondani hogy BASCOM - ban hogy kell a TIMER0 megszakítást bekapcsolni?
A TavIR kézikönyvben nem találtam, sem a bascom helpjében. Úgy próbáltam hogy Enable timer0 de szintakszishibát ír. Előre is kösz üdv gabi20
Hello!
A következőket kell tenned:
Ezzel konfigurálsz és beállítod az előosztót.
Az "Ido" cimkére lép a megszakításkor.
Engedélyezed a megszakítást és a timer0-t
Ezzel elindítod. ( stoppal meg leállítod ha kell ) illetve ha kell megadhatod az indulási értéket is, ettöl kezdve kezd számolni:
Remélem nem hagytam ki semmit
Nem tudja valaki, hogy mi a külömbség az ATMEGA8-nál, az OC1A, és az OC1B között a külömbség? PWM- szempontjából érdekelne.
Semmi. A Timer1-en ül mindkettő, és PWM1a ill PWM1b néven hivatkozol rája...
Köszi
Hello!
Gsm modul vezérlése bascomban megoldható? Ha igen hogyan ?
Meg.
A sorosporton at szolitod meg, es az OpenAT protokolt használd.... U.i.: a gms kisse tag. A T35i modemtol, a mobiltelefonon at a regi Nokina 1610-ig terjed.....
Ehez hasonlóra gondoltam. De ilyen téren teljes homály van a fejemben. Hogyan használok At parancsokat bascomban, és egyáltalán mik azok ? Soros port tehát RX TX ?
|
Bejelentkezés
Hirdetés |