https://wiki.koeln.ccc.de/api.php?action=feedcontributions&user=80.135.67.126&feedformat=atom
C4 Wiki - User contributions [en]
2024-03-29T12:31:18Z
User contributions
MediaWiki 1.30.1
https://wiki.koeln.ccc.de/index.php?title=U23_2008/Gruppe2&diff=14539
U23 2008/Gruppe2
2008-09-24T21:16:22Z
<p>80.135.67.126: /* Mitglieder: */</p>
<hr />
<div>Gruppenchat:<br />
<br />
u23group2@conference.koeln.ccc.de<br />
<br />
Also einfach einen Jabber Account auf koeln.ccc.de oder jabber.ccc.de einrichten und schon gehts los.<br />
Wer zum Beispiel einen Gmail-Account hat, hat selbst schon einen Jabber Account und kann damit loslegen.<br />
<br />
= '''Mitglieder:''' =<br />
{| border="1" cellspacing="0" cellpadding="10" style="border-collapse:collapse;"<br />
|-<br />
! Name !! Realname !! Aussehen !! Jabber ID<br />
|-<br />
| kellertür || Mathias || dunkles Haar, 12" Asus Notebook || kellertür@koeln.ccc.de<br />
|-<br />
| UltraX8 || UltraX8 || Tom Tailor Polo-Shirt, blonde Haare ||<br />
|-<br />
| T06T || Thorsten mit H || braune haare, braune augen, schwarze kleidung/humor ||<br />
|-<br />
| Thomas || || || thomasp@jabber.ccc.de <br />
|-<br />
| Lind || Bene || ca. 190 groß, kurze Haare, schwarzes HardRock Cafe Shirt||<br />
|}<br />
<br />
=Erster Abend=<br />
== '''Sourcecode vom ersten Projektabend:''' ==<br />
#include <avr/io.h><br />
#include <util/delay.h><br />
<br />
uint8_t globalconfig;<br />
<br />
//Uebergabe ist die gewünschte LED Konfiguration, die gesetzt werden soll<br />
//Die Konfiguration wird als Binärzahl übergeben wobei nur die letzten vier stellen ausgewertet werden<br />
static void ledset(uint8_t config) {<br />
globalconfig=config;<br />
PORTC=(config&0x01)<<PC4;<br />
PORTD=((config&0x02)<<(PD3-1))|((config&0x04)<<(PD6-2))|((config&0x08)<<(PD7-3));<br />
}<br />
<br />
//Delay in ms<br />
static void mydelay(uint16_t delay){<br />
uint16_t i; <br />
for (i = 0; i < delay; i++) {<br />
/* wait 4 * 65536 cycles */<br />
_delay_loop_2(5000);<br />
}<br />
} <br />
<br />
<br />
static void led_control(uint8_t mode, uint8_t* sequence, uint8_t size, uint16_t delay) {<br />
while(1) {<br />
switch (mode) {<br />
case 0: //rechtsshift<br />
<br />
break;<br />
case 1: //linksshift<br />
<br />
break;<br />
default: {<br />
for(uint8_t i = 0; i<size; i++) {<br />
ledset(sequence[i]);<br />
mydelay(delay);<br />
}<br />
break;<br />
}<br />
}<br />
}<br />
}<br />
<br />
<br />
void main(void) {<br />
//Port Direction config<br />
DDRC = _BV(PC4); /* == 1<<7 == 128 */<br />
DDRD = _BV(PD3)|_BV(PD6)|_BV(PD7); /* == 1<<7 == 128 */<br />
<br />
<br />
uint8_t bla=0;<br />
<br />
//Definition der Blinkfolge<br />
uint8_t array[]={15,8,3,4};<br />
<br />
led_control(12,array ,4,500);<br />
<br />
}<br />
<br />
==Bezeichnungen der LEDs (siehe Datenblatt)==<br />
LED1 => PC4<br/><br />
LED2 => PD3<br/><br />
LED3 => PD6<br/><br />
LED4 => PD7<br />
==Bezeichnungen der Taster (siehe Datenblatt)==<br />
T1 => PC0<br/><br />
T2 => PC1<br/><br />
T3 => PC2<br/><br />
T4 => PC3<br />
<br />
=Zweiter Abend=<br />
==Lösung zur Lauflicht-Aufgabe==<br />
<source lang="c"><br />
#include <avr/io.h><br />
#include <util/delay.h><br />
<br />
/* Diese Funktion dient zum exakten Setzen eines bestimmten Bits und soll die Lesbarkeit des restlichen Codes erhöhen.<br />
Ü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)!!<br />
*/<br />
static void bitset(uint8_t *reg, uint8_t digit, uint8_t value) {<br />
/* wenn value zu einem Wert ungleich null ausgewertet wird, dann wird das Bit an Stelle digit gesetzt<br />
sonst wird es auf Null gesetzt */<br />
if(value) *reg=(*reg|_BV(digit));<br />
else *reg=(*reg&(~_BV(digit)));<br />
}<br />
<br />
<br />
/*Uebergabe ist die gewünschte LED Konfiguration, die gesetzt werden soll<br />
Die Konfiguration wird als Binärzahl Übergeben wobei nur die letzten vier stellen ausgewertet werden<br />
*/<br />
static void ledset(uint8_t config) {<br />
//Die folgenden Befehle zerpflücken die ersten vier Bits in config und setzten sie in den entsprechenden Registern<br />
bitset(&PORTC,PC4,(config&0x01));<br />
bitset(&PORTD,PD3,(config&0x02));<br />
bitset(&PORTD,PD6,(config&0x04));<br />
bitset(&PORTD,PD7,(config&0x08));<br />
}<br />
<br />
//Delay in ms<br />
static void mydelay(uint16_t delay){<br />
uint16_t i;<br />
for (i = 0; i < delay; i++) {<br />
/* wait 4 * 5000 cycles */<br />
_delay_loop_2(5000);<br />
}<br />
}<br />
<br />
/*Prüft ob den Status eines Buttons. Eingabe 1-4 für Button 1 bis Button 4. Ausgabe 1=gedrückt sonst gleich 0<br />
Übernimmt auch das entprellen durch vergleiche im 10ms Takt bis zwei aufeinanderfolgende gleich sind<br />
*/<br />
static uint8_t buttonstate(uint8_t button) {<br />
/*Einlesen des Buttons. Dazu Maskierung von PortC mit übergebenem Button.<br />
Von dem wird eins Abgezogen weil wir intuitiver Weise bei 1 anfangen die Buttons zu nummerieren.*/<br />
uint8_t state=(!(PINC&_BV(button-1)));<br />
while (1) {<br />
mydelay(20);<br />
if(state==(!(PINC&_BV(button-1)))) return state; //Zustand ist gleich dem letzten Zustand -> Ausbruch aus der Schleife<br />
else state=(!(PINC&_BV(button-1))); //aktuellen Zustand speichern<br />
}<br />
}<br />
<br />
/*Diese Funktion fragt auch den Status des Buttons ab wartet aber mit der Rückgabe bis der Button los gelassen<br />
wurde damit es nicht zu mehrfacher Ausführrung kommt wenn der Button länger gedrückt wird.<br />
*/<br />
static uint8_t buttonstateextended(uint8_t button) {<br />
uint8_t state=(!(PINC&_BV(button-1))); //Button einlesen<br />
if(!(state)) return state; //Ist der Button nicht gedrückt wird das sofort zurück gegeben.<br />
mydelay(5);<br />
if(PINC&_BV(button-1)) return state; //Falls des nur ein Fehlalarm war und der Button gar nicht dedrückt ist<br />
<br />
while (1) { //Warten auf das Loslassen des Buttons<br />
mydelay(5);<br />
if(PINC&_BV(button-1)) return state; //Wir geben den letzten Zustand=Gedrückt noch zurück<br />
}<br />
}<br />
<br />
void main(void) {<br />
//Port Direction config<br />
DDRC = _BV(PC4); //LED 1 ist Ausgang<br />
DDRC &=~(_BV(PC0)|_BV(PC1)|_BV(PC2)|_BV(PC3)); //PIN0-PIN 4 von Port C sind Eingänge;<br />
DDRD = _BV(PD3)|_BV(PD6)|_BV(PD7);//LEDs 2-4 sind Ausgänge<br />
PORTC |= _BV(PC0)|_BV(PC1)|_BV(PC2)|_BV(PC3); //Pullups für die Buttons 1-4 einschalten<br />
<br />
//Variablen für die Steuerung des Lauflichts<br />
uint8_t state=0; //Status 0-3 für die gerade leuchtende LED <br />
uint8_t direction = 1; //Laufrichtung 1= 0...3 0= 3...0<br />
uint16_t delay=200;<br />
uint8_t enable=1;<br />
<br />
while(1) {<br />
if(enable) {<br />
if(direction){<br />
if(state==3) state=0; //Übertrag ab 4, dann wieder von vorne<br />
else state++;<br />
}<br />
else{<br />
if(state==0) state=3; //0 abfangen, dann wieder von hinten<br />
else state--;<br />
}<br />
ledset(_BV(state));<br />
//Hier ist fast noch mal die delay Funktion implementiert aber mit Abfrage der Taster<br />
for (uint16_t i = 0; i < delay; i++) {<br />
/* wait 4 * 5000 cycles */<br />
_delay_loop_2(5000);<br />
if(buttonstateextended(1)) {<br />
enable^=1; //Schaltet Blinklicht ein oder aus<br />
ledset(0);<br />
}<br />
if(buttonstateextended(2)) {<br />
direction^=1; //Schaltet laufrichtung um<br />
}<br />
if(buttonstateextended(3)) {<br />
delay/=2;<br />
}<br />
if(buttonstateextended(4)) {<br />
delay*=2; //schneller<br />
}<br />
}<br />
}<br />
<br />
if(buttonstateextended(1)) {<br />
enable^=1; //Schaltet Blinklicht ein oder aus<br />
ledset(0);<br />
}<br />
}<br />
}<br />
<br />
</source><br />
----<br />
<br />
==Lösung zur Lauflicht-Aufgabe [UltraX8]==<br />
<source lang="c"><br />
/*****************************************************<br />
Project : ATmega168 - LED Sequence<br />
Version : 1.0.0.1<br />
Date : 25.08.2008<br />
Author : Group 2<br />
Company : C4<br />
Comments: <br />
<br />
Chip type : ATmega168<br />
Program type : Application<br />
Clock frequency : 20 MHz<br />
Memory model : Small<br />
External RAM size : 0<br />
Data Stack size : 256<br />
*****************************************************/<br />
<br />
/*****************************************************<br />
Possible instructions:<br />
mode_ex => The following modes are possible:<br />
0: left to right<br />
1: right to left<br />
2: sequence from array<br />
3: diagnostic mode (all LEDs 1)<br />
<br />
sequence_ex => Set a sequence as a non ending loop for ex.:<br />
1, 3, 4, 1, 3, 1, 2, 3,...<br />
<br />
delay_ex => Set the delay between the rotation in ms.<br />
*****************************************************/<br />
<br />
/* Include the header files here */<br />
#include <avr/io.h><br />
#include <util/delay.h><br />
<br />
/* Declare global variables here */<br />
uint8_t enable_ex = 1; // state of the moving light<br />
uint8_t mode_ex = 0; // running direction of LEDs or diagnostic mode (0-3)<br />
uint8_t sequence_ex[] = {1, 3, 4, 1, 3, 1, 2, 3}; // led sequence<br />
uint16_t delay_ex = 150; // delay in ms<br />
<br />
/* Needs the delay in ms */<br />
static void mydelay(uint16_t delay) {<br />
uint16_t i;<br />
for(i = 0; i <= delay; i++) //<br />
{<br />
_delay_loop_2(5000); // Wait for 5 000 cycles<br />
}<br />
}<br />
<br />
/* Needs the LED configuration */<br />
static void ledset(uint8_t led1, uint8_t led2, uint8_t led3, uint8_t led4) {<br />
if(led1){PORTC |= (1 << PC4);} // set the first LED<br />
else{PORTC &= ~(1 << PC4);}<br />
<br />
if(led2){PORTD |= (1 << PD3);} // set the second LED<br />
else{PORTD &= ~(1 << PD3);}<br />
<br />
if(led3){PORTD |= (1 << PD6);} // set the third LED<br />
else{PORTD &= ~(1 << PD6);}<br />
<br />
if(led4){PORTD |= (1 << PD7);} // set the fourth LED<br />
else{PORTD &= ~(1 << PD7);}<br />
}<br />
<br />
/* Checks the status of a button and antibeats it with a delay of 10ms */<br />
static uint8_t buttonstate(uint8_t button) {<br />
uint8_t state = (!(PINC &_BV(button - 1)));<br />
<br />
while(1) {<br />
if(state == (!(PINC&_BV(button - 1)))) {return state;}<br />
else {state = (!(PINC&_BV(button - 1)));}<br />
}<br />
}<br />
<br />
/* Checks the status of a button and waits until the button state is 0 */<br />
static uint8_t buttonstateextended(uint8_t button) {<br />
uint8_t state = buttonstate(button); // checks the button<br />
if(!(state)) {return 0;} // Ist der Button nicht gedrückt wird das sofort zurück gegeben.<br />
<br />
while(1) { // Warten auf das Loslassen des Buttons<br />
mydelay(5);<br />
if(PINC&_BV(button - 1)) {return state;} // Wir geben den letzten Zustand=Gedrückt noch zurück<br />
}<br />
}<br />
<br />
static void setoneled(uint8_t led) {<br />
switch (led) {<br />
case 1:<br />
ledset(1, 0, 0, 0); // power on LED1<br />
break;<br />
case 2:<br />
ledset(0, 1, 0, 0); // power on LED2<br />
break;<br />
case 3:<br />
ledset(0, 0, 1, 0); // power on LED3<br />
break;<br />
case 4:<br />
ledset(0, 0, 0, 1); // power on LED4<br />
break;<br />
}<br />
}<br />
<br />
static void led_control(uint8_t mode, uint8_t* sequence) {<br />
static uint8_t lastled; // includes the last LED with state 1<br />
static uint8_t array_position; // includes the last array position<br />
switch (mode) {<br />
case 0: // Downshift<br />
if(lastled == 4){lastled = 1;}else{lastled++;}<br />
setoneled(lastled);<br />
break;<br />
case 1: // Upshift<br />
if(lastled == 1){lastled = 4;}else{lastled--;}<br />
setoneled(lastled);<br />
break;<br />
case 2: // Sequence<br />
if(array_position == 7){array_position = 0;}else{array_position++;}<br />
setoneled(sequence[array_position]);<br />
break; <br />
case 3: // All LEDs 1 (diagnostic mode)<br />
ledset(1, 1, 1, 1);<br />
break;<br />
}<br />
}<br />
<br />
/* React on key down events */<br />
static void key_button(void) {<br />
if(buttonstateextended(1)) { // Enables or disables the moving light <br />
enable_ex ^= 1; // reverse enable_ex on<br />
ledset(0, 0, 0, 0); // disable the LEDs<br />
}<br />
<br />
if(buttonstateextended(2)) { // Changes the mode<br />
if(mode_ex == 3) {mode_ex = 0;} // The mode can not be greater than 3<br />
else {mode_ex++;} // Jump up to the next mode<br />
}<br />
<br />
if(buttonstateextended(3)) { // Speeds up the delay about 10ms<br />
delay_ex += 10; // delay + 10ms<br />
}<br />
<br />
if(buttonstateextended(4)) { // Drags the delay about 10ms<br />
delay_ex -= 10; // delay -10ms<br />
}<br />
}<br />
<br />
/* Entry Point */<br />
int main(void) {<br />
DDRC = _BV(PC4); // set PC4 as output (LED1)<br />
DDRD = _BV(PD3) | _BV(PD6) | _BV(PD7); // set PD3, PD6 and PD7 as output (LED2-LED4)<br />
<br />
DDRC &= ~(_BV(PC0) | _BV(PC1) | _BV(PC2) | _BV(PC3)); // set PC0 - PC3 as input (Button1-Button4)<br />
PORTC |= _BV(PC0) | _BV(PC1) | _BV(PC2) | _BV(PC3); // activate pull-up for PC0 - PC3 (Button1-Button4)<br />
<br />
while(1) // never-ending loop<br />
{<br />
if(enable_ex) {<br />
led_control(mode_ex, sequence_ex); // call led_control<br />
mydelay(delay_ex); // call mydelay<br />
}<br />
key_button(); // call key_button <br />
}<br />
}<br />
</source><br />
<br />
= Pimp my Rumpus =<br />
[[Image:rumpus-lcd.jpg]]<br />
== LCD ==<br />
Anschluss<br />
{| border="1" cellspacing="0" cellpadding="10" style="border-collapse:collapse;"<br />
!AVR Port !! Rumpus !! LCD Port<br />
|-<br />
| PB2 || ISP RST || DB4<br />
|-<br />
| PB3 || ISP MOSI || DB5<br />
|-<br />
| PB4 || ISP MISO || DB6<br />
|-<br />
| PB5 || ISP SCK || DB7<br />
|-<br />
| || ISP Vcc || Vcc<br />
|-<br />
| || ISP GND || GND, RW, (Kontrast)<br />
|-<br />
| PD6 || LED3 || RS<br />
|-<br />
| PD7 || LED4 || EN<br />
|}<br />
<br />
Es werden Vcc und GND ueber den 6 Pol ISP Header geholt, man kann also da alles gleichzeitig mit einem 6Poligen Pfostenstecker abholen.<br />
<br />
Als Kontrast Poti kann man das Rumpus Poti nehmen, oder einfach den Port des LCD auf GND legen. Vor die Hintergrundbeleuchtung gehoert dann noch ein passender Widerstand.<br />
<br />
== Temperatur Sensoren ==<br />
=== DS1820 ===<br />
Digital einlesen. Sourcen fuer Protokollimplementierung gibt es beim Etherrape Projekt. Benoetigt einen 2R7 pullup.<br />
=== KTY-81 110 ===<br />
Einlesen per ADC. Realisiert als Widerstandsspannungsteiler mit einem 0,1% 2R7 Metalfilmwiderstand.<br />
Schaltunggg + Formel:<br />
<br />
[http://www.sprut.de/electronic/pic/projekte/thermo/thermo.htm www.sprut.de]<br />
<br />
== Sensor fuer relative Luftfeuchtigkeit ==<br />
=== Philips H1 ===<br />
Einlesen digital, z.B. mit Timer, Signalform mit NE555 erstellt<br />
== Absolutdrucksensor ==<br />
=== Freescale MPX4115A ===<br />
Einlesen per ADC<br />
<br />
[[Category:U23 2008]]</div>
80.135.67.126