Themabewertung:
  • 0 Bewertung(en) - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
FAQ zum Einsteigerkurs uC-Programmierung
#61
Hier ist der sauber Thread von Bernhard, sonst geht die Übersicht verloren.

https://radio-bastler.de/forum/showthrea...#pid168238
sicheres Auftreten bei völliger Ahnungslosigkeit
Zitieren
#62
(23.12.2019, 18:11)Tubefan schrieb: Hier ist der sauber Thread von Bernhard, sonst geht die Übersicht verloren.

https://radio-bastler.de/forum/showthrea...#pid168238

Aaahh...Danke  Smile
Zitieren
#63
Hallo, Freunde,
ich gehöre auch zu den jenigen die erst heute freien Kopf bekommen haben sich mit dem Kurs ernsthaft zu beschäftigen. Das ist das Ergebnis vom gerade zu:
   
Danke, Bernhard, für Deinen Angagemant! Ich versuche weiter zu machen. Thumbs_up
Ich wünsche allen mitlesenden Gute Nacht und ein freues Wehnachten morgen!
Beste Grüße aus meiner alten wunderschönen Heimat,
Gruß,
Ivan
Zitieren
#64
Das lässt mir keine Ruhe. Kann ich ein Array mit mehreren Werten gleichzeitig aufrufen?
Beispielsweise: digitalWrite(LEDPIN[0, 3, 6], HIGH);
So geht's leider nicht, nur einzeln.
sicheres Auftreten bei völliger Ahnungslosigkeit
Zitieren
#65
(24.12.2019, 00:29)Tubefan schrieb: Das lässt mir keine Ruhe. Kann ich ein Array mit mehreren Werten gleichzeitig aufrufen?
Beispielsweise: digitalWrite(LEDPIN[0, 3, 6], HIGH);
So geht's  leider nicht, nur einzeln.

Auf Arrays wird über ein Index Elementeweise zugegriffen!   

for (int i=0; i < MAX_ELEMENTE; i++)
   ...... Arrayname[i]... 

Du kannst aber auch eine eigene digitalWrite schreiben und eine ganzes Array als Pointer übergeben, dennoch müsste in der Implementierung weiterhin per Index oder n*sizeof(Datentyp) zugegriffen werden.
Ansprechpartner für Umbau oder Modernisierung von Röhrenradios mittels SDR,DAB+,Internetradio,Firmwareentwicklung. 
Unser Open-Source Softwarebaukasten für Internetradios gibt es auf der Github-Seite! Projekt: BM45/iRadio (Google "github BM45/iRadio")
Zitieren
#66
Ich hatte gehofft mehrere Elemente zusammenzufassen und mit einem Aufruf die Pins nach Wahl auf High oder Low zu schalten.
sicheres Auftreten bei völliger Ahnungslosigkeit
Zitieren
#67
(24.12.2019, 01:05)Tubefan schrieb: Ich hatte gehofft mehrere Elemente zusammenzufassen und mit einem Aufruf die Pins nach Wahl auf High oder Low zu schalten.

Ja das ist ein richtiger, korrekter Weg. Zum Beispiel kann man seine Version der digitalWrite schreiben (der Name kann beibehalten werden) die ein Array anstelle eines Wertes übernimmt. Das sind nur ein paar Zeilen Code.
Ansprechpartner für Umbau oder Modernisierung von Röhrenradios mittels SDR,DAB+,Internetradio,Firmwareentwicklung. 
Unser Open-Source Softwarebaukasten für Internetradios gibt es auf der Github-Seite! Projekt: BM45/iRadio (Google "github BM45/iRadio")
Zitieren
#68
Hallo, Bernhard,
ich bekomme die Nachricht unten nach dem Hochladen. Was soll ich machen um das Ergebnis zu sehen?    
Beim Nano leuchtet die grüne Diode und die rote blinkt.

PS-aha Serieler Monitor unter Werkzeuge starten KopfWand
Gruß,
Ivan
Zitieren
#69
Ich habe mir jetzt mal eine Tabelle für die Ampeln gemacht und "eingekürzt". Wenn die eine Ampel grün/gelb zeigt und die Fußgänger da schon rot sehen sollen brauche ich 9 Ausgangsports.

Alfred
Zitieren
#70
(24.12.2019, 16:05)AlfredG schrieb:  Wenn die eine Ampel grün/gelb zeigt und die Fußgänger da schon rot sehen sollen brauche ich 9 Ausgangsports.

