Forum: Mikrocontroller und Digitale Elektronik STM32F4Discovery state machine


von Ralf S. (ralfspill1978)


Lesenswert?

Hallo,

ich programmiere das erste mal und möchte auf einem STM32F4Discovery 
(F411E Disco) via StateMachine und dem vorhandenen Taster einfach mal 
die Led´s nacheinander durchschalten(Tastendruck 1.Led an, Tastendruck 
2.LED an,Tastendruck 3.LED an) Ich habe aber leider keinen Ansatz. 
vielleicht hat jemand ein einfachen Einstieg oder ein Beispiel.

Danke schon mal

von Dr. Sommer (Gast)


Lesenswert?

Was verstehst du denn bei den per Google via "C State Machine" 
gefundenen Ergebnissen nicht? Wenn du C++ nutzt, kannst du auch nach 
"State Pattern" suchen.

von Cyblord -. (cyblord)


Lesenswert?

Dr. Sommer schrieb:
> Was verstehst du denn bei den per Google via "C State Machine"
> gefundenen Ergebnissen nicht? Wenn du C++ nutzt, kannst du auch nach
> "State Pattern" suchen.

Ein Entwurfsmuster hat recht wenig mit der konkreten Programmiersprache 
zu tun. Eventuell hast du nicht verstanden was ein "Design-Pattern" 
überhaupt ist.
Man kann dieses in so ziemlich jeder Sprache umsetzen.


@TE:
> ich programmiere das erste mal und möchte auf einem STM32F4Discovery
> (F411E Disco) via StateMachine und dem vorhandenen Taster einfach mal
> die Led´s nacheinander durchschalten

Hast du denn überhaupt mal verstanden was eine State-Machine ist?
Im einfachsten Fall hast du eine Variable welche den Zustand 
repräsentiert und eine Switch Anweisung welche je nach Zustand und 
Ereignis des Übergang auslöst. So wird es oft realisiert.
Ich denke aber das liegt auf der Hand wenn man das allgemeine Konzept 
verstanden hat. Wer allerdings sofort nach Copy&Paste Beispielcode 
schreit, der will natürlich gar nicht erst verstehen.

: Bearbeitet durch User
von Dr. Sommer (Gast)


Lesenswert?

Cyblord -. schrieb:
> Ein Entwurfsmuster hat recht wenig mit der konkreten Programmiersprache
> zu tun.
Technisch korrekt. Allerdings ist ein OOP-Entwurfsmuster in einer 
Programmiersprache mit direkter OOP-Unterstützung etwas besser 
aufgehoben.

Cyblord -. schrieb:
> Eventuell hast du nicht verstanden was ein "Design-Pattern"
> überhaupt ist.
Eventuell bist du zu sehr auf Trollen aus. Wobei mich schon 
interessieren würde, wie du das State Pattern z.B. im Lambda-Kalkül 
umsetzen würdest.

von Cyblord -. (cyblord)


Lesenswert?

Dr. Sommer schrieb:
> Cyblord -. schrieb:
>> Ein Entwurfsmuster hat recht wenig mit der konkreten Programmiersprache
>> zu tun.
> Technisch korrekt. Allerdings ist ein OOP-Entwurfsmuster in einer
> Programmiersprache mit direkter OOP-Unterstützung etwas besser
> aufgehoben.

Besser aufgehoben vielleicht. Mehr aber auch nicht.
Und OOP stellt auch gar kein Entwurfsmuster dar.

> Cyblord -. schrieb:
>> Eventuell hast du nicht verstanden was ein "Design-Pattern"
>> überhaupt ist.
> Eventuell bist du zu sehr auf Trollen aus.

Warum. Wenn jemand ein allgemeines Entwurfsmuster, fix auf C++ 
beschränkt dann wird man doch mal vorsichtig nachfragen dürfen.

