Időzítés bascom alatt

Hogyan programozzak AVR chipet? Programozók beállításai...
Bascom nyelvű programok...
Avatar
elektromos
Bitmanipulátor
Hozzászólások: 101
Csatlakozott: 2008. július 30. szerda, 6:00

Időzítés bascom alatt

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

Sziasztok! Szeretném én is megtanulni a programozást, de nem nagyon megy. Összeállítottam magamnak egy kis témát, melyeket lépésről lépésre szeretném megtanulni. Szerintem más kezdők is nagy hasznát vehetik azoknak a dolgoknak, melyeket kérni szeretnék. Mivel látom itt nagyon segítőkészek vagytok, ezért gondoltam az AVR programozására. A led villogásáig, vagyis az első mintaprogramot le tudtam tölteni és az működött is, valamint az LCD-re ki tudtam íratni a nevem, de aztán itt befejeztem a tudásom. Lenne egy ötletem, amit szeretném ha valaki segítene megvalósítani lépésről lépésre leírva. Tudom nem sok időtök van az ilyenre, de ami nektek 5-perc, az nekem több nap! Először a bemenetek, és kimenetek kezelését szeretném megtanulni. Arra gondoltam, hogy, lenne 4 bemenet, és 4 led kimenet. A benetek L-szintre kapcsoljanak be Pl: ha benyomom az 1-es nyomógombot akkor a négy ledből kapcsoljon be az 1 led, és kb 2mp után a 2 led, és kb 50 másodperc múlva kapcsoljanak ki. ATMEGA8-as procim van, és erre kellene a kis program. Persze ez csak az eleje, mert ha segítetek akkor jönne a többi kis kérdésem és lépésről lépésre fel tudnám építeni a kis programomat melyből sokat tudnák tanulni és más kezdő is! Az baj elindulni sem nagyon tudok, de egy kis löket segítene. Ha az 1-es gomb kis programja már megvan, akkor én megpróbálom variálgatni a maradék 3 nyomogombot a kimeneti ledekhez, hogy lássátok tanulni akarok! Persze amiket kitalálok mindig felteszem ide, mert a kis programokból vannak a nagyok is! Róbert nállad vettem az 500-as usb-s programozót, pár db mega8-ast, és ezeken kezdeném, és bascom-ban kérném a segítséget. Kapcsolási rajz nem kell mert a port konfignál ugy is látom, hogy hova vannak irányítva a dolgok. Kérlek segítsetek!
Üdv:Józsi
A hozzászólást 1 alkalommal szerkesztették, utoljára elektromos 2009. március 9. hétfő, 22:25-kor.
Avatar
elektromos
Bitmanipulátor
Hozzászólások: 101
Csatlakozott: 2008. július 30. szerda, 6:00

ennyit hoztam össze elsőre

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

Config Portb.0 = Input

Config Portc.0 = Output

Main:
If Portb.0 = 0 Then Goto Loop1 '

If Portb.0 = 1 Then Goto Main
Loop1:
Portc.0 = 1
Wait 2
Portc.0 = 0
Waitms 100
Goto Main
End

ez csak egy kis kimenet teszt lenne, de nem jó, mert nem veszi figyelembe a nyomógombot, és a led egyből bekapcsol, és kb 6mp-ként villan egyet
Mi lehet a hiba?
Avatar
elektromos
Bitmanipulátor
Hozzászólások: 101
Csatlakozott: 2008. július 30. szerda, 6:00

no sikerűlt

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

Config Portb.0 = Input

Config Portc.0 = Output

Main:
If Pinb.0 = 0 Then Goto Loop1 '

If Pinb.0 = 1 Then Goto Main
Loop1:
Portc.0 = 1
Wait 2
Portc.0 = 0
Waitms 100
Goto Main
End

Megszenvedtem vele, de sokat tanultam belőle!
Köszönöm a sok önzetlen segítséget, remélem később is ennyire segítőkészek lesztek!
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

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

Vigyázz arra, hogy ilyen esetben a program sokat várakozik, azaz semmit sem tesz!

