www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Drehzahlanzeige auf 3x 7-Segment


Autor: Thomsen Weee (dommae)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hi Leute...
Will mir für meine Ente einen Drehzahlmesser bauen und das Zündsignal 
von der Zündspule abgreifen. Das Signal hab ich bereits auf TTL-Niveau 
runtergeschraubt und es kommt sauber am Interrupt-Pin an.
Das Programm zur Drehzahlmessung hab ich in Bascom geschrieben und es 
dürfte auch funktionieren.
Bisher konnte ich jedoch meinen PC nicht mit zur Ente schleppen, um 
meinen Drehzahlwert über RS232 per Terminal am Bildschirm anzeigen zu 
lassen.
Ja, jetzt hab ich mir drei 7-Segment Anzeigen geholt und per 
Multiplexing an meinen Atmega32 angeschlossen...damit will ich dann zur 
Ente runtermarschieren ...
Jetzt aber mein Problem:
Nehmen wir an, die Drehzahl beträgt 1367 U/min. Wie bekomme ich die "1" 
auf die erste Anzeige, die "3" auf die zweite Anzeige und die "6" auf 
die dritte (die "7" spar ich mir)...
Ich will also mehr oder weniger versuchen, die Zahl in ihre einzelnen 
Stellen aufzuteilen und diese Wenn möglich einzeln in eine Variable 
schreiben. Das wäre für die Multiplexing Anzeige wohl am bequemsten...

Wie aber programmiert man das???

danke schonmal und schönes Wochenende,

Thommy

Autor: David Madl (md2k7)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du weißt aber schon, dass es hier auf der Seite ein Tutorial dazu gibt? 
Siehe 
http://www.mikrocontroller.net/articles/AVR-Tutori...

Ist halt nützlich, wenn man ein wenig Assembler versteht. Das 
grundsätzliche Verfahren ist aber sowieso ganz normal in Worten 
beschrieben.

Nachtrag: Achso, gerade gesehen. Du hast also eher ein Problem mit der 
Umrechnung in Dezimalstellen. Da verweise ich noch auf das LCD-Tutorial, 
da wird auch so eine Umrechnung gemacht: 
http://www.mikrocontroller.net/articles/AVR-Tutori...
In Bascom ist es aber wohl bequemer, einfach durch 1000, 100 usw. zu 
dividieren, als diese Assembler-Dividierfunktion nachzuprogrammieren.

Autor: AVRFan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Wie aber programmiert man das???

Z. B. so: Du subtrahierst von Deiner Zahl zuerst 1000, und zwar 
wiederholt solange, bis Du unter Null kommt.  Jede Subtraktion erfasst 
Du mit einem Counter n.  Sobald Du bei irgendeinem negativen Wert 
angelangt bist, addierst Du wieder 1000 dazu.

Dann wiederholst Du genau dasselbe Spiel mit 100 statt der 1000, aber 
die Subtraktionen zählst Du mit einem anderen Counter m.

Dann wiederholst Du genau dasselbe Spiel mit 10 statt der 100, aber die 
Subtraktionen zählst Du mit einem weiteren Counter l.

Der Wert, der jetzt noch vorliegt, liegt garantiert zwischen 0 und 9. 
Du kannst ihn in einer Variablen k abspeichern.

Die Variablen n, m, l, k liegen alle zwischen 0 und 9 und enthalten 
gerade die gewünschten Ziffern der Ausgangszahl: n die Tausenderstelle, 
m die Hunderterstelle, l die Zehnerstelle und k die Einerstelle.

Das nennt man übrigens "Binär-zu-BCD-Umwandlung".  Eine solche findet 
übrigens immer statt, wenn zu einer Zahl der entsprechende String 
berechnet wird.

Autor: Fred (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
in ASM ist das rel einfach!

>Nehmen wir an, die Drehzahl beträgt 1367 U/min. Wie bekomme ich die "1"
>auf die erste Anzeige, die "3" auf die zweite Anzeige und die "6" auf
>die dritte (die "7" spar ich mir)...

ich bin jetzt frech und sage, dass gehöhrt ins erste Lehrjahr!
Wenn Deine Leeerrhherer nicht in der Lage sind Dir DAS beizubringen,
hast Du den falschen Beruf gewählt, oder die Lehhhhhrer können DAS
auch nuhr aus Quellen die nicht optimal sind!!

BinToBCD verabschiedet sich heute
und hat morgen auch noch gute Vorschläge.

Gruß Fred
ps ich bin ein "Rechtschreibkünster under Deuschlands Sonne"

Autor: Herbert von Caravan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Fred
Schwatz kein wirres Zeug, hilf, wenn Du kannst, wenn nicht, leg Dich 
wieder hin.

@Thomsen Wee
Du mußt Deine Variable "Umdrehungenprominute" in einen String umwandeln.
Dann kannst Du mit den Stringoperationen (Mid$, Left$....) die benötigte 
Stelle aus dem String "heraussägen". Nun mußt Du eine Tabelle erstellen,
die Dir das Bitmuster für eine 7-Segmentanzeige bei der jeweiligen Zahl 
erzeugt. Das wird dann auf einen Port ausgegeben, an dem die Segmente 
der Anzeigen hängen. Weiterhin müssen die Anzeigestellen zeitrichtig 
umgeschaltet werden.

Such mal in der Codesammlung nach: "Drehzahlmesser" Das ist ein 
BASCOM-Programm, in dem das Prinzip des Multiplexens deutlich wird.

Hochachtungsvoll
Herbert von Caravan

Autor: Thomsen Weee (dommae)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also danke erstmal für die Tipps!
Ich hoff, es wurde nicht falsch verstanden, mit Multiplexing hab ich 
kein Problem, das läuft wie geschmiert. Das Problem lag einzig und 
allein an der Zahlenzerlegung in die einzelnen Stellen. Das "Zersägen" 
;)

@Fred
Ich mach keine Lehre

@Herbert
Wie wandle ich die Zahl in einen String um? Oder gleich allgemein 
gefragt, wo finde ich eine gute Beschreibung für Bascom, um nicht bei 
jedem kleinen Problem fragen zu müssen.

Autor: Alexander S. (boostar)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So in der Art?
  div_t Temp = div(Zahl, 10);

  for (i=3; i>0; i--) {    // 0: Hunderter, 1: Zehner, 2: Einer
    Ausgabedaten[i-1] = Temp.rem;
    Temp = div(Temp.quot, 10);
  }

In Ausgabedaten stehen die Werte drin, die direkt auf den Port gegeben 
werden und die 8 Segmente (mit Punkt) ansteuern.

Autor: Paul Baumann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mit var = str (x) kannst Du das bewerkstelligen. Ansonsten ist die Hilfe 
von Bascom nicht die schlechteste Sache. Das ist zwar alles in Englisch,
aber in der größten Not hilft auch ein Übersetzungsprogramm.

Du kannst Dir ja im Simulator Deine Variablen anzeigen lassen, dann 
siehst
Du ja, ob er das tut, was Du willst.

MfG Paul

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.