> Wobei mich schon
> interessieren würde, wie du das State Pattern z.B. im Lambda-Kalkül
> umsetzen würdest.

Schlechter Versuch und billig dazu jetzt auf funktionale Programmierung 
zu gehen. Wobei man natürlich auch dort Zustände umsetzen kann, nur 
nicht so wie man das gewohnt ist.
Im Gegenzug würde mich interessieren warum gerade C++ besonders gut oder 
auch nur besser als C, Java, C#, JavaScript usw. etc. ff. geeignet für 
ausgerechnet das State Pattern sein sollte.

: Bearbeitet durch User
von Ralf S. (ralfspill1978)


Lesenswert?

Cyblord

ich denk schon.

ich hab einen Anfangszustand = alles aus

1.Tasterdruck: 1. Led ein =Zustand 1
2.Tasterdruck: und Zustand 1 = 2.Led ein = Zustand 2  usw.

ich habe Probleme wie ich das umsetze in Programmiersprache.

von Dr. Sommer (Gast)


Lesenswert?

Cyblord -. schrieb:
> Besser aufgehoben vielleicht. Mehr aber auch nicht.
> Und OOP stellt auch gar kein Entwurfsmuster dar.

Falls du es nicht gemerkt haben solltest, befinden wir uns in einem 
Forum zur Embedded-Programmierung, und selbst im Thread-Titel ist von 
einem Mikrocontroller die Rede. Daher kann man auf solchen Systemen eher 
selten genutzte Sprachen wie C#,Java,JS,... ausklammern sofern nicht 
explizit gewünscht. So solltest selbst du in der Lage sein 
nachzuvollziehen, warum man sich hier auf die üblichen Sprachen C, C++ 
beschränkt, auch wenn dies rein technisch nicht absolut erschöpfend 
korrekt ist. Tatsächlich liegt die Vermutung nahe, dass du das sogar 
verstanden hast, und lediglich trollen möchtest.

Da C++ virtuelle Funktionen & Kon/De-Strukturen sowie Metaprogrammierung 
unterstützt, ist eine Nutzung von Patterns und insb. des State-Patterns 
dort  viel praktischer und sicherer möglich. Du wärest wahrscheinlich 
der erste, der das State Pattern in C implementiert. Nur weil etwas 
möglich ist, ist es noch lange nicht sinnvoll. Und bei einer 
offensichtlichen Anfänger-Frage darf man schonmal abwegige Möglichkeiten 
implizit ausklammern.

von Cyblord -. (cyblord)


Lesenswert?

Dr. Sommer schrieb:
> Da C++ virtuelle Funktionen & Kon/De-Strukturen sowie Metaprogrammierung
> unterstützt, ist eine Nutzung von Patterns und insb. des State-Patterns
> dort  viel praktischer und sicherer möglich.

Du hast offensichtlich große Probleme, Entwurfsmuster abstrakt und 
unabhängig einer konkreten Implementierung zu betrachten.

Und selbst wenn wir uns gängige Implementierungen ansehen: Für das 
State-Pattern reichen die Funktionzeiger von C locker aus und noch nicht 
mal diese sind notwendig. Das State-Pattern sagt lediglich aus, dass 
sich dasselbe "Objekt" je nach Zustand anders verhält. Man setzt das 
gerne (und zurecht) mit virtuellen Methoden und Zeigern um, notwendig um 
dem Pattern zu genügen ist es nicht.

: Bearbeitet durch User
von Dr. Sommer (Gast)


Lesenswert?

Cyblord -. schrieb:
> Du hast offensichtlich große Probleme, Entwurfsmuster abstrakt und
> unabhängig einer konkreten Implementierung zu betrachten.

Dir mangelt es offensichtlich am Leseverständnis. Auch ein 
Entwurfsmuster muss implementiert werden. Und das geht in manchen 
Sprachen nun einmal besser als in anderen.

