Forum: Mikrocontroller und Digitale Elektronik Suche bestimmte Arduino Funktion B01101011


von P. P. (firefighter112)


Lesenswert?

Hallo in die Runde,

Ich habe ein Problem. Ich habe leider ein Arduinosketch verloren, den 
ich jetzt neu Schreiben muss. Damals hatte ich Hilfe. Und haben eine 
Funktion genutzt, die sah so ähnlich aus:

Int LED=3;

PinMode(LED, OUTPUT);

LED B|0,1,1,0,1,1,0


Dies war dann sogesehen ein Blinken ohne Delay. Irgendwo war noch 
festgelegt, das jeder "kommaschritt" einen eingestellten Wert hatte. 
Jetzt mal zb 10ms.
Also war die LED 10ms aus. Dann 20ms an und wieder 10ms aus.

Ich benötige diese Funktion, da der Arduino nebenbei andere Sachen 
machen soll. Das blinken aber beibehalten soll


Diese Funktion benötige ich. Weiß weder Name noch was da noch alles 
zugehörte.

Ich hoffe irgendjemand weiß, was ich meine und kann mir Funktiobsname 
oder sogar ein Beispiel schreiben.

Vielen Dank und schönen Abend

: Verschoben durch Moderator
von Christian M. (Gast)


Lesenswert?

Sowas:

https://forum.arduino.cc/index.php?topic=441987.0

oder muss es

P. P. schrieb:
> jeder "kommaschritt" einen eingestellten Wert hatte

sein?

Gruss Chregu

von P. P. (firefighter112)


Lesenswert?

Leider muss es mit diesen einzelnen Kommerstellen sein. Da das 
Blinkmuster einen ungleichen Takt hat.

von Rene K. (xdraconix)


Lesenswert?

P. P. schrieb:
> Leider muss es mit diesen einzelnen Kommerstellen sein. Da das
> Blinkmuster einen ungleichen Takt hat.

Was hindert dich daran diese Funktion zu schreiben!? Bzw. was ist genau 
deine Frage eigentlich?

von P. P. (firefighter112)


Lesenswert?

Meine Frage ist, wie sich diese gemeinte Funktion nennt.
Was anderes kann und möchte ich ungern nutzen, da dieses Blinkmuster bzw 
verschiedene dieser Art parallel laufen könnrn und müssen. Da regelmäßig 
ein Wert abgefragt wird, kann es nicht zu umfangreich geschrieben werden

von Frank S. (_frank_s_)


Lesenswert?

P. P. schrieb:
> kann es nicht zu umfangreich geschrieben werden

Wer hindert dich, die Funktion zu schreiben?

MfG von der Spree
Frank

Beitrag #6160141 wurde von einem Moderator gelöscht.
Beitrag #6160157 wurde von einem Moderator gelöscht.
Beitrag #6160174 wurde von einem Moderator gelöscht.
Beitrag #6160182 wurde von einem Moderator gelöscht.
Beitrag #6160190 wurde von einem Moderator gelöscht.
von P. P. (firefighter112)


Lesenswert?

Danke für eure, leider teils sinnlosen, Kommentare.

Ich bin gelernter Elektroniker. Mein Arduino ist seit der Ausbildung nur 
sehr eingerostet. Braucht man in den wenigstem Firmen.

Array sieht sehr nach der gesuchten Funktion aus.
Muss mal rumprobieren.

Der Grund für diesen Weg damals war überschreiten des 
Programmspeicherplatzes. Am Programm hängt noch einiges mehr

von K. S. (the_yrr)


Lesenswert?

P. P. schrieb:
> Ich benötige diese Funktion, da der Arduino nebenbei andere Sachen
> machen soll. Das blinken aber beibehalten soll
dann brauchst du nen freien Timer, an den du ein Interrupt hängst.

> Dies war dann sogesehen ein Blinken ohne Delay. Irgendwo war noch
> festgelegt, das jeder "kommaschritt" einen eingestellten Wert hatte.
> Jetzt mal zb 10ms.
> Also war die LED 10ms aus. Dann 20ms an und wieder 10ms aus.
also stellst du den Timer so ein dass er ca. 10ms braucht bis zum 
Überlauf/TOP. CTC Modus, Vorteiler anpassen, TOP setzten sodass es ca. 
10ms gibt, ISR auf den Zählerüberlauf.

In der ISR zählst du dann eine Variable hoch (von 0 bis array Länge-1), 
und schreibst dann 1 oder 0 auf den Pin, je nachdem ob im Array an der 
Position halt 1 oder 0 steht. Diese variable muss entweder global und 
volatile sein (schlechtere Variante), oder aber in der ISR definiert und 
static (bessere Variante). wenn die Variable > Array Länge-1, dann wird 
sie wieder zu null.
Eine FOR Schleife, ein IF, beides mit 1-2 Zeile Code dahinter.
Nimm keinen Arduino Scheiß in der ISR (Digitalwrite oder wie der 
bullshit heißt, dauert Ewigkeiten), sondern schreib direkt und das 
passende PORT Register.

> Int LED=3;
das soll wohl den Pin definieren, besser wäre aber direkt ins PORT 
Register zu schreiben (und vorher DDR zu setzen).
> PinMode(LED, OUTPUT);
das wird die Initialisierung sein, die den Timer startet
> LED B|0,1,1,0,1,1,0
das sollte wohl mal ein Array werden, hat aber irgendwie so nicht 
geklappt.


