Difference between revisions of "U23 2008/Gruppe3"

From C4 Wiki
Jump to: navigation, search
(Code:)
 
(6 intermediate revisions by 5 users not shown)
Line 12: Line 12:
  
 
== '''Code:''' ==
 
== '''Code:''' ==
 +
[[/Scheduler|Aufgabe Abend 5: Scheduler]]
 +
 
Es gab wohl mehrere Untergruppen, wir sollten alle unseren Code hier reinstellen.
 
Es gab wohl mehrere Untergruppen, wir sollten alle unseren Code hier reinstellen.
  
 
''Ich bin irgendwie zu blöd dafür, den Code richtig im Wiki einzufügen.'' - The-Kenny
 
''Ich bin irgendwie zu blöd dafür, den Code richtig im Wiki einzufügen.'' - The-Kenny
  
''Hab meinen Code jetzt auch mal reingestellt. Code ist bisschen größer aber man kann als Optionen außer an und aus auch toggle und nichtstun benutzen'' - Gordin
+
''Hab meinen Code jetzt auch mal reingestellt. Code ist bisschen größer (426 Byte) aber man kann als Optionen außer an und aus auch toggle und nichtstun benutzen und tolle Konstanten :P'' - Gordin
  
 
Code von mkr:
 
Code von mkr:
 +
<source lang="c">
 
  #include <avr/io.h>
 
  #include <avr/io.h>
 
  #include <util/delay.h>
 
  #include <util/delay.h>
Line 32: Line 35:
 
   //gewählte leds einschalten
 
   //gewählte leds einschalten
 
  PORTC |= ((leds & 1) << PC4 ); //bits aus leds an die richtige stelle schieben
 
  PORTC |= ((leds & 1) << PC4 ); //bits aus leds an die richtige stelle schieben
  PORTD |= ((leds & 2) << (PD3 - 1) ); //minus eins, weils in led an der stelle 1 steht (von rechts)
+
  PORTD |= ((leds & 2) << (PD3 - 1) ); //minus eins, weils in leds an der stelle 1 steht (von rechts)
 
  PORTD |= ((leds & 4) << (PD6 - 2) ); //...
 
  PORTD |= ((leds & 4) << (PD6 - 2) ); //...
 
  PORTD |= ((leds & 8) << (PD7 - 3) );
 
  PORTD |= ((leds & 8) << (PD7 - 3) );
Line 63: Line 66:
 
  }
 
  }
 
  }
 
  }
 +
</source>
 +
 +
  
 
Code von Gordin:
 
Code von Gordin:
 
hauptcode:
 
hauptcode:
 
+
<source lang="c">
  #include "rumpus_ledlib.c" //selbstgeschriebene kleine lib zum steuern der leds
+
#include "rumpus_ledlib.c" //selbstgeschriebene kleine lib zum steuern der leds
   
+
  #include <util/delay.h>
  // 11 = led an 10 = led aus 01 = toggle 00 = nichtstun
 
  uint8_t kr[6] = {    0b11101010,
 
0b10110000,
 
0b00101100,
 
0b00001011,
 
0b00001110,
 
0b00111000 };
 
 
  /*uint8_t kr[8] = {  0b10101010,
 
0b00000011,
 
0b00001100,
 
0b00110000,
 
0b11000000,
 
0b10000000,
 
0b00100000,
 
0b00001000  };*/
 
 
 
 
 
  //Variablen für display()
+
  static void display(uint8_t led_config) {
  uint8_t led1 = 0b11000000;
+
  //übergibt nur die für die jeweilige Funktion wichtigen bits an die led_X funktionen
  uint8_t led2 = 0b00110000;
 
  uint8_t led3 = 0b00001100;
 
  uint8_t led4 = 0b00000011;
 
   
 
  static void display(uint8_t led_config) {
 
  //übergibt nur die wichtigen bits an die led_X funktionen
 
 
  led_1(led_config & led1);
 
  led_1(led_config & led1);
 
  led_2(led_config & led2);
 
  led_2(led_config & led2);
Line 99: Line 83:
 
  led_4(led_config & led4);
 
  led_4(led_config & led4);
 
  _delay_ms(100);
 
  _delay_ms(100);
  }
+
}
 
   
 
   
  int main(void) {
+
int main(void) {
 +
// Binäre Schreibweise: 11 = led an 10 = led aus 01 = toggle 00 = nichtstun
 +
/*uint8_t kr[6] = {    0b11101010 ,
 +
* 0b10110000,
 +
* 0b00101100,
 +
* 0b00001011,
 +
* 0b00001110,
 +
* 0b00111000 }; */
 +
 +
/* Andere möglichkeit:
 +
* (Erzeugt die selbe Sequenz wie oben aber das Programm wird ca. 20 Byte größer)
 +
* Reihenfolge der leds ist egal */
 +
uint8_t kr[6] = { led1    | led2aus | led3aus | led4aus,
 +
led1aus | led2,
 +
led2aus | led3,
 +
led3aus | led4,
 +
led4aus | led3,
 +
led3aus | led2, };
 +
led_init(); // leds initialisieren
 
  uint8_t i;
 
  uint8_t i;
 
  while(1) {
 
  while(1) {
Line 109: Line 111:
 
 
 
 
 
  }
 
  }
  }
+
}
 +
