|
Svet elektronike Revija za prave elektronike
|
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
Jure Urednik
Pridružen/-a: Pon Jan 2004 12:51 Prispevkov: 2132 Kraj: Ljubljana
|
Objavljeno: Sob Dec 12, 2009 11:22 pm Naslov sporočila: |
|
|
fičfirič je napisal/a: | kupil minipin, atmega8515, display, knjigo, programator, bil na tečaju, ampak se mi še vedno ne svita kako bi sploh začel pisat program, ki bi mi sešteval dolžine pulzov,ter prikazoval...
Pomoč? |
No, takle projekt niti ni tako enostaven za začetek, ampak bomo pomagali.
Nekaj podobnega, kot potrebuješ ti je merjenje pospeška s pospeškometrom ADXL. Izhod iz tega čipa je podoben tvojemu: razmerje signal/pavza se spreminja in na podlagi tega se izračuna pospešek.
Koda: | 'routine for measurement of acceleration
Adxl_x:
Config Pinc.2 = Input
Tb = 0
Tc = 0
For I = 0 To 900
Stop Timer1
Timer1 = 0
Bitwait Pinc.2 , Set ', Set
Start Timer1 ' start pri Ta
'measure T1, T2
Bitwait Pinc.2 , Reset ', Reset
Tb = Timer1
' + T1
Bitwait Pinc.2 , Set ', Set
Tc = Timer1 '+ T2
Stop Timer1
Timer1 = 0 'reset timer1 to start measuring T1a & T2a
T1x = Tb
T2x = Tc
'For I = 0 To 9
T1x = T1x + Tb
T2x = T2x + Tc
Next
T1x = T1x / 10
T2x = T2x / 10
Return |
Kaj dela ta programček? Na začetku ustavimo timer in program čaka, da se na Pinc.2 pojavi logična 1. Ko se to zgodi se štarta Timer1,ki šteje. Ko se Pinc.2 postavi na nič se vrednost Timerja prenese v spremenljivko Tb.
For zanka (od 0-900) služi temu, da se naredi povprečje 900 meritev).
Ta del programa je samo copy/paste - nisem prilagodil programa tvojemu primeru, ampak sem ti pokazal, kako bi se tvojega problema lahko lotil.
Če bo še kakšno vprašanje le hrabro naprej z njim!
Lp
Jure |
|
Nazaj na vrh |
|
|
Gustav Profesionalec
Pridružen/-a: Pon Jun 2005 17:19 Prispevkov: 768
|
Objavljeno: Sob Dec 12, 2009 11:49 pm Naslov sporočila: |
|
|
Velika vecina mikrokontrolerjev ima vsaj "gated timer" funkcijo, torej da timer steje samo dokler je "gate" v ustreznem stanju (ce poznas dolzino celotne periode lahko potem preprosto izracunas razmerje), marsikateri pa ima tudi "capture and compare" modul, ki direktno odcitava razmerje.
Ce slednjega tvoj MCU nima, ti preostane prva opcija, kjer ne izgubis nic natancnosti s tem da bi timer prizigal in ustavljal v programu (program se ne izvede v trenutku, ampak porabi doloceno stevilo ciklov, ki za povrh ni nujno vedno enako, ce so uporabljene vejitve programa, kar je tudi pogojni stavek).
Najprej zacni s kaksnim peprostim programom, da dobis obcutek kako sploh zadeva deluje - tudi dirkati ne zacnes takoj prvi dan, ko vidis avto od blizu, ampak traja nekaj casa preden sploh lahko vozis, kaj sele da bi dirkal v F1 ... Ko bos razumel osnove, se loti dokumentacije izbranega mikrokontrolerja in prestudiraj kako deluje omenjena periferija. |
|
Nazaj na vrh |
|
|
fičfirič Profesionalec
Pridružen/-a: Pet Avg 2008 21:58 Prispevkov: 80
|
Objavljeno: Pet Jan 01, 2010 8:37 pm Naslov sporočila: |
|
|
Aha,počasi mi osnovne zadeve le uspevajo.Od krmiljenja servomotorje,koračnih,displejev...Tako da se bom projekta počasi lotil.
Najprej bi rad naredil najbolj osnoven program ki bo tole sešteval.Kasneje pa še mogoče implementiral primerjavo z hitrostijo,ter preračunavanje L/km.
Gledal sem malo tudi da bi vgradil merilnik pretoka goriva,ter od tam odčitaval signal.Ampak ker ima avto tudi povratno linijo kjer odteka višek goriva bi ga moral še odštevati.En tak merilnik pa je od 30€ naprej,dodaten problem je ker v večini primerov ni takega da bi zdržal tlak goriva.Noja spet odvisno kje ga ugradiš, ker ima avto ponavadi dve črpalke.Na injektorjih je okoli 5bar.
Pa pojdimo na program.Tale primer z pospeškometri mi je kar všeč,čeprav nevem če ga popolnoma razumem.
torej:
Koda: |
Config Pinc.2 = Input
Tb = 0
Tc = 0
For I = 0 To 900
Stop Timer1
Timer1 = 0
Bitwait Pinc.2 , Set
Start Timer1
Bitwait Pinc.2 , Reset
Tb = Timer1
|
-konfiguriraš vhod
-postaviš števca na ničlo
-z ukazom bitwait-set čakaš na logično 1 na vhodu,ko se ta pojavi steče števec timer1 ?
-z ukazom bitwait-reset čakaš da logična 1 ugasne, ter isti trenutek vrednost pulza prišteješ v števec Tb?
Koda: |
Bitwait Pinc.2 , Reset
Tb = Timer1
Bitwait Pinc.2 , Set
Tc = Timer1
Stop Timer1
Timer1 = 0
|
Tega dela en rabim,ker je videti da pa šteje kadar je stanje na vhodu 0.
Koda: |
T1x = Tb
T2x = Tc
'For I = 0 To 9
T1x = T1x + Tb
T2x = T2x + Tc
Next
T1x = T1x / 10
T2x = T2x / 10
Return |
Ne razumem najbolje.. |
|
Nazaj na vrh |
|
|
Jure Urednik
Pridružen/-a: Pon Jan 2004 12:51 Prispevkov: 2132 Kraj: Ljubljana
|
Objavljeno: Pet Jan 01, 2010 11:18 pm Naslov sporočila: |
|
|
Oj,
predlagam, da si v Help-u prebereš kaj naredi ukaz Bitwait, pa ti bo bolj jasno
Lp
Jure |
|
Nazaj na vrh |
|
|
fičfirič Profesionalec
Pridružen/-a: Pet Avg 2008 21:58 Prispevkov: 80
|
Objavljeno: Sob Jan 02, 2010 12:38 am Naslov sporočila: |
|
|
saj sem...sem kaj narobe razumel?
Koda: |
Bitwait Pinb.7 , Reset 'wait until bit 7 of Port B is 0.
|
|
|
Nazaj na vrh |
|
|
Bojan Profesionalec
Pridružen/-a: Ned Mar 2004 22:24 Prispevkov: 70
|
Objavljeno: Sob Jan 02, 2010 6:22 pm Naslov sporočila: |
|
|
Jaz mislim, da ti je Jure malo zapeljal na napačno pot. Če želiš brati iz šob, boš moral pristopiti drugače. Tako kot je napisal Gustav, capture and compare. Šobe delajo precej hitro, zato mora tudi SW v krmilniku biti prav napisan.
Najbolje je da si najprej pogledaš ukaze v helpu in kakšen data sheet od procesorja pol pa gas...
Da ne boš obupal si prej naredi kaj bolj preprostega. VELIKO USPEHA! |
|
Nazaj na vrh |
|
|
fičfirič Profesionalec
Pridružen/-a: Pet Avg 2008 21:58 Prispevkov: 80
|
Objavljeno: Sob Jan 02, 2010 7:43 pm Naslov sporočila: |
|
|
Treba bo meriti signale dolžine od 3 do pribljižno 35ms, v periodi od 8-60Hz.
Citiram: |
AtMega8515
• Peripheral Features
– One 8-bit Timer/Counter with Separate Prescaler and Compare Mode
– One 16-bit Timer/Counter with Separate Prescaler, Compare Mode, and Capture Mode
|
Je to ta compare and capture funkcija? Ne najdem kake razlage kako stvar deluje, ter kode za njo.
Kaj bi bilo narobe z metodo bitwait?
Drug problem je tudi ker za prikaz na lcd moraš uporabiti do-loop zanko v kateri uporabiš tudi waitms ukaz,ki ti program upočasnjuje ter tako kvari meritev.Kako bi se rešil tega? |
|
Nazaj na vrh |
|
|
Bojan Profesionalec
Pridružen/-a: Ned Mar 2004 22:24 Prispevkov: 70
|
Objavljeno: Čet Jan 07, 2010 2:26 pm Naslov sporočila: |
|
|
Ni nujno, da je lcd v DO LOOP zanki. Je pa res da ti display takoj pobere vsaj 40ms za prikaz. Oglej si registre od timerjev. Jaz bi na hitro naredil tako, da bi ob vbrizgu sprožil nek timer in ob padajoči rampi timer ustavil. Omenjeni timer bi prikazal na displeju. Za tisto, kar boš ti potreboval je čisto dovolj.
Oglej si sample od:
INT0.BAS
timer0.bas |
|
Nazaj na vrh |
|
|
fičfirič Profesionalec
Pridružen/-a: Pet Avg 2008 21:58 Prispevkov: 80
|
Objavljeno: Čet Jan 07, 2010 2:53 pm Naslov sporočila: |
|
|
Si prepričan da ni v treba da je lcd v zanki? A ob vsaki spremembi na zaslonu ti vzame 40ms? Kako se to reši ponavadi?
Kaj potem lahko z bitwait sprožim timer, ter to nekje seštevam?
Ima kdo kak primer programa z timerjem z padajočo rampo, ker nimam izkušenj z tem.
lp |
|
Nazaj na vrh |
|
|
fičfirič Profesionalec
Pridružen/-a: Pet Avg 2008 21:58 Prispevkov: 80
|
Objavljeno: Sob Jan 30, 2010 4:18 pm Naslov sporočila: |
|
|
sem na pravi poti? Kaj delam narobe?
Koda: |
$regfile = "m8515.dat"
$crystal = 8000000
Config Lcd = 16 * 2
Config Lcdbus = 4
Config Lcdpin = Pin , Db7 = Portc.7 , Db6 = Portc.6 , Db5 = Portc.5 , Db4 = Portc.4 , E = Portc.2 , Rs = Portc.1
Config Pind.0 = Input
Config Portc = Output
Config Pind.2 = Input
Config Int0 = Falling
Config Int1 = Rising
On Int0 Start Timer0
On Int1 Stop Timer0
Cls
Enable Interrupts
Enable Int0
Enable Int1
Lcd Timer0
Return
End
|
|
|
Nazaj na vrh |
|
|
Jure Urednik
Pridružen/-a: Pon Jan 2004 12:51 Prispevkov: 2132 Kraj: Ljubljana
|
Objavljeno: Sob Jan 30, 2010 6:55 pm Naslov sporočila: |
|
|
Hoj,
Bitwait ukaz je izredno hiter, saj je optimalno napisan, če bi pogledal njegovo disasemblirano kodo, bi to videl. Jaz bi ga uporabil brez nadaljnjega.
Tvoj program ima vsaj dve napaki:
Return v programu nima mesta: vrzi ga ven
Nimaš Do-Loop zanke in zato program enkrat odvrti zanko in konča svoje "poslanstvo"...
Lp
Jure |
|
Nazaj na vrh |
|
|
fičfirič Profesionalec
Pridružen/-a: Pet Avg 2008 21:58 Prispevkov: 80
|
Objavljeno: Ned Jan 31, 2010 11:42 am Naslov sporočila: |
|
|
aha.Torej uporabim bitwait kar tako kot je opisano v primeru mal višje? Ali bitwait uporabim za sproženje timerja, interrupt pa za ustavitev?
Moram postaviti ukaz lcd kam na kak poseben način da mi ne upočasnjuje zanke (ker zraven ukaza lcd ponavadi dam tudi npr. waitms 5,da mi zaslon ne utripa preveč). |
|
Nazaj na vrh |
|
|
Jure Urednik
Pridružen/-a: Pon Jan 2004 12:51 Prispevkov: 2132 Kraj: Ljubljana
|
Objavljeno: Ned Jan 31, 2010 1:08 pm Naslov sporočila: |
|
|
Tudi tako, kot si pričel ni narobe. Prevsem je narobe tisto dvoje, kar sem napisal. Če ni Do-Loop zanke se program 1x odvrti in konec.
Lp
Jure |
|
Nazaj na vrh |
|
|
fičfirič Profesionalec
Pridružen/-a: Pet Avg 2008 21:58 Prispevkov: 80
|
Objavljeno: Pon Feb 01, 2010 11:14 am Naslov sporočila: |
|
|
Koda: |
$regfile = "m8515.dat"
$crystal = 8000000
Config Lcd = 16 * 2
Config Lcdbus = 4
Config Lcdpin = Pin , Db7 = Portc.7 , Db6 = Portc.6 , Db5 = Portc.5 , Db4 = Portc.4 , E = Portc.2 , Rs = Portc.1
Config Pind.0 = Input
Config Portc = Output
Config Pind.6 = Output
Config Pind.2 = Input
Config Int0 = Falling
Config Int1 = Rising
Enable Interrupts
Enable Int0
Enable Int1
Config Timer0 = Timer , Prescale = 1 'rabim?
Enable Timer0
Do
On Int0 Start Timer0 'bo v naslednjem ciklu timer startal kjer je končal ali začel iz ničle?
On Int1 Stop Timer0
Lcd Timer0 'ali mi to kaj vpliva oziroma kvari meritev?
Waitms 5
Loop
|
debuger mi javi da je napaka v zadnji vrstici in sicer:
-label not found [STARTTIMER0]
-label not found [STOPTIMER0] |
|
Nazaj na vrh |
|
|
Vlado Profesionalec
Pridružen/-a: Ned Jan 2004 16:11 Prispevkov: 556 Kraj: Ljubljana
|
Objavljeno: Sre Feb 03, 2010 12:48 pm Naslov sporočila: |
|
|
Hm...,
to kar delaš ni prava pot da se naučiš.
Že od začetka ti ljudje poskušajo pomagati ti pa delaš po svoje.
Da ne bom samo kritičen, bom poskusil pomagati.
Najprej napiši kratek program v katerem boš uporabil eno od prekinitev da vidiš kako to deluje, potem napiši program za drugo prekinitev (Timer) da vidiš kako to deluje, potem pa izkušnje iz teh dveh programov združi v tisto kar bi rad naredil.
Citiram: | debuger mi javi da je napaka v zadnji vrstici in sicer:
-label not found [STARTTIMER0]
-label not found [STOPTIMER0] |
ti si v programu nastavil prekinitve za timer in zunanjo prekinitev, nikjer pa ni podprograma na katerega program skoči ob prekinitvi in to je napaka ki ti jo javi ob prevajanju programa.
Koda: | Do
On Int0 Start Timer0 'bo v naslednjem ciklu timer startal kjer je končal ali začel iz ničle?
On Int1 Stop Timer0
Lcd Timer0 'ali mi to kaj vpliva oziroma kvari meritev?
Waitms 5
Loop |
On Int0 Start Timer0 ne sodi v glavno zanko, s tem poveš v programu kam naj skoči ob prekinitvi, enako je tudi za On Int1 Stop Timer0.
Mislim da tudi ime prekinitve ni pravo ker si uporabil rezervirane besede za to. Pravilno bi bilo če napišeš tako:
On Int0 Start_Timer0 ter v tem podprogramu zaženeš timer0. Ne pozabi na začetku ustaviti in resetirati timer ker mi se zdi da takoj po vklopu interrupt-a timer začne z delovanjem (škodovalo ne bo tudi če se motim).
Z ukazom End dodaj
Start_timer0:
start timer0
Return
Stop_Timer0:
Stop Timer0
'preberi vrednost timerja
'postavi nek bit tako da boš v glavni zanki vedel da prebrano vrednost lahko obdelaš Bit_x=1
Reset Timer0
return
Po ustavitvi timera v drugi prekinitvi preberi stanje Timerja in boš imel vrednost o pretečenem času med startom in stopom timerja.
Vlado |
|
Nazaj na vrh |
|
|
|
|
Ne, ne moreš dodajati novih tem v tem forumu Ne, ne moreš odgovarjati na teme v tem forumu Ne, ne moreš urejati svojih prispevkov v tem forumu Ne, ne moreš brisati svojih prispevkov v tem forumu Ne ne moreš glasovati v anketi v tem forumu You cannot attach files in this forum You cannot download files in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|