You are not logged in.
Dear visitor, welcome to Aqua Computer Forum. If this is your first visit here, please read the Help. It explains how this page works. You must be registered before you can use all the page's features. Please use the registration form, to register here or read more information about the registration process. If you are already registered, please login here.
![]() |
Source code |
1 2 3 4 5 6 7 8 9 10 11 12 13 |
int mode = 1; switch ( mode ) { case 1: mode_1(); case 2: mode_2(); case 3: mode_3(); default: mode_0(); } |
![]() |
Source code |
1 2 3 |
... case '2': ... |
This post has been edited 1 times, last edit by "Freakmaster" (Jun 27th 2009, 2:44pm)
Quoted
if (!(PIND&(1<<PD0)))
{
pin1 = 1;
}
if (!(PIND&(1<<PD1)))
{
pin2 = 2;
}
if (!(PIND&(1<<PD2)))
{
pin3 = 4;
}
char mode = (pin1 + pin2 + pin3);
Quoted
switch ( mode )
{
case 0:
dauerleuchten(); //funktioniert
break;
case 1:
eineinhalb_hertz();//funktioniert nicht - läuft mit 3 hertz
break;
case 2:
drei_hertz(); //funktioniert nicht - läuft mit 5 hertz
break;
case 3:
fuenf_hertz(); //funktioniert nicht - läuft mit 20 hertz
break;
case 4:
fuenf_hertz_blink(); //funktioniert nicht - führt 1 aus
break;
case 5:
zwanzig_hertz(); //kann ich grad nicht testen
break;
case 6:
vierzig_hertz(); //funktioniert nicht - führt 1 aus
break;
default:
PORTD &= ~(1<< PD6);
break;
}
Quoted
void eineinhalb_hertz () //Blinken bei 1,5 Hz
{
PORTD ^= (1<< PD6);
_delay_ms(666);
}
This post has been edited 3 times, last edit by "Freakmaster" (Jun 27th 2009, 4:00pm)
![]() |
Source code |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
#define DIP1 0x01 #define DIP2 0x02 #define DIP3 0x04 #define DIP1IN !(PIND&DIP1) #define DIP2IN !(PIND&DIP2) #define DIP3IN !(PIND&DIP3) #define MODE1 (DIP1&DIP2) #define MODE2 (DIP1) #define MODE3 (DIP3&DIP1) uchar temp=0; if(DIP1IN) temp |= DIP1; if(DIP2IN) temp |= DIP2; if(DIP3IN) temp |= DIP3; switch(temp){ case MODE1: break; } |
Das war auch nicht böse gemeint, aber versuche immer so zu Programmieren das Code für sich sebst spricht. Also Kommentare mehr oder weniger bei den einfachen sachen überflüssig sind.ich lerns ja auch gerade erst![]()
![]() |
Source code |
1 |
char mode = (pin1 + pin2 + pin3); |
![]() |
Source code |
1 2 3 4 5 |
void eineinhalb_hertz ()//Blinken bei 1,5 Hz { PORTD ^= (1<< PD6); _delay_ms(666); } |
![]() |
Source code |
1 2 3 4 5 6 7 8 9 10 |
//LED #define LED_PORT PORTD #define LED 6 #define ledToggle() LED_PORT ^= (1<<LED) void eineinhalb_hertz ()//Blinken bei 1,5 Hz { ledToggle(); _delay_ms(666); } |
Quoted
Function Documentation
void _delay_ms ( double __ms )
Perform a delay of __ms milliseconds, using _delay_loop_2().
The macro F_CPU is supposed to be defined to a constant defining the CPU clock frequency (in Hertz).
The maximal possible delay is 262.14 ms / F_CPU in MHz.
![]() |
Source code |
1 2 3 4 5 6 |
void delayms(uint time) { while(time){ time--; _delay_ms(1); } |
Das war auch nicht böse gemeint,...ich lerns ja auch gerade erst![]()
Also defines wirken sich nicht auf die Performance aus. Beim Kompilieren werden die defines sozusagen ersetzt.
Echte Funktionen dagegen können soweit ich weiß schon Performance kosten. Allerdings ist das denk ich bei dir im Moment sowas von vernachlässigbar. Versuch doch erstmal mit nem Timer zu arbeiten, anstelle von den sleeps.
![]() |
Source code |
1 |
uchar getDipSwitch(void); |
das ist niccht gerade übersichtlich was du da zusammprogrammierst.
ich würde das so machen:
![]()
Source code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 #define DIP1 0x01 #define DIP2 0x02 #define DIP3 0x04 #define DIP1IN !(PIND&DIP1) #define DIP2IN !(PIND&DIP2) #define DIP3IN !(PIND&DIP3) #define MODE1 (DIP1&DIP2) #define MODE2 (DIP1) #define MODE3 (DIP3&DIP1) uchar temp=0; if(DIP1IN) temp |= DIP1; if(DIP2IN) temp |= DIP2; if(DIP3IN) temp |= DIP3; switch(temp){ case MODE1: break; }
![]() |
Source code |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
#define DIP1 0x01 #define DIP2 0x02 #define DIP3 0x04 #define DIP1IN (!PIND)&DIP1 #define DIP2IN (!PIND)&DIP2 #define DIP3IN (!PIND)&DIP3 #define MODE1 (DIP1&DIP2) #define MODE2 (DIP1) #define MODE3 (DIP3&DIP1) uchar temp = DIP1IN | DIP2IN | DIP3IN; switch(temp){ case MODE1: break; } |
![]() |
Source code |
1 |
temp = (!PIND)&(DIP1|DIP2|DIP3); |
This post has been edited 2 times, last edit by "Clark" (Jun 29th 2009, 8:29am)
![]() |
Source code |
1 2 3 4 5 6 7 |
#define DIP1 (0x01) #define DIP2 (0x02) #define DIP3 (0x04) #define DIP1IN ((!PIND)&DIP1) #define DIP2IN ((!PIND)&DIP2) #define DIP3IN ((!PIND)&DIP3) |
This post has been edited 1 times, last edit by "hurra" (Jun 29th 2009, 9:04am)
Sollte man bei defines nicht sogar immer ne Klammer um den Gesamtausdruck machen?
![]()
Source code
1 2 3 4 5 6 7 #define DIP1 (0x01) #define DIP2 (0x02) #define DIP3 (0x04) #define DIP1IN ((!PIND)&DIP1) #define DIP2IN ((!PIND)&DIP2) #define DIP3IN ((!PIND)&DIP3)
E: Ahh, hab gerade nochmal nachgelesen. Das macht eigentlich nur bei Makros mit Parametern Sinn.
![]() |
Source code |
1 |
#define DIP1IN ((!PIND)&DIP1) |
![]() |
Source code |
1 |
#define DIP1IN (!PIND&DIP1) |
![]() |
Source code |
1 2 3 |
#define DIP1IN !PIND&DIP1 int x = 5+ DIP1IN * 7; |
![]() |
Source code |
1 |
5+!PIND&DIP1*7 |
![]() |
Source code |
1 |
(5+(!PIND))&(DIP1*7) |
Quoted
#define port PORTD
#define pin PIND
#define pin_dip1 0x01 //PD0
#define pin_dip2 0x02 //PD1
#define pin_dip3 0x04 //PD2
#define pin_active 0x08 //PD3
#define pin_led 0x20 //PD5
#define dip1val 1 //wert von dip1 (1)
#define dip2val 2 //wert von dip2 (2)
#define dip3val 4 //wert von dip3 (4)
#define dip1in (!(pin)&pin_dip1)
#define dip2in (!(pin)&pin_dip2)
#define dip3in (!(pin)&pin_dip3)
#define active (!(pin)&pin_active)
#define led_toggle() port ^= (1<<pin_led);
#define led_off() port &= ~(1<<pin_led);
#define led_on() port |= (1<<pin_led);
Quoted
if(dip1in)
temp |= dip1val;
if(dip2in)
temp |= dip2val;
if(dip3in)
temp |= dip3val;
Quoted
switch(temp){
case 0:
break;
case 1:
break;
...
}
This post has been edited 8 times, last edit by "Freakmaster" (Jun 29th 2009, 10:50am)
So! Hier nochmal überarbeitet - ich hasse es, wenn ich code einfach so tippen muss und ihn nicht ausprobieren kann ;D
Ich habs jetzt mal die PINs und die Werte der DIPs aufgetrennt um das ganze etwas übersichtlicher und portabel vom experimentierboard auf die fertige Platine zu machen:
(gibt es bei C eigentlich eine Konvention, dass man Variablen komplett groß, klein oder sonstirgendwie schreibt?)
Quoted
Quoted
#define port PORTD
#define pin PIND
#define pin_dip1 0x01 //PD0
#define pin_dip2 0x02 //PD1
#define pin_dip3 0x04 //PD2
#define pin_active 0x08 //PD3
#define pin_led 0x20 //PD5
#define dip1val 1 //wert von dip1 (1)
#define dip2val 2 //wert von dip2 (2)
#define dip3val 4 //wert von dip3 (4)
#define dip1in (!(pin)&pin_dip1)
#define dip2in (!(pin)&pin_dip2)
#define dip3in (!(pin)&pin_dip3)
#define active (!(pin)&pin_active)
Quoted
Quoted
#define led_toggle() port ^= (1<<pin_led);
#define led_off() port &= ~(1<<pin_led);
#define led_on() port |= (1<<pin_led);
Die Abfrage habe ich vom Sebastian übernommen:
Quoted
if(dip1in)
temp |= dip1val;
if(dip2in)
temp |= dip2val;
if(dip3in)
temp |= dip3val;
![]() |
Source code |
1 |
temp = (!PIND)&(DIP1|DIP2|DIP3); |
Quoted
Der switch/case schaut dann so aus:
Quoted
switch(temp){
case 0:
break;
case 1:
break;
...
}
Aktuell les ich mich grad in Timer und interrupts ein um die _delay_ms(); rauswerfen zu können...
This post has been edited 1 times, last edit by "Clark" (Jun 29th 2009, 11:01am)
es gibt so ca. hunderte von Konventionen.
sicher, dass active low aktiv ist?
![]() |
Source code |
1 2 |
portregister &= ~(1<<pin_active)[...]; //Pins als Eingänge port |= (1<<pin_active)[...]; //pull-up Widerstände einschalten |
Quoted
Ich würde dir die Variante empfehlen, die ich oben geschrieben habe, sie ist a) schneller b) für den Prozessor "angenehmer"
![]()
Source code
1 temp = (!PIND)&(DIP1|DIP2|DIP3);
das reduziert die gesamte rechenlast an der Stelle auf ein einziges nicht und eine binäre und verknüpfung.
This post has been edited 1 times, last edit by "Freakmaster" (Jun 29th 2009, 12:08pm)
-