</source>
  
 
rumpus_ledlib.c:
 
rumpus_ledlib.c:
 +
<source lang="c">
 
  #include <avr/io.h>
 
  #include <avr/io.h>
#include <util/delay.h>
 
 
  // Prototypen
 
  // Prototypen
 
  void led_1(uint8_t wastun);
 
  void led_1(uint8_t wastun);
Line 119: Line 122:
 
  void led_3(uint8_t wastun);
 
  void led_3(uint8_t wastun);
 
  void led_4(uint8_t wastun);
 
  void led_4(uint8_t wastun);
 +
void led_init(void);
 +
 +
const uint8_t led1 = 0b11000000;
 +
const uint8_t led1aus = 0b10000000;
 +
const uint8_t led1toggle = 0b01000000;
 +
const uint8_t led2 = 0b00110000;
 +
const uint8_t led2aus = 0b00100000;
 +
const uint8_t led2toggle = 0b00010000;
 +
const uint8_t led3 = 0b00001100;
 +
const uint8_t led3aus = 0b00001000;
 +
const uint8_t led3toggle = 0b00000100;
 +
const uint8_t led4 = 0b00000011;
 +
const uint8_t led4aus = 0b00000010;
 +
const uint8_t led4toggle = 0b00000001;
 +
 
   
 
   
 
  /* toggled alle leds  */ /* auskommentieren zum benutzen 0o
 
  /* toggled alle leds  */ /* auskommentieren zum benutzen 0o
 
  void led_toggleall() {
 
  void led_toggleall() {
DDRC = _BV(PC4);
 
 
  PORTC ^= _BV(PC4);
 
  PORTC ^= _BV(PC4);
DDRD =  _BV(PD3) | _BV(PD6) | _BV(PD7);
 
 
  PORTD ^= _BV(PD3) | _BV(PD6) | _BV(PD7);
 
  PORTD ^= _BV(PD3) | _BV(PD6) | _BV(PD7);
 
  }*/
 
  }*/
 
   
 
   
  /* Steuert led 1 0b11000000 = anschalten, 0b10000000 = ausschalten, 0b01000000 = toggle, 0b00000000 = nichts*/
+
 +
  /* ausführen bevor man was mit den leds macht */
 +
 +
void led_init() {
 +
DDRC = _BV(PC4);
 +
DDRD = _BV(PD3) | _BV(PD6) | _BV(PD7);
 +
PORTC &= ~_BV(PC4);
 +
PORTD &= ~_BV(PD3) | ~_BV(PD3) | ~_BV(PD3);
 +
}
 +
 +
 +
/* Steuerung für led 1: Argumente, die übergeben werden können:
 +
  * 0b11000000 (led1) = anschalten
 +
  * 0b10000000 (led1aus) = ausschalten
 +
  * 0b01000000 (led1toggle) = toggle
 +
  * 0b00000000 (0) = nichts */
 +
 
  void led_1(uint8_t wastun) {
 
  void led_1(uint8_t wastun) {
  DDRC = _BV(PC4);
+
  if (wastun == led1aus) {
switch (wastun) {
+
  PORTC &= ~_BV(PC4); // löscht PC4 in PORTC
  case 0b10000000:
+
}
PORTC &= ~_BV(PC4); //setzt alle werte, die schon da sind und nicht PC4 sind
+
else if (wastun == led1) {
break;
+
  PORTC |= _BV(PC4); // setzt PC4 in PORTC
  case 0b11000000:
+
}
PORTC |= _BV(PC4); // setzt alle werte, die schon da sind und PC4
+
else if (wastun == led1toggle) {
break;
+
  PORTC ^= _BV(PC4); // tauscht PC4 in PORTC
  case 0b01000000:
 
PORTC ^= _BV(PC4); // setzt alle werte, die schon da sind und tauscht PC4
 
 
  }
 
  }
 
  }
 
  }
 
   
 
   
  /* Steuert led 2 0b00110000 = anschalten, 0b00100000 = ausschalten, 0b00010000 = toggle, 0b00000000 = nichts*/
