Witam
Bawię sie ostatnio taka ciekawa funkcją do eliminacji zestyków i niestety nie potrafię jej zmusić do działania.
Niby wszystko działa poprawnie, ale nigdy nie wykonuje sie porównanie:
if(State==0xf000), funkcja DebounceSwitch() nigdy nie zwraca, ani TRUE, ani FALSE. Czy ktoś może się orientuje gdzie popłeniam błąd.
Zmienne licznik i licznik1 są to tylko zmienne kontrolne/debugujące by sprawdzić przebieg działania tej funkcji.
Jeśli ktoś sobie życzy lub nie rozumie z chęcią wytłumaczę jak działa funkcja DebounceSwitch() (no przynajmniej tak jak ją rozumiem).
Z góry dziękuję za każdą uwagę i sugestię.
--
pozdawiam
demeus
Bawię sie ostatnio taka ciekawa funkcją do eliminacji zestyków i niestety nie potrafię jej zmusić do działania.
#include <avr/pgmspace.h>
#include <avr/io.h> // dostęp do rejestrów
#include <avr/interrupt.h> // funkcje sei(), cli()
#include <avr/signal.h> // definicje SIGNAL, INTERRUPT
#include "HD44780.h"
#include "delay.h"
#define T0_INIT 256-250
#define podswietlenie_on 1
#define podswietlenie_off 0
uint16_t tmp_tab[14]={0}; // Tablica pomocnicza
uint16_t tmp=0; // Zmienna pomocnicza
uint8_t liczt0=0; // Licznik wejsc do przerwania, klawisz badany gdy liczt0=0
char flaga_wlacz=0; // Flaga sygnalizujaca stan urzadzenia
volatile uint8_t podswietlenie_lcd=1; // Zmienna ustawiająca podświetlenie LCD
volatile uint8_t liczydelko=0;
volatile uint16_t licznik=0;
volatile uint16_t licznik1=0;
void Inicjalizacja_mcu (void)
{
asm("sei");
LCD_Initalize(); // inicjalizacja wyświetlacza
TCNT0 = T0_INIT; // wartość początkowa T/C0
TCCR0 = _BV(CS00)|_BV(CS01); // preskaler ck/64
TIMSK = _BV(TOIE0);
DDRD &= 0xEF; //DDRD,PD4 jako wejście (przycisk A)
PORTD |= 0x10; //PORTD,PD4 z wew. podciąganiem (przycisk A)
}
char RawKeyPressed(void)
{
if (bit_is_clear (PIND,PD4))
{
return FALSE;
}
else
return TRUE;
}
char DebounceSwitch()
{
static uint16_t State = 0; // Current debounce status
State=(State<<1) | !RawKeyPressed() | 0xe000;
licznik=State;
if(State==0xf000)
{
return TRUE;
++licznik1;
}
else
{
return FALSE;
}
}
SIGNAL (SIG_OVERFLOW0)
{
TCNT0 = T0_INIT; // wartość początkowa T/C0 przerwanie co 1ms
if (++liczydelko==5)
{
DebounceSwitch();
liczydelko=0;
}
}
int main(void)
{
Inicjalizacja_mcu();
while(1)
{
LCD_GoTo(0,0);
tmp=licznik;
itoa (tmp, tmp_tab, 2);
LCD_WriteText(tmp_tab);
LCD_GoTo(0,1);
tmp=licznik1;
itoa (tmp, tmp_tab, 10);
LCD_WriteText(tmp_tab);
}
}Niby wszystko działa poprawnie, ale nigdy nie wykonuje sie porównanie:
if(State==0xf000), funkcja DebounceSwitch() nigdy nie zwraca, ani TRUE, ani FALSE. Czy ktoś może się orientuje gdzie popłeniam błąd.
Zmienne licznik i licznik1 są to tylko zmienne kontrolne/debugujące by sprawdzić przebieg działania tej funkcji.
Jeśli ktoś sobie życzy lub nie rozumie z chęcią wytłumaczę jak działa funkcja DebounceSwitch() (no przynajmniej tak jak ją rozumiem).
Z góry dziękuję za każdą uwagę i sugestię.
--
pozdawiam
demeus
