Themabewertung:
  • 0 Bewertung(en) - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
FAQ zum Einsteigerkurs uC-Programmierung
Navi  meint, die Abfrage des Schalters sollte vor der ersten Grünphase für Fußgänger erfolgen.

ABER  :

 ..........die Fußgängerampel nur noch dann auf grün schaltet, wenn eine Anforderung per Taster erfolgt.

Das heißt ja immer Rot für die Rentner wenn sie den Knopf nicht finden, also auch die Grünphase für Fußgänger aus dem normalen Zyklus rausnehmen und nur dann anspringen, wenn der Schalter betätigt wurde.

Sven
Zitieren
In der Initialisierungsphase der Ampel (gelb blicken + alle rot) muss nichts geändert werden! Hier braucht der Taster auch noch nicht abgefragt werden.

Im Regelbetrieb:
Die Fußgängergrünphase muss aus der jetzigen Ablaufsteuerung nicht rausgenommen werden!
Auch die Dauer der Fußgängerphase ändert sich ja nicht und es wird auch wieder im Rot/Gelb bzw. Gelb-Zustand der Autoampel geschaltet!
Das Schalten der Fußgängerampel + der Warnlichter "Achtung Fußgänger" kann man ja durch ein Flag blockieren/freigeben, ich denke das sieht jeder ein? Die Schwierigkeit bei der Hausaufgabe ist das Setzen des Flags durch den Taster! Dies soll(!) und kann in jedem Schaltzustand der Anlage im Regelbetrieb möglich sein und nicht nur für den kleinen Moment zwischen den Schaltphasen während der Controller bisher (also in Lösung zur Hausaufgabe 2) nicht blockiert war.

Auch ein mögliches Prellen des Tasters sollte im Auge behalten werden, damit in der Protokollierung der Grün-Signalanfragen über die serielle Schnittstelle nicht mehrere Einträge pro Tastendruck erscheinen.

Wenn ich so die Lösungen vieler Leute sehe, denke ich, Ihn bekommt das alle hin! Wenn Ihr dann noch Lust und Zeit habt, probiert auch ruhig die Zusatzaufgaben aus! Wer absolut nicht mit der Ampel klar kommt, der kann meinetwegen auch die Zusatzaufgaben mit dem Zähler oder der Uhr stattdessen machen. Darin kommt der Taster ja auch vor.

Machts Euch allen noch Spaß oder gibt es schon Leute die den Kurs aufgegeben haben?

Gruß 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
Da ich die Ampel nicht mehr sehen kann habe das erfolgreich übersprungen  :-) und mir die 7 Segmentanzeige vorgenommen, da hier die Taster auch zum Einsatz kommen.
Meine Segmente haben leider die Anschlüsse seitlich und sind anders belegt. Mit etwas suchen konnte die Belegung gefunden werden.
Mein Programm ist jetzt soweit das durch Eingabe der Variabel ZAHL auch die entsprechende angezeigt wird.

Was ist hiermit genau gemeint? Verstehe ich nicht.

Entwickle eine C-Funktion mit Namen void siebenseg(int zahl) , die eine einzelne
7-Segmentanzeige ansteuert und den Wert des Übergabeparameters zahl (von 0-9)
darstellen kann.

Wieso void siebenseg(hier die Zahl?) Wo muss das void stehen im loop? Oder ist das eine Art Unterprogrammaufruf?

Gruß Frank
sicheres Auftreten bei völliger Ahnungslosigkeit
Zitieren
Ah, jetzt ja, also eine Art Unterprogramm.

Im Hauptprogrammteil steht nur der Aufruf siebenseg[ZAHL]
sicheres Auftreten bei völliger Ahnungslosigkeit
Zitieren
(13.01.2020, 20:37)Tubefan schrieb: Was ist hiermit genau gemeint? Verstehe ich nicht.

Was genau verstehst Du nicht?

Was eine C-Funktion ist ist klar?  Siehe Lektion 1!

setup und loop, digitalRead, digitalWrite, pinMode .... alles Funktionen!
Die zu schreibende Funktion soll also siebenseg heißen.


(13.01.2020, 20:37)Tubefan schrieb: Wieso void siebenseg(hier die Zahl?) Wo muss das void stehen im loop?

void = nichts/leer ist der Datentyp des Rückgabewertes dieser Funktion, sprich sie hat kein Rückgabewert! Siehe Lektion 1 ... dort wurden Funktionen,  Übergabeparameter und Rückgabewerte besprochen und demonstriert. Das waren die Funktionen zur den Grundrechenarten!

(13.01.2020, 20:37)Tubefan schrieb: ...und mir die 7 Segmentanzeige vorgenommen, da hier die Taster auch zum Einsatz kommen. ...

Aber bitte bei der Zähler/Uhr-Aufgabe auch nicht das Entprellen (ohne delay) vergessen, denn das gehört auch zur Lektion 3 und sollte geübt werden. Die Ampel"-kollegen" 
machen das z.Bsp. auch in der Implementierung des "Echtzeitbetrieb" und der Protokollierung der Tastendrücke über die serielle Schnittstelle.


An einem Arduino sollen zusätzlich zur 7-Segmentanzeige zwei Taster (aufwärts und abwärts) angeschlossen werden. Durch Druck der Taste „aufwärts“ wird der Anzeigewert der 7-Segmentanzeige schrittweise bis zu 9 erhöht, durch Druck der Taste „abwärts“ wird der Anzeigewert der 7-Segmentanzeige schrittweise bis auf 0 reduziert. Achtung: Tastenprellen 

Erweitere deine C-Funktion void siebenseg(int zahl) um die Möglichkeit auf vier 7- Segmentanzeigen Werte zwischen 0000 bis 9999 darstellen zu können. 

Implementiere auf Basis der Lösung von Aufgabe 2 eine Uhr, die die vier 7- Segmentanzeigen nutzt, um die Uhrzeit im Format HH:MM anzuzeigen. Über je ein Taster lassen sich die Stunden und Minuten einstellen.


Gruß 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
Mein Problem ist wohl das ich die Aufgabenstellung immer falsch interpretiere...
ich frage den Taster ab - zeigt er low wird ein Flag gesetzt und die Meldung geht via Serial raus.
Jetzt brauch ich den Taster bis die Fußgängerampel grün wird ja nicht mehr abfragen. Eine Entprellung ist daher doch unnötig?
Denn der Rentner nun die Hand auf dem Taster lässt käme ja dann aller 5...10ms eine Meldung via Serial.
Wenn dann die Fußgänger wieder rot haben wird das Flag zurückgesetzt und das Spiel beginnt von vorn.

Alfred
Zitieren
Hallochen,

dann mal auch ein paar Fragen in den Raum werfe:

was macht :  unsigned long ulTime = 0;   ?


#define WARTEZEIT_IN_MS 5   sagt 5 ms  Wartezeit richtig?

ulTime = millis();                      ist dann der Befehl dazu zur Ausführung richtig?


#define WARTEZEIT_IN_MS (ampelphasen_initialisierung[x][9])  funktioniert so nicht wie dann?

wenn  " millis " den Arduino nicht einfriert wird das weitere Programm weiter abgearbeitet?

In einer Schleife würde es sich ja dann " verheddern " irgendwie, denn es werden Programmteile bearbeitet, die noch gar nicht an der Reihe sind. Oder habe ich da einen Knoten in meinen Gedanken?

Sven
Zitieren
(13.01.2020, 22:35)AlfredG schrieb: Mein Problem ist wohl das ich die Aufgabenstellung immer falsch interpretiere...
ich frage den Taster ab - zeigt er low wird ein Flag gesetzt und die Meldung geht via Serial raus.


Ja

(13.01.2020, 22:35)AlfredG schrieb: Jetzt brauch ich den Taster bis die Fußgängerampel grün wird ja nicht mehr abfragen.

Der Alltag sieht doch ehr so aus, das der nächste "Rentner" nun auch nochmal drückt oder auf der anderen Staßenseite gerückt wird obwohl eine Grünsignalanforderung schon besteht.
Das mehrfache Drücken sollte also ruhig registriert werden und ins Protokoll kommen. Übrigens wird so eine Protokoll bei (einigen/allen?) Ampeln tatsächlich geschrieben um im Rechtsfall Nachweise zu haben. War mir bis vor kurzem auch neu!

(13.01.2020, 22:35)AlfredG schrieb: Eine Entprellung ist daher doch unnötig?

Doch! Es soll pro drücken ja nur ein(!) Protokolleintrag geschrieben werden! Überlege mal was passiert wenn der Schalter prellt und Du bei jedem Prellen einen Eintrag wegschreibst! Das wollen wir nicht, also Entprellen!

(13.01.2020, 22:35)AlfredG schrieb: Denn der Rentner nun die Hand auf dem Taster lässt käme ja dann aller 5...10ms eine Meldung via Serial.

Nö, siehe Beispielaufgabe bzw. #143 hier im Thread (https://www.radio-bastler.de/forum/showt...#pid169768) und Uli sein Post #144!

Wenn die Taste gedrückt bleibt, dann darf auch nur eine Anforderung des Signals kommen. Aber das ist ja nicht schwer, die Lösung steht in #143 und #144

(13.01.2020, 22:35)AlfredG schrieb: Wenn dann die Fußgänger wieder rot haben wird das Flag zurückgesetzt und das Spiel beginnt von vorn.

Davon ist auszugehen! Wink Thumbs_up
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
(13.01.2020, 22:38)Larry67 schrieb: Hallochen,

dann mal auch ein paar Fragen in den Raum werfe:

was macht :  unsigned long ulTime = 0;   ?

Eine Variable vom Datentyp unsigned long (siehe Datentypen Lektion 1!) mit Namen ulTime anlegen und mit dem Wert 0 vorzuinitialisieren!

(13.01.2020, 22:38)Larry67 schrieb: #define WARTEZEIT_IN_MS 5   sagt 5 ms  Wartezeit richtig?

Legt ein Alias fest! D.h. im Programm schreibt man das aussagekräftigere WARTEZEIT_IN_MS und es wird vom Compiler durch 5 ersetzt.
Stelle Dir vor, die "5" wird als Wert an mehreren Stellen hart in den Code geschrieben, dann musst Du bei Änderungen immer alle Stellen im Code finden und abändern. So änderst Du das nur am #define-Eintrage ab und alle Stellen im Code sind automatisch aktualisiert.

(13.01.2020, 22:38)Larry67 schrieb: ulTime = millis();                      ist dann der Befehl dazu zur Ausführung richtig?

Siehe Lektionstext: "Der Rückgabewert der Funktion millis ist vom Typ unsigned long ..."
Hier liefert millis also einen Rückgabewert und dieser wird in der Variablen ulTime vom Typ unsigned long abgespeichert! Nichts dran verkehrt.

(13.01.2020, 22:38)Larry67 schrieb: #define WARTEZEIT_IN_MS (ampelphasen_initialisierung[x][9])  funktioniert so nicht wie dann?

Der Compiler schreibt jetzt überall im Programm wo WARTEZEIT_IN_MS steht (ampelphasen_initialisierung[x][9]) hin.  Passt das syntaktisch zu deinem Programm?

(13.01.2020, 22:38)Larry67 schrieb: wenn  " millis " den Arduino nicht einfriert wird das weitere Programm weiter abgearbeitet?

Nach dem Aufruf von millis wird, wie im Lektionstext steht, die Zeit im ms zurückgeliefert, seit dem der Controller gestartet ist. Mehr nicht! Das Programm läuft danach komplett weiter und es wird nicht angehalten! Siehe Demoprogramme im PDF zur Lektion 3.

(13.01.2020, 22:38)Larry67 schrieb: In einer Schleife würde es sich ja dann " verheddern " irgendwie, denn es werden Programmteile bearbeitet, die noch gar nicht an der Reihe sind. Oder habe ich da einen Knoten in meinen Gedanken?

Dafür sollst Du ja eine Lösung mit den Wissen aus den bisherigen 3 Lektionen schreiben! Darum geht es ja!
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
ich werde erstmal ne Runde drüber schlafen,
ja langsam fällt der Groschen