+
 +
  /* Steuerung für led 2: Argumente, die übergeben werden können:
 +
  * 0b00110000 (led2) = anschalten
 +
  * 0b00100000 (led2aus) = ausschalten
 +
  * 0b00010000 (led2toggle) = toggle
 +
  * 0b00000000 (0) = nichts */
 +
 
  void led_2(uint8_t wastun) {
 
  void led_2(uint8_t wastun) {
  DDRD = DDRD | _BV(PD3);
+
  if (wastun == led2aus) {
switch (wastun) {
+
  PORTD &= ~_BV(PD3); // löscht PD3 in PORTD
  case 0b00100000:
+
}
PORTD &= ~_BV(PD3);
+
else if (wastun == led2) {
break;
+
  PORTD |= _BV(PD3); // setzt PD3 in PORTD
  case 0b00110000:
+
}
PORTD |= _BV(PD3);
+
else if (wastun == led2toggle) {
break;
+
  PORTD ^= _BV(PD3); // tauscht PD3 in PORTD
  case 0b00010000:
 
PORTD ^= _BV(PD3);
 
 
  }
 
  }
 
  }
 
  }
 
   
 
   
  /* Steuert led 3 0b00001100 = anschalten, 0b00001000 = ausschalten, 0b00000100 = toggle, 0b00000000 = nichts*/
+
 +
  /* Steuerung für led 3: Argumente, die übergeben werden können:
 +
  * 0b00001100 (led3) = anschalten
 +
  * 0b00001000 (led3aus) = ausschalten
 +
  * 0b00000100 (led3toggle) = toggle
 +
  * 0b00000000 (0) = nichts */
 +
 
  void led_3(uint8_t wastun) {
 
  void led_3(uint8_t wastun) {
  DDRD = DDRD | _BV(PD6);
+
  if (wastun == led3aus) {
switch (wastun) {
+
  PORTD &= ~_BV(PD6); // löscht PD6 in PORTD
  case 0b00001000:
+
}
PORTD &= ~_BV(PD6);
+
else if (wastun == led3) {
break;
+
  PORTD |= _BV(PD6); // setzt PD6 in PORTD
  case 0b00001100:
+
}
PORTD |= _BV(PD6);
+
else if (wastun == led3toggle) {
break;
+
  PORTD ^= _BV(PD6); // tauscht PD6 in PORTD
  case 0b00000100:
 
PORTD ^= _BV(PD6);
 
 
  }
 
  }
 
  }
 
  }
 
   
 
   
  /* Steuert led 4 0b00000011 = anschalten, 0b00000010 = ausschalten, 0b00000001 = toggle, 0b00000000 = nichts*/
+
 +
  /* Steuerung für led 4: Argumente, die übergeben werden können:
 +
  * 0b00000011 (led4) = anschalten
 +
  * 0b00000010 (led4aus) = ausschalten
 +
  * 0b00000001 (led4toggle) = toggle
 +
  * 0b00000000 (0) = nichts */
 +
 
  void led_4(uint8_t wastun) {
 
  void led_4(uint8_t wastun) {
  DDRD = DDRD | _BV(PD7);
+
  if (wastun == led4aus) {
switch (wastun) {
+
  PORTD &= ~_BV(PD7); // löscht PD7 in PORTD
  case 0b00000010:
+
}
PORTD &= ~_BV(PD7);
+
else if (wastun == led4) {
break;
+
  PORTD |= _BV(PD7); // setzt PD7 in PORTD
  case 0b00000011:
+
}
PORTD |= _BV(PD7);
+
else if (wastun == led4toggle) {
break;
+
  PORTD ^= _BV(PD7); // tauscht PD7 in PORTD
  case 0b00000001:
 
PORTD ^= _BV(PD7);
 
 
  }
 
  }
 
  }
 
  }
 +
</source>
 +
 +
== '''Aufgabe Abend3:''' ==
 +
<source lang="c">
 +
/*
 +
* abend3test.c
 +
*
 +
*  Created on: 25.08.2008
 +
*      Author: Gordin
 +
*/
 +