Cyblord -. schrieb:
> Und selbst wenn wir uns gängige Implementierungen ansehen: Für das
> State-Pattern reichen die Funktionzeiger von C locker aus.
Ich habe nichts anderes behauptet. C++ hat die genannten Features aber 
nicht nur aus Spaß.

von Cyblord -. (cyblord)


Lesenswert?

Dr. Sommer schrieb:
> Dir mangelt es offensichtlich am Leseverständnis. Auch ein
> Entwurfsmuster muss implementiert werden. Und das geht in manchen
> Sprachen nun einmal besser als in anderen.

Nur geht das State-Pattern in C genauso gut oder schlecht wie in C++ 
umzusetzen. Gerade bei derart einfachen Applikationen. Gerade hier dann 
massiv auf die Features von C++ zu setzen macht erst recht keinen Sinn. 
Nur weil man das State-Pattern mal so und so in C++ umgesetzt hat.
Und deine Antwort impliziert dass man das State-Pattern nur mit C++ 
umsetzen sollte.
Vielleicht hast du dich ja nur falsch ausgedrückt und willst das nun mal 
berichtigen? Oder dich halt weiter reinreiten.

>
> Cyblord -. schrieb:
>> Und selbst wenn wir uns gängige Implementierungen ansehen: Für das
>> State-Pattern reichen die Funktionzeiger von C locker aus.
> Ich habe nichts anderes behauptet. C++ hat die genannten Features aber
> nicht nur aus Spaß.

Aber sicher nicht um das State-Pattern umzusetzen. Der Zusammenhang 
macht einfach keinen Sinn, ich bleibe bei meiner obigen Aussage: Du 
solltest lernen abstrakt über ein Konzept zu denken.

: Bearbeitet durch User
von Dr. Sommer (Gast)


Lesenswert?

Cyblord -. schrieb:
> Das State-Pattern sagt lediglich aus, dass
> sich dasselbe "Objekt" je nach Zustand anders verhält.
Das kenn ich aber anders:

„[..] [D]esign patterns [...] are descriptions of communicating 
objects and classes that are customized to solve a general design 
problem in a particular context.“ [Gamma u. a., 1994, S. 3]

Und das ist immerhin der Erfinder von Designpatterns. Dort wird das 
Design Pattern auch explizit mit Klassen und virtuellen Funktionen 
definiert. Habe das Buch aber leider gerade nicht da.

Cyblord -. schrieb:
> Nur geht das State-Pattern in C genauso gut oder schlecht wie in C++
> umzusetzen.
Nein. Da C++ automatisch den richtigen Konstruktor aufruft, die 
Speicherallokation/deallokation implizit durchführt, per 
Metaprogrammierung eine Konsistenzprüfung ermöglicht, kann man hier viel 
weniger Fehler machen.

Cyblord -. schrieb:
> Gerade bei derart einfachen Applikationen.
... kann man auf das eher komplexe State Pattern verzichten und einfach 
switch-case verwenden.

Cyblord -. schrieb:
> Und deine Antwort impliziert dass man das State-Pattern nur mit C++
> umsetzen sollte.
Genau, wenn es um kleine Embedded Systems geht. Ada wäre auch noch eine 
Möglichkeit.

Cyblord -. schrieb:
> Vielleicht hast du dich ja nur falsch ausgedrückt und willst das nun mal
> berichtigen? Oder dich halt weiter reinreiten.
Vielleicht hast du einfach eine falsche Vorstellung von Design Patterns. 
Diese sind recht konkrete Muster, wie man Klassen für bestimmte Zwecke 
nutzen kann (siehe Zitat oben, oder eine beliebige Software Engineering 
Vorlesung).

Cyblord -. schrieb:
> Aber sicher nicht um das State-Pattern umzusetzen.
OOP-Anwendungen wie State Patterns sind genau das Ziel der 
OOP-Fähigkeiten von OOP-Sprachen wie C++.