Ha a processzornak más feladata is van/lenne közben, akkor arra nem tud időt szánni, mert a Wait utasítással van elfoglalva...

Én ahogy megoldanám (vázlatként).
Lenne egy "időalap". Ez bárhol is jér a program, mindíg meghívódna, a főprogram ideiglenes megszakításával is akár.
Ez az ún. Interrupt, mely ha időre megy, akkor a a Timer (időzítő).
Az időalap legyen mondjuk 10 msec.
Az időalapra valo ugraskor egy szamlalo no (ami az eltelt időt "lépteti").
Az időalapra ugráskor a kimenet állapota illetve nyomógomb figyelés is történhet (úgyse látod az 1 msec "késleltetést".
Amire figyelni kell:
- nyomógombot ha megnyomod, akkor prelleg.
- a nyomógomb újboli megnyomása a LEDciklust újraindítja, vagy figyelmen kívül hagyja (egy segédváltozóban jelzem, hogy fut a LEDvillogós ciklus).


Tipp a Te programod esetére (kicsit módosítva):

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

Config Portb.0 = Input 
Config Portc.0 = Output 
portc.0=1'belső felhúzó ellenállás

Do 'Do-Loop végtelen főprogram ciklus
If Pinb.0 = 0 Then Gosub Loop1 
'szubrutnkét ugorjon ki. Így ez a kódrészlet többször felhasználható.
loop

Loop1: 
Portc.0 = 1 
Wait 2 
Portc.0 = 0 
Waitms 100 
return 
Elvileg az IF Then után is lehetne ezt a szubrutint írni, és akkor ott vagyunk ahol Te először...
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

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

A processzor sebességét beállítottad?
Az első prg nem villoghat 6 secenként!
A chipek alapban a belső 1 MHzről járnak! A Biztosítékbitek segítségével állítandó az órajel, és a prg-k elején érdemes a chipet definiálni + órajelet (meg a sorosporti kommunikációt - ha van)
Avatar
elektromos
Bitmanipulátor
Hozzászólások: 101
Csatlakozott: 2008. július 30. szerda, 6:00

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

Szia Robert!
Most a megszakítással foglalkoztam, de nem jó!
Mikor elindítom a programot akkor a portc.0 egyből bekapcsol, és villog, de nem megy a másik kapcsolóra, csak akkor, ha folyamatosan nyomom pl: a portd2.gombot. Ha portd.3 int gombot benyomom akkor kikapcsolja a ledet egy pillanatra, de ujra vissza ugrik a portc.0-ra !
Miért, mit rontottam el? A timert még nem tudom használni, az még sok lenne egyszerre! Fokozatosan akarom megtanulni, de elég nehéz, de pár nap mulva már remélem többet tudok. A bascom könyvet amit Te írtál azokat tanulmányozom, de még nem igazán értem! Azt hogy lehet elérni, mikor elindul a program akkor minden kimenet low szinten legyen és csak az a kimenet legyen magas, melyet a nyomógombal akarok.
A próbapanelemen 4 felhuzó ellenállást be tettem. 4Mhz-es kvarcot állítottam be a definicióban, de azokat nem másolom mindig ide, ha nem probléma. A compiler-ben simán lefordul a progi, meg bele is tudom tenni az atmega8-ba.
itt a kis művem:
Config Portd.0 = Input
Config Portd.1 = Input
Config Portd.2 = Input
Config Portd.3 = Input 'INT1 láb

Config Portc.0 = Output
Config Portc.1 = Output
Config Portc.2 = Output
Config Portc.3 = Output
Config Int1 = Low Level
On Int1 Buttom
Enable Interrupts
Enable Int1

Kezd:

If Pind.0 = 0 Then Gosub Loop1
If Pind.1 = 0 Then Gosub Loop2 Else Portc.1 = 0
If Pind.2 = 0 Then Gosub Loop3 Else Portc.2 = 0
Loop1:

Do
Set Portc.0
Wait 1
Reset Portc.0
Waitms 100
Return
Loop

Loop2:
Do
Set Portc.1
Wait 1
Reset Portc.1
Waitms 100
Return
Loop


Loop3:
Do
Set Portc.2
Set Portc.3
Wait 1
Reset Portc.2
Reset Portc.3
Waitms 100
Return
Loop


End
Buttom:
Reset Portc
Return
Avatar
szovhoz
Bitfaragó
Hozzászólások: 608
Csatlakozott: 2007. április 7. szombat, 6:00

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

Ha portd.3 int gombot benyomom akkor kikapcsolja a ledet egy pillanatra, de ujra vissza ugrik a portc.0-ra !
ez azért van mert az intet low levelre tetted.

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

Config Int1 = Falling
On Int1 Buttom
Enable Interrupts
Enable Int1
ezt tedd be helyette.

de én azt a gombot nem tenném intre ebben az esetben. sima láb elegendő lenne.

pl. itt egy leghetőség egy gombra.

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

Config Pind.0 = Input
Config Pind.1 = Input
Config Pind.2 = Input
Config Pind.3 = Input 'INT1 láb

Config Portc.0 = Output
Config Portc.1 = Output
Config Portc.2 = Output
Config Portc.3 = Output 'int1

Portc.0 = 0
Portc.1 = 0
Portc.2 = 0
Portc.3 = 0

Do


If Pind.0 = 1 Then                                         ' ha megnyomod a gombot akkor a ledek sorban kacsolnak be utánna vissza ki.
Portc.0 = 1
Waitms 50                                                   ' az idő eleszi a procit ezt másként is lehet csinálni.
Portc.1 = 1
Waitms 50
Portc.2 = 1
Waitms 50
Portc.3 = 1
Waitms 50
Else
Portc.3 = 0
Waitms 50
Portc.2 = 0
Waitms 50
Portc.1 = 0
Waitms 50
Portc.0 = 0
End If

Loop
A hozzászólást 1 alkalommal szerkesztették, utoljára szovhoz 2009. március 10. kedd, 17:43-kor.
Avatar
elektromos
Bitmanipulátor
Hozzászólások: 101
Csatlakozott: 2008. július 30. szerda, 6:00

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

köszi, kipróbálom!
Kipróbáltam, de nem csinál semmit, csak ha :If Portd.0 = 0 Then
tehát áttírom az 1-et 0-ra. Akkor
egyenként bekapcsolja a ledeket, de ugy is marad, bekapcsolva. A nyomógombra nem reagál semmit. Valami beállítás hiányzik az elejéről?
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

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

Minthogy bemenetet nézel:

If PINd.0=....

Port az kimenet (erre írsz ki valamit), PIN a bemenetként vizsgált (erről olvasol)....
Avatar
elektromos
Bitmanipulátor
Hozzászólások: 101
Csatlakozott: 2008. július 30. szerda, 6:00

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

hát benéztem rendesen, de már jó!
Köszi
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

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

Üdv Elektromos!

Ebben a kis részletben elkövettél minden hibát, amit 1 kezdő csak megtehet!
Ajánlott valahogy így kezdeni a programodat:
$regfile = "m8def.dat"
’$sim ’Ha csak szimulátorban akarod futtatni!
$crystal = 14745600
$hwstack = 64
$swstack = 64
$framesize = 80

A Do – Loop utasítás páros egy végtelen ciklust szervez.
Loop1: ’
Do ’ Ez a ciklus eleje! Itt bekerül a következő utasítás címe az $swstack -ba
Set Portc.0 ’Első utasítás
Wait 1
Reset Portc.0
Waitms 100
Return ’Itt kiugrasz tehát a következő utasításra sohasem kerül sor, vagyis a Do – Loop itt felesleges!
Loop ’ mikor ide érne az utasítás-végrehajtás vissza, ugorna az Első utasításra.
8)
Avatar
elektromos
Bitmanipulátor
Hozzászólások: 101
Csatlakozott: 2008. július 30. szerda, 6:00

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

