Difference between revisions of "U23 2008/Gruppe4"

From C4 Wiki
Jump to: navigation, search
(Sourcecode, Abend 2)
 
(One intermediate revision by the same user not shown)
Line 10: Line 10:
 
* Kathy
 
* Kathy
  
 +
=Abende=
 +
==Abend 1==
 +
===aufgabe1.c===
 +
 +
<source lang="c">
 +
#include <avr/io.h>
 +
#include <util/delay.h>
 +
 +
static void display(uint8_t led_config) {
 +
  /* Usage: led_config ist wie folgt aufgebaut:
 +
                  0b0000 LED4 LED3 LED2 LED1
 +
                 
 +
                  Wenn alle LEDs an sind heisst das led_config = 0b00001111.
 +
  */
 +
  /* Erklärung: Über die led_config wird eine Maske gelegt (AND) um nur das nötige Bit übrig zu
 +
                lassen. Dieses übrige Bit wird dann an die richtige Stelle geshiftet.
 +
                Die Erklärung an jeder Zeile ist die ausführliche Variante, wo das nötige Bit erst
 +
                an das erste Bit geshiftet und danach an die benötigte Stelle geshiftet wird.
 +
  */
 +
 
 +
  // LEDs auf 0 setzen.
 +
  PORTC &= ~_BV(PC4);
 +
  PORTD &= ~(_BV(PD3) | _BV(PD6) | _BV(PD7));
 +
 
 +
  // Die in led_config genannten LEDs auf 1 setzen.
 +
  PORTC |= (led_config & 0b00000001)<<4; /* >>0 <<4 (PC4) */
 +
  PORTD |= (led_config & 0b00000010)<<2; /* >>1 <<3 (PD3) */
 +
  PORTD |= (led_config & 0b00000100)<<4; /* >>2 <<6 (PD6) */
 +
  PORTD |= (led_config & 0b00001000)<<4; /* >>3 <<7 (PD7) */
 +
}
 +
 +
 +
static void delay(uint16_t delay){
 +
  /* Usage: delay ist die Zeit in ms. */
 +
  uint16_t i;
 +
  for (i = 0; i < delay; i++) {
 +
    /* wait 4 * 5000 cycles */
 +
    _delay_loop_2(5000);
 +
  }       
 +
}
 +
 +
 +
void main(void) {
 +
 +
  /* configure LEDs as output */
 +
  DDRD = _BV(PD3) | _BV(PD6) | _BV(PD7);
 +
  DDRC = _BV(PC4);
 +
 
 +
  uint8_t led_configs[] = { 0b00001000, //1
 +
                            0b00000100,
 +
                            0b00000010,
 +
                            0b00000001,
 +
                            0b00000010, //5
 +
                            0b00000100,
 +
                            0b00001000,
 +
                            0b00001010,
 +
                            0b00000101,
 +
                            0b00001010, //10
 +
                            0b00000101,
 +
                            0b00001111,
 +
                            0b00000000
 +
                          };
 +
  uint8_t led_config_size = 13;
 +
                         
 +
  while(1) {
 +
    uint8_t i;
 +
    for(i = 0; i < led_config_size; i++) {
 +
      display(led_configs[i]);
 +
      delay(1000);
 +
    }
 +
  }
 +
}
 +
</source>
 +
 +
==Abend 2==
 +
 +
===projekt1.c===
 +
Dies ist noch vor der Pizzapause entstanden und überträgt die Tastenkombination auf die LEDs.
 +
<source lang="c">
 +
#include <avr/io.h>
 +
#include <util/delay.h>
 +
 +
static void display(uint8_t led_config) {
 +
  /* Usage: led_config ist wie folgt aufgebaut:
 +
                  0b0000 LED4 LED3 LED2 LED1
 +
                 
 +
                  Wenn alle LEDs an sind heisst das led_config = 0b00001111.
 +
  */
 +
  /* Erklärung: Über die led_config wird eine Maske gelegt (AND) um nur das nötige Bit übrig zu
 +
                lassen. Dieses übrige Bit wird dann an die richtige Stelle geshiftet.
 +
                Die Erklärung an jeder Zeile ist die ausführliche Variante, wo das nötige Bit erst
 +
                an das erste Bit geshiftet und danach an die benötigte Stelle geshiftet wird.
 +
  */
 +
  PORTC &= ~_BV(PC4);
 +
  PORTD &= ~(_BV(PD3) | _BV(PD6) | _BV(PD7));
 +
 
 +
  PORTC |= (led_config & 0b00000001)<<4; /* >>0 <<4 (PC4) */
 +
  PORTD |= (led_config & 0b00000010)<<2; /* >>1 <<3 (PD3) */
 +
  PORTD |= (led_config & 0b00000100)<<4; /* >>2 <<6 (PD6) */
 +
  PORTD |= (led_config & 0b00001000)<<4; /* >>3 <<7 (PD7) */
 +
}
 +
 +
