wechselnde Variable per Tastendruck an Ausgang ausgeben (ATMEL AVR-Mikrocontroller)



  • 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.


Anmelden zum Antworten