Hab das ganze jetzt nochmal umgestrickt und denke das ich am richtigen Weg bin:
Code:
//----------------------------------------
// Titel : Arcade Tastenprogrammierung
//----------------------------------------
#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdint.h>
#include <avr/eeprom.h>
#include <avr/pgmspace.h>
typedef unsigned char BYTE;
typedef unsigned int WORD;
BYTE bPortB;
BYTE nKeyPress;
const unsigned char Tabelle[] PROGMEM = {249, 164, 176, 153, 146, 130, 248, 128, 144};
#define CNTDEBOUNCE 10
#define CNTREPEAT 200
#define KEY_PIN PINB
#define KEY_PINNO PB6
uint8_t eeFooByte;
volatile uint8_t gKeyCounter;
ISR(TIMER1_COMPA_vect)
{
uint8_t tmp_kc;
tmp_kc = gKeyCounter;
if (!(KEY_PIN & (1<<KEY_PINNO)))
{
if (tmp_kc < CNTREPEAT)
{
tmp_kc++;
}
}
else
{
tmp_kc = 0;
}
gKeyCounter = tmp_kc;
}
void init(void)
{
PORTB |= _BV(6); // Pull-Up Port B6 aktivieren
DDRB = 0xFF; // Port B als Eingang
DDRD = 0xFF; // Port D als Ausgang
TIMSK |= (1<<TOIE1); //Timer1 Interrupt aktiviert
TCCR1B = 1; //Prescaler 1
TCNT1 = 65535-3600; //Preloader 3600
}
int main (void)
{
init();
sei();
bPortB = 1;
nKeyPress = eeprom_read_byte(&eeFooByte);
while(1)
{
if ( gKeyCounter > CNTDEBOUNCE )
{
if (gKeyCounter == CNTREPEAT) // Code fuer "Taste lange gedrueckt"
{
eeprom_write_byte(&eeFooByte, nKeyPress);
}
else // Code fuer "Taste kurz gedrueckt"
{
PORTD = pgm_read_byte(&Tabelle[nKeyPress]);
if (nKeyPress < 8)
{
nKeyPress++;
}
else
{
nKeyPress = 0;
}
}
}
}
return 0;
}
Mit den initialisieren der Interrupts bin ich nur etwas überfragt. Wie macht man das richtig?
Wie gesagt ich verwende einen ATMEGA8 mit 8MHz Takt.
Lesezeichen