Alfred

Unabhängig von den Schaltzuständen(!)  sind 9 Ausgangsports in dieser Hausaufgabe absolut ausreichend! 

2xRGlGr = 6; 
1xRGr = 2; 
1xBlinklicht = 1 ; 

6+2+1 = 9

PS: Die Umschaltung der Fussgängerampeln soll laut Beschreibung um Zustand gelb und rot/gelb erfolgen.
Ansprechpartner für Umbau oder Modernisierung von Röhrenradios mittels SDR,DAB+,Internetradio,Firmwareentwicklung. 
Unser Open-Source Softwarebaukasten für Internetradios gibt es auf der Github-Seite! Projekt: BM45/iRadio (Google "github BM45/iRadio")
Zitieren
#71
Hallochen,

Euch schöne Weihnacht und frohe Festtage. Beim Warten auf den Weihnachtsmann habe ich an der nächsten Hausaufgabe gesessen. Ohne Verdrahtung nur im Kopf durchgespielt kam dann sowas bei raus, sicher in der super long version erst einmal:

Sven


#define P4 4
#define P5 5
#define P6 6
#define P7 7
#define P8 8
#define P9 9
#define P10 10
#define P11 11
#define P12 12
void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
}
                        // A1/3    P4 rt P5 ge P6 gn    Pins am Arduino
                        // A2/4    P7 rt P8 ge P9 gn
                        // A5/6    P10 rt P11 gn
                        // A7      P12 ge blink
void loop() {
  // put your main code here, to run repeatedly:
  // Ausgänge definieren
  for (int i = 3; i < 12; i++) {
    pinMode(i, OUTPUT);                         // testen ob das geht
  }
                                                // Modus Nacht
  for (int k = 0; k < 6; k++)
  {
    digitalWrite(P4, HIGH);
    digitalWrite(P5, HIGH);
    delay (1000);
    digitalWrite(P5, LOW);
    delay (1000);
  }
                                                 //A1-A6 rot, A7 aus
                                                 // Zustand wird für 10 Sekunden gehalten
  for (int k = 0; k < 11; k++)
  {
    digitalWrite(P4, LOW);
    digitalWrite(P5, LOW);
    digitalWrite(P4, HIGH);
    digitalWrite(P7, HIGH);
    digitalWrite(P10, HIGH);
    delay (10000);
  }
                                                //Übergang in Regelbetrieb:
                                                //Rot – Rot/Gelb (für zwei Sekunden) – Grün ,  RÜCKSPRUNG
  for (int m = 0; m < 1Wink // smiley ist semikolon und Klammer zu
  {
    for (int k = 0; k < 1; k++)
    {
      digitalWrite(P5, HIGH);
      delay (2000);
    }
    digitalWrite(P4, LOW);                       // grün A1/3
    for (int k = 0; k < 1; k++)
    {
      digitalWrite(P6, HIGH);
      delay (20000);                            // grünphase 20 sec
    }
    for (int k = 0; k < 1; k++)
    {
      digitalWrite(P5, HIGH);
      delay (2000);
    }
    digitalWrite(P6, LOW);
    digitalWrite(P5, LOW);
    digitalWrite(P4, HIGH);                     // rot A1/3
    for (int k = 0; k < 1; k++)
    {
      digitalWrite(P8, HIGH);
      delay (2000);                             // rt/gn A2/4
    }
    for (int k = 0; k < 1; k++)                 //20 sec
    {
      digitalWrite(P7, LOW);
      digitalWrite(P8, LOW);
      digitalWrite(P9, LOW);
      digitalWrite(P8, HIGH);
      digitalWrite(P10, LOW);
      digitalWrite(P11, HIGH);                  //A2/4  gn  A5/6 gn
      for (int i = 0; i < 11; i++)
      {
        digitalWrite(P12, HIGH);                //blinken A7
        delay (1000);
        digitalWrite(P12, LOW);
        delay (1000);
      }
      digitalWrite(P10, HIGH);
      digitalWrite(P11, LOW);
      digitalWrite(P10, HIGH);
      digitalWrite(P8, HIGH);
      delay (2000);
      digitalWrite(P7, HIGH);
      digitalWrite(P8, LOW);
      digitalWrite(P9, LOW);                   //rot A2/4  Rücksprung zu Rücksprung
    }
  }
}
Zitieren
#72
ich habe die Zustände in ein Array gepackt und rufe dann die Zeilen nacheinander auf:

int LEDS [10][9] =
{//rt ge gn rt ge gn rt gn bl
 {0, 1, 0, 0, 1, 0, 1, 0, 0},
 {0, 0, 0, 0, 0, 0, 1, 0, 0},
 {1, 0, 0, 1, 0, 0, 1, 0, 0},
 {1, 1, 0, 1, 0, 0, 1, 0, 0},
 {0, 0, 1, 1, 0, 0, 0, 1, 0},
 {0, 0, 1, 1, 0, 0, 0, 1, 1},
 {0, 1, 1, 1, 0, 0, 1, 0, 0},
 {1, 0, 0, 1, 1, 0, 1, 0, 0},
 {1, 0, 0, 0, 0, 1, 1, 0, 0},
 {1, 0, 0, 0, 1, 1, 1, 0, 0}

};

0 und 1 scheint statt HIGH und LOW auch zu funktionieren, mit der Tabelle müssen die LED's nach Masse geschaltet werden, oder man dreht alles rum.

Alfred
Zitieren
#73
Hallo Alfred,

sicherlich eleganter damit, aber mit Arrays muss ich mich erst befassen und mit dem Einlesen auch.
Haben ja noch viel Zeit zum Üben, aber es macht Spass sich damit zu befassen.

Sven
Zitieren
#74
Also pro Schaltzustand  der Ampelanlage den Inhalt eines Feldes einlesen OK , aber wie geht es dann mit dem Blinksignal ? Als eigenständige Schleife?
Zitieren
#75
Zeile 1 und 2 im Array ist quasi das gelb blinken, ich teste ob die Sekunde gerade ist dann Zeile1 bei ungerade dann Zeile2
Zitieren
#76
bei gerader Sekundenanzahl sollt das schon passen denk ich, aber ich muss das erstmal die Tage verdrahten dann sieht man es
Zitieren
#77
Das man die Ports einzeln schalten muss ist ärgerlich :-). Schöner wäre es wenn man das gleich byteweise rausschicken könnte. Obwohl dann die Mehrfachbelegung wieder reinfunkt (d0 und d1).
Naja, erstmal läufts, auch wenn bei mir die Fußgänger am Anfang Pech hatten :-)
Ich habe mir dann ein paar Zustände mit Serial.print zur Hilfe anzeigen lassen.
Zitieren
#78
(24.12.2019, 23:09)AlfredG schrieb: Das man die Ports einzeln schalten muss ist ärgerlich :-).