static void delay(uint16_t delay){
 +
  /* Usage: delay ist die Zeit in ms. */
 +
  uint16_t i;
 +
  for (i = 0; i < delay; i++) {
 +
    _delay_loop_2(5000);
 +
  }       
 +
}
  
==Sourcecode, Abend1==
+
void main(void) {
 +
 
 +
    /* configure LEDs as output */
 +
  DDRD = _BV(PD3) | _BV(PD6) | _BV(PD7);
 +
  DDRC = _BV(PC4);
 +
 
 +
  // Taster sind schon durch die Initialisierung als Eingang eingerichtet.
 +
 
 +
  PORTC |= _BV(PC0) | _BV(PC1) | _BV(PC2) | _BV(PC3);
 +
 
 +
  while(1) {
 +
   
 +
    display(~PINC);
 +
   
 +
    delay(100); //warte 1/10 sec
 +
   
 +
  }
 +
}
 +
</source>
  
 
===aufgabe1.c===
 
===aufgabe1.c===
#include <avr/io.h>
+
Dies war die erste Aufgabe, allerdings noch ohne Entprellung.
#include <util/delay.h>
+
<source lang="c">
+
#include <avr/io.h>
static void display(uint8_t led_config) {
+
#include <util/delay.h>
  /* Usage: led_config ist wie folgt aufgebaut:
+
#define TRUE 255
                  0b0000 LED4 LED3 LED2 LED1
+
#define FALSE 0
                 
+
#define RECHTS 255
                  Wenn alle LEDs an sind heisst das led_config = 0b00001111.
+
#define LINKS 0
  */
+
 
  /* Erklärung: Über die led_config wird eine Maske gelegt (AND) um nur das nötige Bit übrig zu  
+
 
                lassen. Dieses übrige Bit wird dann an die richtige Stelle geshiftet.
+
static void display(uint8_t led_config) {
                Die Erklärung an jeder Zeile ist die ausführliche Variante, wo das nötige Bit erst
+
  /* Usage: led_config ist wie folgt aufgebaut:
                an das erste Bit geshiftet und danach an die benötigte Stelle geshiftet wird.
+
                  0b0000 LED4 LED3 LED2 LED1
  */
+
                 
 
+
                  Wenn alle LEDs an sind heisst das led_config = 0b00001111.
  // LEDs auf 0 setzen.
+
  */
  PORTC &= ~_BV(PC4);
+
  /* Erklärung: Über die led_config wird eine Maske gelegt (AND) um nur das nötige Bit übrig zu  
  PORTD &= ~(_BV(PD3) | _BV(PD6) | _BV(PD7));
+
                lassen. Dieses übrige Bit wird dann an die richtige Stelle geshiftet.
 
+
                Die Erklärung an jeder Zeile ist die ausführliche Variante, wo das nötige Bit erst
  // Die in led_config genannten LEDs auf 1 setzen.
+
                an das erste Bit geshiftet und danach an die benötigte Stelle geshiftet wird.
  PORTC |= (led_config & 0b00000001)<<4; /* >>0 <<4 (PC4) */
+
  */
  PORTD |= (led_config & 0b00000010)<<2; /* >>1 <<3 (PD3) */
+
  PORTC &= ~_BV(PC4);
  PORTD |= (led_config & 0b00000100)<<4; /* >>2 <<6 (PD6) */
+
  PORTD &= ~(_BV(PD3) | _BV(PD6) | _BV(PD7));
  PORTD |= (led_config & 0b00001000)<<4; /* >>3 <<7 (PD7) */
+
 
}
+
  PORTC |= (led_config & 0b00000001)<<4; /* >>0 <<4 (PC4) */
+
  PORTD |= (led_config & 0b00000010)<<2; /* >>1 <<3 (PD3) */
