Sie sind nicht angemeldet.
![]() |
Quellcode |
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(); } |
![]() |
Quellcode |
1 2 3 |
... case '2': ... |
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Freakmaster« (27. Juni 2009, 14:44)
Zitat
if (!(PIND&(1<<PD0)))
{
pin1 = 1;
}
if (!(PIND&(1<<PD1)))
{
pin2 = 2;
}
if (!(PIND&(1<<PD2)))
{
pin3 = 4;
}
char mode = (pin1 + pin2 + pin3);
Zitat
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;
}
Zitat
void eineinhalb_hertz () //Blinken bei 1,5 Hz
{
PORTD ^= (1<< PD6);
_delay_ms(666);
}
Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »Freakmaster« (27. Juni 2009, 16:00)
![]() |
Quellcode |
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![]()
![]() |
Quellcode |
1 |
char mode = (pin1 + pin2 + pin3); |
![]() |
Quellcode |
1 2 3 4 5 |
void eineinhalb_hertz ()//Blinken bei 1,5 Hz { PORTD ^= (1<< PD6); _delay_ms(666); } |
![]() |
Quellcode |
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); } |
Zitat
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.
![]() |
Quellcode |
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.
![]() |
Quellcode |
1 |
uchar getDipSwitch(void); |
das ist niccht gerade übersichtlich was du da zusammprogrammierst.
ich würde das so machen:
![]()
Quellcode
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; }
![]() |
Quellcode |
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; } |
![]() |
Quellcode |
1 |
temp = (!PIND)&(DIP1|DIP2|DIP3); |
Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Clark« (29. Juni 2009, 08:29)
![]() |
Quellcode |
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) |
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »hurra« (29. Juni 2009, 09:04)
Sollte man bei defines nicht sogar immer ne Klammer um den Gesamtausdruck machen?
![]()
Quellcode
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.
![]() |
Quellcode |
1 |
#define DIP1IN ((!PIND)&DIP1) |
![]() |
Quellcode |
1 |
#define DIP1IN (!PIND&DIP1) |
![]() |
Quellcode |
1 2 3 |
#define DIP1IN !PIND&DIP1 int x = 5+ DIP1IN * 7; |
![]() |
Quellcode |
1 |
5+!PIND&DIP1*7 |
![]() |
Quellcode |
1 |
(5+(!PIND))&(DIP1*7) |
Zitat
#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);
Zitat
if(dip1in)
temp |= dip1val;
if(dip2in)
temp |= dip2val;
if(dip3in)
temp |= dip3val;
Zitat
switch(temp){
case 0:
break;
case 1:
break;
...
}
Dieser Beitrag wurde bereits 8 mal editiert, zuletzt von »Freakmaster« (29. Juni 2009, 10:50)
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?)
Zitat
Zitat
#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)
Zitat
Zitat
#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:
Zitat
if(dip1in)
temp |= dip1val;
if(dip2in)
temp |= dip2val;
if(dip3in)
temp |= dip3val;
![]() |
Quellcode |
1 |
temp = (!PIND)&(DIP1|DIP2|DIP3); |
Zitat
Der switch/case schaut dann so aus:
Zitat
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...
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Clark« (29. Juni 2009, 11:01)
es gibt so ca. hunderte von Konventionen.
sicher, dass active low aktiv ist?
![]() |
Quellcode |
1 2 |
portregister &= ~(1<<pin_active)[...]; //Pins als Eingänge port |= (1<<pin_active)[...]; //pull-up Widerstände einschalten |
Zitat
Ich würde dir die Variante empfehlen, die ich oben geschrieben habe, sie ist a) schneller b) für den Prozessor "angenehmer"
![]()
Quellcode
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.
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Freakmaster« (29. Juni 2009, 12:08)
-