#include <avr/interrupt.h>
 +
 +
void taster_lesen(void);
 +
 +
volatile uint8_t checktaster;
 +
uint8_t gerade_gedrueckt;
 +
 +
ISR(TIMER1_COMPA_vect)
 +
    {
 +
    checktaster = 1;
 +
    }
 +
 +
void taster_lesen()
 +
    {
 +
    static uint8_t laststate = 0, oldstate = 0;
 +
    /* Speichert umgekehrten Wert der Taster (1 = gedrückt) */
 +
    uint8_t newstate = (~PINC) & 0b1111;
 +
    /* Überprüft, ob der Aktuelle state der Taster gleich dem letzten ist. */
 +
    uint8_t state = laststate & newstate;
 +
    /* Überprüft ob der neue state der Taster ungleich dem vorletzten
 +
    * und ob der neue State gedrückt ist => Taster wurde gerade gedrückt */
 +
    gerade_gedrueckt = (state ^ oldstate) & state;
 +
    /* Speichert den letzten state der Taster ab zur Überprüfung beim nächsten Aufruf
 +
    * ob sich der neue state zum vorletzten mal geändert hat */
 +
    oldstate = laststate;
 +
    /* Speichert den neuen state der Taster ab zur Überprüfung beim nächsten Aufruf
 +
    * ob der neue state gleich geblieben ist*/
 +
    laststate = newstate;
 +
    }
  
 +
int main(void)
 +
    {
 +
    /* Leds initialisieren */
 +
    DDRC = _BV(PC4);
 +
    DDRD = _BV(PD3) | _BV(PD6) | _BV(PD7);
 +
    /* Taster initialisieren */
 +
    PORTC = _BV(PC0) | _BV(PC1) | _BV(PC2) | _BV(PC3);
 +
    /* inittimer1, prescaler 1024 */
 +
    TCCR1B = _BV(CS12) | _BV(CS10);
 +
    /* Set CTC mode */
 +
    TCCR1B |= _BV (WGM12);
 +
    /* compare match after 10ms , 20mhz/1024/100 = ~195 */
 +
    OCR1A = 195;
 +
    /* enable interrupt */
 +
    TIMSK1 = _BV(OCIE1A);
 +
    sei ();
  
try this: einfach ein leerzeichen vor die Codezeile packen und es wird dementsprechend interpretiert. -obstfliege
+
    while (1)
 +
{
 +
if (checktaster)
 +
    {
 +
    taster_lesen();
 +
            /* Setzt die Bits für die leds (kleiner als einzelne if-abfragen) */
 +
    PORTC ^= (gerade_gedrueckt & 0b1) << 4;
 +
    PORTD ^= ((gerade_gedrueckt & 0b10) << 2) + ((gerade_gedrueckt & 0b1100) << 4);
 +
    checktaster = 0;
 +
    }
 +
}
 +
    }
  
 +
</source>
 
[[Category:U23 2008]]
 
[[Category:U23 2008]]

Latest revision as of 23:14, 17 September 2008

Gruppe3

Wir saßen an der linken Ecke des projizierten Bildes ;)


Mitglieder:


-mkr
-PyroGX
-whitenexx
-The Kenny (Macbook, Brille)
-Gordin

Code:

Aufgabe Abend 5: Scheduler

Es gab wohl mehrere Untergruppen, wir sollten alle unseren Code hier reinstellen.

Ich bin irgendwie zu blöd dafür, den Code richtig im Wiki einzufügen. - The-Kenny

Hab meinen Code jetzt auch mal reingestellt. Code ist bisschen größer (426 Byte) aber man kann als Optionen außer an und aus auch toggle und nichtstun benutzen und tolle Konstanten :P - Gordin

Code von mkr: <source lang="c">

#include <avr/io.h>
#include <util/delay.h>
 
void set_leds(uint8_t leds)
	{
	//alle leds ausschalten
	PORTC &= ~_BV(PC4);
	PORTD &= ~_BV(PD3);
	PORTD &= ~_BV(PD6);
	PORTD &= ~_BV(PD7);

 	//gewählte leds einschalten
	PORTC |= ((leds & 1) << PC4 );		//bits aus leds an die richtige stelle schieben
	PORTD |= ((leds & 2) << (PD3 - 1) );	//minus eins, weils in leds an der stelle 1 steht (von rechts)
	PORTD |= ((leds & 4) << (PD6 - 2) );	//...
	PORTD |= ((leds & 8) << (PD7 - 3) );
	}