Hát tudod igyekszem :D
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

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

Akkor folytatom, hogy mikor mi történik:

Kezd:

1.: If Pind.0 = 0 Then Gosub Loop1 ’Elugrik a Loop1-re
2.: If Pind.1 = 0 Then Gosub Loop2 Else Portc.1 = 0 ’Elugrik a Loop2-re
3.: If Pind.2 = 0 Then Gosub Loop3 Else Portc.2 = 0 ’Elugrik a Loop3-re
Nagy hiba innen tovább megy a Loop1-re!
4.: Loop1:

5.: Do ’Loop3-ból ide ugrik!
6.: Set Portc.0 ’ ’Loop3-ból ide ugrik! ITT a nagy hiba!
7.: Wait 1
8.: Reset Portc.0
9.: Waitms 100
10.: Return ’Mikor az 1. sorból jött Visszaugrik 2. sorra.
’Mikor az 3. sorból jött ITT a nagy hiba Nem volt előtte Gosub ! Tehát bizonytalan hova ugrik el!!
11.: Loop

Loop2:

Return ’Visszaugrik 3. sorra

Loop3:

Return ’Visszaugrik 5. sorra

Jól olvasd végig a megjegyzéseimet! Remélem érthető!
A tanulság:
1.: Érdemes végignézni mikor hova kerül a vezérlés!
2.: Ne ugráljunk feleslegesen, mert áttekinthetetlen lesz a programunk!
3.: Mivel mindig ugyan azt akarlyuk újra és újra végrehajtani érdemes az egészet egy:
Do
Itt legyen a főprogram!
….
….
Loop
Végtelen ciklusba rakni!