Cyblord -. schrieb:
> Du
> solltest lernen abstrakt über ein Konzept zu denken.
Du solltest lernen was Design Patterns eigentlich sind, und welche 
Vorteile C++ bietet. Ein bisschen Common Sense würde dir auch nicht 
schaden.

von Cyblord -. (cyblord)


Lesenswert?

Dr. Sommer schrieb:
> „[..] [D]esign patterns [...] are descriptions of communicating
> objects and classes that are customized to solve a general design
> problem in a particular context.“ [Gamma u. a., 1994, S. 3]
>
> Und das ist immerhin der Erfinder von Designpatterns. Dort wird das
> Design Pattern auch explizit mit Klassen und virtuellen Funktionen
> definiert.

Lerne mal den Unterschied zwischen einem Beispiel und einer Definition. 
Und die Geschichte der Pattern ist etwas komplexer. Mit einem einzigen 
"Erfinder" ist es da nicht getan.


> Cyblord -. schrieb:
>> Du
>> solltest lernen abstrakt über ein Konzept zu denken.
> Du solltest lernen was Design Patterns eigentlich sind, und welche
> Vorteile C++ bietet.
Schon wieder Pattern und C++ in einem Satz vermischt. Frage mich nur wie 
man Pattern in Java umsetzen kann. Das geht ja praktisch gar nicht, weil 
alle Pattern nur mit C++ Features "definiert" sind.
Und ich kenne die Vorteile von C++, hat mit dem Thema nur gar nichts zu 
tun. Aber das wirst du nie kapieren wie es aussieht.

> Ein bisschen Common Sense würde dir auch nicht
> schaden.
Common was?

: Bearbeitet durch User
von grundschüler (Gast)


Lesenswert?

Ralf S. schrieb:
> Ich habe aber leider keinen Ansatz.

Versuch zuerst mal den Taster und die Led zu programmieren:

gedrückt => Led_an
nicht gedrückt Led_aus

wenn das geht, folgt der nächste Schritt

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

grundschüler schrieb:
> wenn das geht, folgt der nächste Schritt
Dann mit dem selben Taster die LED ein- und ausschalten. Das ist dann 
schon ein Zustandsautomat mit den 2 Zuständen "LED ein" und "LED aus"...

Und so geht es dann Schritt für Schritt näher ans Ziel.

von Dr. Sommer (Gast)


Lesenswert?

Cyblord -. schrieb:
> Und die Geschichte der Pattern ist etwas komplexer. Mit einem einzigen
> "Erfinder" ist es da nicht getan.
Die ganze Welt der Software Entwicklung beruft sich auf genanntes Buch. 
Das kann daher getrost als Standard betrachtet werden. Falls du einer 
der Menschen bist, die für diverse Begriffe eigene/unübliche 
Definitionen verwenden, solltest du dich von öffentlichen Foren 
fernhalten, um müßige Diskussionen zu vermeiden, die dann letztendlich 
zur Findung der Diskrepanzen der Definition degenerieren.

Cyblord -. schrieb:
> Frage mich nur wie
> man Pattern in Java umsetzen kann.
Da Java stark von C++ inspiriert ist, genauso. Wie ich bereits 
geschrieben habe (Leseverständnis!), können wir Java hier außen vor 
lassen.

Cyblord -. schrieb:
> Das geht ja praktisch gar nicht, weil
> alle Pattern nur mit C++ Features "definiert" sind.
Mit Features, die OOP-Sprachen bieten:
"Although design patterns describe object-oriented designs, they are 
based on practical solutions that have been implemented in mainstream 
object-oriented programming languages like Smalltalk and C++ rather than 
procedural languages (Pascal, C, Ada) or more dynamic object-oriented 
languages (CLOS, Dylan, Self)." [Gamma, S. 15].

Cyblord -. schrieb:
>> Ein bisschen Common Sense würde dir auch nicht
>> schaden.
> Common was?
Hahaha, q.e.d. ;-)

