Inga kontaktstuds?

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
sica06
Inlägg: 83
Blev medlem: 31 augusti 2008, 17:31:50
Ort: Karlskrona

Inga kontaktstuds?

Inlägg av sica06 »

Hej,

Jag har nyligen börjat pilla med switches till min AVR-P28/ATmega88 (nybörjare).

Jag har precis provat ett program där jag försöker komma underfund med kontaktstuds mha delay-funktioner. Detta verkar fungera bra.
Jag blev dock lite nyfiken på att prova hur länge studsarna varar på min MCU, så jag provade att göra en kod som testar detta. Eventuellt kan man inte koda fram det som jag har gjort, eller så har jag inga kontaktstudsar som ger utslag - kan det vara så?

Koden ser ut så här:

Kod: Markera allt

int button_is_pressed()
{  //koden från "while(1)" är min "provkod".								
	if(bit_is_clear(PIND, PD1)) // Vid intryck blir switch-pinnen LOW (pull-up resistor).
	{
		while(1)
		{
		//_delay_ms(2);
			if(bit_is_set(PIND, PD1)) //Om det finns studsar så blir pinnen HIGH igen , även om jag inte släpper knappen. Då ska LED:en tändas (det gör den ej).
			{
				PORTC ^= _BV(PC5);
				while(1){}
				
			}
		} //Koden här nedan är inte relevant i frågan.	
		_delay_ms(DEBOUNCE_TIME); //Let bounce clear for 25 ms
		if(bit_is_clear(PIND, PD1))
			return 1;
	}	
	return 0;
}
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 46945
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Inga kontaktstuds?

Inlägg av TomasL »

Du får nog köra med ett oscilloskop för att se det, gissar jag.
Sen är det väl så att det beror på typ av brytare och hur slitna dem är. Gissar att en ny kvalitetsbrytare inte studsar, men efter ett par tusen operationen så börjar den.
Användarvisningsbild
Icecap
Inlägg: 26636
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Inga kontaktstuds?

Inlägg av Icecap »

Vilka brytare som stutsar beror på konstruktionen och slitaget.

Sedan tycker _jag_ att det är mycket dålig programmeringsteknik med delay för att debounca.

Jag läser av helst via en timer ISR på runt 10-100Hz, vid att bara läsa knapp-porten 1 gg per interrupt får jag aldrig några bounces alls, jag anammar även en n-key-rollover för att rensa ytterligare och det har fungerat i riktigt många projekt utan problem.

Det går även att läsa knappar på detta vis i main-loop'en men om den är snabb kan man behöva att lägga in att den ska ha 2 lika avläsningar innan den reagerar. Detta sätt har jag testat i ett färre antal projekt och det har även det fungerat klockrent.

Men att använda delay är en styggelse tycker jag.
xxargs
Inlägg: 10189
Blev medlem: 23 september 2006, 14:28:27
Ort: Södertälje

Re: Inga kontaktstuds?

Inlägg av xxargs »

TomasL skrev:Du får nog köra med ett oscilloskop för att se det, gissar jag.
Sen är det väl så att det beror på typ av brytare och hur slitna dem är. Gissar att en ny kvalitetsbrytare inte studsar, men efter ett par tusen operationen så börjar den.
Alla mekaniska brytare studsar mer eller mindre och dessutom ändrar sig lite med tiden beroende på slitage, fjädring mm. - så det är bara att lära sig att hantera det i programvaran...
sica06
Inlägg: 83
Blev medlem: 31 augusti 2008, 17:31:50
Ort: Karlskrona

Re: Inga kontaktstuds?

Inlägg av sica06 »

Jo, jag har inte tänkt använda delays senare, utan detta var mest för att testa. Senare använder jag troligtvis någon RC-krets eller möjligtvis timer.

Undrar en snabb sak när jag ändå "är här", som jag är lite nyfiken över.
När jag använder delays så specifierar jag att F_CPU är 1000000UL. Min processor är dock på 8Mhz - hur går det ihop?
Användarvisningsbild
BEEP
EF Sponsor
Inlägg: 1593
Blev medlem: 21 januari 2006, 16:57:56
Ort: Mölndal

Re: Inga kontaktstuds?

Inlägg av BEEP »

Menar du att du måste ha 1000000UL för att tiderna ska stämma?
bos
Inlägg: 2311
Blev medlem: 24 februari 2007, 23:29:15
Kontakt:

Re: Inga kontaktstuds?

Inlägg av bos »

sica06 skrev:När jag använder delays så specifierar jag att F_CPU är 1000000UL. Min processor är dock på 8Mhz - hur går det ihop?
Hur det går ihop vet bara du själv, för frågan är inte korrekt ställd.

Vad undrar du egentligen över?
sica06
Inlägg: 83
Blev medlem: 31 augusti 2008, 17:31:50
Ort: Karlskrona

Re: Inga kontaktstuds?

Inlägg av sica06 »

