Kazalo po Svet elektronike forumu Svet elektronike
Revija za prave elektronike
 
AlbumAlbum   Pomoč pogostih vprašanjPomoč pogostih vprašanj   IščiIšči   Seznam članovSeznam članov   Skupine uporabnikovSkupine uporabnikov   Registriraj seRegistriraj se 
 Tvoj profilTvoj profil   Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil   PrijavaPrijava 

zajem signala injektorja
Pojdi na stran Prejšnja  1, 2
 
Objavi novo temo   Odgovori na to temo    Kazalo po Svet elektronike forumu -> Samogradnje
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
Jure
Urednik


Pridružen/-a: Pon Jan 2004 12:51
Prispevkov: 2132
Kraj: Ljubljana

PrispevekObjavljeno: Sob Dec 12, 2009 11:22 pm    Naslov sporočila: Odgovori s citatom

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
Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
Gustav
Profesionalec


Pridružen/-a: Pon Jun 2005 17:19
Prispevkov: 768

PrispevekObjavljeno: Sob Dec 12, 2009 11:49 pm    Naslov sporočila: Odgovori s citatom

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
Poglej uporabnikov profil Pošlji zasebno sporočilo
fičfirič
Profesionalec


Pridružen/-a: Pet Avg 2008 21:58
Prispevkov: 80

PrispevekObjavljeno: Pet Jan 01, 2010 8:37 pm    Naslov sporočila: Odgovori s citatom

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
Poglej uporabnikov profil Pošlji zasebno sporočilo
Jure
Urednik


Pridružen/-a: Pon Jan 2004 12:51
Prispevkov: 2132
Kraj: Ljubljana

PrispevekObjavljeno: Pet Jan 01, 2010 11:18 pm    Naslov sporočila: Odgovori s citatom

Oj,

predlagam, da si v Help-u prebereš kaj naredi ukaz Bitwait, pa ti bo bolj jasno Very Happy

Lp
Jure
Nazaj na vrh
Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
fičfirič
Profesionalec


Pridružen/-a: Pet Avg 2008 21:58
Prispevkov: 80

PrispevekObjavljeno: Sob Jan 02, 2010 12:38 am    Naslov sporočila: Odgovori s citatom

saj sem...sem kaj narobe razumel?

Koda:

Bitwait Pinb.7 , Reset                 'wait until bit 7 of Port B is 0.
Nazaj na vrh
Poglej uporabnikov profil Pošlji zasebno sporočilo
Bojan
Profesionalec


Pridružen/-a: Ned Mar 2004 22:24
Prispevkov: 70

PrispevekObjavljeno: Sob Jan 02, 2010 6:22 pm    Naslov sporočila: Odgovori s citatom

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! Laughing
Nazaj na vrh
Poglej uporabnikov profil Pošlji zasebno sporočilo
fičfirič
Profesionalec


Pridružen/-a: Pet Avg 2008 21:58
Prispevkov: 80

PrispevekObjavljeno: Sob Jan 02, 2010 7:43 pm    Naslov sporočila: Odgovori s citatom

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
Poglej uporabnikov profil Pošlji zasebno sporočilo
Bojan
Profesionalec


Pridružen/-a: Ned Mar 2004 22:24
Prispevkov: 70

PrispevekObjavljeno: Čet Jan 07, 2010 2:26 pm    Naslov sporočila: Odgovori s citatom

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
Poglej uporabnikov profil Pošlji zasebno sporočilo
fičfirič
Profesionalec


Pridružen/-a: Pet Avg 2008 21:58
Prispevkov: 80

PrispevekObjavljeno: Čet Jan 07, 2010 2:53 pm    Naslov sporočila: Odgovori s citatom

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
Poglej uporabnikov profil Pošlji zasebno sporočilo
fičfirič
Profesionalec


Pridružen/-a: Pet Avg 2008 21:58
Prispevkov: 80

PrispevekObjavljeno: Sob Jan 30, 2010 4:18 pm    Naslov sporočila: Odgovori s citatom

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
Poglej uporabnikov profil Pošlji zasebno sporočilo
Jure
Urednik


Pridružen/-a: Pon Jan 2004 12:51
Prispevkov: 2132
Kraj: Ljubljana

PrispevekObjavljeno: Sob Jan 30, 2010 6:55 pm    Naslov sporočila: Odgovori s citatom

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
Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
fičfirič
Profesionalec


Pridružen/-a: Pet Avg 2008 21:58
Prispevkov: 80

PrispevekObjavljeno: Ned Jan 31, 2010 11:42 am    Naslov sporočila: Odgovori s citatom

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
Poglej uporabnikov profil Pošlji zasebno sporočilo
Jure
Urednik


Pridružen/-a: Pon Jan 2004 12:51
Prispevkov: 2132
Kraj: Ljubljana

PrispevekObjavljeno: Ned Jan 31, 2010 1:08 pm    Naslov sporočila: Odgovori s citatom

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
Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
fičfirič
Profesionalec


Pridružen/-a: Pet Avg 2008 21:58
Prispevkov: 80

PrispevekObjavljeno: Pon Feb 01, 2010 11:14 am    Naslov sporočila: Odgovori s citatom

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
Poglej uporabnikov profil Pošlji zasebno sporočilo
Vlado
Profesionalec


Pridružen/-a: Ned Jan 2004 16:11
Prispevkov: 556
Kraj: Ljubljana

PrispevekObjavljeno: Sre Feb 03, 2010 12:48 pm    Naslov sporočila: Odgovori s citatom

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
Poglej uporabnikov profil Pošlji zasebno sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo    Kazalo po Svet elektronike forumu -> Samogradnje Časovni pas GMT + 1 ura, srednjeevropski - zimski čas
Pojdi na stran Prejšnja  1, 2
Stran 2 od 2

 
Pojdi na:  
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