- Labornetzteil AliExpress         
Ergebnis 1 bis 10 von 11

Thema: Arduino-Code: fehlende Definition, benötige Hilfe

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    31.03.2014
    Beiträge
    179
    Ja, das ist richtig. Da habe ich mich nicht klar ausgedrückt. Der Code, so wie er im Buch steht (also ohne irgendwelche Korrekturen), funktioniert zunächst nicht. Durch das Einfügen der Deklarierung von buttonState (so wie auch von Dir vorgeschlagen) funktioniert das insofern, dass das Lauflicht läuft, und zwar ohne weitere Aktion. Danke für Deinen aufmerksamen Hinweis!
    Anliegen speziell dieses Codes soll - laut Beschreibung im Buch - jedoch sein, dass folgendes funktioniert:
    1x kurzer Tastendruck --> Lauflicht geht an
    wieder 1x kurzer Tastendruck, Lauflicht geht wieder aus

    Der vorangegangene Code im Buch macht genau das: sofort nach dem Hochladen läuft das Lauflicht los. Da ist kein Schalter vorgesehen. Entsprechend einfacher ist der Code auch ausgeführt. Anschliessend wird nun der Taster hinzugenommen (mit dem hier erwähnten Code), und der soll die Lauflicht-Funktion an- bzw. ausschalten. Und DAS macht der Code - so wie er im Buch angeboten wird - nicht.

    Ich arbeite mit Bootloader. Kann Dir aber nicht sagen, welcher das ist. Ich beschreibe die ATmegas mit der üblichen Arduino-Software, da ist der Bootloader ja integriert. Für meinen "Buch-Lern-Kurs" verwende ich einen Original-Arduino-UNO bzw. LEONARDO, da ich mit diversen Klones hin und wieder festgestellt habe, dass manches nicht funktioniert. Probleme dieser Art möchte ich zumindest beim Erarbeiten dieses Buches von vornherein ausschliessen.

    __________________________________________________ __________________________________________________ __________________________________________________ _________________

    Hier möchte ich gleich nochmal nachhaken. Wenn ich richtig "gelernt" habe, so gibt es beim Programmieren einen Unterschied zwischen deklarieren und definieren. Das war mir bisher auch noch nicht klar, aber es ergibt Sinn. Nun nehme ich diese Zeile:

    int buttonStateOld = 0;

    Die "Null" bedeutet hier ja keine PIN-Zuweisung am Arduino. Hier können (ganzzahlige) Werte zwischen -32000 bis +32000 (gerundet, 16 bit???) stehen. So zumindest wird es in der Arduino-Sprache beschrieben. Allerdings verarbeitet der doch nur 8 bit, was genaugenommen nur 256 (0-255) Werten entspricht. Warum hier 16 bit-Werte möglich sind, ist mir auch (noch) unklar, ist aber ein anderes Thema.
    Spielt es eine Rolle, ob ich in der erwähnten Zeile "buttonStateOld" überhaupt einen Wert (0 oder 1 oder 1687 ...) eintrage - bzw. kann ich dort irgendeinen Wert einsetzen, der mir grad durch den Kopf geht? Habe ich hier "richtig" gelernt? Mit einem Wert, den man dort einträgt, reserviert man sich lediglich einen Speicherplatz, was bei umfangreichen Codes dann von Bedeutung ist. Ob ich da nun 0 eintrage oder zB 156 ergibt letztlich in binärer Schreibeweise keinen wirklichen Unterschied (ausser den Wert selbst), denn meine 8 verfügbaren Bits werden ja auch bei der (Dezimal-)Zahl 0 reserviert, nur eben (binär) in 0-0-0-0-0-0-0-0 und nehmen genausoviel Speicher in Beschlag, wie zB die (Dezimal-)Zahl 12: 0-0-0-0-1-1-0-0.
    Mir ist noch nicht nicht klar, mit welchem Wert (Dezimalzahl) man diese Deklaration (hier im Beispiel buttonStateOld) definiert. Warum schreibst Du (@ oberallgeier) z.B. buttonState = 1, und nicht etwa 0 oder 181? Eine 1 oder eine 0 geben doch hier nicht HIGH oder LOW an. Warum 0 oder 1?

    Andi


    Nachtrag:
    @Rabenauge:
    Durch Einfügen von
    buttonState=digitalRead(PUSH_BUTTON);
    in den Loop funktioniert das mit dem kurzen Tasterdruck. Aber nur beim anschalten auch zuverlässig. Entgegen Deiner Vermutung läuft das Lauflicht weiter, auch wenn ich den Taster dann loslasse. Mit dem Ausschalten wird es dann aber knifflig. Der Code erkennt den kurzen Tasterdruck für "ausschalten" (also während das Lauflicht läuft) nur dann, wenn die Lauflicht-Sequenz komplett durchgelaufen ist. Also nur dann, wenn ich genau diesen Zeitpunkt erwische, geht auch das Lauflicht wieder aus. Wenn ich mitten in der Sequenz drücke, hat das keinen Einfluss.
    Ich habe das direkt ganz oben im Loop eingetragen:

    Code:
     
    void loop() 
    {
      buttonState=digitalRead(PUSH_BUTTON);
      if (buttonState != buttonStateOld)
      {
        if(buttonState == HIGH)
        {
          if(buttonFlag == false)
    Muss das evt. innerhalb einer der aufgeführten Bedingungen (innerhalb bestimmter geschweifter Klammern) eingesetzt werden, oder muss ein Interrupt geschrieben werden?

    Andi
    Geändert von Andi#87 (20.03.2023 um 20:12 Uhr)

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von Rabenauge
    Registriert seit
    13.10.2007
    Ort
    Osterzgebirge
    Alter
    56
    Beiträge
    2.211
    Der Button wird ja _nur_ ausserhalb der Lauflicht-Prozedur abgefragt.
    Das machen wir da ziemlich hemdsärmelig...
    Man _kann_ das durchaus auch anders coden, so dass _sofort_ auf nen Tastendruck reagiert wird, aber das ist etwas fortgeschrittener.
    Dann nutzt man einen Interrupt (der immer auch mitten in ner laufenden Routine ausgelöst werden kann).
    Vielleicht kommt da in deinem Buch noch was zu- da müssen einige Sachen beachtet werden, damits einwandfrei funktioniert.
    Es gibt da mehrere Möglichkeiten:
    -der Tastendruck wird _auch_ während der Lauflicht-Sequenz erkannt, aber die Reaktion erfolgt auch erst, wenn ein Durchlauf beendet ist
    -die Sequenz wird _sofort_ abgebrochen.
    Durch den Interrupt muss der Button nicht zyklisch abgefragt werden.
    Aber Interrupts haben auch kleinere Tücken- und das geht nicht an jedem Pin.

    int buttonStateOld = 0;

    Die "Null" bedeutet hier ja keine PIN-Zuweisung am Arduino. Hier können (ganzzahlige) Werte zwischen -32000 bis +32000 (gerundet, 16 bit???) stehen. So zumindest wird es in der Arduino-Sprache beschrieben. Allerdings verarbeitet der doch nur 8 bit, was genaugenommen nur 256 (0-255) Werten entspricht. Warum hier 16 bit-Werte möglich sind, ist mir auch (noch) unklar, ist aber ein anderes Thema.

    Es gibt nicht ohne Grund verschiedeneVariablentypen.Im Grunde legst du mit int() fest, wieviel Speicherplatz für die Variable reserviert werden soll.
    Eine Int belegt dann einfach mehrere Speicheradressen, da sie, wie du richtig erkannt hast, eben bei 8bit _nicht_ in eine Speicherstelle passt.
    Deshalb kann es irgendwann wichtig werden, das _richtig_ zu machen, denn grundsätzlich kann man auch alles als float() deklarieren (und dann nur für ein Bit, also ne bool nutzen, das geht), verschwendet dabei aber ne Menge Speicher, den man womöglich noch braucht.
    Umgedreht funktioniert es natürlich nicht: in eine bool() passt keine float() oder int().
    Ob Arduino tatsächlich mit Bool() arbeiten kann (also da tatsächlich nur ein Bit reserviert) , bin ich mir grade nicht ganz sicher, aber zumindest Byte() bringt richtig was, wenn man Speicher sparen will.
    Ein Byte passt in eine Speicherzelle, während Integer schon zwei belegen.
    Byte kann man z.B. prima für die ganzen Pindefinitionen benutzen, das reicht vom Wertebereich her sogar aufm Mega mit seinen >50 Pins mühelos.
    Richtige Speicherfresser sind Strings: pro Zeichen ein Byte.
    Wenn man viele Textausgaben hat, kann es lohnen, die mehrmals zu benutzen.

    Naja, allein zur Speicheroptimierung könnte man noch ne ganze Menge mehr erzählen..bei den kleinen Rechenknechten wird das schnell mal wichtig.

    Ach ja: dein Programm müsste auch dann stoppen, wenn du den Button länger gedrückt hälst- eben so lange, _bis_ er mal abgefragt wird.

    Ich will da aber deinem Buch jetzt nicht vorgreifen...da kommt sicher noch was, denn gerade bei Midi ist Schnelligkeit alles.
    Erfahrungsgemäss muss man unbedingt unter 5ms bleiben zwischen "Ereignis ausgelöst" und "Dinge werden getan", sonst hört man die Verzögerung deutlich.
    Das heisst, man braucht wirklich schnellen Code, da in der Latenz auch Dinge enthalten sind wie "noteOff", Kanal-oder Bankwechsel und anderes.
    Grüssle, Sly
    ..dem Inschenör ist nix zu schwör..

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    31.03.2014
    Beiträge
    179
    ...dein Programm müsste auch dann stoppen, wenn du den Button länger gedrückt hälst- eben so lange, _bis_ er mal abgefragt wird.
    Ja, das ist richtig.

    Danke für Deine sehr ausführlichen Hinweise und die Zeit, die Du Dir dafür genommen hast!!!

    Das muss ich jetzt Schritt für Schritt mehrmals lesen und "forschen", um das in meinen Kopf reinzubekommen.

    Andi

Ähnliche Themen

  1. Antworten: 0
    Letzter Beitrag: 29.01.2013, 19:33
  2. Bascom code auf Arduino Board Flashen **Hilfe**
    Von KoaxPilot im Forum Microcontroller allgemeine Fragen/Andere Microcontroller
    Antworten: 13
    Letzter Beitrag: 23.06.2011, 09:14
  3. Benötige Hilfe bei der CC2 auf RP5
    Von blade im Forum C-Control II
    Antworten: 28
    Letzter Beitrag: 19.03.2006, 17:02
  4. Hilfe: BASCOM Definition files?
    Von reiner im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 2
    Letzter Beitrag: 17.12.2005, 15:03
  5. benötige Hilfe bei meinem Code
    Von Reeper im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 5
    Letzter Beitrag: 09.12.2005, 15:36

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

fchao-Sinus-Wechselrichter AliExpress