rising edge

Rasprava o AVR mikrokontrolerima, AVR projekti i drugo vezano za AVR...

Moderators: pedja089, stojke369, trax, InTheStillOfTheNight

Post Reply
User avatar
kepos
Pocetnik na forumu
Pocetnik na forumu
Posts: 43
Joined: 09-01-2009, 14:19
Location: Croatia, Osijek, Retfala
Contact:

rising edge

Post by kepos »

Imam jedan mali problem kod kojega sam zapeo pa ako netko moze mozda pomoci...
Naime u sklopu necega trebam napraviti da kada pritisnem tipku (koja je spojena na uP) da mi se jednoj varijabli pribroji odrjedjena vrjednost. Ali trebam po stisku pribrojiti samo 1, znaci ne treba pribrojavati dokle god je tipka stisnuta nego samo jednom, odnosno na rastuci brid koji dolazi na port. Nadam se da me shvacate. E sad kod koji sam napisao glasi:

Code: Select all

uint8_t state; // globalna varijabla

... // deklaracije funkcija, pocetak main itd...

	while (1) {
		disp_n(count);
		if (button( &PINA, 0)) count++;
		if (button( &PINA, 1)) count+=10;
		if (button( &PINA, 2)) count+=100;
	}

... // neki kod izmedju i kraj main() funkcije
	
	uint8_t button(volatile uint8_t *port, uint8_t pin) {
	if ( (*port & (1 << pin)) && (state == 0)) {
		_delay_ms(10);
		if (*port & (1 << pin)) {
			state=1;
			return 1;
		}
	}
	if ( !(*port & (1 << pin)) && (state == 1)) state = 0;
	return 0;
}
no medjutim on mi pribrojava vrijednosti dokle god je tipka stisnuta a ne samo jednom...
User avatar
Kizo
Pravo uznapredovao :)
Pravo uznapredovao :)
Posts: 387
Joined: 01-11-2009, 22:40
Location: Hrvatska

Re: rising edge

Post by Kizo »

Program bi radio, kako si opisao, kada bi čitao samo jednu tipku. Problem je u varijabli "state" koja je zajednička za sve tipke.

Recimo da si stisnuo prvu tipku, uvjet pod if je istinit.

Code: Select all

if ( (*port & (1 << pin)) && (state == 0)) {
      _delay_ms(10);
      if (*port & (1 << pin)) {
         state=1;
         return 1;
}
Javlja se da je detektiran rastući brid (return 1), te se promjeni "state" u "1" kako bi blokirao stisnutu tipku. Sve fino i krasno.

No sljedeća tipka koja nije stisnuta će zbog

Code: Select all

if ( !(*port & (1 << pin)) && (state == 1)) state = 0;
promijeniti "state" natrag u "0" i onda kad se dođe natrag do tipke koja je stisnuta, će proći provjeru

Code: Select all

if ( (*port & (1 << pin)) && (state == 0)){
...
}
i zbog toga ti se "count" povećava dokle je tipka stisnuta.
User avatar
kepos
Pocetnik na forumu
Pocetnik na forumu
Posts: 43
Joined: 09-01-2009, 14:19
Location: Croatia, Osijek, Retfala
Contact:

Re: rising edge

Post by kepos »

Ajme koji lapsuz :oops: E puno hvala! Uopce to nisam primjetio... :?
User avatar
InTheStillOfTheNight
Odlično uznapredovao
Odlično uznapredovao
Posts: 938
Joined: 01-06-2006, 17:54
Location: Zagreb

Re: rising edge

Post by InTheStillOfTheNight »

Zbunjeno programiranje... Kizo vidim još se boriš sa svime, nije vrag da si se C-a uhvatio :)
InTheStillOfTheNight
User avatar
Kizo
Pravo uznapredovao :)
Pravo uznapredovao :)
Posts: 387
Joined: 01-11-2009, 22:40
Location: Hrvatska

Re: rising edge

Post by Kizo »

O pa gdje si ti Noćni, nema te od zadnje pomrčine Mjeseca :D
Nisam se još ozbiljno uhvatio C-a, ali eto zanimam se pomalo, blinkam LEDice i to.
Što se tiče programa, malo je atipično ovo zvanje PIN registra po referenci (pointer), a i sve je koncipirano kao da su tipke spojene prema Vcc, a inače se spajaju prema masi. :?
Post Reply