bei den beiden währe sicherlich zum besseren Verstehen ein = Zeichen hilfreich gewesen
#define TASTER_PIN 10 #define TASTER_PIN = 10
#define WARTEZEIT_IN_MS 5 #define WARTEZEIT_IN_MS = 5
Zitieren
(13.01.2020, 23:51)Larry67 schrieb: bei den beiden währe sicherlich zum besseren Verstehen ein   =   Zeichen hilfreich gewesen

#define TASTER_PIN 10                
#define TASTER_PIN = 10

#define WARTEZEIT_IN_MS 5          
#define WARTEZEIT_IN_MS = 5

 Achtung Falle! 

Define in C und C++ sind Aliase und keine Zuweisungen! Zuweisungen (z.Bsp. in Variablen) haben ein = , Aliase oder Ersetzungen nicht! Irgendwie auch logisch, denn man möchte ja bei

delay(WARTEZEIT_IN_M) ein delay(5) erreichen und kein delay(= 5), was Unsinn wäre.
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
Noch ein Tipp:

Wenn Ihr auf dem Steckbrett Microtaster benutzt und einige Tastendrücke werden schlecht, gar nicht oder nur mit massiven Druck erkannt, so sucht den Fehler nicht immer im Programm! Das kann durchaus richtig sein und Ihr verzweifelt!

Ich habe für die Testaufbauten in Lektion 3 verschiedene Taster ausprobiert und im Oszi angeschaut. Mache Typen von Microtaster, besonders neue Exemplare davon, bekommen Anfangs schlecht Kontakt, prellen dafür auch so gut wie gar nicht das man fast der Meinung ist, ein Entprellen wäre unnötig. Ein Sprühstoß Kontaktspray hat bei neuen(!) Exemplaren sehr gut geholfen. Alte Microtaster, besonders welche die in Benutzung waren, bekommen dagegen schnell Kontakt und prellen wahnsinnig nach.

Ich musste auch schon neue X-Box Controller "reparieren" weil die Spieler der Meinung waren das manche Eingaben nicht erkannt werden. Das stimmte, schuld waren fabrikneue Microtaster. Kontaktspray mit einer Spritze oder der Ersatz durch "eingefahrene" Taster hat das Problem mit dem XBox Kontroller gelöst und alles waren happy.
Ich habe noch nicht die Datenblätter befragt ob da irgendwo drinsteht, das ein Microtaster erst nach xxxx Betätigungen einsatzbereit ist.

Solltet Ihr also solche mistigen Taster erwischt haben, dann verzweifelt nicht an euren Programmen, sondern testet die Sache auch mal mit anderen Tastern oder zur Not mit einfachen Steckbrücken (Jumper) und einem Stück Draht.

Gruß 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
Hallo ihr Wissenden,

es geht um die Funktion millis()

Bernhard schreibt dazu :
Es gibt eine elegantere Methode Zeit zu messen,
und:
Mit der Funktion millis() bekommt der Programmierer die Anzahl an Millisekunden
zurückgeliefert, die der Microcontroller schon mit Spannung versorgt wird.

Ok Zeit seit Einschalten des Arduino messen ist verständlich.
Aber Zeit zurückgeliefert da klemmt es bei mir mächtig gewaltig.
Ich kann doch nicht in die Vergangenheit zurückreisen.
Verstehen würde ich, wenn es hieße : im Programm 10 Schritte zurück
Vielleicht kann es mir einer so von Doof zu Doof erklären?

Sven
Zitieren
Millis ist eine fortlaufende Zahl die sich nach einschalten pro Millisekunde um 1 erhöht. Um damit eine Zeit zu messen schreibst du den aktuellen Milliswert in eine Variable. Anschließend ziehst du die Variable von dem weitergelaufenen Milliswert ab. Dann erhälst du eine abfragbare Differenz.

Gruß Frank
sicheres Auftreten bei völliger Ahnungslosigkeit
Zitieren
ok millis ist wie eine Uhr also,
bei Tastendruck wird die Zeit notiert
zeit = millis() z.B.
millis läuft weiter
Abfrage, ob millis minus zeit größer als 5ms sind
wenn ja
Schalter gedrückt ?, dann zähler++

so etwa??
Zitieren
dann hat der Arduino also zwischen dem Zeitpunkt des Notierens der Zeit = millis()   und der Abfrage

