U23 2008/Gruppe4
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
Sourcecode, Abend1
aufgabe1.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, //0 0b00000100, 0b00000010, 0b00000001, 0b00000010, 0b00000100, //5 0b00001000, 0b00001010, 0b00000101, 0b00001010, 0b00000101, //10 0b00001111, 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
#include <avr/io.h> #include <util/delay.h> #define TRUE 255 #define FALSE 0 #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 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); } }