+
  PORTD |= (led_config & 0b00000100)<<4; /* >>2 <<6 (PD6) */
static void delay(uint16_t delay){
+
  PORTD |= (led_config & 0b00001000)<<4; /* >>3 <<7 (PD7) */
  /* Usage: delay ist die Zeit in ms. */
+
}
  uint16_t i;
+
 
  for (i = 0; i < delay; i++) {
+
static void delay(uint16_t delay){
    /* wait 4 * 5000 cycles */
+
  /* Usage: delay ist die Zeit in ms. */
    _delay_loop_2(5000);
+
  uint16_t i;
  }         
+
  for (i = 0; i < delay; i++) {
}
+
    // 4 * 5000 zyklen
+
    _delay_loop_2(5000);
+
  }         
void main(void) {
+
}
+
 
  /* configure LEDs as output */
+
void main(void) {
  DDRD = _BV(PD3) | _BV(PD6) | _BV(PD7);
+
 
  DDRC = _BV(PC4);
+
    /* configure LEDs as output */
 
+
  DDRD = _BV(PD3) | _BV(PD6) | _BV(PD7);
  uint8_t led_configs[] = { 0b00001000, //0
+
  DDRC = _BV(PC4);
                            0b00000100,
+
 
                            0b00000010,
+
  // Taster sind schon durch die Initialisierung als Eingang eingerichtet.
                            0b00000001,
+
 
                            0b00000010,
+
  PORTC |= _BV(PC0) | _BV(PC1) | _BV(PC2) | _BV(PC3);
                            0b00000100, //5
+
   
                            0b00001000,
+
  uint8_t led_configs[] = { 0b00001000, //0
                            0b00001010,
+
                            0b00000100,
                            0b00000101,
+
                            0b00000010,
                            0b00001010,
+
                            0b00000001
                            0b00000101, //10
+
                          };
                            0b00001111,
+
  uint8_t led_config_size = 4;
                            0b00000000
 
                          };
 
  uint8_t led_config_size = 12;
 
                         
 
  while(1) {
 
    uint8_t i;
 
    for(i = 0; i < led_config_size; i++) {
 
      display(led_configs[i]);
 
      delay(1000);
 
    }
 
  }
 
}
 
 
  
==Sourcecode, Abend 2==
+
  uint8_t i = 0;
===aufgabe1.c===
+
   
#include <avr/io.h>
+
  uint8_t ein = TRUE;
#include <util/delay.h>
+
  uint8_t richtung = RECHTS;
#define TRUE 255
+
  uint32_t wartezeit = 1000;
#define FALSE 0
+
 
