Grüßt euch, ich brauche malwieder eure Hilfe. Ich habe einen Arduino Uno und möchte ihn dazu vergewaltigen, 2 unterschiedliche Prozesse gleichzeitig zu bearbeiten. Ich weiß, dass das prinzipiell nicht vorgesehen ist, aber es gibt wohl Wege und Möglichkeiten, den Arduino dazu zu bringen. Hier mal 2 Links. Leider verstehe ich die Befehle nicht so ganz. http://www.vielsichtig.de/index.php?id=120 http://www.arduinoforum.de/arduino-Thread-zwei-Befehle-paralell Zum Ziel: Ich möchte gleichzeitig einen Servo ansteuern und über den digitalen Ausgang ein Rechtecksignal in verschiedenen Frequenzen ausgeben. Der Servo soll ein Programm ablaufen (langsam hin und herschwenken, dann aufhören) und das per Taster starten. Das Rechtecksignal soll über einen Drehschalter 6 verschiedene Frequenzen erzeugen. Die beiden Programme einzeln funktionieren schon, nur leider weiß ich nicht, wie ich sie verbinden kann. Ich weiß, dass ich auf jeden Fall "delay" aus dem Programm verbannen muss und stattdessen mit "millis" arbeiten muss. Hat einer einen Tipp, wie ich das alles bewerkstelligen kann? Hier mal die Quelltexte der einzelnen Programme: Servo: #include <Servo.h> Servo servo1; const int Taster = 2; const int LedPin = 13; void setup() { pinMode(Taster, INPUT); pinMode(LedPin, OUTPUT); servo1.attach(9); } void loop() { int druck; druck = digitalRead(Taster); int position; if (druck == HIGH) { digitalWrite(LedPin, LOW); //dient nur der Kontrolle for(position = 0; position < 180; position += 20) { servo1.write(position); delay(500); } for(position = 180; position >= 0; position -= 20) { servo1.write(position); delay(500); } } else { digitalWrite(LedPin, HIGH); servo1.write(0); } } Rechteck: Ich weiß, dass man die Taster über Indizes zusammenfassen kann und den Text somit kürzen und übersichtlicher machen kann. Darum gehts erstmal nicht. Mir gefällt die einzelne Abfage in jedem Ablauf nicht. Wie kann ich die Abfrage vereinfachen? Mit Unterprogrammen? const int Taste1 = 2; const int Taste2 = 3; const int Taste3 = 4; const int Taste4 = 5; const int Taste5 = 6; const int Taste6 = 7; const int LedPin = 13; void setup() { pinMode (Taste1, INPUT); pinMode (Taste2, INPUT); pinMode (Taste3, INPUT); pinMode (Taste4, INPUT); pinMode (Taste5, INPUT); pinMode (Taste6, INPUT); pinMode (LedPin, OUTPUT); //nur zum Testen } void loop() { if (digitalRead (Taste1)== LOW){ digitalWrite (LedPin, HIGH); delay (100); digitalWrite (LedPin, LOW); delay (1100);} if (digitalRead (Taste2)== LOW){ digitalWrite (LedPin, HIGH); delay (100); digitalWrite (LedPin, LOW); delay (650);} if (digitalRead (Taste3)== LOW){ digitalWrite (LedPin, HIGH); delay (100); digitalWrite (LedPin, LOW); delay (400);} if (digitalRead (Taste4)== LOW){ digitalWrite (LedPin, HIGH); delay (100); digitalWrite (LedPin, LOW); delay (328);} if (digitalRead (Taste5)== LOW){ digitalWrite (LedPin, HIGH); delay (100); digitalWrite (LedPin, LOW); delay (275);} if (digitalRead (Taste6)== LOW){ digitalWrite (LedPin, HIGH); delay (166); digitalWrite (LedPin, LOW); delay (166);} } Die LED wird nur zum Test angesteuert. Es soll dann über ein Spannungsteiler und einen Verstärker ein Körperschallwandler angesteuert werden. Wisst ihr, ob man da eine Impedanzwandlung dazwischen schalten muss? Eingangsimpedanz verstärker sind 10kOhm, max. Pegel 60mV. Kann man die Programme verbinden oder soll ich einfach 2 Arduinos verwenden? Gruß Tobner
Vielleicht kann man sie verbinden.... Dazu wird der Dreh und Angelpunkt, der Verzicht auf Delay() sein. Tipp: Lese das Beispiel "BlinkWithoutDelay". Mache dich über endliche Automaten kundig. Für deinen Frequenzgenerator könnte sich die Beschäftigung mit den Timern auszahlen. Tobias M. schrieb: > http://www.vielsichtig.de/index.php?id=120 Der Autor hat die Berechnung mit den Millis nicht verstanden. In die Tonne mit dem Artikel.
Servus, das ist hier alles kein Problem. Das schafft auch ein Chinduino. Wir brauchen hier einen Timerinterupt für die LEDs und zwei Funktionen, um die Geschichte übersichtlich zu halten. Außerdem brauchen wir eine feste Abtastzeit: TA;
1 | #include <Servo.h> |
2 | #define SERVO_SPEED 20
|
3 | #define SERVO_MAX_ANGLE 180
|
4 | #define TA 32 //Abtastzeit
|
5 | |
6 | Servo servo1; |
7 | |
8 | typedef enum{ |
9 | CW=1, CCW=0; |
10 | }SERVO_DIR_t; |
11 | |
12 | const int Taster = 2; |
13 | const int LedPin = 13; //schreib gleich hin ServoLed oder so |
14 | const int LedPin2 = x; //2. LED oder weglassen |
15 | |
16 | const int Taste1 = 2; |
17 | const int Taste2 = 3; |
18 | const int Taste3 = 4; |
19 | const int Taste4 = 5; |
20 | const int Taste5 = 6; |
21 | const int Taste6 = 7; |
22 | const int LedPin = 13; |
23 | |
24 | void Servo_loop(); |
25 | void LED_loop(); |
26 | |
27 | void setup() { |
28 | pinMode(Taster, INPUT); |
29 | pinMode(LedPin, OUTPUT); |
30 | servo1.attach(9); |
31 | pinMode (Taste1, INPUT); |
32 | pinMode (Taste2, INPUT); |
33 | pinMode (Taste3, INPUT); |
34 | pinMode (Taste4, INPUT); |
35 | pinMode (Taste5, INPUT); |
36 | pinMode (Taste6, INPUT); |
37 | pinMode (LedPin2, OUTPUT); //hier brauchst du eine 2. LED |
38 | }
|
39 | |
40 | }
|
41 | |
42 | void Servo_loop() { |
43 | static int position=0; //entweder global oder static |
44 | static SERVO_DIR_t dir = CW; //clock wise |
45 | |
46 | int druck = digitalRead(Taster); |
47 | |
48 | if (druck == HIGH){ |
49 | if(position<=SERVO_MAX_ANGLE && dir){ |
50 | position+=SERVO_SPEED; |
51 | dir = CW; |
52 | } else { |
53 | position-=SERVO_SPEED; |
54 | dir = CCW; |
55 | if(position<=0){ |
56 | position=0; //keine neg. Werte! |
57 | dir = CW; |
58 | }
|
59 | |
60 | digitalWrite(LedPin, LOW); //dient nur der Kontrolle |
61 | servo1.write(position); |
62 | |
63 | }else{ |
64 | digitalWrite(LedPin, HIGH); |
65 | servo1.write(0); |
66 | }
|
67 | }
|
68 | |
69 | // das kann man genau so lösen, nur bei 7 tasten ist es
|
70 | // nicht übersichtlich, deshalb guck dir mal an wie man
|
71 | // Interupt erstellt.
|
72 | void LED_loop(){ |
73 | if (digitalRead (Taste1)== LOW){ |
74 | digitalWrite (LedPin, HIGH); |
75 | delay (100); |
76 | digitalWrite (LedPin, LOW); |
77 | delay (1100); |
78 | }
|
79 | ...
|
80 | }
|
81 | |
82 | void loop() { |
83 | |
84 | while(!(millis()%TA){ |
85 | void Servo_loop(); |
86 | void LED_loop(); //hier besser mit einer ISR lösen |
87 | }
|
88 | }
|
Von den Tasten musst du auch Zustände merken:
1 | typdef struct { |
2 | bool taste_1,taste_2,taste_3,taste_4,taste_5,taste_6; |
3 | }TasteFlag; |
Viel Erfolg. mfg
Für solche Aufgaben sind die Timer und Timer-Interrupts des ATMega prädestiniert. Die Arduino Uno "Firmware" belegt nur einen der 8Bit Timer. Der 16Bit Timer und ein zweiter 8Bit Timer stehen zur freien Verfügung. Schau dir mal im Datenblatt des ATMega328P den Fast PWM Mode an. Das ist die einfachste Variante ein Servo mit Timer anzusteuern. Alles zeitkritische wird mit den Timern erledigt und dann hast du im loop() alle Zeit der Welt sonstige Dinge zu erledigen und zu steuern. Mit delay() blockiert man den Arduino nur, die Funktion ist ein absoluter Notbehelf. Zu dem Thema sollte es aber auch genügend Tutorials geben.
:
Bearbeitet durch User
Hier eine sehr gute Anleitung zum Thema Multitasking auf dem Arduino: https://learn.adafruit.com/multi-tasking-the-arduino-part-1/overview
WOW, ich bin begeistert. Ich hatte mich schon auf das hier typische Grundrauschen eingestellt. Keine Spur davon! Vielen Dank für die ganzen Tipps, mit der Anleitung von chris habe ich es hinbekommen. Hier mal der Quelltext: #include <Servo.h> const int Taste1 = 2; const int Taste2 = 3; const int Taste3 = 4; const int Taste4 = 5; const int Taste5 = 6; const int Taste6 = 7; class Flasher { // Class Member Variables // These are initialized at startup int ledPin; // the number of the LED pin long OnTime; // milliseconds of on-time long OffTime; // milliseconds of off-time // These maintain the current state int ledState; // ledState used to set the LED unsigned long previousMillis; // will store last time LED was updated // Constructor - creates a Flasher // and initializes the member variables and state public: Flasher(int pin, long on, long off) { ledPin = pin; pinMode(ledPin, OUTPUT); OnTime = on; OffTime = off; pinMode (Taste1, INPUT); pinMode (Taste2, INPUT); pinMode (Taste3, INPUT); pinMode (Taste4, INPUT); pinMode (Taste5, INPUT); pinMode (Taste6, INPUT); ledState = LOW; previousMillis = 0; } void Update() { // check to see if it's time to change the state of the LED unsigned long currentMillis = millis(); if((ledState == HIGH) && (currentMillis - previousMillis >= OnTime)) { ledState = LOW; // Turn it off previousMillis = currentMillis; // Remember the time digitalWrite(ledPin, ledState); // Update the actual LED } else if ((ledState == LOW) && (currentMillis - previousMillis >= OffTime)) { ledState = HIGH; // turn it on previousMillis = currentMillis; // Remember the time digitalWrite(ledPin, ledState); // Update the actual LED } } }; class Sweeper { Servo servo; // the servo int pos; // current servo position int increment; // increment to move for each interval int updateInterval; // interval between updates unsigned long lastUpdate; // last update of position public: Sweeper(int interval) { updateInterval = interval; increment = 1; } void Attach(int pin) { servo.attach(pin); } void Detach() { servo.detach(); } void Update() { if((millis() - lastUpdate) > updateInterval) // time to update { lastUpdate = millis(); pos += increment; servo.write(pos); Serial.println(pos); if ((pos >= 180) || (pos <= 0)) // end of sweep { // reverse direction increment = -increment; } } } }; Flasher led1(13, 100, 1100); Flasher led2(13, 100, 650); Flasher led3(13, 100, 400); Flasher led4(13, 100, 328); Flasher led5(13, 100, 275); Flasher led6(13, 166, 166); Sweeper sweeper1(200); void setup() { Serial.begin(9600); sweeper1.Attach(9); } void loop() { if(digitalRead(0) == HIGH) { sweeper1.Update(); } if(digitalRead(Taste1) == LOW) { led1.Update(); } if(digitalRead(Taste2) == LOW) { led2.Update(); } if(digitalRead(Taste3) == LOW) { led3.Update(); } if(digitalRead(Taste4) == LOW) { led4.Update(); } if(digitalRead(Taste5) == LOW) { led5.Update(); } if(digitalRead(Taste6) == LOW) { led6.Update(); } } Einziges Problem ist, dass der Servo die ganze Zeit hin und her fährt und bei Tastendruck deaktiviert wird. Er soll aber auf Tastendruck starten und einmal hin und herfahren und dann stehenbleiben, bis wieder der Taster gedrückt wird.
Tobias M. schrieb: > Er soll aber auf Tastendruck > starten und einmal hin und herfahren und dann stehenbleiben, bis wieder > der Taster gedrückt wird. Dazu braucht man eine Flankenerkennung. Es gibt fertige Libs für Entprellung + Flankenerkennung mehrerer Tasten, einfach danach suchen.
Ich wollte es nur über "digitalread == HIGH" machen. Was spricht dagegen? Es geht mir eher darum, dass der Servo momentan noch ununterbrochen hin- und herfährt. Ich bin gerade dabei, das "increment = -increment" herrauszunehmen.
Tobias M. schrieb: > Ich weiß, dass das > prinzipiell nicht vorgesehen ist Doch, genau das ist vorgesehen. Die Taktfrequenz moderner MCs ist so hoch, daß es fast keine Anwendungen ohne Multitasking mehr gibt.
Tobias M. schrieb: > Einziges Problem ist, dass der Servo die ganze Zeit hin und her fährt > und bei Tastendruck deaktiviert wird. Er soll aber auf Tastendruck > starten und einmal hin und herfahren und dann stehenbleiben, bis wieder > der Taster gedrückt wird. Ein bisschen nachdenken musst du aber auch. Das ist doch das gleiche Prinzip wie bei den LEDs nur als Änderungsvariable hast du nicht die Zeit sondern die Bewegung/Winkel.
Tobias M. schrieb: > Ich wollte es nur über "digitalread == HIGH" machen. Was spricht > dagegen? Daß "HIGH" keine Flanke ist. MCs sind da etwas störrisch. Sie machen immer nur das, was Du programmierst und nicht das, was Du denkst, was sie tun sollten.
Ich hab den Sketch soweit am Laufen. Nur Leider muss ich einen lcd-Display einbauen und darauf einen Countdown ablaufen lassen. Der Countdown (5Minuten) soll auf Tastendruck starten und wenn er abgelaufen ist, automatisch wieder auf 05:00 (MM:SS) springen. Dabei soll der Servo schwenken. Im großen und ganzen wollte ich unter im Loop einfach ein unterprogramm countdown einfügen, was nach Tastendruck aktiviert wird. Leider stellt sich die Geschichte schwieriger als gedacht. bisheriger Ansatz des unterprogramms: die variable time wird bei Tastendruck auf 500000000 gesetzt. Das sollten 5min sein. Anfangs war das im Unterprogramm mit drin, aber bei jedem Durchlauf wäre die Zeit wieder auf 5Min gesetzt worden, was ja sinnlos ist.. Danach gehts in das Programm void countdown(){ double time ; double timeb =0; double secondsa=0; int secondsb=0; double secondsc=0; int minutes=0; double mic=0; secondsa=timeb/1000000; minutes=secondsa/60; secondsc=minutes*60; secondsb=secondsa-secondsc; lcd.setCursor(1,0); lcd.print(minutes); lcd.setCursor(2,0); lcd.print(":"); lcd.setCursor(3,0); lcd.print(timeb); if(time!=0){ timeb=time-micros(); mic=micros(); if (timeb<=0){ lcd.clear(); lcd.setCursor(0,0); lcd.print("05:00"); } } }
Wo der Fehler ist. Es funktioniert einfach nicht. Es kommt kine Startzeit,wenn ich den Taster betätige und es läuft auch keine Zeit ab.
Lies Dir das hier durch, da ist alles schön erklärt: Tobias M. schrieb: > http://www.vielsichtig.de/index.php?id=120
Nur mit dem Code von contdown() ist mir nicht klar wie das funktionieren soll. Die Variable time wird nicht initialisiert und mic wird ein Wert zugewiesen, der dann aber nicht benutzt wird. Wenn du irgendwo den Zeitstempel von letzten Aufruf der Funktion festfalten moechtest kommst du um zumindest eine statische Variable nicht herum.
Ich werd auch gerade nicht schlau. Es fehlt halt irgendwas. Ich habe dieses Beispiel versucht zu vereinfachen: http://kuskus.bplaced.net/index.php/arduino-und-microcontroler/5-arduino-countdown-timer Ich habe den ganzen Bums mit der Hintergrundbeleuchtung und dem Zeitüberlauf rausgenommen, aber es funktioniert nicht. Problem ist, dass der Sketch rundherum immer größer wird. Langsam wird es unübersichtlich und ich seh den Wald vor lauter Bäumen nicht.
Einen Tastendruck kannst Du folgendermaßen detektieren:
1 | loop
|
2 | {
|
3 | ...
|
4 | static uint8_t alteTasteMerker=0; |
5 | uint8_t neueTaste; |
6 | |
7 | neueTaste = getTastenPinWert(); |
8 | if( neueTaste != alteTasteMerker ) ... Taste gedrückt, mach was .... |
9 | |
10 | alteTasteMerker = neueTaste; |
11 | ...
|
12 | }
|
Hallo Leute, der Sketch funktioniert soweit. Ich habe nur das Problem, dass der Zähler ins negative geht. Hier mal der Sketch (stückweise): LiquidCrystal lcd(12, 11, 5, 4, 3, 2); double time = 0; double timeb =0; double secondsa=0; int secondsb=0; double secondsc=0; int minutes=0; void countdown(){ secondsa=timeb/1000000; minutes=secondsa/60; secondsc=minutes*60; secondsb=secondsa-secondsc; lcd.setCursor(0,0); lcd.print(" "); lcd.setCursor(0,0); if(minutes<10){ lcd.print("00"); lcd.setCursor(1,0); } lcd.print(minutes); lcd.setCursor(2,0); lcd.print(":"); lcd.setCursor(3,0); lcd.print(" "); lcd.setCursor(3,0); if(secondsb<10){ lcd.print("00"); lcd.setCursor(4,0); } lcd.print(secondsb); if(time!=0){ //count only time isn't 0 (button dos'nt pressd) lcd.setCursor(0,1); lcd.print("Zeit louft"); lcd.setCursor(5,0); lcd.print(" "); timeb=time-micros(); } if(timeb>0){ sweeper1.Update(); } if (timeb<=0){ lcd.clear(); lcd.setCursor(0,1); lcd.print("Zeit = 0"); } } void loop() { countdown(); if(digitalRead(A0) == LOW) { time = time + 3000000; } .. Bei Tastendruck soll er 5 Minuten hinzufügen. Funktioniert auch, nur ist der Taster noch nicht entprellt. Wie schaffe ich es, dass der Zähler auf 00:00 stehen bleibt? Am liebsten wäre es mir, wenn er anfangs bei 05:00 steht und bei Tastendruck anfängt, abzulaufen. Vllt hat einer ne Idee, ich seh langsam dem Wald vor lauter Bäumen nicht mehr.
Tobias M. schrieb: > ich seh langsam dem Wald vor lauter Bäumen nicht > mehr. Das haben Programme allgemein so an sich, wenn sie wachsen und man keinen Programmablaufplan erstellt hat. Quelltexte nicht anzuhängen, sondern stückchenweise ohne Syntax Highlighting erhöht auch nicht gerade die Lesebereitschaft.
Okay, hier der komplette Quelltext: #include <Servo.h> #include <LiquidCrystal.h> const int Taste1 = 0; const int Taste2 = 6; const int Taste3 = 7; const int Taste4 = 8; const int Taste5 = 0; const int Taste6 = 10; const int Taster = A0; LiquidCrystal lcd(12, 11, 5, 4, 3, 2); double time = 0; double timeb =0; double secondsa=0; int secondsb=0; double secondsc=0; int minutes=0; class Flasher { // Klassen speichern die Variablen // Sie werden anfangs initialisiert int ledPin; long OnTime; // "An"-Zeit in Millisekunden long OffTime; // "Aus"-Zeit in Millisekunden int ledState; // led-Status unsigned long previousMillis; // speichert die Zeit seit dem letzten Update // Flasher bereitstellen public: Flasher(int pin, long on, long off) { ledPin = pin; pinMode(ledPin, OUTPUT); OnTime = on; OffTime = off; pinMode (Taste1, INPUT); pinMode (Taste2, INPUT); pinMode (Taste3, INPUT); pinMode (Taste4, INPUT); pinMode (Taste5, INPUT); pinMode (Taste6, INPUT); pinMode (Taster, INPUT); ledState = LOW; previousMillis = 0; } void Update() { // checken, ob es Zeit zum umschalten der LED ist unsigned long currentMillis = millis(); if((ledState == HIGH) && (currentMillis - previousMillis >= OnTime)) { ledState = LOW; // ausschalten previousMillis = currentMillis; // Zeit speichern digitalWrite(ledPin, ledState); // LED umschalten } else if ((ledState == LOW) && (currentMillis - previousMillis >= OffTime)) { ledState = HIGH; // anschalten previousMillis = currentMillis; // Zeit speichern digitalWrite(ledPin, ledState); // LED umschalten } } }; class Sweeper { Servo servo; // the servo int pos; // current servo position int increment; // increment to move for each interval int updateInterval; // Intervall zwischen den Updates unsigned long lastUpdate; // Zeit seit dem letzten Update public: Sweeper(int interval) { updateInterval = interval; increment = 1; } void Attach(int pin) { servo.attach(pin); } void Detach() { servo.detach(); } void Update() { if((millis() - lastUpdate) > updateInterval) // time to update { lastUpdate = millis(); pos += increment; servo.write(pos); Serial.println(pos); if ((pos >= 180) || (pos <= 0)) // Ende der Rotation { // rückwärtige Rotation increment = -increment; } } } }; Flasher led1(13, 600, 600); Flasher led2(13, 375, 375); Flasher led3(13, 250, 250); Flasher led4(13, 210, 218); Flasher led5(13, 187, 188); Flasher led6(13, 166, 166); Sweeper sweeper1(250); //Zeit zwischen den Schritten void countdown(){ secondsa=timeb/1000000; minutes=secondsa/60; secondsc=minutes*60; secondsb=secondsa-secondsc; lcd.setCursor(0,0); lcd.print(" "); lcd.setCursor(0,0); if(minutes<10){ lcd.print("00"); lcd.setCursor(1,0); } lcd.print(minutes); lcd.setCursor(2,0); lcd.print(":"); lcd.setCursor(3,0); lcd.print(" "); lcd.setCursor(3,0); if(secondsb<10){ lcd.print("00"); lcd.setCursor(4,0); } lcd.print(secondsb); if(timeb>0){ //count only time isn't 0 (button dos'nt pressd) lcd.setCursor(0,1); lcd.print("Zeit louft"); lcd.setCursor(5,0); lcd.print(" "); timeb=time-micros(); sweeper1.Update(); } if (timeb<=0){ lcd.setCursor(0,0); lcd.print("00:00"); lcd.setCursor(0,1); lcd.print("Zeit = 0 "); } } void setup() { Serial.begin(9600); sweeper1.Attach(9); lcd.begin(16, 2); lcd.setCursor(4, 0); lcd.print("Dings"); lcd.setCursor(2,1); lcd.print("CTG-Simulator"); delay (4000); lcd.clear(); digitalWrite (A0,HIGH); } void loop() { countdown(); if(digitalRead(A0) == LOW) { time = time + 30000000; timeb = time; delay(250); } if(digitalRead(Taste1) == LOW) { lcd.setCursor(9, 0); lcd.print("FHF: 50"); led1.Update(); } if(digitalRead(Taste2) == LOW) { lcd.setCursor(9, 0); lcd.print("FHF: 80"); led2.Update(); } if(digitalRead(Taste3) == LOW) { lcd.setCursor(9, 0); lcd.print("FHF:100"); led3.Update(); } if(digitalRead(Taste4) == LOW) { lcd.setCursor(9, 0); lcd.print("FHF:120"); led4.Update(); } if(digitalRead(Taste5) == LOW) { lcd.setCursor(9, 0); lcd.print("FHF:160"); led5.Update(); } if(digitalRead(Taste6) == LOW) { lcd.setCursor(9, 0); lcd.print("FHF:200"); led6.Update(); } } Habe den Taster entprellt, die Anzeige bleibt bei 00:00 stehen, doch die Zeit läuft "hinter den Kulissen" weiter Rückwärts. Bedeutet, wenn ich bei 00:00 den Taster drücke, geht die Zeit nicht auf 05:00 hoch, sondern nur auf 04:xx.
Tobias M. schrieb: > Okay, hier der komplette Quelltext: Wie wär's wenn auch du dich mal an die Regeln zum Posten von (grossen) Quelltexten hältst? Hast du deren Sinn nicht verstanden?
Frickelfritze schrieb: > Wie wär's wenn auch du dich mal an die Regeln zum > Posten von (grossen) Quelltexten hältst? Hast du deren > Sinn nicht verstanden? Wie hättest du es denn gerne? ;)
Hallo Tobias, es geht um diese Regeln:
1 | Antwort schreiben |
2 | Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an. |
3 | Wichtige Regeln - erst lesen, dann posten! |
4 | Groß- und Kleinschreibung verwenden |
5 | Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang |
6 | Formatierung (mehr Informationen...) |
7 | [c]C-Code[/c] |
8 | [avrasm]AVR-Assembler-Code[/avrasm] |
9 | [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code] |
10 | [math]Formel in LaTeX-Syntax[/math] |
11 | [[Titel]] - Link zu Artikel |
12 | Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel, |
13 | "Adresse kopieren", und in den Text einfügen. |
Noch eine Anmerkung einen Datentype double mit 64Bit hast Du nicht zur Verfügung. Bei den AVR ist dieser als double = float deklariert.
Karl M. schrieb: > Hallo Tobias, > > es geht um diese Regeln: Das wird scheinbar nicht helfen, denn Tobias kann nur Copy & Post.
Es tut mir leid, das habe ich vergessen. Kann leider den Betrag nicht mehr ändern. Werde es in Zukunft aber berücksichtigen.
Hat keiner noch eine Idee? Vllt könnte ich eine Variable einfügen, die ich mit micros () gleichsetzen, aber die ich bei Bedarf Null setzen kann. An der Umsetzung bin ich bisher leider gescheitert.
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.