von Cyblord -. (cyblord)


Lesenswert?

Respekt. Du lässt dich fast nicht aus der Ruhe bringen und argumentierst 
äußerst sachlich.

(Dass du allerdings wirklich glaubst ich wüsste nicht was Common Sense 
ist finde ich ein wenig beleidigend ;-) )

: Bearbeitet durch User
von Pete K. (pete77)


Lesenswert?

state=1
do
  if keypressed then
    if state=1 then led1
    if state=2 then led2
    if state=3 then led3
  state=state+1
  if state=4 then state=1
while (1)

von RP6conrad (Gast)


Lesenswert?

Wichtig : "keypressed" soll eine Aenderung sein von low nach high !! Das 
macht men wie folgt :

if ((key==high)&(old_key_state==low)) Keypressed =1;
else Keypressed = 0;
old_key_state=key;

"key" soll auch noch entprellt sein !!!

von Stefan F. (Gast)


Lesenswert?

Schau mal in mein Buch 
http://stefanfrings.de/mikrocontroller_buch/Einstieg%20in%20die%20Elektronik%20mit%20Mikrocontrollern%20-%20Band%202.pdf 
Kapitel 11.3 und folgende

Wenn du das verstanden hast, dann denke mal darüber nach wie Enums statt 
Zahlen die Lesbarkeit des Codes verbessern. In Band 3 Kapitel 9.2 
findest du dazu ein konkretes Beispiel.

Das Buch bezieht sich auf AVR Mikrocontroller, doch auf dem STM 
funktioniert das prinzipiell ebenso.

von Ruediger A. (Firma: keine) (rac)


Lesenswert?

Ralf S. schrieb:
> Cyblord
>
> ich denk schon.
>
> ich hab einen Anfangszustand = alles aus
>
> 1.Tasterdruck: 1. Led ein =Zustand 1
> 2.Tasterdruck: und Zustand 1 = 2.Led ein = Zustand 2  usw.
>
> ich habe Probleme wie ich das umsetze in Programmiersprache.

Kapitel 4 meines Buches enthält eine "Bauanleitung" zur Implementation 
eines Zustandsautomaten in C.

von Harry L. (mysth)


Lesenswert?

Was hat das Prinzip einer State-Machine mit der Prozessor-Architektur zu 
tun?

...und warum braucht man als blutiger Anfänger ohne jede Erfahrung einen 
Cortex M4 mit -gefühlt- ner halben Millionen Register und 2000 Seiten 
Manual?

Manchmal ist Weniger Mehr.

von Nop (Gast)


Lesenswert?

Dr. Sommer schrieb:
> Was verstehst du denn bei den per Google via "C State Machine"
> gefundenen Ergebnissen nicht? Wenn du C++ nutzt, kannst du auch nach
> "State Pattern" suchen.

Wenn der TE offensichtlich nicht einmal weiß, was ein endlicher Automat 
überhaupt ist, der wird ganz sicher etwas damit anfangen können, wenn 
man die grundlegend einfache Idee noch um Tonnen an OOP-Lametta 
aufbläst.

von Stefan F. (Gast)


Lesenswert?

> warum braucht man als blutiger Anfänger ohne jede Erfahrung
> einen Cortex M4 mit -gefühlt- ner halben Millionen Register
> und 2000 Seiten Manual?

Möglicherweise, weil er preisgünstig ist und für den Fall des Falles 
reichlich Power hat. Aber du hast Recht, die Komplexität ist nicht ohne. 
Ich habe schon bei den STM32F103 das Gefühl, die Grenzen meines 
Horizontes erriecht zu haben. Ich habe aber auch mehr als 20 Jahre 
Erfahrung mit anderen wesentlich kleineren Mikrocontrollern.

Wie dem auch sei, einen Zustandsautomaten kann man darauf genau so 
programmieren, wie auf einem ATtiny. Das ist ja gerade das schöne an den 
"alten" Patterns.

