Hallo an alle ! erstmal kurze Vorstellung - bin Finn. Hab mir STK500 zugelegt und probiere seit zwei Wochen in µC Welt und C Programmierung mich einzuarbeiten. Habe LED´s schon einzel zum leuchten gebracht und mit Taster Ansteuerung. ABER hier komme ich echt nicht mehr weiter... Ich möchte gerne 3 Tasterabfragen programmieren. Mit folgenden Bedingungen: Bei erstem drücken des Taster 1 - Blinkt LED 1. und LED 2 geht aus Bei erstem drücken des Taster 2 - Blinkt LED 2. und LED 1 geht aus Bei zweitem drücken des Tasters 1 - geht LED 1 aus. Bei zweitem drücken des Tasters 2 - geht LED 2 aus. Mit dem 3ten Taster sollen 3 LED´s nach einander geschaltet werden (das Klappt soweit) Habe viel hier im Forum gelesen - und denke mal es muss mit einem 2ten Timer irgendwie realesierbar sein. das Programm was ich zusammengestellt habe(mit Hilfe der Beispielprogramme). Bringt die LED1 und 2 zum leuchten. Für euch ist es sicherlich kein großes Problem mir mit dem Programm zu helfen. Wie gesagt - die LED1 und LED2 sollen blinken. Ich komm einfach nicht mehr weiter... Danke schon mal für die Hilfe und jeden Tip !
finn N. schrieb: > Danke schon mal für die Hilfe und jeden Tip ! Erstmal sieht dein Programm hervorragend aus. Rein optisch. Wie fürs Lehrbuch. Die Timerkonfiguration ist allerdings suboptimal. Ich will jetzt nicht Murks sagen. Im Moment ist das auch Jammern auf gehobenem Niveau. Guck dir im Tutorial mal den CTC-Mode an. Einen Timer hast du ja schon. In diesem lässt du eine Variable zählen, rauf oder runter ist Geschmackssache.
1 | #define BLINK_INTERVAL 50
|
2 | volatile uint8_t blink = 0; |
3 | uint8_t blinkLed0 = 0; |
4 | uint8_t blinkLed1 = 0; |
5 | |
6 | ISR(TIMER...) |
7 | {
|
8 | static uint8_t count = 0; |
9 | ...
|
10 | count++; |
11 | if(count == BLINK_INTERVAL) |
12 | {
|
13 | count = 0; |
14 | blink = 1; |
15 | }
|
16 | ...
|
17 | }
|
18 | |
19 | int main(void) |
20 | {
|
21 | ...
|
22 | while(1) |
23 | {
|
24 | ...
|
25 | if(blink) |
26 | {
|
27 | blink = 0; |
28 | if(blinkLed0) LED_PORT ^= (1 << LED0); |
29 | if(blinkLed1) LED_PORT ^= (1 << LED1); |
30 | }
|
31 | ...
|
32 | }
|
33 | ...
|
34 | }
|
Eine Möglichkeit von vielen. Mit den Tastern setzt du blinkLed0 und blinkLed1 entsprechend auf 0 oder 1 und die eine oder andere oder beide Leds blinken. Statt die Led direkt einzuschalten, setzt du jetzt die entsprechende Blinkvariable. Beim Um- und Abschalten musst du noch dafür sorgen, daß die Led ausgeschaltet wird: LED_PORT &= ~(1 << LEDx);. mfg.
Hallo Finn, Habe mir dein Problem mehrmals durchlesen müssen. Kann soweit keinen Fehler erkennen. Müsste eigentlich soweit funktionieren. Vielleicht wäre es noch sinnvoll, deine IF-Verweisung in eine partielle struc-abfrage zu integrieren. sollte eigentlich relativ leicht sein. Vielleicht fällt anderen Forumsmitgliedern ja noch ne andere Lösung ein.
finn N. schrieb: > Wie gesagt - die LED1 und LED2 sollen blinken. Ich komm einfach > nicht mehr weiter... Nun da gibt es viele Möglichkeiten. Z.B. Du erzeugst Dir erstmal einen Takt:
1 | volatile uint8_t tick_10ms; |
2 | |
3 | ISR( TIMER0_OVF_vect ) // every 10ms |
4 | {
|
5 | static uint8_t ct0, ct1, rpt; |
6 | uint8_t i; |
7 | |
8 | TCNT0 = (uint8_t)(int16_t)-(F_CPU / 1024 * 10e-3 + 0.5); // preload for 10ms |
9 | tick_10ms = 1; |
10 | // ..
|
Und dann brauchst Du noch 2 Flags, um das Blinken einzuschalten:
1 | uint8_t blink_on0, blink_on1; |
Dann die Blinkroutinen:
1 | void blink0() |
2 | {
|
3 | static uint8_t tick = 0; |
4 | |
5 | switch( tick++ ){ |
6 | case 50: LED_PORT |= 1<<LED0; // after 500ms |
7 | break; |
8 | case 100: LED_PORT &= ~(1<<LED0); |
9 | tick = 0; |
10 | }
|
11 | }
|
Und dann nur noch im Main aufrufen:
1 | // ..
|
2 | while(1){ |
3 | if( tick_10ms ){ |
4 | tick_10ms = 0; |
5 | if( blink_on0 ) |
6 | blink0(); // blink |
7 | else
|
8 | LED_PORT &= ~(1<<LED0); // off |
9 | // ..
|
10 | }
|
11 | // und die Tasten auswerten:
|
12 | if( get_key_press( 1<<KEY0 )){ |
13 | blink_on0 = !blink_on0; |
14 | blink_on1 = 0; |
15 | }
|
16 | // ..
|
17 | }
|
UAU das ging ja flot ! ! ! 1A ! Vielen Vielen Dank !) Habe jetzt das Programm verbessert ! Funktioniert soweit wie es soll ! Zur Verbesserung des Ganzen: - beim Taster 1 drücken soll nur die LED1 blinken - beim Taster 2 drücken soll nur die LED2 blinken im Moment ist es so das ich die unabhängig von einander Blinken lassen kann. Nochmal zur Verdeutlichung - was ich vor habe Taster 1 betätigt -->LED1 Blinkt, LED2 Aus ->danach Taster 2 betätigt-->LED1 Aus, LED2 Blinkt -> nochmal Taster 2 --> LED1 Aus, LED2 Aus (und umgekehrt) ich vermute das es nur eine Zeile im jeweiligen "Blinkprogramm" ist -> das das andere "Blinkprogramm" ausschaltet... aber wie genau das funktioniert..... das suche ich seit gestern Nacht... Dankbar für weitere Vorschläge... void blink0() { static uint8_t tick = 0; switch( tick++ ){ case 10: LED_PORT &= ~(1<<LED0); //an // after 100ms break; case 20: LED_PORT |= 1<<LED0; //aus tick = 0; } } void blink1() { static uint8_t tick = 0; switch( tick++ ){ case 10: LED_PORT &= ~(1<<LED1); //an // after 100ms break; case 20: LED_PORT |= 1<<LED1; //aus tick = 0; } } oder das komplette Programm rein stellen?
finn N. schrieb: > oder das komplette Programm rein stellen? Was denkst Du? Dann aber als Anhang. Ist Dir klar, was blink0, blink1 machen? Werten sie die Tasten aus? Nein. Sie sollen nur das Blinken ohne Blockierung der Mainloop machen. Die Bedienlogik muß also in die get_key_press Bearbeitung hinein und nur dort.
Peter Dannegger schrieb: > Die Bedienlogik muß also in die get_key_press Bearbeitung hinein und nur > dort. Hast recht ! Jetzt läuf´s ! Danke !!! :)
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.