#define RECHTS 255
+
  while(1) {
#define LINKS 0
+
     
+
    switch ((~PINC) & 0b00001111) {
+
      case _BV(PC0):
static void display(uint8_t led_config) {
+
        //ein/aus
  /* Usage: led_config ist wie folgt aufgebaut:
+
        ein = ~ein;
                  0b0000 LED4 LED3 LED2 LED1
+
       
                 
+
        break;
                  Wenn alle LEDs an sind heisst das led_config = 0b00001111.
+
          
  */
+
      case _BV(PC1):
  /* Erklärung: Über die led_config wird eine Maske gelegt (AND) um nur das nötige Bit übrig zu
+
        //wechseln
                lassen. Dieses übrige Bit wird dann an die richtige Stelle geshiftet.
+
        richtung = ~richtung;
                Die Erklärung an jeder Zeile ist die ausführliche Variante, wo das nötige Bit erst
+
       
                an das erste Bit geshiftet und danach an die benötigte Stelle geshiftet wird.
+
        break;
  */
 
  PORTC &= ~_BV(PC4);
 
  PORTD &= ~(_BV(PD3) | _BV(PD6) | _BV(PD7));
 
 
 
  PORTC |= (led_config & 0b00000001)<<4; /* >>0 <<4 (PC4) */
 
  PORTD |= (led_config & 0b00000010)<<2; /* >>1 <<3 (PD3) */
 
  PORTD |= (led_config & 0b00000100)<<4; /* >>2 <<6 (PD6) */
 
  PORTD |= (led_config & 0b00001000)<<4; /* >>3 <<7 (PD7) */
 
}
 
 
static void delay(uint16_t delay){
 
  /* Usage: delay ist die Zeit in ms. */
 
  uint16_t i;
 
  for (i = 0; i < delay; i++) {
 
    // 4 * 5000 zyklen
 
    _delay_loop_2(5000);
 
  }          
 
}
 
 
void main(void) {
 
 
 
    /* configure LEDs as output */
 
  DDRD = _BV(PD3) | _BV(PD6) | _BV(PD7);
 
  DDRC = _BV(PC4);
 
 
 
  // Taster sind schon durch die Initialisierung als Eingang eingerichtet.
 
 
 
  PORTC |= _BV(PC0) | _BV(PC1) | _BV(PC2) | _BV(PC3);
 
   
 
  uint8_t led_configs[] = { 0b00001000, //0
 
                            0b00000100,
 
                            0b00000010,
 
                            0b00000001
 
                          };
 
  uint8_t led_config_size = 4;
 
 
  uint8_t i = 0;
 
   
 
  uint8_t ein = TRUE;
 
  uint8_t richtung = RECHTS;
 
  uint32_t wartezeit = 1000;
 
 
 
  while(1) {
 
 
        
 
        
    switch ((~PINC) & 0b00001111) {
+
      case _BV(PC2):
      case _BV(PC0):
+
        //schneller
        //ein/aus
+
        if(wartezeit/1.5 < wartezeit && wartezeit/1.5 > 50) {
        ein = ~ein;
+
          wartezeit /= 1.5;
       
+
        }
        break;
+
       
       
+
        break;
      case _BV(PC1):
+
       
        //wechseln
+
      case _BV(PC3):
        richtung = ~richtung;
+
        //langsamer
       
+
        if(wartezeit*1.5 > wartezeit) {
        break;
+
          wartezeit *= 1.5;
 +
        }
 
          
 
          
      case _BV(PC2):
+
        break;
        //schneller
+
     
        if(wartezeit/1.5 < wartezeit && wartezeit/1.5 > 50) {
+
    }
          wartezeit /= 1.5;
+
 
        }
+
 
       
+
    if(ein == TRUE) {
        break;
+
      display(led_configs[i]);
       
+
      if(richtung == RECHTS) {
      case _BV(PC3):
+
        i++;
        //langsamer
+
      } else {
        if(wartezeit*1.5 > wartezeit) {
+
        i--;
          wartezeit *= 1.5;
+
      }
        }
+
     
       
+
      //wrapping
        break;
+
      if(i == 255) {
     
+
        i = 3;
    }
+
      } else if(i == 4) {
 
+
        i = 0;
 
+
      }
    if(ein == TRUE) {
+
    }
      display(led_configs[i]);
+
   
      if(richtung == RECHTS) {
+
    delay(wartezeit);
        i++;
+
 
      } else {
+
  }
        i--;
+
}
      }
+
</source>
     
+
 
      //wrapping
+
===aufgabe2.c===
      if(i == 255) {
+
Dies ist unsere Lösung für die Entprellung, allerdings nur auf dem 1. Taster.
        i = 3;
+
 
      } else if(i == 4) {
+
<source lang="c">
        i = 0;
+
#include <avr/io.h>
      }
+
#include <util/delay.h>
    }
+
#define TRUE 255
   
+
#define FALSE 0
    delay(wartezeit);
+
#define RECHTS 255
 
+
#define LINKS 0
  }
+
 
}
+
 
 +
static void display(uint8_t led_config) {
 +
  /* Usage: led_config ist wie folgt aufgebaut:
 +
                  0b0000 LED4 LED3 LED2 LED1
 +
                 
 +
                  Wenn alle LEDs an sind heisst das led_config = 0b00001111.
 +
  */
 +
  /* Erklärung: Über die led_config wird eine Maske gelegt (AND) um nur das nötige Bit übrig zu
 +
                lassen. Dieses übrige Bit wird dann an die richtige Stelle geshiftet.
 +
                Die Erklärung an jeder Zeile ist die ausführliche Variante, wo das nötige Bit erst
 +
                an das erste Bit geshiftet und danach an die benötigte Stelle geshiftet wird.
 +
  */
 +
  PORTC &= ~_BV(PC4);
 +
  PORTD &= ~(_BV(PD3) | _BV(PD6) | _BV(PD7));
 +
 
 +
  PORTC |= (led_config & 0b00000001)<<4; /* >>0 <<4 (PC4) */
 +
  PORTD |= (led_config & 0b00000010)<<2; /* >>1 <<3 (PD3) */
 +
  PORTD |= (led_config & 0b00000100)<<4; /* >>2 <<6 (PD6) */
 +
  PORTD |= (led_config & 0b00001000)<<4; /* >>3 <<7 (PD7) */
 +
}
 +
 
 +