8)
A hozzászólást 1 alkalommal szerkesztették, utoljára kapu48 2009. március 10. kedd, 16:49-kor.
Avatar
elektromos
Bitmanipulátor
Hozzászólások: 101
Csatlakozott: 2008. július 30. szerda, 6:00

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

Ez így jó lesz?
$regfile = "m8def.dat"

$crystal = 4000000
$hwstack = 64
$swstack = 64
$framesize = 80

Config Portd.0 = Input
Config Portd.1 = Input
Config Portd.2 = Input
Config Portd.3 = Input 'INT1 láb

Config Portc.0 = Output
Config Portc.1 = Output
Config Portc.2 = Output
Config Portc.3 = Output

Portc.0 = 0
Portc.1 = 0
Portc.2 = 0
Portc.3 = 0
Loop1:

Do
If Pind.0 = 0 Then

Set Portc.0
Wait 1
Reset Portc.0
Waitms 100
End If


If Pind.1 = 0 Then
Set Portc.1
Wait 1
Reset Portc.1
Waitms 100
End If

If Pind.2 = 0 Then

Set Portc.2
Waitms 300
Set Portc.3
Wait 1
Reset Portc.2
Reset Portc.3
Waitms 100
End If
Loop
már hasonlít arra amit írtál? Most egy maradt Portd.3-as lábat meg kellene ugy csinálni, hogy ha bármelyik led világít akkor ha ezt földre teszem akkor szakítsa meg a programot interrupt.Olvasgatok róla, de
megpróbálom azt is megírni, és majd javítsatok ki, mint idáig tettétek!
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

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

Jó de ha már leírtam ide teszem!
Ez a sor felesleges: Loop1:
De nem hiba!

Nagy vonalakban így szervezd a programod:

1. Fejrész:
Beállított a Fordítónak szükséges értékeket!
2. Változók definiálása.
3. Portok beállítása.
4. Megszakítások beállítása.
5. Változóknak kezdőérték adás.
6. Kezdeti csak 1* végrehajtandó utasítások.
7. Főprogram
Do

Loop
8. Szubrutinok
Címke:

Return
9. Megszakítás rutinok
Címke:

Return
End ’Program
8)
A hozzászólást 1 alkalommal szerkesztették, utoljára kapu48 2009. március 10. kedd, 15:07-kor.
Válasz küldése