Időzítés bascom alatt
- elektromos
- Bitmanipulátor
- Hozzászólások: 101
- Csatlakozott: 2008. július 30. szerda, 6:00
Időzítés bascom alatt
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
Üdv:Józsi
A hozzászólást 1 alkalommal szerkesztették, utoljára elektromos 2009. március 9. hétfő, 22:25-kor.
- elektromos
- Bitmanipulátor
- Hozzászólások: 101
- Csatlakozott: 2008. július 30. szerda, 6:00
ennyit hoztam össze elsőre
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?
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?
- elektromos
- Bitmanipulátor
- Hozzászólások: 101
- Csatlakozott: 2008. július 30. szerda, 6:00
no sikerűlt
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!
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!
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):
Elvileg az IF Then után is lehetne ezt a szubrutint írni, és akkor ott vagyunk ahol Te először...
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
- elektromos
- Bitmanipulátor
- Hozzászólások: 101
- Csatlakozott: 2008. július 30. szerda, 6:00
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
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
ez azért van mert az intet low levelre tetted.Ha portd.3 int gombot benyomom akkor kikapcsolja a ledet egy pillanatra, de ujra vissza ugrik a portc.0-ra !
Kód: Egész kijelölése
Config Int1 = Falling
On Int1 Buttom
Enable Interrupts
Enable Int1de é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.
- elektromos
- Bitmanipulátor
- Hozzászólások: 101
- Csatlakozott: 2008. július 30. szerda, 6:00
- elektromos
- Bitmanipulátor
- Hozzászólások: 101
- Csatlakozott: 2008. július 30. szerda, 6:00
Ü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.

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.
- elektromos
- Bitmanipulátor
- Hozzászólások: 101
- Csatlakozott: 2008. július 30. szerda, 6:00
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!

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!
A hozzászólást 1 alkalommal szerkesztették, utoljára kapu48 2009. március 10. kedd, 16:49-kor.
- elektromos
- Bitmanipulátor
- Hozzászólások: 101
- Csatlakozott: 2008. július 30. szerda, 6:00
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!
$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!
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

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
A hozzászólást 1 alkalommal szerkesztették, utoljára kapu48 2009. március 10. kedd, 15:07-kor.