static void delay(uint16_t delay){
 +
  /* Usage: delay ist die Zeit in ms. */
 +
  uint16_t i;
 +
  for (i = 0; i < delay; i++) {
 +
    // 4 * 5000 zyklen
 +
    _delay_loop_2(5000);
 +
  }       
 +
}
 +
 
 +
void main(void) {
 +
 
 +
    /* configure LEDs as output */
 +
  DDRD = _BV(PD3) | _BV(PD6) | _BV(PD7);
 +
  DDRC = _BV(PC4);
 +
 
 +
  // Taster sind schon durch die Initialisierung als Eingang eingerichtet.
 +
 
 +
  PORTC |= _BV(PC0) | _BV(PC1) | _BV(PC2) | _BV(PC3);
 +
   
 +
  uint8_t gueltiges_war = 0;
 +
  uint8_t war = 0;
 +
  uint8_t ist = 0;
 +
 
 +
  uint8_t tmp = 255;
 +
  while(1) {
 +
   
 +
    ist = PINC & _BV(PC0);
 +
   
 +
    if(war == ist) {
 +
      gueltiges_war = ist;
 +
    }
 +
   
 +
    if(ist != gueltiges_war) {
 +
      tmp = ~tmp;
 +
    }
 +
   
 +
    war = ist;
 +
   
 +
    display(tmp);
 +
   
 +
    delay(20);
 +
  }
 +
}
 +
</source>
 +
 
 +
=TODO=
 +
* Abend 2
 +
** aufgabe1.c und aufgabe2.c zusammenbringen.
 +
 
 
[[Category:U23 2008]]
 
[[Category:U23 2008]]

Latest revision as of 18:36, 26 August 2008

Wir saßen am Go-Brett (Brett mit den Kästchen drauf).

News

Ich hab meine Bitshift-Geschichte gefixt (zwar nicht getestet, sollte aber nun wirklich laufen...) --Lostgeek 16:52, 19 August 2008 (UTC)

Mitglieder

  • lostgeek (Hemd, 180cm, MacBook)
  • David, nichts wissend, nur wissen wo's steht
  • Michael
  • Kathy

Abende

Abend 1

aufgabe1.c

<source lang="c">

  1. include <avr/io.h>
  2. include <util/delay.h>

static void display(uint8_t led_config) {

 /* Usage: led_config ist wie folgt aufgebaut:
                 0b0000 LED4 LED3 LED2 LED1
                 
                 Wenn alle LEDs an sind heisst das led_config = 0b00001111.
 */
 /* Erklärung: Über die led_config wird eine Maske gelegt (AND) um nur das nötige Bit übrig zu 
               lassen. Dieses übrige Bit wird dann an die richtige Stelle geshiftet.
               Die Erklärung an jeder Zeile ist die ausführliche Variante, wo das nötige Bit erst
               an das erste Bit geshiftet und danach an die benötigte Stelle geshiftet wird.
 */
 
 // LEDs auf 0 setzen.
 PORTC &= ~_BV(PC4);
 PORTD &= ~(_BV(PD3) | _BV(PD6) | _BV(PD7));
 
 // Die in led_config genannten LEDs auf 1 setzen.
 PORTC |= (led_config & 0b00000001)<<4; /* >>0 <<4 (PC4) */
 PORTD |= (led_config & 0b00000010)<<2; /* >>1 <<3 (PD3) */
 PORTD |= (led_config & 0b00000100)<<4; /* >>2 <<6 (PD6) */
 PORTD |= (led_config & 0b00001000)<<4; /* >>3 <<7 (PD7) */

}


static void delay(uint16_t delay){

 /* Usage: delay ist die Zeit in ms. */
 uint16_t i;
 for (i = 0; i < delay; i++) {
   /* wait 4 * 5000 cycles */
   _delay_loop_2(5000);
 }         

}


void main(void) {

 /* configure LEDs as output */
 DDRD = _BV(PD3) | _BV(PD6) | _BV(PD7);
 DDRC = _BV(PC4);
 
 uint8_t led_configs[] = { 0b00001000, //1
                           0b00000100,
                           0b00000010,
                           0b00000001,
                           0b00000010, //5
                           0b00000100, 
                           0b00001000,
                           0b00001010,
                           0b00000101,
                           0b00001010, //10
                           0b00000101, 
                           0b00001111,
                           0b00000000
                         };
 uint8_t led_config_size = 13;
                         
 while(1) {
   uint8_t i;
   for(i = 0; i < led_config_size; i++) {
     display(led_configs[i]);
     delay(1000);
   }
 }

} </source>

Abend 2

projekt1.c

Dies ist noch vor der Pizzapause entstanden und überträgt die Tastenkombination auf die LEDs. <source lang="c">

  1. include <avr/io.h>
  2. include <util/delay.h>

static void display(uint8_t led_config) {

 /* Usage: led_config ist wie folgt aufgebaut:
                 0b0000 LED4 LED3 LED2 LED1
                 
                 Wenn alle LEDs an sind heisst das led_config = 0b00001111.
 */
 /* Erklärung: Über die led_config wird eine Maske gelegt (AND) um nur das nötige Bit übrig zu 
               lassen. Dieses übrige Bit wird dann an die richtige Stelle geshiftet.
               Die Erklärung an jeder Zeile ist die ausführliche Variante, wo das nötige Bit erst
               an das erste Bit geshiftet und danach an die benötigte Stelle geshiftet wird.
 */
 PORTC &= ~_BV(PC4);
 PORTD &= ~(_BV(PD3) | _BV(PD6) | _BV(PD7));
 
 PORTC |= (led_config & 0b00000001)<<4; /* >>0 <<4 (PC4) */
 PORTD |= (led_config & 0b00000010)<<2; /* >>1 <<3 (PD3) */
 PORTD |= (led_config & 0b00000100)<<4; /* >>2 <<6 (PD6) */
 PORTD |= (led_config & 0b00001000)<<4; /* >>3 <<7 (PD7) */

}

static void delay(uint16_t delay){

 /* Usage: delay ist die Zeit in ms. */
 uint16_t i;
 for (i = 0; i < delay; i++) {
   _delay_loop_2(5000);
 }         

}

void main(void) {

   /* configure LEDs as output */
 DDRD = _BV(PD3) | _BV(PD6) | _BV(PD7);
 DDRC = _BV(PC4);
 
 // Taster sind schon durch die Initialisierung als Eingang eingerichtet.
 
 PORTC |= _BV(PC0) | _BV(PC1) | _BV(PC2) | _BV(PC3);
 
 while(1) {
   
   display(~PINC);
   
   delay(100); //warte 1/10 sec
   
 }

} </source>

aufgabe1.c

Dies war die erste Aufgabe, allerdings noch ohne Entprellung. <source lang="c">

  1. include <avr/io.h>
  2. include <util/delay.h>
  3. define TRUE 255
  4. define FALSE 0
  5. define RECHTS 255
  6. define LINKS 0


static void display(uint8_t led_config) {

 /* Usage: led_config ist wie folgt aufgebaut:
                 0b0000 LED4 LED3 LED2 LED1
                 
                 Wenn alle LEDs an sind heisst das led_config = 0b00001111.
 */
 /* Erklärung: Über die led_config wird eine Maske gelegt (AND) um nur das nötige Bit übrig zu 
               lassen. Dieses übrige Bit wird dann an die richtige Stelle geshiftet.
               Die Erklärung an jeder Zeile ist die ausführliche Variante, wo das nötige Bit erst
               an das erste Bit geshiftet und danach an die benötigte Stelle geshiftet wird.
 */
 PORTC &= ~_BV(PC4);
 PORTD &= ~(_BV(PD3) | _BV(PD6) | _BV(PD7));
 
 PORTC |= (led_config & 0b00000001)<<4; /* >>0 <<4 (PC4) */
 PORTD |= (led_config & 0b00000010)<<2; /* >>1 <<3 (PD3) */
 PORTD |= (led_config & 0b00000100)<<4; /* >>2 <<6 (PD6) */
 PORTD |= (led_config & 0b00001000)<<4; /* >>3 <<7 (PD7) */

}

static void delay(uint16_t delay){

 /* Usage: delay ist die Zeit in ms. */
 uint16_t i;
 for (i = 0; i < delay; i++) {
   // 4 * 5000 zyklen
   _delay_loop_2(5000);
 }         

}