wenn 5ms vergangen sind, die Möglichkeit, je nach Taktrate und Umfang von Befehlen einige abzuarbeiten.

d.h. der kleine Arduino ein paar Befehle, der große Due dann viele mehr.

Muß man dann wohl bei komplexen Nebenprogrammen wohl beachten.


Sven
Zitieren
(14.01.2020, 22:19)Larry67 schrieb: Hallo ihr Wissenden,

es geht um die Funktion millis()

Bernhard schreibt dazu :
Es gibt eine elegantere Methode Zeit zu messen,
und:
Mit der Funktion millis() bekommt der Programmierer die Anzahl an Millisekunden
zurückgeliefert
, die der Microcontroller schon mit Spannung versorgt wird.

Ok Zeit seit Einschalten des Arduino messen ist verständlich.
Aber Zeit zurückgeliefert da klemmt es bei mir mächtig gewaltig.
Ich kann doch nicht in die Vergangenheit zurückreisen.
Verstehen würde ich, wenn es hieße :  im Programm 10 Schritte zurück
Vielleicht kann es mir einer so von Doof zu Doof erklären?

Sven

Sven,

zurückliefern hat nichts mit Zeitreisen zu tun! Zurückgeliefert bedeutet das der Aufruf der Funktion millis() einen Wert zurückliefert!
Die Funktion liefert also einen Rückgabewert zurück!
Schaue doch bitte mal in Lektion 1. Da ist der Aufbau von Funktionen beschrieben und auch wie eine Funktion etwas zurückliefert! Siehe die ganzen Funktionen zu den Grundrechenarten! Sie liefern etwas zurück, nämlich das Ergebnis!

variable = millis(); Bedeutet das der Aufruf von millis die Anzahl an Millisekunden seit dem Einschalten an die Variable zurückliefert! Das hat nichts mit Zeitreisen zu tun!
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
(14.01.2020, 23:18)Larry67 schrieb: dann hat der Arduino also zwischen dem Zeitpunkt des Notierens der Zeit = millis()   und der Abfrage

wenn 5ms vergangen sind, die Möglichkeit, je nach Taktrate und Umfang von Befehlen einige abzuarbeiten.

Ja das ist der Vorteil den man bei delay nicht hat. Bei delay bleibt der Controller im Programm für diese Zeit stehen.
Je nach Implementierung von delay führt der Controller dann eine Schleife mit "nichts drin" bzw. NOP (No Operation) aus.

(14.01.2020, 23:18)Larry67 schrieb: d.h. der kleine Arduino ein paar Befehle, der große Due dann viele mehr.

Wenn der Controller eine höhere Taktfrequenz hat, dann schafft er zum Beispiel in 5ms mehr Rechenoperationen, ist richtig! Aber 5ms bleiben 5ms, also auch hier keine Zeitreise erwarten!

(14.01.2020, 23:18)Larry67 schrieb: Muß man dann wohl bei komplexen Nebenprogrammen wohl beachten.

Kommt darauf an was gemacht werden muss. Sind zeitkritische Sachen im Programm wichtig, dann ja. In unseren Programmen ist die Taktfrequenz aber erstmal egal, denn eine Millisekunde bleibt eine Millisekunde. Und wenn eine Ampelphase 10 Sekunden dauert, dann dauert die auf einem Ardiuno Nano, auf einem Due oder gar einem STM32 auch 10 Sekunden. Programmiertechnisch brauchen wir uns in der Hausaufgabe damit also nicht beschäftigen welche Taktrate der Prozessor hat.
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
Hallo Bernhard,

guten Morgen, so, über Nacht ist dann wohl der Groschen gefallen, auch dir Frank, danke für die Anschubhilfe.
Tja, manchmal klemmt es beim Verstehen eben etwas mehr oder weniger.
Jetzt kann ich mich richtig damit beschäftigen da der Sinn klar ist.

Sven
Zitieren
Hallo Ihr,

Anmerkung:

 wenn Ihr in der Zusatzaufgabe eine Mehrfach 7 Segmentanzeige benutzt oder mehrere einzelne im Multiplex  bitte die Massen oder das Plus mittels Transistor schalten sonst verkraftet der Arduino den Stom nicht !

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: