INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
[erledigt] Wie Mealy-Automat implementieren?
23.05.2015, 00:46 (Dieser Beitrag wurde zuletzt bearbeitet: 23.05.2015 05:24 von gregors.)
Beitrag #1
[erledigt] Wie Mealy-Automat implementieren?
Hat sich erledigt. Eine genauere Suche hat einen Hilfreichen Link aufgezeigt.

Hallo allerseits!

Ich möchte einen Mealy-Automaten implementieren. Das ist ein Softwarekonstrukt, mit dem einem in der Pulslänge kodierten Signal entnommen werden kann, ob man eine Eins, eine Null, eine Synchronisationspause oder Müll empfangen hat.

Das mit der Pulslänge kann man sich zum Beispiel als Morsecode vorstellen. Es gibt
- Langes Piep
- kurzes Piep
- kurze Pause
- lange Pause (Müll)

Zur Verfügung habe ich einen Arduino Nano oder einen Uno R3.

Es gibt vermutlich Sourcecode en masse, in dem ich fündig werden könnte. Aber es gibt unterschiedliche Wege, das zu realisieren. Ich möchte das mit IRQs tun und bräuchte einen Schubs in die richtige Richtung, z. B. als Lesetipp.

Gruß

Gregor
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
23.05.2015, 16:48
Beitrag #2
RE: [erledigt] Wie Mealy-Automat implementieren?
mich würde trotzdem mal interessieren, wie du auf "Mealy Automat" gekommen bist... 8-)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
23.05.2015, 16:53
Beitrag #3
RE: [erledigt] Wie Mealy-Automat implementieren?
(23.05.2015 16:48)HaWe schrieb:  mich würde trotzdem mal interessieren, wie du auf "Mealy Automat" gekommen bist... 8-)

Diesen Begriff habe ich in einer c't-Hacks oder so aufgeschnappt und bei der Wikipedia ist das auch ein Begriff. Nur habe ich ein Problem damit, die zeitlichen Abläufe zu sortieren. Prinzipiell ist die Funktionsweise klar, die Implementierung ist das, was mich wurmt.

Gruß

Gregor
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
23.05.2015, 17:06 (Dieser Beitrag wurde zuletzt bearbeitet: 24.05.2015 09:26 von HaWe.)
Beitrag #4
RE: [erledigt] Wie Mealy-Automat implementieren?
ah ok, ich dachte mir schon, das muss von einem "echten Informatiker" kommen ("endlicher Zustandsautomat").

Aber wenn es dir nur um Encoder geht - den Link, den du angegeben hast, verwende ich auch im Prinzip.

Leider ist mein eigener Thread ins Nirwana verschwunden, aber da sah es so aus:

Auslesen der Encoderwerte eines NXT-Encodermotors mit einem Arduino AVR (Uno oder Mega)
und Ansteuerung per pwm mit einem L293D Digital H-Bridge-Treiber:


[Bild: anschlussencoder_Steckplatine.jpg]
aus: http://www.meinduino.de/drehencoder.shtml

