?
Mich beschäftigt seit einigen Tagen ein Problem von dem ich nicht weiß wie ich es am besten lösen könnte.
Dazu möchte ich vorweg erwähnen das ich erst in den Anfängen der C-Programmierung bin. Meine Kenntnisse habe ich soweit aus BASIC übernommen.
Ich post mal die relevanten Teile meines Programmes:
Tabelle mit Tastenzuordnung:
#define KEY_PIN PINB
#define LED0 (1<<PC0)
#define LED1 (1<<PC1)
#define LED2 (1<<PC2)
#define LED3 (1<<PC3)
#define LED4 (1<<PC4)
#define LED5 (1<<PC5)
#define NR_KONFIGS 9
#define NR_KEYS 6
uint8_t KonfigPattern[NR_KONFIGS][NR_KEYS] PROGMEM =
{
{LED0,LED1,LED2,LED3,LED4,LED5}, // Konfiguration 1
{LED0,LED2,LED4,LED1,LED3,LED5}, // Konfiguration 2
{LED1,LED0,LED3,LED2,LED4,LED5}, // Konfiguration 3
{LED0,LED2,LED4,LED1,LED3,LED5}, // Konfiguration 4
{LED0,LED2,LED4,LED1,LED3,LED5}, // Konfiguration 5
{LED0,LED2,LED4,LED1,LED3,LED5}, // Konfiguration 6
{LED0,LED2,LED4,LED1,LED3,LED5}, // Konfiguration 7
{LED0,LED2,LED4,LED1,LED3,LED5}, // Konfiguration 8
{LED0,LED2,LED4,LED1,LED3,LED5}, // Konfiguration 9
};
volatile uint8_t key_state; // Entprellt und invertierte Tastenstatus:
// Bit=1 -> Taste wurde gedrückt
volatile uint8_t key_press; // Tastendruck registriert
volatile uint8_t key_rpt; // Tastendruckdauer
volatile uint8_t nKonfig; // Tasten-Konfiguration
volatile uint8_t nFire = 0; // Dauerfeuer-Konfiguration
volatile uint8_t nFireTime = 12; // Dauerfeuer-Zeit
volatile uint8_t repeatFire; // Dauerfeuer-Portwert
volatile uint8_t Summe; // Tastenzuordnung bei gedrückten Tasten
Timer Interrupt:
ISR(TIMER0_OVF_vect)
{
cntTicks++;
if(cntTicks >= nFireTime) // Ist Variable <nFireTime> mal 10ms
{
repeatFire ^= 0x01; // Wechselt PortC.0 nach Zeit von 0 auf 1
cntTicks = 0;
}
}
Hauptprogramm:
while(1)
{
Summe = 0;
if(!(KEY_PIN & 0x01)) // Wenn Taste PortB.0 auf HIGH
Summe |= pgm_read_byte(&KonfigPattern[nKonfig-1][0]);
if(!(KEY_PIN & 0x02)) // Wenn Taste PortB.1 auf HIGH
Summe |= pgm_read_byte(&KonfigPattern[nKonfig-1][1]);
if(!(KEY_PIN & 0x04)) // Wenn Taste PortB.2 auf HIGH
Summe |= pgm_read_byte(&KonfigPattern[nKonfig-1][2]);
if(!(KEY_PIN & 0x08)) // Wenn Taste PortB.3 auf HIGH
Summe |= pgm_read_byte(&KonfigPattern[nKonfig-1][3]);
if(!(KEY_PIN & 0x10)) // Wenn Taste PortB.4 auf HIGH
Summe |= pgm_read_byte(&KonfigPattern[nKonfig-1][4]);
if(!(KEY_PIN & 0x20)) // Wenn Taste PortB.5 auf HIGH
Summe |= pgm_read_byte(&KonfigPattern[nKonfig-1][5]);
if(OUT_PIN == 0x01)
if(nFire != 0)
Summe = repeatFire;
OUT_PORT = Summe;
......
Das ganze sollte folgende Funktion erfüllen:
Wird eine Taste gedrückt und die Variable nFire=1 soll der Ausgang (Variable Summe) in einer definierten Zeitspanne zwischen 0 und 1 wechseln.
Der Ausgangspin ist immer der gleiche (0x01). Der ändert sich nicht. Also das Tooglen soll sich nur auf diesen Ausgang beziehen. Alle anderen Ausgänge sollen bei gedrückter Taste dauerhigh sein.
Das Problem liegt in erster Linie an der Tabelle soweit ich das sehe. Dort wird ja der Ausgang schon beim Drücken auf HIGH gelegt. Ich müßte also diesen Zustand ändern um ihn dann auf toggle zu bringen.
ich hoffe das ich mich so halbwegs verständlich gmeacht habe
Würde mich freuen wenn mir da jemand einenTip geben kann.