jetzt bist du dran, das ist ja so gut wie schon geschrieben. Wenn das 
Grundgerüst steht meld dich wieder, dann gibts mehr Hilfe.


> Ich hoffe irgendjemand weiß, was ich meine und kann mir Funktiobsname
> oder sogar ein Beispiel schreiben.
Funktionsname gibts so nicht (soweit ich weiß), und schreiben werd ich 
dir nichts. so weit kommts ja noch, das Forum ist für Hilfe zur 
Selbsthilfe, nicht zum Vorkauen von 5 Zeilen einfachstem Code.

P. P. schrieb:
> Der Grund für diesen Weg damals war überschreiten des
> Programmspeicherplatzes. Am Programm hängt noch einiges mehr
welcher Speicherplatz, Flash oder RAM?
Wenn das Array sehr lang ist und RAM knapp, hilft ein Progmem attribut 
(wirds so ähnlich auch in Arduino geben, ich kenn nur C), dann bleibt 
das Array im Flash und wird nicht in den RAM geladen was auch unnötig 
ist wenn es sich nicht ändert.

: Bearbeitet durch User
von my2ct (Gast)


Lesenswert?

P. P. schrieb:
> Ich benötige diese Funktion, da der Arduino nebenbei andere Sachen
> machen soll.

Erstmal brauchst du ein vernünftiges Backup-System.

Als nächstes ein Buch o.w.a.i. mit elementaren Grundlagen von C.

array[] hat mit Funktionen nun wirlich nichts zu tun.

Beitrag #6160329 wurde von einem Moderator gelöscht.
von Michael M. (michael89)


Lesenswert?

Hallo,

suchst du sowas ?

int so_viel_wie_auch_immer = 10;    // Anzahl der Sequenz (array größe)
bool abfolge[so_viel_wie_auch_immer] = {0,1,1,0,1,1,0,1,1,0}; // Array 
das die Sequenz speichert

int zeahler=-1;                // zaehlvariable für array
bool timer=0;                  // Flag wenn 10ms erreicht sind
unsigned long millis_10ms = 0; // Vergleichswert für millis()

void setup(){

pinMode(LED,OUTPUT);


}

void loop(){

if(millis()-millis_10ms>=10){
   millis_10ms+=10;           // erhöht den Vergleichswert um 10
   timer=1;                   // Timer Flag, zeigt an das 10ms vorbei 
sind
}

if(timer){      // Auswertung der Flag
timer=0;        // Rücksetzen der Flag
zaehler++;      // Array Position
digitalWrite(LED,abfolge[zaehler]); // Pin für LED schalten jeh nach 
Sequenz
if(zaehler == (so_viel_wie_auch_immer-1) ) zaehler=-1; // Array auf 
Anfangswert setzen

}

}

Das ist bestimmt nicht die eleganteste Methode aber da du geschrieben 
hast es wär ähnlich aufgebaut wie das blink without delay ist der oben 
stehende Code dran angelegt.

Natürlich wär es besser sich mit Timer und Interrupts zu beschäftigen, 
aber um erstmal weiter zu kommen.

Viel Spaß.

: Bearbeitet durch User
von irgendjemand (Gast)


Lesenswert?

Michael M. schrieb:
> suchst du sowas ?
>
> int so_viel_wie_auch_immer = 10;    // Anzahl der Sequenz (array größe)
> ...

So würde es sogar der Compiler schlucken:
1
#define LED LED_BUILTIN
2
3
const int so_viel_wie_auch_immer = 10;    // Anzahl der Sequenz (array größe)
4
bool abfolge[so_viel_wie_auch_immer] = {0, 1, 1, 0, 1, 1, 0, 1, 1, 0}; // Array
5
6
int zaehler = -1;              // zaehlvariable für array
7
bool timer = 0;                // Flag wenn 10ms erreicht sind
8
unsigned long millis_10ms = 0; // Vergleichswert für millis()
9
10
void setup() {
11
  pinMode(LED, OUTPUT);
12
}
13
14
void loop() {
15
  if (millis() >= millis_10ms + 10) {
16
    millis_10ms += 10;          // erhöht den Vergleichswert um 10
17
    timer = 1;                  // Timer Flag, zeigt an das 10ms vorbei sind
18
  }
19
20
  if (timer) {                  // Auswertung der Flag
21
    timer = 0;                  // Rücksetzen der Flag
22
    zaehler++;                  // Array Position
23
    digitalWrite(LED, abfolge[zaehler]);           // Pin für LED schalten jeh nach Sequenz
24
    if (zaehler == (so_viel_wie_auch_immer - 1) )
25
      zaehler = -1;                                // Array auf Anfangswert setzen
26
  }
27
}

von Philipp K. (philipp_k59)


Lesenswert?

Also ich habe es  so verstanden, das ist einfach nicht genau genug 
erklärt/gefragt..
1
int led=7;
2
boolean ledstate=false;
3
int taktung[]={10,20,10,20,10,20};
4
void setup() {
5
  // put your setup code here, to run once:
6
pinMode(led, OUTPUT);
7
}
8
unsigned long lastswitch =millis();
9
int steps=0;
10
void loop() {
11
  // put your main code here, to run repeatedly:
12
unsigned long tempmillis =millis();
13
if(lastswitch+taktung[steps]>=tempmillis)
14
{
15
  ledstate=!ledstate;
16
  lastswitch=tempmillis;
17
  digitalWrite(led, ledstate);
18
  if(steps<5)
19
  steps++; else steps=0;
20
  
21
  }
22
23
}

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.