edit: Vyřešeno, fungující kód vizte ke konci tématu.
Vytvořil jsem si kód pro zjišťování stavu tlačítka tak, aby eliminoval softwarově jeho zákmity a aby rozlišoval aktivaci po stisku nebo po puštění. Když jsem potřeboval pracovat s více tlačítky, kód jsem kopíroval a měnil názvy portů a pinů, to činilo můj kód nepřehledným, protože dlouhým. Chtěl jsem tedy nahradit kód tlačítek makrem, ale přes možnost použít parametry by nebylo výsledné volání makra dost jednoduché. Vytvořil jsem tedy funkci, která by měla být univerzální pro jakýkoliv port, jakýkoliv pin a dokázala by také rozlišit stisknutí nebo puštění tlačítka a měla by eliminovat zákmity (debounce switch). Fce funguje ale jen pro pin0, pro pin 1 a další už ne. Nevím proč, mořím se s tím druhý den a nemám nápady. Prosím o pomoc. Kdyby bylo něco nejasného, vysvětlím myšlenku, třeba jsem to jinak myslel a jinak - blbě naprogramoval, že princip z kódu není jasný. Díky, Pavel
#include <avr/io.h>
#include "..\inc\mojelib1.h"
#define DEBOUNCE waitms(30)
/**** definice funkcí ****/
char tlacitko ( char PINX, char pin, char puvodni)
{
// pro předávání stavů platí:
// bit0: 1=puštěno; 0=nebylo puštěno
// bit1: 1=stisknuto; 0=nebylo stisknuto
// bit2: 1=minulý stav byl 1; 0=minulý stav byl 0
char vystup=0;
char stav_tlacitka=0;
stav_tlacitka = bit_is_set(PINX,pin);
if ( (stav_tlacitka == 1) && ((puvodni & 0b00000100) == 0x00) ) //test zda bylo stisknuto a zda původně ne
{
DEBOUNCE;
stav_tlacitka = bit_is_set(PINX,pin);
if (stav_tlacitka == 1) //test zda je stále stisknuto
{
vystup = 0b00000010; //právě bylo stisknuto
}
}
if (stav_tlacitka == 0 && ((puvodni & 0b00000100) != 0x00) ) //test zda bylo puštěno a zda původně ne
{
DEBOUNCE;
stav_tlacitka = bit_is_set(PINX,pin);
if (stav_tlacitka == 0) //test zda je stále puštěno
{
vystup = 0b00000001; //právě bylo puštěno
}
}
vystup = vystup | (stav_tlacitka << 2); //aby se na třetím místě odzadu objevila 1 když je stisknuto, 0 když není a zbytek neměnit
return vystup;
}
/**** /definice funkcí ****/
/////////////////////////////// MAIN //////////////////////////////
int main (void)
{
DDRB = 0x00; // všechny piny na PortB jako vstupní
PORTB = 0xff; // pull-up na portu B zapnuto
DDRD = 0xff; // všechny piny na PortD jako výstupní
PORTD = 0x00; // všechny LED zhasne
char tlacB0 = 0;
char tlacB1 = 0;
//*********** nekonečná smyčka ***********//
for(;;)
{
tlacB1 = tlacitko (PINB, 1, tlacB1);
if ((tlacB1 & 0b00000001) != 0x00 )
{
PORTD ^= (0b00000001);
}
}
//*********** /nekonečná smyčka ***********//
}
/////////////////////////////// END MAIN //////////////////////////
Když část
tlacB1 = tlacitko (PINB, 1, tlacB1);
if ((tlacB1 & 0b00000001) != 0x00 )
{
PORTD ^= (0b00000001);
}
změním tak, aby pracovala s pinem 0:
tlacB0 = tlacitko (PINB, 0, tlacB0);
if ((tlacB0 & 0b00000001) != 0x00 )
{
PORTD ^= (0b00000001);
}
,
funguje to. Jakmile nuly vyměním za jiné číslo portu, neděje se nic.
administrator: přejmenováno z "funkce pro jednoduchou práci s tlačítky"