@Ruediger Asche:
> Kapitel 4 meines Buches enthält eine "Bauanleitung" zur Implementation
> eines Zustandsautomaten in C.

Wie heisst denn das Buch? Und falls möglich, wo kann man es 
herunterladen?

von Ruediger A. (Firma: keine) (rac)


Lesenswert?

Stefan U. schrieb:
>
> @Ruediger Asche:
>> Kapitel 4 meines Buches enthält eine "Bauanleitung" zur Implementation
>> eines Zustandsautomaten in C.
>
> Wie heisst denn das Buch? Und falls möglich, wo kann man es
> herunterladen?

http://www.springer.com/de/book/9783658148492

Eine Vorschau gib es hier:

https://books.google.de/books?id=8ra8DQAAQBAJ

Die Ebook Version gibt es mittlerweile auf den unzähligen zwielichtigen 
"freien Downloadportalen"... oder auch (sogar kapitelweise) 
kostenpflichtig bei Springer oder dem Buchhändler seiner Wahl (schönen 
Dank!)

Danke fürs Interesse!

: Bearbeitet durch User
von Stefan F. (Gast)


Lesenswert?

Ah interessant. Das Buch scheint dem "The Definitive Guide to Cortex 
M3/M4 Microcontrollern" ähnlich zu sein.

von Ruediger A. (Firma: keine) (rac)


Lesenswert?

Stefan U. schrieb:
> Ah interessant. Das Buch scheint dem "The Definitive Guide to Cortex
> M3/M4 Microcontrollern" ähnlich zu sein.

Vielen Dank für das Kompliment, aber Nein: Auf einer Ebene mit "der 
Bibel" würde ich das Buch definitiv nicht sehen. Dafür spielt der Cortex 
im Buch auch eine viel zu kleine Rolle. Ich benutze ihn als 
Illustrationsobjekt, um zu demonstrieren, wie Embedded Firmware 
entwickelt wird (Fokus RTOS).

Yiu geht wesentlich mehr ins Detail beim Cortex, dafür liefere ich u.A. 
empirische Daten, wie sich die Architektur performanzmässig ausreizen 
lässt (z.B. harte Zyklendeltas bei unerschiedlichen Optimierunsgstufen 
etc), oder erkläre, wie der Exclusive Access Monitor genau funktioniert. 
So Sachen halt.

Aber zurück zum Thema:

> warum braucht man als blutiger Anfänger ohne jede Erfahrung
> einen Cortex M4 mit -gefühlt- ner halben Millionen Register
> und 2000 Seiten Manual?

Ich finde den Cortex für so einen Zweck nicht die schlechteste Wahl. Die 
Komplexität hängt immer davon ab, welches POD und welches Ökosystem man 
wählt. Der Riesenvorteil beim Cortex ist eben, dass man die Lernkurve 
nur einmal durchmachen muss, und danach kann man (sogar von 
verschiedenen Herstellern) die gesamte Skalierungsbreite ausnutzen und 
auf Rennsemmeln umsteigen kann, ohne nochmal von 0 auf anzufangen.

Die Discovery Serie hat den Zusatzcharme, dass die Debug Probe bereits 
On Board integriert ist, so dass man hardwaremässig zum Durchstarten 
nicht mehr als ein USB Kabel braucht.

von Kaj (Gast)


Lesenswert?

[offtpic]
Ruediger A. schrieb:
> Die Discovery Serie hat den Zusatzcharme, dass die Debug Probe bereits
> On Board integriert ist, so dass man hardwaremässig zum Durchstarten
> nicht mehr als ein USB Kabel braucht.
Das hat Atmel/Microchip mitlerweile auch, zu finden z.B.
bei dem Arduino M0 Pro, oder auf dem SAM R21 Xplained Pro. :)
[/offtpic]

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.