int main(void)
	{ 	
	uint8_t i = 0;			//index der ledconf, die ausgegeben werden soll
	uint8_t delay_time = 200;	//pause zwischen den ausgaben
	uint8_t ledconf[4] = {		//array mit led zuständen
		0b00001000,
		0b00000100,
		0b00000010,
		0b00000001,
		};

	// LED Output-Pins konfigurieren
	DDRC |= _BV(PC4);
	DDRD |= ( _BV(PD3) | _BV(PD6) | _BV(PD7) );

	while(1)
		{
		if (i >= sizeof(ledconf))		//index darf maximal so graß sein, wie die anzahl der ledconf elemente - 1
			i = 0;
		set_leds(ledconf[i]);
		i++;

		_delay_ms(delay_time);
		}
	}

</source>


Code von Gordin: hauptcode: <source lang="c">

#include "rumpus_ledlib.c" //selbstgeschriebene kleine lib zum steuern der leds
#include <util/delay.h>
					
static void display(uint8_t led_config) {
	//übergibt nur die für die jeweilige Funktion wichtigen bits an die led_X funktionen
	led_1(led_config & led1);
	led_2(led_config & led2);
	led_3(led_config & led3);
	led_4(led_config & led4);
	_delay_ms(100);
}

int main(void) {
	// Binäre Schreibweise: 11 = led an 10 = led aus 01 = toggle 00 = nichtstun
	/*uint8_t kr[6] = {    	0b11101010 ,
	 * 			0b10110000,
	 * 			0b00101100,
	 * 			0b00001011,
	 * 			0b00001110,
	 * 			0b00111000 }; */
	 
	/* Andere möglichkeit: 
	 * (Erzeugt die selbe Sequenz wie oben aber das Programm wird ca. 20 Byte größer)
	 * Reihenfolge der leds ist egal */
	uint8_t kr[6] = {	led1    | led2aus | led3aus | led4aus,
				led1aus | led2,
				led2aus | led3,
				led3aus | led4,
				led4aus | led3,
				led3aus | led2, }; 
	led_init(); // leds initialisieren
	uint8_t i;
	while(1) {
		for (i = 0; i < sizeof(kr) ; i++) { // Größe des Arrays muss im  Array stehen array[X]...
		display(kr[i]);	
		}
		
	}
}

</source>

rumpus_ledlib.c: <source lang="c">

#include <avr/io.h>
// Prototypen
void led_1(uint8_t wastun);
void led_2(uint8_t wastun);
void led_3(uint8_t wastun);
void led_4(uint8_t wastun);
void led_init(void);

const uint8_t led1 		= 	0b11000000;
const uint8_t led1aus 		= 	0b10000000;
const uint8_t led1toggle	= 	0b01000000;
const uint8_t led2 		= 	0b00110000;
const uint8_t led2aus		= 	0b00100000;
const uint8_t led2toggle	= 	0b00010000;
const uint8_t led3 		= 	0b00001100;
const uint8_t led3aus		= 	0b00001000;
const uint8_t led3toggle	= 	0b00000100;
const uint8_t led4 		= 	0b00000011;
const uint8_t led4aus		= 	0b00000010;
const uint8_t led4toggle	= 	0b00000001;


/* toggled alle leds  */ /* auskommentieren zum benutzen 0o
void led_toggleall() {
PORTC ^= _BV(PC4);
PORTD ^= _BV(PD3) | _BV(PD6) | _BV(PD7);
}*/


/* ausführen bevor man was mit den leds macht */

void led_init() {
DDRC = _BV(PC4);
DDRD = _BV(PD3) | _BV(PD6) | _BV(PD7);
PORTC &= ~_BV(PC4);
PORTD &= ~_BV(PD3) | ~_BV(PD3) | ~_BV(PD3);
}


/* Steuerung für led 1: Argumente, die übergeben werden können:
 * 0b11000000 (led1) = anschalten
 * 0b10000000 (led1aus) = ausschalten
 * 0b01000000 (led1toggle) = toggle
 * 0b00000000 (0) = nichts */

void led_1(uint8_t wastun) {
if (wastun == led1aus) {
	PORTC &= ~_BV(PC4); // löscht PC4 in PORTC
	}
else if (wastun == led1) {
	PORTC |= _BV(PC4); // setzt PC4 in PORTC
	}
else if (wastun == led1toggle) {
	PORTC ^= _BV(PC4); // tauscht PC4 in PORTC
	}
}