void main(void) {

   /* configure LEDs as output */
 DDRD = _BV(PD3) | _BV(PD6) | _BV(PD7);
 DDRC = _BV(PC4);
 
 // Taster sind schon durch die Initialisierung als Eingang eingerichtet.
 
 PORTC |= _BV(PC0) | _BV(PC1) | _BV(PC2) | _BV(PC3);
   
 uint8_t led_configs[] = { 0b00001000, //0
                           0b00000100,
                           0b00000010,
                           0b00000001
                         };
 uint8_t led_config_size = 4;
 uint8_t i = 0;
   
 uint8_t ein = TRUE;
 uint8_t richtung = RECHTS;
 uint32_t wartezeit = 1000;
 
 while(1) {
     
   switch ((~PINC) & 0b00001111) {
     case _BV(PC0):
       //ein/aus
       ein = ~ein;
       
       break;
       
     case _BV(PC1):
       //wechseln
       richtung = ~richtung;
       
       break;
      
     case _BV(PC2):
       //schneller
       if(wartezeit/1.5 < wartezeit && wartezeit/1.5 > 50) {
         wartezeit /= 1.5;
       }
       
       break;
       
     case _BV(PC3):
       //langsamer
       if(wartezeit*1.5 > wartezeit) {
         wartezeit *= 1.5;
       }
       
       break;
     
   }
 
 
   if(ein == TRUE) {
     display(led_configs[i]);
     if(richtung == RECHTS) {
       i++;
     } else {
       i--;
     }
     
     //wrapping
     if(i == 255) {
       i = 3;
     } else if(i == 4) {
       i = 0;
     }
   }
   
   delay(wartezeit);
 
 }

} </source>

aufgabe2.c

Dies ist unsere Lösung für die Entprellung, allerdings nur auf dem 1. Taster.

<source lang="c">

  1. include <avr/io.h>
  2. include <util/delay.h>
  3. define TRUE 255
  4. define FALSE 0
  5. define RECHTS 255
  6. define LINKS 0


static void display(uint8_t led_config) {

 /* Usage: led_config ist wie folgt aufgebaut:
                 0b0000 LED4 LED3 LED2 LED1
                 
                 Wenn alle LEDs an sind heisst das led_config = 0b00001111.
 */
 /* Erklärung: Über die led_config wird eine Maske gelegt (AND) um nur das nötige Bit übrig zu 
               lassen. Dieses übrige Bit wird dann an die richtige Stelle geshiftet.
               Die Erklärung an jeder Zeile ist die ausführliche Variante, wo das nötige Bit erst
               an das erste Bit geshiftet und danach an die benötigte Stelle geshiftet wird.
 */
 PORTC &= ~_BV(PC4);
 PORTD &= ~(_BV(PD3) | _BV(PD6) | _BV(PD7));
 
 PORTC |= (led_config & 0b00000001)<<4; /* >>0 <<4 (PC4) */
 PORTD |= (led_config & 0b00000010)<<2; /* >>1 <<3 (PD3) */
 PORTD |= (led_config & 0b00000100)<<4; /* >>2 <<6 (PD6) */
 PORTD |= (led_config & 0b00001000)<<4; /* >>3 <<7 (PD7) */

}

static void delay(uint16_t delay){

 /* Usage: delay ist die Zeit in ms. */
 uint16_t i;
 for (i = 0; i < delay; i++) {
   // 4 * 5000 zyklen
   _delay_loop_2(5000);
 }         

}

void main(void) {

   /* configure LEDs as output */
 DDRD = _BV(PD3) | _BV(PD6) | _BV(PD7);
 DDRC = _BV(PC4);
 
 // Taster sind schon durch die Initialisierung als Eingang eingerichtet.
 
 PORTC |= _BV(PC0) | _BV(PC1) | _BV(PC2) | _BV(PC3);
   
 uint8_t gueltiges_war = 0;
 uint8_t war = 0;
 uint8_t ist = 0;
 
 uint8_t tmp = 255;
 while(1) {
   
   ist = PINC & _BV(PC0);
   
   if(war == ist) {
     gueltiges_war = ist;
   }
   
   if(ist != gueltiges_war) {
     tmp = ~tmp;
   }
   
   war = ist;
   
   display(tmp);
   
   delay(20);
 }

} </source>

TODO

  • Abend 2
    • aufgabe1.c und aufgabe2.c zusammenbringen.