Vous n’êtes pas connecté.
![]() |
Code source |
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(); } |
![]() |
Code source |
1 2 3 |
... case '2': ... |
Ce message a été modifié 1 fois. Dernière modification effectuée par "Freakmaster" (27 juin 2009, 14:44)
Citation
if (!(PIND&(1<<PD0)))
{
pin1 = 1;
}
if (!(PIND&(1<<PD1)))
{
pin2 = 2;
}
if (!(PIND&(1<<PD2)))
{
pin3 = 4;
}
char mode = (pin1 + pin2 + pin3);
Citation
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;
}
Citation
void eineinhalb_hertz () //Blinken bei 1,5 Hz
{
PORTD ^= (1<< PD6);
_delay_ms(666);
}
Ce message a été modifié 3 fois. Dernière modification effectuée par "Freakmaster" (27 juin 2009, 16:00)
![]() |
Code source |
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![]()
![]() |
Code source |
1 |
char mode = (pin1 + pin2 + pin3); |
![]() |
Code source |
1 2 3 4 5 |
void eineinhalb_hertz ()//Blinken bei 1,5 Hz { PORTD ^= (1<< PD6); _delay_ms(666); } |
![]() |
Code source |
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); } |
Citation
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.
![]() |
Code source |
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.
![]() |
Code source |
1 |
uchar getDipSwitch(void); |
das ist niccht gerade übersichtlich was du da zusammprogrammierst.
ich würde das so machen:
![]()
Code source
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; }
![]() |
Code source |
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; } |
![]() |
Code source |
1 |
temp = (!PIND)&(DIP1|DIP2|DIP3); |
Ce message a été modifié 2 fois. Dernière modification effectuée par "Clark" (29 juin 2009, 08:29)
![]() |
Code source |
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) |
Ce message a été modifié 1 fois. Dernière modification effectuée par "hurra" (29 juin 2009, 09:04)
Sollte man bei defines nicht sogar immer ne Klammer um den Gesamtausdruck machen?
![]()
Code source
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.
![]() |
Code source |
1 |
#define DIP1IN ((!PIND)&DIP1) |
![]() |
Code source |
1 |
#define DIP1IN (!PIND&DIP1) |
![]() |
Code source |
1 2 3 |
#define DIP1IN !PIND&DIP1 int x = 5+ DIP1IN * 7; |
![]() |
Code source |
1 |
5+!PIND&DIP1*7 |
![]() |
Code source |
1 |
(5+(!PIND))&(DIP1*7) |
Citation
#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);
Citation
if(dip1in)
temp |= dip1val;
if(dip2in)
temp |= dip2val;
if(dip3in)
temp |= dip3val;
Citation
switch(temp){
case 0:
break;
case 1:
break;
...
}
Ce message a été modifié 8 fois. Dernière modification effectuée par "Freakmaster" (29 juin 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?)
Citation
Citation
#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)
Citation
Citation
#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:
Citation
if(dip1in)
temp |= dip1val;
if(dip2in)
temp |= dip2val;
if(dip3in)
temp |= dip3val;
![]() |
Code source |
1 |
temp = (!PIND)&(DIP1|DIP2|DIP3); |
Citation
Der switch/case schaut dann so aus:
Citation
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...
Ce message a été modifié 1 fois. Dernière modification effectuée par "Clark" (29 juin 2009, 11:01)
es gibt so ca. hunderte von Konventionen.
sicher, dass active low aktiv ist?
![]() |
Code source |
1 2 |
portregister &= ~(1<<pin_active)[...]; //Pins als Eingänge port |= (1<<pin_active)[...]; //pull-up Widerstände einschalten |
Citation
Ich würde dir die Variante empfehlen, die ich oben geschrieben habe, sie ist a) schneller b) für den Prozessor "angenehmer"
![]()
Code source
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.
Ce message a été modifié 1 fois. Dernière modification effectuée par "Freakmaster" (29 juin 2009, 12:08)
-