Hallo Leute,
ich habe miraus der Wiki dieses Beispiel herausgesucht und versucht in meinen Aufbau zu integrieren: Taster-Abfrage in C
Nur leider tut das ganze nicht so wie es soll.
Mein Beispiel sieht folgendermaßen aus:
Code:
//----------------------------------------
// Titel : Arcade Tastenprogrammierung
//----------------------------------------
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <avr/eeprom.h>
#include "taster.h"
typedef unsigned char BYTE;
typedef unsigned int WORD;
BYTE bPortB;
BYTE nKeyPress;
uint8_t eeFooByte;
volatile uint8_t gKeyCounter;
volatile signed char taster = NO_TASTER;
taste_t tasten[NUM_TASTER];
const unsigned char Tabelle[] PROGMEM = {249, 164, 176, 153, 146, 130, 248, 128, 144};
SIGNAL (SIG_OVERFLOW0)
{
static unsigned char count_ovl0;
unsigned char ovl0 = count_ovl0+1;
if (ovl0 >= 39)
{
get_taster (1, PINB & (1<<PB4));
ovl0 = 0;
}
count_ovl0 = ovl0;
}
void ioinit()
{
PORTB |= 1 << PB4;
DDRD = 0xFF;
TCCR0 = 1 << CS00;
TIMSK |= (1 << TOIE0);
}
int main (void)
{
ioinit();
bPortB = 1;
nKeyPress = 0;
// nKeyPress = eeprom_read_byte(&eeFooByte);
gKeyCounter = 0;
tasten[0].mode = TM_SHORT;
tasten[1].mode = TM_LONG;
tasten[2].mode = TM_REPEAT;
while(1)
{
signed char tast = taster;
PORTD = pgm_read_byte(&Tabelle[nKeyPress]);
switch (tast)
{
default:
case NO_TASTER:
break;
case 1:
if (nKeyPress < 8)
{
nKeyPress++;
}
else
{
nKeyPress = 0;
}
break;
case 1+TASTER_LONG:
eeprom_write_byte(&eeFooByte, nKeyPress);
break;
}
if (tast != NO_TASTER)
taster = NO_TASTER;
}
return 0;
}
void get_taster (const unsigned char num, unsigned char tast)
{
const taste_t * const ptast = & tasten[num];
const unsigned char taster_old = ptast->old;
unsigned char pressed, press, release, mode, delay;
#if TASTER_LEVEL
tast = !!tast;
#else
tast = !tast;
#endif
/* Taster bleibt gedrueckt */
pressed = taster_old & tast;
/* Taster neu gedrueckt */
press = ~taster_old & tast;
/* Taster losgelassen */
release = taster_old & ~tast;
*((unsigned char *) & ptast->old) = tast;
tast = NO_TASTER;
mode = ptast->mode;
delay = ptast->delay;
if (press)
{
if (mode != TM_LONG)
tast = num;
delay = 0;
}
else if (pressed)
{
if (delay < 0xfe)
delay++;
}
else if (release)
{
if (mode == TM_LONG && delay != 0xff)
tast = num;
}
if (mode == TM_LONG)
{
if (delay == TASTER_DELAY_LONG)
{
tast = TASTER_LONG + num;
delay = 0xff;
}
}
else if (mode == TM_REPEAT)
{
if (delay == TASTER_REPEAT_DELAY)
{
tast = num;
delay = TASTER_REPEAT_DELAY - TASTER_REPEAT;
}
}
if (taster == NO_TASTER)
taster = tast;
*((unsigned char *) & ptast->delay) = delay;
}
Bei einem Tastendruck passiert leider nichts.
Hat jemand eine Idee wo da der Hund begraben sein könnte?
Lesezeichen