Tachometr
Moderátor: Moderátoři
Tak osahávej periodicky port a vyhodnocuj změnu - doteď tam byla jednička, odteď tam není - došlo ke změně a vyhodnocujeme čas do doby, kdy se tato změna bude opakovat.
Schválně pak dej vědět, jak jsi to dořešil, hlavně mě bude zajímat, jak budeš mít ošetřený údaj, aby se neměnil s každou nepatrnou změnou od impulsu k impulsu - je to otázka, jak dlouho musíš koukat na displej, než přečteš výsledek. Číselné vyjádření rychlosti se musí měnit proto velmi pomalu, abys neztrácel čas čtením.
Schválně pak dej vědět, jak jsi to dořešil, hlavně mě bude zajímat, jak budeš mít ošetřený údaj, aby se neměnil s každou nepatrnou změnou od impulsu k impulsu - je to otázka, jak dlouho musíš koukat na displej, než přečteš výsledek. Číselné vyjádření rychlosti se musí měnit proto velmi pomalu, abys neztrácel čas čtením.
Ve čtvrtek budou součástky. Tak se dotoho plně pustím, zatím ted sbítám teoriiHill píše:Tak osahávej periodicky port a vyhodnocuj změnu - doteď tam byla jednička, odteď tam není - došlo ke změně a vyhodnocujeme čas do doby, kdy se tato změna bude opakovat.
Schválně pak dej vědět, jak jsi to dořešil, hlavně mě bude zajímat, jak budeš mít ošetřený údaj, aby se neměnil s každou nepatrnou změnou od impulsu k impulsu - je to otázka, jak dlouho musíš koukat na displej, než přečteš výsledek. Číselné vyjádření rychlosti se musí měnit proto velmi pomalu, abys neztrácel čas čtením.
Tak po dlouhém hledání jsem našel něco takovéhoto:
Myslíte, že to je to co potřebuji? Nemám to zatím jak odskoušet. V simulátoru jsem nenašel jak simulovat vstupy.
Kód: Vybrat vše
//******************************************************************************
//This code is orogionally based on the "adconlcd" example provided with the
//MikroElectronika MikroPascal Compiler.
//
//This revision of the code eliminates all interrupt routines. Instead the timer1
//register is used to count the number of low to high transitions that occur during
//the sample period. The value of timer1 is a word, so the maximum frequency that
//this code can measure is 65535 Hz. This code uses specific features of the
//16F887A so porting to a different model chip may be difficult.
//
//Due to the fact that I am using timer1 with an external counter, the input signal
//will have to be provided on RC0 (PortC, Pin 0) as this is a required by the PICs
//hardware
//
//Also included in this version is test code that starts a PWM that can be used for
//testing. the output is RC2 (PortC, Pin2). If you have an EasyPIC2 board you can
//remove the pullup/down jumper on the buttons and simply hold dow RC0 and RC2 to
//feed the PWM signal to the counter pin.
//
// INTERESTING NOTE ON "FOR" LOOPS:
// If you are using a "for" loop with a byte or word variable and a decrimenting counter
// like:
// x:byte;
// for x := 100 downto 0 do
// The loop will run infinatly. This is because the compiler is looking for x to be
// less than 0 to terminate the loop. Since Bytes and Words are only positive numbers
// they will never be less than 0 (a byte with a value of 0 minus 1 is 255).
//******************************************************************************
program FreqonLCD;
var
Hits:word;
b:array[6] of char;
const
OutFreq:word = 4000; //for testing
SampleTime:Word = 1000;
{The following two constants provide the ability to accomodate for frequency
drift. "CorrectionAmount" is the amount that ill be subtracted from the
frequency for every 1000 count of frequency}
CorrectionAmount:word = 3;
{The following function activates the interrupt and waits "SampleTime". Even during the
delay, the rise of portb pin0 will cause an interrupt}
Function CollectSample:word;
begin
delay_ms(1000);
setbit(portb,1); //set portb pin1 1 high, to act as an indicator that sampling had begun
TrisC := 1; //set portc pin 0 as in input
clearbit(T1CON,0); //make sure timer1 is not running
TMR1L := 0; //clear timer 1 low byte
TMR1H := 0; //clear timer1 high byte
{Set timer1 as external counter:
bit 6&7 (00) - ignored
bit 4&5 (00) - prescaler 1:1
bit 3 (0) - oscillator off
bit 2 (1) - do not sync with oscillator
bit 1 (1) - External source (RC0);
bit 0 (1) - timer1 enabled}
T1CON := %00000111;
delay_ms(SampleTime); //Wait the sample interval
clearbit(T1CON,0); //disable timer1
hits := (TMR1H*256)+TMR1L; //Build a word from 2 bytes
hits := hits - ((hits div 1000)*CorrectionAmount); //Adjust value to accomodate for freqency drift
result := hits *(1000 div SampleTime); //Accomodate for sample periods under 1 second
clearbit(portb,1); //Turn off the LED on portb pin 1
end;
begin
//Start test code
{Connect pin RC2 to RC0}
PWM_Init(OutFreq);
PWM_Change_Duty(127);
PWM_Start;
//End test code
PORTB := 0; // clear portb
TRISB := 1; // designate portb as output (LCD is connected to portb)
intcon := 0; // disable all interrupts
Lcd_init(PORTB); // initialize (4-bit interface connection)
lcd_cmd( LCD_CURSOR_OFF); // send command to LCD (cursor off)
lcd_cmd(LCD_CLEAR);
while true do
begin
hits := CollectSample; //perform the sampling process
WordToStr(hits,b); //convert the word "hits" to a string
lcd_out(1,1,'Read Frequency:'); //Output first line on the LCD
lcd_out(2,1,' ');
lcd_out(2,1,b); //write "b" to the second line of the LCD
lcd_out(2,7,'Hz'); //write "Hz" on second line
end;
end.
NO tak jsem se ozval trochu dříve. Rád bych jse zeptal jak udělat co nejjednodušeji bezzákmitové tlačítko? Testoval jsem to na diodě. Stiskem zapni a stiskem vypni. Ale když jsem držel tlačítko tak to blikalo podle toho jaké jsem měl nadstavné spoždění. Ale nenapadámě jak udělat jednoduše to aby se stiskem zaplno a dokud nepustím a nestisknu znova aby nezhasla... Paměti je málo no.
ale co sa bojis, staci na konci rutinky dat cakanie na pustenie tlacitka a za tym oneskorenie tak 100ms aby dozneli zakmityluccas píše:NO tak jsem se ozval trochu dříve. Rád bych jse zeptal jak udělat co nejjednodušeji bezzákmitové tlačítko? Testoval jsem to na diodě. Stiskem zapni a stiskem vypni. Ale když jsem držel tlačítko tak to blikalo podle toho jaké jsem měl nadstavné spoždění. Ale nenapadámě jak udělat jednoduše to aby se stiskem zaplno a dokud nepustím a nestisknu znova aby nezhasla... Paměti je málo no.
asi takto. stisk testuji následovně. (běží to v cyklu);Modemo píše:ale co sa bojis, staci na konci rutinky dat cakanie na pustenie tlacitka a za tym oneskorenie tak 100ms aby dozneli zakmityluccas píše:NO tak jsem se ozval trochu dříve. Rád bych jse zeptal jak udělat co nejjednodušeji bezzákmitové tlačítko? Testoval jsem to na diodě. Stiskem zapni a stiskem vypni. Ale když jsem držel tlačítko tak to blikalo podle toho jaké jsem měl nadstavné spoždění. Ale nenapadámě jak udělat jednoduše to aby se stiskem zaplno a dokud nepustím a nestisknu znova aby nezhasla... Paměti je málo no.
if TestBit(portB, 0) = 1 then i:=i+1;
pokud je na vstupu seplý spínač tak to přičte jedničku.
když tam dám delay_ms(100);
delay_ms(100);
if TestBit(portB, 0) = 1 then i:=i+1;
tady to přičítá jen pokud se trefím mezi těch 100ms a pokud čudlík přidržím tak zase přičítá vkuse.
Když tam šoupnu toto co mě napadlo
repeat
begin
if TestBit(portB, 0) = 1 then i:=i+1;
repeat
begin
if TestBit(portB, 0) = 1 then ok:=false else ok:=true;
end;
until ok;
end;
until ok;
ok:=false;
tak je to sice pěkné ale program vlastně stojí pokud to držím a funguje to prostě nějak čudně. Dokonce si myslím, že to je pěkně hnusné řešení. ale nechci se na to vykašlat. jen to vydím na delší dobu.