Program írás help
- nobody_hun
- Bitfaragó
- Hozzászólások: 425
- Csatlakozott: 2005. november 14. hétfő, 7:00
Sziasztok!
1 másodperces várakozást akarok, a következő kódhoz:
$crystal = 4000000
..
While Counter < 120
Cls
Lcd Counter
Counter = Counter + 1
' ide jönne a várakozás
Wend
wait 1 nem annyit vár, amennyit kellene
Amit találtam, az a következő kód:
$asm
ldi R17, 0xAF
ldi R18, 0x96
ldi R19, 0x36
_Delay5sb:
subi R17, $01
sbci R18, $00
sbci R19, $00
brne _Delay5sb
$end Asm
Itt a regiszterek értékét kellene változtatgatni.. van erre
valami ötleteket?
Üdv.
Zsolti
1 másodperces várakozást akarok, a következő kódhoz:
$crystal = 4000000
..
While Counter < 120
Cls
Lcd Counter
Counter = Counter + 1
' ide jönne a várakozás
Wend
wait 1 nem annyit vár, amennyit kellene
Amit találtam, az a következő kód:
$asm
ldi R17, 0xAF
ldi R18, 0x96
ldi R19, 0x36
_Delay5sb:
subi R17, $01
sbci R18, $00
sbci R19, $00
brne _Delay5sb
$end Asm
Itt a regiszterek értékét kellene változtatgatni.. van erre
valami ötleteket?
Üdv.
Zsolti
Súgó, waitms parancs:
DE: az INT rutinok ezt kitolják!
ha precíziós időzítést akarsz, akkor a TIMER számlálót használod. Most kérdés mennyire kell pontosnak lennie.
Számolnod kell a INT rutinba be és kilépéssel. A bascom szimulátorban ezzel is számolva:
Mintaprogi (mellette az idők):
Azaz a Waitms 1000 utasítás ténylegesen (ha nem esik be INT), akkor 1001.026msec-0,239msec=1000,787msec.
Ha a waitms 1000 helyett waitms 999-et írsz, akkor ugyanez:
1000.525msec-0,239msec=1000,286
Na pontosítsunk: 998-al:
999,4915-0,239=999,2525 msec
És a maradékot kipótoljuk a waitus utasítással, mondjuk 500-al:
999,9915-999,4915=0,4235msec
Na írjunk 1000 us időt:
1000,491-999,4915=0,9995 msec
Szóval, ha waitms 998-at írunk, akkor:
999,2525 msecunk van. Ehhez kell adni ugye: 1000-999,2525=0,7475msec azaz 747,5 us időt.
Tesztelve a szimulátorban:
1000,239-0,239=1000 msec!
Nyertünk:)
A kód:
Szóval a szimulátorban ez jött ki.
4MHz órajel, és 2313 chip esetén....
U.i.: a waitms közel percíz, a waitus idő nop ASM uitasításokból rakja ki, így pontatlanabb! A SÚGÓ erre külön kitér.
U.i.2.: Na, jó hosszú lett:) de legalább követhető...
Kód: Egész kijelölése
_WaitMS:
_WaitMS1F:
Push R30 ; save Z
Push R31
_WaitMS_1:
Ldi R30,$E8 ;delay for 1 mS
Ldi R31,$03
_WaitMS_2:
Sbiw R30,1 ; -1
Brne _WaitMS_2 ; until 1 mS is ticked away
Sbiw R24,1
Brne _WaitMS_1 ; for number of mS
Pop R31
Pop R30
Ret
ha precíziós időzítést akarsz, akkor a TIMER számlálót használod. Most kérdés mennyire kell pontosnak lennie.
Számolnod kell a INT rutinba be és kilépéssel. A bascom szimulátorban ezzel is számolva:
Mintaprogi (mellette az idők):
Kód: Egész kijelölése
'$sim '0msec
Print "start" '
Waitms 1000 '0,239msec
Print "end" '1001,026msec
End
Ha a waitms 1000 helyett waitms 999-et írsz, akkor ugyanez:
1000.525msec-0,239msec=1000,286
Na pontosítsunk: 998-al:
999,4915-0,239=999,2525 msec
És a maradékot kipótoljuk a waitus utasítással, mondjuk 500-al:
999,9915-999,4915=0,4235msec
Na írjunk 1000 us időt:
1000,491-999,4915=0,9995 msec
Szóval, ha waitms 998-at írunk, akkor:
999,2525 msecunk van. Ehhez kell adni ugye: 1000-999,2525=0,7475msec azaz 747,5 us időt.
Tesztelve a szimulátorban:
1000,239-0,239=1000 msec!
Nyertünk:)
A kód:
Kód: Egész kijelölése
waitms 998
waitus 747
4MHz órajel, és 2313 chip esetén....
U.i.: a waitms közel percíz, a waitus idő nop ASM uitasításokból rakja ki, így pontatlanabb! A SÚGÓ erre külön kitér.
U.i.2.: Na, jó hosszú lett:) de legalább követhető...
nem idevág de nem találtam jobb topicot rá:
atmega8
PD1 és PD0 nem úgy viselkedik ahogy kéne neki
hiába mondom PD.1 nek hogy high nem történik semmi
de ha pl portd=255 akkor az is high lesz
pd0 viszont csak high ezt nem lehet lowra tenni
még a portd=0 val sem ez a két láb elviekben az RxD TxD
de fuse ba nem találtam olyan lehetőséget amivel ezt külön I/o-nak kéne
beállítani
PD1-en programozás közben villog a led úgy mint az STK200-on lévő led
bascom leírásban épített
lehet magát a vezérlőt kinyírhattam valamivel?
sémában a programozó és a csak ADC lábakat kerülve 16 led lóg föld felé.
atmega8
PD1 és PD0 nem úgy viselkedik ahogy kéne neki
hiába mondom PD.1 nek hogy high nem történik semmi
de ha pl portd=255 akkor az is high lesz
pd0 viszont csak high ezt nem lehet lowra tenni
még a portd=0 val sem ez a két láb elviekben az RxD TxD
de fuse ba nem találtam olyan lehetőséget amivel ezt külön I/o-nak kéne
beállítani
PD1-en programozás közben villog a led úgy mint az STK200-on lévő led
bascom leírásban épített
lehet magát a vezérlőt kinyírhattam valamivel?
sémában a programozó és a csak ADC lábakat kerülve 16 led lóg föld felé.
Üdv mindenkinek!
Még új vagyok a fórumon, így ha választ kapok az egyik kérdésre, már jön is a következő probléma
Már régóta szeretném nagyszabású, világmegváltó ötleteimet végre megvalósítani az AT család segítségével ':roll:'
Eddig a megfelelő prog.nyelv kiválasztása késleltetett.
Két nyelv az ASSEMBLY és a BASIC jöhetett számításba, mivel hobbi szinten már irtam ezeken progikat. Hosszas latolgatás után a BASCOM mellet döntöttem, egy ATmega16-os mikrovezérlővel a műtőasztalon
Mivel nem vagyok nagyratörő, a portok programozásával kezdtem, perifériaként ledekkel és nyomógombokkal meg spékelve. Kisebb nehézségeim voltak a C-porton, de rájöttem a JTAG kapcsolhatóságára Amiben a segítségeteket kérem: a B1, B2 portokon lévő nyomógombokat a szimulátor érzékeli, de programozás útán a panelen nincs reakció. Multiméterrel ellenőriztem az 1., 2. lábakat és a feszültség szint OK. Hol a hiba???
Előre is köszi
Még új vagyok a fórumon, így ha választ kapok az egyik kérdésre, már jön is a következő probléma
Már régóta szeretném nagyszabású, világmegváltó ötleteimet végre megvalósítani az AT család segítségével ':roll:'
Eddig a megfelelő prog.nyelv kiválasztása késleltetett.
Két nyelv az ASSEMBLY és a BASIC jöhetett számításba, mivel hobbi szinten már irtam ezeken progikat. Hosszas latolgatás után a BASCOM mellet döntöttem, egy ATmega16-os mikrovezérlővel a műtőasztalon
Mivel nem vagyok nagyratörő, a portok programozásával kezdtem, perifériaként ledekkel és nyomógombokkal meg spékelve. Kisebb nehézségeim voltak a C-porton, de rájöttem a JTAG kapcsolhatóságára Amiben a segítségeteket kérem: a B1, B2 portokon lévő nyomógombokat a szimulátor érzékeli, de programozás útán a panelen nincs reakció. Multiméterrel ellenőriztem az 1., 2. lábakat és a feszültség szint OK. Hol a hiba???
Előre is köszi
Látatlanban:
Port és PIN utasítás keverése. 38. fejezetben magyarázat ott van (kezdők problémái:)). A programrészlettel amúgy elölrébb sikerülne lenni:)...
config portirány megadása után:
Port és PIN utasítás keverése. 38. fejezetben magyarázat ott van (kezdők problémái:)). A programrészlettel amúgy elölrébb sikerülne lenni:)...
config portirány megadása után:
Kód: Egész kijelölése
Porta=valami 'kiírás a portra
valami=pinb 'a port lábállapotának beolvasása
valami=porta 'a kiírt adat visszaolvasása (lábállapottól függetlenül)
Nagyon köszönöm robert!
Eltaláltad, nem ismertem a PIN és a DDR használatát
Most, hogy megirtam első pár, tucat gyakorlóprogimat, újabb kérdésekkel zaklatnám a publikumot. Sok dologban nem tudom eldönteni, hogy
ugyanazt az utat járom e ugyanazon cél eléréséig é, vagy csak a primitív programjaimból nem süt a lényegi külömbség
Anno gépikódú progik írásánál keményen rákényszerültem a végcél figyelése mellett, a minél pörgősebb, tisztább rövidebb kód írására
Tehát a kérdéseim: 1. A DDRb=0 azonos a CONFIG PORTb Inputtal? mikor jobb az egyik vagy a másik?
2. Alábbi programban a végeredmény ugyanaz. Vajon
lényegében is ugyanaz történik?
Íme:
$regfile = "m16def.dat"
$crystal = 16000000
$baud = 9600
Ddrb = 0
Ddrc = 255
Ddrd = 255
Dim A As Byte
Dim X As Byte
Dim Y As Byte
Dim Z As Byte
Do
Lekerdez:
A = Pinb
If A = 254 Then
Goto 19
End If
If A = 253 Then
Goto 1hijan20
End If
Goto Lekerdez
19:
For X = 0 To 7
Set Portd.x
Waitms 300
Reset Portd.x
Next X
Goto Lekerdez
1hijan20:
Y = 1
Portd = 1
Waitms 100
For X = 0 To 7
Y = Y * 2
Portd = Y
Waitms 100
Next X
Loop
End
3. A port túl írásánál miért lép a következőre és tovább?
PL:
$regfile = "m16def.dat"
$crystal = 16000000
$baud = 9600
Ddrb = 0
Ddrc = 255
Ddrd = 255
Dim X As Byte
Do
X = X + 1
Portd.x = 1
Loop
End
Eltaláltad, nem ismertem a PIN és a DDR használatát
Most, hogy megirtam első pár, tucat gyakorlóprogimat, újabb kérdésekkel zaklatnám a publikumot. Sok dologban nem tudom eldönteni, hogy
ugyanazt az utat járom e ugyanazon cél eléréséig é, vagy csak a primitív programjaimból nem süt a lényegi külömbség
Anno gépikódú progik írásánál keményen rákényszerültem a végcél figyelése mellett, a minél pörgősebb, tisztább rövidebb kód írására
Tehát a kérdéseim: 1. A DDRb=0 azonos a CONFIG PORTb Inputtal? mikor jobb az egyik vagy a másik?
2. Alábbi programban a végeredmény ugyanaz. Vajon
lényegében is ugyanaz történik?
Íme:
$regfile = "m16def.dat"
$crystal = 16000000
$baud = 9600
Ddrb = 0
Ddrc = 255
Ddrd = 255
Dim A As Byte
Dim X As Byte
Dim Y As Byte
Dim Z As Byte
Do
Lekerdez:
A = Pinb
If A = 254 Then
Goto 19
End If
If A = 253 Then
Goto 1hijan20
End If
Goto Lekerdez
19:
For X = 0 To 7
Set Portd.x
Waitms 300
Reset Portd.x
Next X
Goto Lekerdez
1hijan20:
Y = 1
Portd = 1
Waitms 100
For X = 0 To 7
Y = Y * 2
Portd = Y
Waitms 100
Next X
Loop
End
3. A port túl írásánál miért lép a következőre és tovább?
PL:
$regfile = "m16def.dat"
$crystal = 16000000
$baud = 9600
Ddrb = 0
Ddrc = 255
Ddrd = 255
Dim X As Byte
Do
X = X + 1
Portd.x = 1
Loop
End
A config portb és a DDRB ugyanaz...
Az optimalizálás, végcél nem mindig fontos. Itt az időzítés ami érdekes lehet, az ASM - fejben optimalizálva - jobb. DE: most egy LCDkezelés, Sorosport ASMben ~ 1 hét, Bascomban 1 óra...
A program/fordító a hülyeségeket nem tudja kivédeni...
Hogy hogy optimalizálod? Ez a gyakorlattal jön majd úgyis elő. Illetve ha a chip megvan, és a flash kevés:))))
A Bascom ASM C arány
tömörségre:
10 7 8
fejlesztési időre
1 5 2-3
Szóval marad a Bascom:)
Az optimalizálás, végcél nem mindig fontos. Itt az időzítés ami érdekes lehet, az ASM - fejben optimalizálva - jobb. DE: most egy LCDkezelés, Sorosport ASMben ~ 1 hét, Bascomban 1 óra...
A program/fordító a hülyeségeket nem tudja kivédeni...
Hogy hogy optimalizálod? Ez a gyakorlattal jön majd úgyis elő. Illetve ha a chip megvan, és a flash kevés:))))
A Bascom ASM C arány
tömörségre:
10 7 8
fejlesztési időre
1 5 2-3
Szóval marad a Bascom:)
Robert köszi a jótanácsot!
A távoli jövőben ey messzi messzi galaxisban... vagyis, ha nagy leszek-mint most- szeretnék megvalósítani egy univerzális, CAN hálózatos autóba szerelhető hálózati dekódert, amit aztán pl. hagyományos távkapcs. nélküli riasztók vezérlésére vagy diagnosztikára is lehetne használni. Most főként a riasztós oldala érdekel a dolognak. Az azonosított adacsomagokhoz kéne egy kimeneti csatornát hozzárendelnii, mint rádióadókhoz a hifi nyomógombjait.
Előre is köszi az ötleteket.
UI.:tetszik az oldal, csak nem valami nyüzsgő a fórum. Lehet, hogy egyedűl vagyok a talán ciki kérdéseimmel
A távoli jövőben ey messzi messzi galaxisban... vagyis, ha nagy leszek-mint most- szeretnék megvalósítani egy univerzális, CAN hálózatos autóba szerelhető hálózati dekódert, amit aztán pl. hagyományos távkapcs. nélküli riasztók vezérlésére vagy diagnosztikára is lehetne használni. Most főként a riasztós oldala érdekel a dolognak. Az azonosított adacsomagokhoz kéne egy kimeneti csatornát hozzárendelnii, mint rádióadókhoz a hifi nyomógombjait.
Előre is köszi az ötleteket.
UI.:tetszik az oldal, csak nem valami nyüzsgő a fórum. Lehet, hogy egyedűl vagyok a talán ciki kérdéseimmel
Spec terület az elektronikán belül, és kevesen is foglalkoznak vele, pláne HUN nyelven. És még a Bascom is szűkít:).
Amúgy azért fut a fórum, bár most vizsgaidőszak illetve nyár van. Normális ember a vízparton, vagy a hegyekben északon van:).
A CANra a 90S128CAN illetve a MCP chipek RS232-CAN átalakítóját láttam használni. Én még a RS485-nél járok csak:).
Kérdezz nyugodtan, azért az elmúlt 2 évben elég nagy tapasztalat halmozódott itt fel, nem is beszélve a sok-sok megvalósított projektről (lsd pl. a Versenyeket...)
Amúgy azért fut a fórum, bár most vizsgaidőszak illetve nyár van. Normális ember a vízparton, vagy a hegyekben északon van:).
A CANra a 90S128CAN illetve a MCP chipek RS232-CAN átalakítóját láttam használni. Én még a RS485-nél járok csak:).
Kérdezz nyugodtan, azért az elmúlt 2 évben elég nagy tapasztalat halmozódott itt fel, nem is beszélve a sok-sok megvalósított projektről (lsd pl. a Versenyeket...)
Üdv!
CAN project vissza a polcra, de már itt is van a következő feladat.
ADC-s jelfeldolgozásról olvastam a Bascom könyv 15. fejezetében, de ez a téma, csak egy másic IC I2C kapcsolatára épülő köret. Tudom, először a kis ujjad, majd az egész ADC Mégis, nagy lökést adna a rogramozásban. Ha már van ilyen téma, akkor bocsi
Köszi!
CAN project vissza a polcra, de már itt is van a következő feladat.
ADC-s jelfeldolgozásról olvastam a Bascom könyv 15. fejezetében, de ez a téma, csak egy másic IC I2C kapcsolatára épülő köret. Tudom, először a kis ujjad, majd az egész ADC Mégis, nagy lökést adna a rogramozásban. Ha már van ilyen téma, akkor bocsi
Köszi!
Sziasztok!
M32-re kötöttem SD-foglalatot. Van egy 256MB-os kártya is, de valahogy nem akar összejönni a dolog. Nem a kapcsolással van baj, hanem a Bascommal nem boldogulok.
1:
1.11.8.1-es Bascom van. Ebben elvileg benne kéne lennie az AVR-DOS-nak, ugye?
2:
Hiába olvasgatom a help-et, nekem abból nem tiszta, hogy mit kell a programba írnom ahhoz, hogy az AVR kezelje végre a kártyát.
Ha valaki megszánna egy programrészlettel, ami elvezet addig, hogy beállít mindent, ami a DOS-hoz kell, és mondjuk végrehajtja a DISKSIZE utasítást, azzal sokat segítenétek!
Köszi!
M32-re kötöttem SD-foglalatot. Van egy 256MB-os kártya is, de valahogy nem akar összejönni a dolog. Nem a kapcsolással van baj, hanem a Bascommal nem boldogulok.
1:
1.11.8.1-es Bascom van. Ebben elvileg benne kéne lennie az AVR-DOS-nak, ugye?
2:
Hiába olvasgatom a help-et, nekem abból nem tiszta, hogy mit kell a programba írnom ahhoz, hogy az AVR kezelje végre a kártyát.
Ha valaki megszánna egy programrészlettel, ami elvezet addig, hogy beállít mindent, ami a DOS-hoz kell, és mondjuk végrehajtja a DISKSIZE utasítást, azzal sokat segítenétek!
Köszi!