Difference between revisions of "U23 2008/Gruppe2"
(→Gruppe 2) |
|||
Line 76: | Line 76: | ||
} | } | ||
+ | == '''Bezeichnungen der LEDs (siehe Datenblatt)''' == | ||
+ | /***************************************************** | ||
+ | Project : ATmega168 - LED Sequence | ||
+ | Version : 1.0.0.1 | ||
+ | Date : 25.08.2008 | ||
+ | Author : Group 2 | ||
+ | Company : C4 | ||
+ | Comments: | ||
+ | Chip type : ATmega168 | ||
+ | Program type : Application | ||
+ | Clock frequency : 2,000000 MHz | ||
+ | Memory model : Small | ||
+ | External RAM size : 0 | ||
+ | Data Stack size : 256 | ||
+ | *****************************************************/ | ||
+ | /* Include the header files here */ | ||
+ | #include <avr/io.h> | ||
+ | #include <util/delay.h> | ||
+ | |||
+ | /* Declare global variables here */ | ||
+ | const uint8_t mode_ex = 0; // running direction of LEDs or diagnostic mode (0-3) | ||
+ | const uint8_t sequence_ex[] = {1, 3, 4, 1, 3, 1, 2, 3}; // led sequence | ||
+ | const uint16_t delay_ex = 100; // delay in ms | ||
+ | |||
+ | static void led_control(uint8_t mode, uint8_t* sequence) { | ||
+ | static uint8_t lastled; // includes the last LED with state 1 | ||
+ | static uint8_t array_position; // includes the last array position | ||
+ | switch (mode){ | ||
+ | case 0: // downshift | ||
+ | if(lastled == 4){lastled = 1;}else{++lastled;} | ||
+ | switch (lastled) { | ||
+ | case 1: | ||
+ | ledset(1, 0, 0, 0); // power on LED1 | ||
+ | break; | ||
+ | case 2: | ||
+ | ledset(0, 1, 0, 0); // power on LED2 | ||
+ | break; | ||
+ | case 3: | ||
+ | ledset(0, 0, 1, 0); // power on LED3 | ||
+ | break; | ||
+ | case 4: | ||
+ | ledset(0, 0, 0, 1); // power on LED4 | ||
+ | break; | ||
+ | default: | ||
+ | } | ||
+ | break; | ||
+ | case 1: // upshift | ||
+ | if(lastled == 1){lastled = 4;}else{--lastled;} | ||
+ | switch (lastled){ | ||
+ | case 1: | ||
+ | ledset(1, 0, 0, 0); // power on LED1 | ||
+ | break; | ||
+ | case 2: | ||
+ | ledset(0, 1, 0, 0); // power on LED2 | ||
+ | break; | ||
+ | case 3: | ||
+ | ledset(0, 0, 1, 0); // power on LED3 | ||
+ | break; | ||
+ | case 4: | ||
+ | ledset(0, 0, 0, 1); // power on LED4 | ||
+ | break; | ||
+ | default: | ||
+ | } | ||
+ | break; | ||
+ | case 2: // sequence | ||
+ | switch (sequence[array_position]){ | ||
+ | case 1: | ||
+ | ledset(1, 0, 0, 0); // power on LED1 | ||
+ | break; | ||
+ | case 2: | ||
+ | ledset(0, 1, 0, 0); // power on LED2 | ||
+ | break; | ||
+ | case 3: | ||
+ | ledset(0, 0, 1, 0); // power on LED3 | ||
+ | break; | ||
+ | case 4: | ||
+ | ledset(0, 0, 0, 1); // power on LED4 | ||
+ | break; | ||
+ | default: | ||
+ | } | ||
+ | if(array_position <= 7){array_position = 0;}else{++array_position;} | ||
+ | break; | ||
+ | default: // all LEDs 1 (diagnostic mode) | ||
+ | ledset(1, 1, 1, 1); | ||
+ | } | ||
+ | } | ||
+ | /* Needs the LED configuration */ | ||
+ | static void ledset(uint8_t led1, uint8_t led2, uint8_t led3, uint8_t led4) { | ||
+ | if(led1){PORTC |= (1 << PC4);} // set the first LED | ||
+ | else{PORTC &= ~(1 << PC4);} | ||
+ | |||
+ | if(led2){PORTD |= (1 << PD3);} // set the second LED | ||
+ | else{PORTD &= ~(1 << PD3);} | ||
+ | |||
+ | if(led3){PORTD |= (1 << PD6);} // set the third LED | ||
+ | else{PORTD &= ~(1 << PD6);} | ||
+ | |||
+ | if(led4){PORTD |= (1 << PD7);} // set the fourth LED | ||
+ | else{PORTD &= ~(1 << PD7);} | ||
+ | } | ||
+ | |||
+ | static void mydelay(uint16_t delay) { | ||
+ | uint16_t i; | ||
+ | for(i = 0; i <= delay; i++) | ||
+ | { | ||
+ | _delay_loop_2(5000); // delay | ||
+ | } | ||
+ | } | ||
+ | |||
+ | /* Entry Point */ | ||
+ | void main(void) { | ||
+ | DDRC = _BV(PC4); // set PC4 as output | ||
+ | DDRD = _BV(PD3) | _BV(PD6) | _BV(PD7); // set PD3, PD6 and PD7 as output | ||
+ | |||
+ | while(1) // never-ending loop | ||
+ | { | ||
+ | led_control(mode_ex, sequence_ex); // call led_control | ||
+ | mydelay(delay_ex); | ||
+ | } | ||
+ | } | ||
== '''Bezeichnungen der LEDs (siehe Datenblatt)''' == | == '''Bezeichnungen der LEDs (siehe Datenblatt)''' == |
Revision as of 20:56, 25 August 2008
Contents
Gruppe 2
Gruppenchat:
u23group2@conference.koeln.ccc.de
Also einfach einen Jabber Account auf koeln.ccc.de oder jabber.ccc.de einrichten und schon gehts los. Wer zum Beispiel einen Gmail-Account hat, hat selbst schon einen Jabber Account und kann damit loslegen.
Mitglieder:
-kellertür (Mathias)
-UltraX8 (Arnaud) (Tom Tailor Polo-Shirt, blonde Haare)
-T06T (Thorsten mit H) (braune haare, braune augen, schwarze kleidung/humor)
-Thomas
-Lind (Bene) (ca. 190 groß, kurze Haare, schwarzes HardRock Cafe Shirt)
Sourcecode vom ersten Projektabend:
#include <avr/io.h> #include <util/delay.h> uint8_t globalconfig; //Uebergabe ist die gewünschte LED Konfiguration, die gesetzt werden soll //Die Konfiguration wird als Binärzahl übergeben wobei nur die letzten vier stellen ausgewertet werden static void ledset(uint8_t config) { globalconfig=config; PORTC=(config&0x01)<<PC4; PORTD=((config&0x02)<<(PD3-1))|((config&0x04)<<(PD6-2))|((config&0x08)<<(PD7-3)); } //Delay in ms static void mydelay(uint16_t delay){ uint16_t i; for (i = 0; i < delay; i++) { /* wait 4 * 65536 cycles */ _delay_loop_2(5000); } } static void led_control(uint8_t mode, uint8_t* sequence, uint8_t size, uint16_t delay) { while(1) { switch (mode) { case 0: //rechtsshift break; case 1: //linksshift break; default: { for(uint8_t i = 0; i<size; i++) { ledset(sequence[i]); mydelay(delay); } break; } } } } void main(void) { //Port Direction config DDRC = _BV(PC4); /* == 1<<7 == 128 */ DDRD = _BV(PD3)|_BV(PD6)|_BV(PD7); /* == 1<<7 == 128 */ uint8_t bla=0; //Definition der Blinkfolge uint8_t array[]={15,8,3,4}; led_control(12,array ,4,500); }
Bezeichnungen der LEDs (siehe Datenblatt)
/***************************************************** Project : ATmega168 - LED Sequence Version : 1.0.0.1 Date : 25.08.2008 Author : Group 2 Company : C4 Comments:
Chip type : ATmega168 Program type : Application Clock frequency : 2,000000 MHz Memory model : Small External RAM size : 0 Data Stack size : 256
- /
/* Include the header files here */
- include <avr/io.h>
- include <util/delay.h>
/* Declare global variables here */ const uint8_t mode_ex = 0; // running direction of LEDs or diagnostic mode (0-3) const uint8_t sequence_ex[] = {1, 3, 4, 1, 3, 1, 2, 3}; // led sequence const uint16_t delay_ex = 100; // delay in ms
static void led_control(uint8_t mode, uint8_t* sequence) {
static uint8_t lastled; // includes the last LED with state 1 static uint8_t array_position; // includes the last array position switch (mode){ case 0: // downshift if(lastled == 4){lastled = 1;}else{++lastled;} switch (lastled) { case 1: ledset(1, 0, 0, 0); // power on LED1 break; case 2: ledset(0, 1, 0, 0); // power on LED2 break; case 3: ledset(0, 0, 1, 0); // power on LED3 break; case 4: ledset(0, 0, 0, 1); // power on LED4 break; default: } break; case 1: // upshift if(lastled == 1){lastled = 4;}else{--lastled;} switch (lastled){ case 1: ledset(1, 0, 0, 0); // power on LED1 break; case 2: ledset(0, 1, 0, 0); // power on LED2 break; case 3: ledset(0, 0, 1, 0); // power on LED3 break; case 4: ledset(0, 0, 0, 1); // power on LED4 break; default: } break; case 2: // sequence switch (sequence[array_position]){ case 1: ledset(1, 0, 0, 0); // power on LED1 break; case 2: ledset(0, 1, 0, 0); // power on LED2 break; case 3: ledset(0, 0, 1, 0); // power on LED3 break; case 4: ledset(0, 0, 0, 1); // power on LED4 break; default: } if(array_position <= 7){array_position = 0;}else{++array_position;} break; default: // all LEDs 1 (diagnostic mode) ledset(1, 1, 1, 1); }
} /* Needs the LED configuration */ static void ledset(uint8_t led1, uint8_t led2, uint8_t led3, uint8_t led4) {
if(led1){PORTC |= (1 << PC4);} // set the first LED else{PORTC &= ~(1 << PC4);} if(led2){PORTD |= (1 << PD3);} // set the second LED else{PORTD &= ~(1 << PD3);} if(led3){PORTD |= (1 << PD6);} // set the third LED else{PORTD &= ~(1 << PD6);} if(led4){PORTD |= (1 << PD7);} // set the fourth LED else{PORTD &= ~(1 << PD7);}
}
static void mydelay(uint16_t delay) {
uint16_t i; for(i = 0; i <= delay; i++) { _delay_loop_2(5000); // delay }
}
/* Entry Point */ void main(void) {
DDRC = _BV(PC4); // set PC4 as output DDRD = _BV(PD3) | _BV(PD6) | _BV(PD7); // set PD3, PD6 and PD7 as output while(1) // never-ending loop { led_control(mode_ex, sequence_ex); // call led_control mydelay(delay_ex); }
}
Bezeichnungen der LEDs (siehe Datenblatt)
LED1 => PC4
LED2 => PD3
LED3 => PD6
LED4 => PD7
Funktionen der Globalen Variablen
uint8_t mode
0 = links...rechts
1 = rechts...links
2 = Sequenz aus Array
3 = default => alle LEDs an bzw. 1
uint8_t* sequence
Sequenz nach Schema uint8_t*[] = {0, 3, 4, 1, 3, 1, 2, 0};
Nach 4 LED-Moves fängt die Sequenz an der Stelle, wo sie zuletzt war wieder mit LED1 an.
uint16_t delay
Delay der Sequenz in MS.