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


von Thomsen W. (dommae)


Angehängte Dateien:

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

von David M. (md2k7)


Lesenswert?

Du weißt aber schon, dass es hier auf der Seite ein Tutorial dazu gibt? 
Siehe 
http://www.mikrocontroller.net/articles/AVR-Tutorial:_7-Segment-Anzeige#Mehrere_7-Segment_Anzeigen_.28Multiplexen.29

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-Tutorial:_LCD#Dezimal_ausgeben
In Bascom ist es aber wohl bequemer, einfach durch 1000, 100 usw. zu 
dividieren, als diese Assembler-Dividierfunktion nachzuprogrammieren.

von AVRFan (Gast)


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.

von Fred (Gast)


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"

von Herbert von Caravan (Gast)


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

von Thomsen W. (dommae)


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.

von Alexander S. (boostar)


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.

von Paul Baumann (Gast)


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

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.