U23 2008/Gruppe2
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.
Contents
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)
Erster Abend
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)
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.
Zweiter Abend
Lösung zur Lauflicht-Aufgabe
<source lang="c">
- include <avr/io.h>
- include <util/delay.h>
/* Diese Funktion dient zum exakten Setzen eines bestimmten Bits und soll die Lesbarkeit des restlichen Codes erhöhen. Übergeben wird die Adresse des Speichers für den Register, die Stelle (0-7), die gesetzt werden soll und ein Wert dafür (0 oder 1)!!
- /
static void bitset(uint8_t *reg, uint8_t digit, uint8_t value) { /* wenn value zu einem Wert ungleich null ausgewertet wird, dann wird das Bit an Stelle digit gesetzt sonst wird es auf Null gesetzt */ if(value) *reg=(*reg|_BV(digit)); else *reg=(*reg&(~_BV(digit))); }
/*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) { //Die folgenden Befehle zerpflücken die ersten vier Bits in config und setzten sie in den entsprechenden Registern bitset(&PORTC,PC4,(config&0x01)); bitset(&PORTD,PD3,(config&0x02)); bitset(&PORTD,PD6,(config&0x04)); bitset(&PORTD,PD7,(config&0x08)); }
//Delay in ms static void mydelay(uint16_t delay){ uint16_t i; for (i = 0; i < delay; i++) { /* wait 4 * 5000 cycles */ _delay_loop_2(5000); } }
/*Prüft ob den Status eines Buttons. Eingabe 1-4 für Button 1 bis Button 4. Ausgabe 1=gedrückt sonst gleich 0
Übernimmt auch das entprellen durch vergleiche im 10ms Takt bis zwei aufeinanderfolgende gleich sind
- /
static uint8_t buttonstate(uint8_t button) { /*Einlesen des Buttons. Dazu Maskierung von PortC mit übergebenem Button. Von dem wird eins Abgezogen weil wir intuitiver Weise bei 1 anfangen die Buttons zu nummerieren.*/ uint8_t state=(!(PINC&_BV(button-1))); while (1) { mydelay(20); if(state==(!(PINC&_BV(button-1)))) return state; //Zustand ist gleich dem letzten Zustand -> Ausbruch aus der Schleife else state=(!(PINC&_BV(button-1))); //aktuellen Zustand speichern } }
/*Diese Funktion fragt auch den Status des Buttons ab wartet aber mit der Rückgabe bis der Button los gelassen
wurde damit es nicht zu mehrfacher Ausführrung kommt wenn der Button länger gedrückt wird.
- /
static uint8_t buttonstateextended(uint8_t button) { uint8_t state=(!(PINC&_BV(button-1))); //Button einlesen if(!(state)) return state; //Ist der Button nicht gedrückt wird das sofort zurück gegeben. mydelay(5); if(PINC&_BV(button-1)) return state; //Falls des nur ein Fehlalarm war und der Button gar nicht dedrückt ist
while (1) { //Warten auf das Loslassen des Buttons mydelay(5); if(PINC&_BV(button-1)) return state; //Wir geben den letzten Zustand=Gedrückt noch zurück } }
void main(void) { //Port Direction config DDRC = _BV(PC4); //LED 1 ist Ausgang DDRC &=~(_BV(PC0)|_BV(PC1)|_BV(PC2)|_BV(PC3)); //PIN0-PIN 4 von Port C sind Eingänge; DDRD = _BV(PD3)|_BV(PD6)|_BV(PD7);//LEDs 2-4 sind Ausgänge PORTC |= _BV(PC0)|_BV(PC1)|_BV(PC2)|_BV(PC3); //Pullups für die Buttons 1-4 einschalten
//Variablen für die Steuerung des Lauflichts uint8_t state=0; //Status 0-3 für die gerade leuchtende LED uint8_t direction = 1; //Laufrichtung 1= 0...3 0= 3...0 uint16_t delay=200; uint8_t enable=1;
while(1) { if(enable) { if(direction){ if(state==3) state=0; //Übertrag ab 4, dann wieder von vorne else state++; } else{ if(state==0) state=3; //0 abfangen, dann wieder von hinten else state--; } ledset(_BV(state)); mydelay(delay); }
if(buttonstateextended(1)) { enable^=1; //Schaltet Blinklicht ein oder aus } if(buttonstateextended(2)) { direction^=1; //Schaltet laufrichtung um } if(buttonstate(3)) { if(delay>=10) delay-=10; //schneller wenn nicht schon zu schnell } if(buttonstate(4)) { delay+=10; //schneller } } } </source>