Nu har jag inte tillgång till MCU:n, så jag kan inte testa.
Har fått för mig att jag bör använda F_CPU 1000000UL, och detta har fungerat som det bör. Detta är alltså tydligen fel?

Ska testa ändra imorgon så får vi se..

tack så länge!
sodjan
EF Sponsor
Inlägg: 43249
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Inga kontaktstuds?

Inlägg av sodjan »

Testa och testa, RTFM är väl betydligt enklare... :-)

Det hela är ju väldigt enkelt. Parametern F_CPU talar om vilken hastighet du
*tänker* köra processorn på och därmed kan kompilatorn generera korrekta
delay rutiner. Om du däremot säger att du ska köra i 1 MHz och sedan kör i
8 MHz så är det ju ganska uppenbart vad som kommer att hända...

> och detta har fungerat som det bör.

Det gör det säkert ! Det beror ju helt på vad du menar med "fungerar"... :roll:

> Ska testa ändra imorgon så får vi se..

Varför ändra något som "fungerar" ?
Användarvisningsbild
BEEP
EF Sponsor
Inlägg: 1593
Blev medlem: 21 januari 2006, 16:57:56
Ort: Mölndal

Re: Inga kontaktstuds?

Inlägg av BEEP »

Datablad - ATmega88

The device is shipped with internal RC oscillator at 8.0MHz and with the fuse CKDIV8 pro-
grammed, resulting in 1.0MHz system clock.
The startup time is set to maximum and time-out
period enabled. (CKSEL = "0010", SUT = "10", CKDIV8 = "0"). The default setting ensures that
all users can make their desired clock source setting using any available programming interface.
sodjan
EF Sponsor
Inlägg: 43249
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Inga kontaktstuds?

Inlägg av sodjan »

Jaha ?
Det viktiga är ju fortfarande vilken hastighet du faktiskt tänker köra på.
Det där citatet ur databladet säger ju inte ett smack om det...
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: Inga kontaktstuds?

Inlägg av jesse »

BEEP har nog löst mysteriet om megahetrzsen. Sodjan, jag har hört om många nybörjare som läst för slarvigt i databladet (precis det stycke som BEEP citerar) och tror att processorn går på 8 MHz bara för att RC-oscillatorn ligger på den frekvensen. Så när dom ser att kretsen är förprogrammerad att dividera frekvensen med 8 så fattar dom. Aha, på så vis :!:
sica06
Inlägg: 83
Blev medlem: 31 augusti 2008, 17:31:50
Ort: Karlskrona

Re: Inga kontaktstuds?

Inlägg av sica06 »

Ok, jag tror jag är med.
Vill bara reda ut det så att jag inte har missförstått det:

- Oscillatorfrekvens och processorfrekvens är två vitt skilda saker?
- mha F_CPU anger jag min processorfrekvens?

Gällande fuses:
- Kan jag genom att ändra fuse CKDIV8 också ändra min processorfrekvens? Vad skulle detta få för effekt?

Dryga frågor kanske, men jag blir nyfiken och jag hittar inte svaren någon annanstans.. Hoppas ni står ut..
sodjan
EF Sponsor
Inlägg: 43249
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Inga kontaktstuds?

Inlägg av sodjan »

> - Oscillatorfrekvens och processorfrekvens är två vitt skilda saker?

Om jag förstår det rätt så är den interna oscillatorn fast på 8 MHz, sedan kan den
delas ner till andra hastigheter efter behov (se CKDIV8 ). Se databladet för detaljer.

> - mha F_CPU anger jag min processorfrekvens?

Ja, till *kompilatorn* !
Vilken hastighet du sedan faktiskt kör med är en helt annan sak. Det vet
ju kompilatorn ingenting om och det har inget med F_CPU att göra...

> - Kan jag genom att ändra fuse CKDIV8 också ändra min processorfrekvens?
> Vad skulle detta få för effekt?

Hittade du verkligen ingenting om CKDIV8 i databladet ?

> Dryga frågor kanske, men jag blir nyfiken och jag hittar inte svaren någon annanstans...

Än vardå ? Var har du letat ? Är det inte det som BEEP citerade aldeles nyss från
databladet som gäller ?
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: Inga kontaktstuds?

Inlägg av jesse »

Att leta i databladet kan vara ganska givande. Databladet har en jättebra innehållsförteckning som man kan se i fältet till vänster om dokumentet i pdf-programmet. Leta upp "system clock" där så får du svar på det mesta du undrar om.

Det finns ett enklare sätt att ändra frekvens än att programmera om CKDIV8: I kapitel 8.11 står det om "system clock prescaler" att du kan välja hur frekvensen från oscillatorn ska delas genom att ändra i registret CLKPR. Läser du på sidan 38 och 39 i databladet så står alla detaljer du behöver veta. Här kan du sätta frekvenserna 8, 4, 2, 1 MHz och 500, 250, 125, 62.5 och 31.25 kHz.
Skriv svar