/* Steuerung für led 2: Argumente, die übergeben werden können:
 * 0b00110000 (led2) = anschalten
 * 0b00100000 (led2aus) = ausschalten
 * 0b00010000 (led2toggle) = toggle
 * 0b00000000 (0) = nichts */

void led_2(uint8_t wastun) {
if (wastun == led2aus) {
	PORTD &= ~_BV(PD3); // löscht PD3 in PORTD
	}
else if (wastun == led2) {
	PORTD |= _BV(PD3); // setzt PD3 in PORTD
	}
else if (wastun == led2toggle) {
	PORTD ^= _BV(PD3); // tauscht PD3 in PORTD
	}
}


/* Steuerung für led 3: Argumente, die übergeben werden können:
 * 0b00001100 (led3) = anschalten
 * 0b00001000 (led3aus) = ausschalten
 * 0b00000100 (led3toggle) = toggle
 * 0b00000000 (0) = nichts */

void led_3(uint8_t wastun) {
if (wastun == led3aus) {
	PORTD &= ~_BV(PD6); // löscht PD6 in PORTD
	}
else if (wastun == led3) {
	PORTD |= _BV(PD6); // setzt PD6 in PORTD
	}
else if (wastun == led3toggle) {
	PORTD ^= _BV(PD6); // tauscht PD6 in PORTD
	}
}


/* Steuerung für led 4: Argumente, die übergeben werden können:
 * 0b00000011 (led4) = anschalten
 * 0b00000010 (led4aus) = ausschalten
 * 0b00000001 (led4toggle) = toggle
 * 0b00000000 (0) = nichts */

void led_4(uint8_t wastun) {
if (wastun == led4aus) {
	PORTD &= ~_BV(PD7); // löscht PD7 in PORTD
	}
else if (wastun == led4) {
	PORTD |= _BV(PD7); // setzt PD7 in PORTD
	}
else if (wastun == led4toggle) {
	PORTD ^= _BV(PD7); // tauscht PD7 in PORTD
	}
}

</source>

Aufgabe Abend3:

<source lang="c"> /*

* abend3test.c
*
*  Created on: 25.08.2008
*      Author: Gordin
*/
  1. include <avr/interrupt.h>

void taster_lesen(void);

volatile uint8_t checktaster; uint8_t gerade_gedrueckt;

ISR(TIMER1_COMPA_vect)

   {
   checktaster = 1;
   }

void taster_lesen()

   {
   static uint8_t laststate = 0, oldstate = 0;
   /* Speichert umgekehrten Wert der Taster (1 = gedrückt) */
   uint8_t newstate = (~PINC) & 0b1111;
   /* Überprüft, ob der Aktuelle state der Taster gleich dem letzten ist. */
   uint8_t state = laststate & newstate;
   /* Überprüft ob der neue state der Taster ungleich dem vorletzten
    * und ob der neue State gedrückt ist => Taster wurde gerade gedrückt */
   gerade_gedrueckt = (state ^ oldstate) & state;
   /* Speichert den letzten state der Taster ab zur Überprüfung beim nächsten Aufruf
    * ob sich der neue state zum vorletzten mal geändert hat */
   oldstate = laststate;
   /* Speichert den neuen state der Taster ab zur Überprüfung beim nächsten Aufruf
    * ob der neue state gleich geblieben ist*/
   laststate = newstate;
   }

int main(void)

   {
   /* Leds initialisieren */
   DDRC = _BV(PC4);
   DDRD = _BV(PD3) | _BV(PD6) | _BV(PD7);
   /* Taster initialisieren */
   PORTC = _BV(PC0) | _BV(PC1) | _BV(PC2) | _BV(PC3);
   /* inittimer1, prescaler 1024 */
   TCCR1B = _BV(CS12) | _BV(CS10);
   /* Set CTC mode */
   TCCR1B |= _BV (WGM12);
   /* compare match after 10ms , 20mhz/1024/100 = ~195 */
   OCR1A = 195;
   /* enable interrupt */
   TIMSK1 = _BV(OCIE1A);
   sei ();
   while (1)

{ if (checktaster) { taster_lesen();

           /* Setzt die Bits für die leds (kleiner als einzelne if-abfragen) */

PORTC ^= (gerade_gedrueckt & 0b1) << 4; PORTD ^= ((gerade_gedrueckt & 0b10) << 2) + ((gerade_gedrueckt & 0b1100) << 4); checktaster = 0; } }

   }

</source>