Du schreibst einfach eine eigene digitalWrite in der Du ein "Array"  (besser gesagt ist es die Speicheradresse der 0. Elements im Array) übergibst. In der digitalWrite (also in deiner Version) wird dann, mit dem Wissensstand bis jetzt, eine Schleife abgearbeitet die alle Ausgänge setzt. Und schon hast Du praktisch deine eigene Funktion die gefühlt alles in einem Augenblick schaltet.

An alle! Probiert das bitte AUS! Das ist sehr lehrreich!

(24.12.2019, 23:09)AlfredG schrieb: Schöner wäre es wenn man das gleich byteweise rausschicken könnte.

Dazu kommen wir im Fortgeschrittenenkurs wenn wir direkt mit den Registern des Prozessors arbeiten. Ist und soll hier noch nicht Thema werden, denn sonst werden richtige Anfänger komplett verwirrt. Bleibt bitte erstmal nur bei den Funktionen die in den Lektionen behandelt werden und löst damit die Aufgabe, keine direkte Registermanipulation einführen! Ich habe den Weg absichtlich so gewählt damit im Einstiegskurs niemand mit Registern arbeiten muss!

(24.12.2019, 23:09)AlfredG schrieb: Obwohl dann die Mehrfachbelegung wieder reinfunkt (d0 und d1).
Naja, erstmal läufts, auch wenn bei mir die Fußgänger am Anfang Pech hatten :-)

Kann man maskieren! Mathematisch durch UND und ODER Operationen und einer passenden Maske. Wie genau kommt im Folgekurs!
Ansprechpartner für Umbau oder Modernisierung von Röhrenradios mittels SDR,DAB+,Internetradio,Firmwareentwicklung. 
Unser Open-Source Softwarebaukasten für Internetradios gibt es auf der Github-Seite! Projekt: BM45/iRadio (Google "github BM45/iRadio")
Zitieren
#79
(24.12.2019, 21:44)AlfredG schrieb: ich habe die Zustände in ein Array gepackt und rufe dann die Zeilen nacheinander auf:

int LEDS [10][9] =
{//rt ge gn rt ge gn rt gn bl
 {0, 1, 0, 0, 1, 0, 1, 0, 0},
 {0, 0, 0, 0, 0, 0, 1, 0, 0},
 {1, 0, 0, 1, 0, 0, 1, 0, 0},
 {1, 1, 0, 1, 0, 0, 1, 0, 0},
 {0, 0, 1, 1, 0, 0, 0, 1, 0},
 {0, 0, 1, 1, 0, 0, 0, 1, 1},
 {0, 1, 1, 1, 0, 0, 1, 0, 0},
 {1, 0, 0, 1, 1, 0, 1, 0, 0},
 {1, 0, 0, 0, 0, 1, 1, 0, 0},
 {1, 0, 0, 0, 1, 1, 1, 0, 0}

};

0 und 1 scheint statt HIGH und LOW auch zu funktionieren, mit der Tabelle müssen die LED's nach Masse geschaltet werden, oder man dreht alles rum.

Alfred
 
Das wird schon gut so! Wenn Du zum Beispiel hinten noch ein Element für die Taktung der Anlage rein hängst, hast Du ein Ampelprogramm komplett in einem Speicherfeld.


@Sven: lege die Festlegung der Datenrichtung doch nach setup(), denn die Festlegung der Pin-Art muss nicht dauernd in loop abgearbeitet werden. Einmal festgelegt reicht es aus! Dann sind deine Schaltzyklen der Ampel falsch, sie geht ja dauern wieder in den Inbetriebnahme Modus und bleibt nicht im Regelbetrieb. Hier würde ich einen Flag und eine IF-Bedingung einsetzen. Du benutzt auch mal Aliasnamen für die Ports, dann in der Festlegung der Datenrichtung wieder nicht! Brauchst du die Aliase überhaupt, es wird ja nur ein “P“ vorgesetzt? Probiere das mal noch mehr zu strukturieren und zu optimieren! Gleiche Aufgaben kannst Du auch in eigene Funktionen auslagern! Bei komplexeren Programmen wirst du sonst keinen Überblick mehr haben, andere Leser des Codes wahrscheinlich noch weniger.

Liebe Grüße
Bernhard
Ansprechpartner für Umbau oder Modernisierung von Röhrenradios mittels SDR,DAB+,Internetradio,Firmwareentwicklung. 
Unser Open-Source Softwarebaukasten für Internetradios gibt es auf der Github-Seite! Projekt: BM45/iRadio (Google "github BM45/iRadio")
Zitieren
#80
Hallo Bernhard,

wie gesagt ist mein Programm so zwischen Pfefferkuchen und Kartoffelsalat entstanden ohne el. Aufbau. Ob das so klappt ist also nicht gewiß. Das Programmieren der Schleifen habe ich somit erstmal stark geübt, bei der Festlegung der Datenrichtung und Bezeichnungen im Setup hat der Arduino immer gemeckert, da muss ich mich noch richtig reinknien. Das Arbeiten mit Arrays und Flags muss ich erst einmal erarbeiten und durchdenken, habe ja noch Zeit.
Auf jeden Fall macht das Spaß sich damit zu Beschäftigen und einiges ist schon wieder erlernt. Schwierig ist es, wenn man die ganzen Möglichkeiten der unterschiedlichen Syntaxe nicht kennt aber so sucht man und beschäftigt sich damit. Insgesamt war der Kurs eine tolle Idee von Dir gewesen.


Aber das klappt im Setup jetzt:

for (int P = 3; P < 12; P++) {
pinMode(P , OUTPUT);
}

die Ausgänge werden in einer Schleife auf Ausgang gesetzt mehr ist nicht erforderlich

Sven
Zitieren


Möglicherweise verwandte Themen…
Thema Verfasser Antworten Ansichten Letzter Beitrag
  Einsteigerkurs Microcontrollerprogrammierung Bernhard45 13 9.926 23.05.2020, 23:55
Letzter Beitrag: Bernhard45

Gehe zu: