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
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.
>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.
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"
@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
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.