Tachometr

Diskuze a poradna o programátorech a programování různých obvodů

Moderátor: Moderátoři

Zpráva
Autor
Uživatelský avatar
Modemo
Příspěvky: 90
Registrován: 13 kvě 2007, 00:00
Bydliště: Brno, Pov. Bystrica

#31 Příspěvek od Modemo »

luccas píše:jo a mám to :)

while PORTB.0 = 0 do nop;
i:=i+1;
while PORTB.0 = 1 do nop;

jednoduché ale účiné :D

No vidis, staci porozmyslat :wink:
Houmer_other

#32 Příspěvek od Houmer_other »

Když tak na to koukám,tak mě napadá dotaz.Co je rychlejší ,jestli i:-i+1 nebo Inc(i).Jak to ten kompilátor vyoptimalizuje?
Uživatelský avatar
Modemo
Příspěvky: 90
Registrován: 13 kvě 2007, 00:00
Bydliště: Brno, Pov. Bystrica

#33 Příspěvek od Modemo »

Neviem ako konkretne mikropascal, ale napr avrgcc co viem, je fakt dost hnusne inteligentny...... a pouziva (teda snazi sa) co najlepsi preklad. Myslim ze dany pripad je mu jedno, nahradi to vzdy tym istym.... sak si kuknite asm, pre oba pripady :roll:
Houmer_other

#34 Příspěvek od Houmer_other »

Zkoušel jsem to a i v mikdopascalu je to jedno.V obou případech to přeloží jako "INCF _i, 1"
Uživatelský avatar
luccas
Příspěvky: 192
Registrován: 06 kvě 2007, 00:00
Kontaktovat uživatele:

#35 Příspěvek od luccas »

Tak jsem na jedno řešení přišel. Ale opět je díky mé neznalosti velice prasácké. Ukazuje to +/- tu rychlost. Ale! vím, že je chyba v tom způsobu.



Kód: Vybrat vše

procedure interrupt;
begin
   brojac := brojac + 1;
   TMR0   := 96;
   INTCON := $20;
end;

 
 
begin

  OPTION_REG := $84; 
  TRISB  :=   0;       
  PORTB  := $FF;
  trisb.7 := 1;       
  brojac :=   0;     
  TMR0   :=  96;
  INTCON := $A0;
 
  Lcd_Init(PORTC);             
  Lcd_Cmd(LCD_CLEAR);
  Lcd_Cmd(LCD_CURSOR_OFF);

  Lcd_Out(1, 1, ('Rychlost: '));
  Lcd_Out(1,13,' KMh');
  polomer:=0.3;

repeat
 begin
 
 if brojac >= 3000 then
 begin
  v:=0;
  byteToStr(v,txt_vys);
  Lcd_Out(1,10,txt_vys);
 end;
 

        if portb.7 = 1 then
        begin
           t:=brojac/1000;
           mereni;
           Lcd_Out(1,10,txt_vys);
           brojac := 0;
           while PORTB.7 = 1 do nop;
        end;
         

    floattostr((brojac/1000),tt);
    Lcd_Out(2,7,tt);
     
end;
until 0=1;
end.


Já ten čas mezi dvěma impulzy počátám tak, že ten čítač přičte cca. 1000 za 1s. a s toho vycházím. Ale nejhlavnější problém je ten, že to zjišťuji a počítám a nuluji v programu. takže když někde hodím spoždění 0,5s tak končím. protože nemám šanci odchytit výstup. Proto se prosím ptám, nevíte někdo jak nastavit časovač tak aby mi na impuls sepnul a na další impuls vyhodil čas, vynuloval se a znova?

:cry: já už fakt na víc nepříjdu než to co jsem napsal. děkuji
Uživatelský avatar
luccas
Příspěvky: 192
Registrován: 06 kvě 2007, 00:00
Kontaktovat uživatele:

#36 Příspěvek od luccas »

a když nad tím tak přemýšlím tak jsem došel k závěru, že mi to vyhovuje. Ale potřeboval bych pomoct alespoň s tím, jak udělat aby mi ten časovač napočítal do 1000 přesně za 1s. ??? :) pak to bude super. Díkes. :D
DMF

#37 Příspěvek od DMF »

Timer se dá nastavit na spouštění třeba náběžnou hranou.Atmely to umí na sto procent,PICy určitě taky.Koukni do manuálu.
Uživatelský avatar
luccas
Příspěvky: 192
Registrován: 06 kvě 2007, 00:00
Kontaktovat uživatele:

#38 Příspěvek od luccas »

DMF píše:Timer se dá nastavit na spouštění třeba náběžnou hranou.Atmely to umí na sto procent,PICy určitě taky.Koukni do manuálu.


jo tak to kdybych věděl jak :( . Já vím, že to tak udělat jde ale nevím jak to tak udělat. Manuál mi moc nepomohl
DMF

#39 Příspěvek od DMF »

například u picu 12F675 se nastavuje přerušení při změně na konkrétním portu IOC
1=povoleno přerušení při změně GPIO
0 = zakázáno (maskováno) při změně GPIO

INTEDG: bit výběru aktivní hrany pro přerušení
1 – náběžná hrana signálu vývodu GP2/INT je aktivní
0 – sestupná hrana signálu vývodu GP2/INT je aktivní
DMF

#40 Příspěvek od DMF »

Zkus kouknout do tohoto datasheetu na ten timer (možná ho máš):
http://www.copsu.cz/mikrop/download/ok.php?link=16F87xA
Uživatelský avatar
tominekk
Příspěvky: 295
Registrován: 16 črc 2004, 00:00
Bydliště: 49°11'30.229"N, 16°35'29.415"E
Kontaktovat uživatele:

#41 Příspěvek od tominekk »

Sorry chlapy, nedá mi to a musím poukázat na dvě videa z youtube.
Na jednom jede frajírek prej přes 400kmh-1 a na druhým jde docela pěkně vidět digitální tachometr - pro inspiraci autora.

Kód: Vybrat vše

http://www.youtube.com/watch?v=qaYcvN5yNGg&mode=related&search=
http://www.youtube.com/watch?v=k51irq9QiPg&mode=related&search=
Chytrej člověk se učí chybama, ale jenom blbec těma svejma!
Uživatelský avatar
luccas
Příspěvky: 192
Registrován: 06 kvě 2007, 00:00
Kontaktovat uživatele:

#42 Příspěvek od luccas »

http://im.lide.cz/photo/big/28/09/1782100-16152809.jpg

takže asi takto to vypadá. Program sem použil ten co jsem ukázal. prostě zapnu čítač, který napočítá 1000 cca. za 1s. a když se mihne snímač tak hodnotu přečtu, spočtu ukážu a vynuluji. a pořád dokola. Když se signál neoběví do 3s tak zobrazím nulu. A rychlost se zobrazuje tedy každou otočkou. když jedete rychleji tak jse to teoreticky obnovuje vícekrát ale má to svou logiku. Tak prakticky vzato jsem potěšen :) Sice je možnost vylepšit ten engin o to přerušení tak jak by mělo být ale na moji motorku či kolo to stačí :D

Ještě krom parametrů. Dokáže to měřit do 255Kmh z důvodu použíté proměné byte která může nabírat hodnot od 0 do 255.
toť asi vše.
Uživatelský avatar
caven
Příspěvky: 417
Registrován: 15 srp 2006, 00:00

#43 Příspěvek od caven »

A nehodíš jsem schéma a program ??? Vypadá to zajímavě
Uživatelský avatar
luccas
Příspěvky: 192
Registrován: 06 kvě 2007, 00:00
Kontaktovat uživatele:

#44 Příspěvek od luccas »

caven píše:A nehodíš jsem schéma a program ??? Vypadá to zajímavě


Musím to ještě všechno dodělat :) takže až to bude tak se ozvu.
DMF

#45 Příspěvek od DMF »

Zkus tam použít ten timer.Mužeš mu nastavit předděličku a měřit počet impulsů za delší čas.Měření by bylo přesnější. Existuje řada principů ,jak to řešit.
Odpovědět

Zpět na „Programování PIC, ATMEL, EEPROM a dalších obvodů“