Fórum témák

» Több friss téma
Fórum » Bascom-AVR
 
Témaindító: puli122, idő: Ápr 11, 2010
Lapozás: OK   3 / 18
(#) hpmaster válasza gerry hozzászólására (») Máj 3, 2010 /
 
É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)
(#) hpmaster válasza hpmaster hozzászólására (») Máj 3, 2010 /
 
HIBAJAVÍTÁS!!! ->

  1. Do
  2.    If Pinb.0 = 0 Or Pinb.1 = 0 And A = 0 Then
  3.    Waitms 200


IF sorba (16. osr) kell egy AND A = 0 feltétel is!

Elnézést
(#) puli122 válasza hpmaster hozzászólására (») Máj 4, 2010 /
 
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?
(#) elektromos válasza hpmaster hozzászólására (») Máj 4, 2010 /
 
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.
(#) elektromos válasza gerry hozzászólására (») Máj 4, 2010 /
 
( 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.
(#) hpmaster válasza puli122 hozzászólására (») Máj 4, 2010 /
 
Két lehetőség is van a portok irányának beállítására.

1.
  1. Config Portb = Input

Ebben az esetben ugyebár a B portod összes lába bemenetként funkcionál. Ha ilyenkor azt mondod, hogy
  1. PortB = 255

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:
  1. Config Portb.0 = Output
  2. Config PinB.1 = Input
  3. Config PinB.2 = Input
  4. Config PinB.3 = Input
  5. Config PinB.4 = Input
  6. Config PortB.5 = Output
  7. Config PortB.6 = Output
  8. Config PortB.7 = Output
  9.  
  10. PORTB = &B00011110
  11. 'vagy megadhatjuk decimálisan is:
  12. PORTB = 30

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:
  1. DDRB = &B11100001
  2.  
  3. PORTB = &B00011110

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".
(#) puli122 válasza hpmaster hozzászólására (») Máj 4, 2010 /
 
Így már világos. Köszi
(#) elektromos válasza hpmaster hozzászólására (») Máj 4, 2010 /
 
Nagyon jól magyarázod a dolgokat! Csak ne hagyd abba!
(#) hpmaster válasza elektromos hozzászólására (») Máj 4, 2010 /
 
A feladat megoldva és kommentelve.

Időzítő alkalmazása:
  1. $Crystal = 8000000
  2.  
  3. Config Timer0 = Timer, Prescale = 1024
  4.  
  5. On Timer0 Letelt
  6.  
  7. Enable Interrupts
  8. Enable Timer0
  9.  
  10. Start Timer0

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

  1. Timer1=3035
  2. Start Timer1


3035-től 65535-ig pont 62500 lépést kell megtenni.

Lehet kérdezni
(#) elektromos válasza hpmaster hozzászólására (») Máj 5, 2010 /
 
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.
(#) ht1080z válasza elektromos hozzászólására (») Máj 5, 2010 /
 
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.
(#) hpmaster válasza elektromos hozzászólására (») Máj 5, 2010 /
 
Igazán nem tesz semmit
(#) elektromos válasza ht1080z hozzászólására (») Máj 5, 2010 /
 
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.
(#) puli122 hozzászólása Máj 6, 2010 /
 
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.
  1. '--- alapadatok ---
  2. $regfile = "m8def.dat"
  3.  $crystal = 4000000
  4.  
  5. Config Lcd = 24 * 2
  6. Config Lcdpin = Pin , Db4 = Portb.0 , Rs = Portb.1 , Db6 = Portb.5 , E = Portb.2 , Db5 = Portb.3 , Db7 = Portb.4.
  7. Config Lcdmode = Port
  8.  
  9. Config Int0 = Falling
  10. Config Int1 = Falling
  11.  
  12. On Int0 Gomb
  13. On Int1 Gomb1
  14.  
  15. Enable Int0
  16. Enable Int1
  17.  
  18. Config Timer1 = Timer , Prescale = 64
  19.  
  20. On Timer1 Ido
  21.  
  22. Enable Interrupts
  23.  
  24. Enable Timer1
  25.  
  26.  
  27.  
  28. Dim Mp As Integer
  29. Dim Perc As Integer
  30. Dim Sta As Bit
  31. Dim Null As Bit
  32.  
  33. Timer1 = 3035
  34.  
  35. Do
  36.  
  37. If Null = 1 Then
  38.  
  39. Mp = 0
  40. Perc = 0
  41. Sta = 0
  42. Null = 0
  43.  
  44.  
  45. End If
  46.  
  47.  
  48. If Sta = 0 Then
  49.  
  50. Stop Timer1
  51.  
  52. Else
  53.  
  54.  
  55. Start Timer1
  56.  
  57. End If
  58.  
  59.  
  60. If Mp > 59 Then
  61. Mp = 0
  62.  
  63. Perc = Perc + 1
  64.  
  65. End If
  66.  
  67.  
  68. Cls
  69.  
  70. Lcd "Eltelt ido:" ; "  " ; Perc ; ":" ; Mp
  71.  
  72. Waitms 800
  73.  
  74. Loop
  75.  
  76. Gomb:
  77.  
  78. Toggle Sta
  79.  
  80. Waitms 75
  81. Gifr = 64
  82.  
  83. Return
  84.  
  85. Gomb1:
  86.  
  87. Null = 1
  88.  
  89. Waitms 75
  90. Gifr = 64
  91. Return
  92.  
  93. Ido:
  94.  
  95. Mp = Mp + 1
  96.  
  97. Return
(#) puli122 hozzászólása Máj 11, 2010 /
 
Ahogy időm engedi csinálok még példaprogramot, csak írjátok le hogy miről.
Ha tudom megírom.
(#) elektromos válasza puli122 hozzászólására (») Máj 11, 2010 /
 
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.
(#) gabi20 válasza elektromos hozzászólására (») Máj 11, 2010 /
 
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.
(#) puli122 válasza elektromos hozzászólására (») Máj 11, 2010 /
 
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
(#) elektromos hozzászólása Máj 11, 2010 /
 
Köszi
(#) puli122 hozzászólása Máj 15, 2010 /
 
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.
(#) gabi20 válasza puli122 hozzászólására (») Máj 23, 2010 /
 
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
(#) puli122 válasza gabi20 hozzászólására (») Máj 23, 2010 /
 
Hello!
A következőket kell tenned:
  1. Config Timer0 = Timer , Prescale = 64

Ezzel konfigurálsz és beállítod az előosztót.

  1. On Timer1 Ido


Az "Ido" cimkére lép a megszakításkor.

  1. Enable Interrupts
  2. Enable Timer0

Engedélyezed a megszakítást és a timer0-t

  1. Start Timer0

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:

  1. Timer0 = 211


Remélem nem hagytam ki semmit
(#) gabi20 válasza puli122 hozzászólására (») Máj 23, 2010 /
 
Hálásan kösz így már működik
(#) puli122 válasza gabi20 hozzászólására (») Máj 23, 2010 /
 
Nincs mit!
(#) elektromos hozzászólása Máj 27, 2010 /
 
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.
(#) TavIR-AVR válasza elektromos hozzászólására (») Máj 27, 2010 /
 
Semmi. A Timer1-en ül mindkettő, és PWM1a ill PWM1b néven hivatkozol rája...
(#) elektromos válasza TavIR-AVR hozzászólására (») Máj 27, 2010 /
 
Köszi
(#) puli122 válasza TavIR-AVR hozzászólására (») Máj 27, 2010 /
 
Hello!
Gsm modul vezérlése bascomban megoldható? Ha igen hogyan ?
(#) TavIR-AVR válasza puli122 hozzászólására (») Máj 27, 2010 /
 
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.....
(#) puli122 válasza TavIR-AVR hozzászólására (») Máj 27, 2010 /
 
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 ?
Következő: »»   3 / 18
Bejelentkezés

Belépés

Hirdetés
XDT.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