Forum: Mikrocontroller und Digitale Elektronik LEDs via Dave3 blinken lassen


von Neu (Gast)


Lesenswert?

Hallo zusammen,

ich bin am Anfang meines Studiums und bin gerade dabei ein Board der XMC 
4000er Familie mithilfe von Dave3 zu programmieren.Also bin ich noch
Jetzt zu meiner Frage:
Auf dem Board sind 2 LEDs drauf die ich beide zum blinken bringen 
möchte.
Eine LED ist kein Problem und die zweite nur zum Dauerleuchten zu 
bringen auch nicht.Doch das beide blinken,bekomme ich nicht hin.
Ich habe dazu 3 Apps mit denen es eigentlich möglich sein sollte:
IO004,PWMSP001,NVIC002.
Jetzt stellt sich die Frage, wie ich diese Apps richtig verknüpfe?
Wenn jmd mit Dave Erfahrung hat und diese womöglich lächerliche Frage 
beantworten kann, wäre ich dankbar.

Grüße

Neu

: Verschoben durch Moderator
von DaveTester (Gast)


Lesenswert?

Wenn du was lernen willst, lässt du besser die Finger von den DaveApps. 
Ich arbeite gerade beruflich damit und kann jedem nur abraten davon. 
Infineon´s Marketing Abteilung hat hier ganze Arbeit geleistet...

von Neu (Gast)


Lesenswert?

Problem ist nur,dass im Internet kaum etwas zu DAVE steht und ich mehr 
oder weniger auf die Apps angewiesen bin, da ich bislang noch ein 
Anfänger in C bin.

von Peter D. (peda)


Lesenswert?

Neu schrieb:
> Auf dem Board sind 2 LEDs drauf die ich beide zum blinken bringen
> möchte.

Um 2 LEDs unabhängig blinken zu lassen, gibt es verschiedene Ansätze:

- 2 Statemachines
- 2 Timerinterrupts
- Scheduler
- Multitasking-OS

Keine Ahnung, was davon Dave realisieren kann.

von Neu (Gast)


Lesenswert?

Ich habe es so versucht:

Eine LED habe ich mithilfe von PWM zum blinken gebracht.Sein Signal habe 
ich mit einem Interrupt verknüpft, mit dem ich versuche die 2te LED ein- 
und auszuschalten.
Jedoch lässt sich die 2te LED,die mithilfe einer IO App läuft nicht mit 
dem dem Interrupt verbinden,zumindest mit meinem Wissensstand.
Ich habe versucht eine Schleife zu schreiben:

for(int i=0;i<10000;i++){
    if(i%2000==0){
      IO004_TogglePin(IO004_Handle0);
    }
    else{
      IO004_ResetPin(IO004_Handle0);
    }
    }

hier habe ich versucht die LED bei verschiedenen Werten von i leuchten 
zu lassen und ansonsten zu reseten,damit eine Art blinken erzeugt wird.
Doch sie wird nur gedimmt,was für mich heißt dass die Frequenz viel zu 
hoch ist...Jedoch habe ich keine Ahnung wie ich diese drosseln kann.

von Martin H. (marrtn)


Lesenswert?

Du schaltest zwar ab und zu ein (i==0, 2000, 4000, ...), aber auch 
sofort wieder aus (z.B. bei i==1).
Wirf einfach das "IO004_ResetPin" raus, dann wird alle 2000 Durchläufe 
umgeschalten. Die Blinkfrequenz wird durch die 2000 vorgegeben.

Ich habe den Code mal ein bisschen modifiziert:
1
static int i = 0;
2
if(i%2000==0)
3
{
4
  IO004_TogglePin(IO004_Handle0);
5
}
6
i++;

[edit] Ich habe jetzt erst Interrupt gelesen und den Code etwas 
modifiziert... [/edit]

von Neu (Gast)


Lesenswert?

Danke für die Antwort.Doch komischweise leuchtet die LED jetzt einfach 
durch^^.
Liegt das womöglich daran,dass ich die LED mithilfe einer IO App 
angesteuert habe?Und hier irgendwelche Probleme zwischen Quellcode und 
App auftreten?
Wobei noch gesagt werden sollte, dass die App alleine die LED nicht zum 
leuchten gebracht hat,sondern erst mit dem Befehl 
"IO004_TogglePin(IO004_Handle0);" in der main.

von Peter D. (peda)


Lesenswert?

Warum immer so kompliziert?

Hier das Beispiel mit 2 Statemachines auf dem AVR:
1
#define F_CPU   1e6             // 1MHz
2
#include <util/delay.h>
3
#include "sbit.h"
4
5
#define LED0    PORT_B0
6
#define LED0_oe DDR_B0
7
#define LED1    PORT_B1
8
#define LED1_oe DDR_B1
9
10
void statemachine0()
11
{
12
  static int state = 0;
13
14
  switch( ++state ){
15
    case 150: LED0 = 1;
16
              break;
17
    case 300: LED0 = 0;
18
              state = 0;
19
              break;
20
  }
21
}
22
23
void statemachine1()
24
{
25
  static int state = 0;
26
27
  switch( ++state ){
28
    case 400: LED1 = 1;
29
              break;
30
    case 800: LED1 = 0;
31
              state = 0;
32
              break;
33
  }
34
}
35
36
int main()
37
{
38
  LED0_oe = 1;                  // output
39
  LED1_oe = 1;                  // output
40
  for(;;){
41
    _delay_us( 1000 );          // 1ms time base
42
43
    statemachine0();
44
    statemachine1();
45
  }
46
}

von Karl H. (kbuchegg)


Lesenswert?

Peter Dannegger schrieb:
> Warum immer so kompliziert?

Weil alle immer glauben, dass es am sinnvollsten als Anfänger ist, wenn 
man sich gleich mal mit einem entsprechendem Framework umgibt, welches 
das Lernen der Programmierung bzw. einer Programmiersprache unnötig 
macht.

Die Wahrheit ist genau anders rum. Kennt man erst mal eine 
Programmiersprache bzw. kann konventionell programmieren, dann sind 
Frameworks eine Erleichterung und man versteht auch, wie und warum 
manche Dinge im Framework genau so gelöst sind und nicht anders. Ohne 
die 'klassischen Vorkenntnisse' hingegen steht man da wie der Ochs vorm 
Tor, weil nichts Sinn zu ergeben scheint und man die Querverbindungen 
innerhalb des Frameworks nicht versteht.

Die Industrie tut dann natürlich noch das Übrige dazu, indem sie diese 
Systeme anpreist wie geschnitten Brot. Die wollen ihr Zeug ja 
schliesslich auch verkaufen.

von Neu (Gast)


Lesenswert?

#include <util/delay.h>
#include "sbit.h"

können in dave3 nicht eingebunden werden,somit kann ich diesen 
Quelltext(auch wenn er richtig ist) nicht verwenden^^

von Peter D. (peda)


Lesenswert?

Neu schrieb:
> können in dave3 nicht eingebunden werden

Natürlich nicht.
Portzugriffe und Delay sind keine C Standardfunktionen, da kocht jeder 
Compilerhersteller sein eigenes Süppchen.
Die mußt Du also durch entsprechende Funktionen Deines Compilers 
ersetzen.
Ich denke aber, man erkennt leicht, was die Funktionen wie "LED0 = 1" 
usw. tun sollen.

Ich wollte auch nur das Prinzip einer Statemachine verdeutlichen, d.h. 
gerade kein gedankenloses Abkupfern.

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
Noch kein Account? Hier anmelden.