(je 100kOhm Widerstände,
alternativ mit eingebauten PullupsSmile
Code:
pinMode(encoderA, INPUT_PULLUP);
pinMode(encoderB, INPUT_PULLUP);

mit diesem Code:
Code:
/************************************************************
*
* Demo-Programm zur Auswertung eines händisch betriebenen
* Drehencoders (Quadraturencoder) mit dem Arduino im
* Timer-Interrupt mit einer Abfragefrequenz von rd. 1kHz
*
* Kann von jederman frei verwendet werden, aber bitte den
* Hinweis: "Entnommen aus http://www.meinDUINO.de" einfügen
*
************************************************************/

// An die Pins 2 und 3 ist der Encoder angeschlossen
#define encoderA 2
#define encoderB 3

// Globale Variablen zur Auswertung in der
// Interrupt-Service-Routine (ISR)
volatile int8_t altAB = 0;
volatile int encoderWert = 0;

// Die beiden Schritt-Tabellen für volle oder 1/4-Auflösung
// 1/1 Auflösung
//int8_t schrittTab[16] = {0,-1,1,0,1,0,0,-1,-1,0,0,1,0,1,-1,0};

// 1/2 Auflösung ergibt bei Lego-Motoren 1 tick pro Grad (standard wie bei Lego)
int8_t schrittTab[16] = {0, 0,0,0,1,0,0,-1, 0,0,0,1,0,0,-1,0};


// 1/4 Auflösung
//int8_t schrittTab[16] = {0,0,0,0,0,0,0,-1,0,0,0,0,0,1,0,0};


/*************************************************************
*
* Interrupt Service Routine
*
* Wird aufgerufen, wenn der entsprechende Interrupt
* ausgelöst wird
*
*************************************************************/
ISR(TIMER1_COMPA_vect) {
  altAB <<= 2;
  altAB &= B00001100;
  altAB |= (digitalRead(encoderA) << 1) | digitalRead(encoderB);
  encoderWert += schrittTab[altAB];
}


/*************************************************************
*
* void setup()
*
* Wird einmal beim Programmstart ausgeführt
*
*************************************************************/
void setup() {
  pinMode(encoderA, INPUT);
  pinMode(encoderB, INPUT);
  
  noInterrupts(); // Jetzt keine Interrupts / disable

  TIMSK1 |= (1 << OCIE1A); // Timer 1 PIDOutput Compare A Match Interrupt Enable
  TCCR1A = 0;             // "Normaler" Modus
  // WGM12: CTC-Modus einschalten (Clear Timer on Compare match)
  //        Stimmen OCR1A und Timer überein, wird der Interrupt ausgelöst
  // Bit CS12 und CS10 setzen

  TCCR1B = (1 << WGM12) | (1 << CS11); // Frequenz = 16000000 / 1024 / 15 = rd. 1042Hz = 1kHz


  // Prescaler OCR1A  einstellen:
  // Frequenz = 16,000,000 / 8 / 64 = rd. 31 kHz (64-1=63)
  // Frequenz = 16,000,000 / 8 / 128 = rd. 16 kHz (128-1=127)
  // Frequenz = 16,000,000 / 8 / 512 = rd. 4 kHz (512-1=511)
  // Frequenz = 16,000,000 / 8 /1024 = rd. 2 kHz (1024-1=1023)
  OCR1A = 511; // also 4kHz = alle 250µs

  interrupts(); // Interrupts wieder erlauben / enable

  Serial.begin(115200);
}


/*************************************************************
*
* void loop()
*
* Wird immer wieder durchlaufen
*
*************************************************************/
void loop() {

  while(true) {
    Serial.println(encoderWert);
    delay(100);
  }
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
23.05.2015, 17:25
Beitrag #5
RE: [erledigt] Wie Mealy-Automat implementieren?
(23.05.2015 17:06)HaWe schrieb:  (schrieb echt viel)

Danke für diesen reichhaltigen Input! Wenn ich das durchgearbeitet habe, was einige Tage dauern kann, bin ich bestimmt ein ganzes Stück schlauer.

Gruß

Gregor
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
24.05.2015, 09:07 (Dieser Beitrag wurde zuletzt bearbeitet: 24.05.2015 09:12 von HaWe.)
Beitrag #6
RE: [erledigt] Wie Mealy-Automat implementieren?
der Unterschied zu deinem verlinkten Code ist nur das Schaltbild und dass der Timer IRQ 4x so schnell läuft, im 250µs-Takt (statt 1000µs). Dazu wurden ein paar Prescaler etc. anders eingestellt.

Falls du den Code für noch mehr Motoren brauchst, sag Bescheid (aber du hast es ja als erledigt markiert).
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
26.05.2015, 21:12 (Dieser Beitrag wurde zuletzt bearbeitet: 26.05.2015 21:13 von gregors.)
Beitrag #7
RE: [erledigt] Wie Mealy-Automat implementieren?
(24.05.2015 09:07)HaWe schrieb:  ... Falls du den Code für noch mehr Motoren brauchst, sag Bescheid (aber du hast es ja als erledigt markiert).

BTW: Ich verwende den Code jetzt wahrscheinlich überhaupt nicht (oder nur als copy+paste-Vorlage), weil ich verstanden habe, warum ich das bislang nicht verstanden habe (die Mealy-Sache).

Ich werde das Gewünschte wie angeregt umsetzen, aber nicht, um es für Motor-Encoder oder so zu verwenden, sondern für die Kommunikation.

Gruß

Gregor
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  erledigt: atan2 rechnet falsch? HaWe 0 343 30.11.2015 17:29
Letzter Beitrag: HaWe

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste