a=128
b=a
a=a and &B11110000
b=b and &B00001111
porta=a
port a = porta or b
dann gibts da noch den befehl "shift"
Hallo,
ich will mit einem ATmega16 eine Lichtschranke bauen,
die mir die Zeit misst die ein Gegenstand braucht um 10cm zurückzulegen un dann die Geschwindigkeit in m/s auf 3 7-Segment Anzeigen ausgeben.
Die Lichtschranken sind kein Problem, das habe ich mit Interrupts gelöst.
Jetzt kann ich ja die Zeit die der Timer ausgibt in eine Variable schreiben.
Wenn ich da gleich Byte nehme, kann ich damit dann rechnen?
Ich müsste ja laut v = s/t 0,1 / Variable nehmen und das dann auf 3 Stellen runden, ohne Nachkommastellen.
Wenn das geht wäre das ja schonmal super
Dann hätte ich eine 3stellieg Byte Zahl.
Was ja ganz gut funktioniert ist folgendes:
Dann geben die 8Pins von PortA die Bytezahl aus.Code:Dim Var As Byte Var = 2 PortA = Var
Funktioniert auch mit meinen BCD Dekodern, die 4 Inputs haben und dann auf 7-Segment ausgeben.
Jetzt muss ich aber auf PortA 2 Stellen ausgeben, also einmal auf Pin 1-4 eine Stelle und auf Pin 5-8 die 2.
Die 3. Stelle gebe ich dann am Port C aus.
Meine Frage wäre jetzt wie kann ich das anstellen?
Also die Bytezahl in 3 einzelne teilen und dann auf den "halben" Port ausgeben.
Was natürlich gehen würde aber unschön ist, dass ich mir für jede Ziffer einen Bitcode aufschreibe und dann mit Select wähle.
Danke schonmal,
Lukas
a=128
b=a
a=a and &B11110000
b=b and &B00001111
porta=a
port a = porta or b
dann gibts da noch den befehl "shift"
Vor den Erfolg haben die Götter den Schweiß gesetzt
Uh danke für den Code,
aber ich verstehs leider gar nicht *g*
Shift werd ich mir mal anschauen, danke für den Tipp
Wenn möglich mach man solche Rechnungen mit längerren Zahlen. Entweder Fließkomma (Single) oder als ganzzahl (long = 32 Bit). Die Skalierung oder ein Runden dann ganz am Ende.
Also ich bin soweit, dass ich am Ende eine Bytezahl rauskriege, die keine Nachkommastellen hat.
Geht ja glaube ich eh ned...
Das Programm steigert einfach immer die Zeit, ich wollte im Simulator mal schauen was so rauskommt.Code:Config Porta = Output Dim Anzeige As Byte Dim Zeit As Single Dim Speed As Single Zeit = 0 Do Zeit = Zeit + 0.001 Print Zeit Waitms 1000 Speed = 0.1 / Zeit Speed = Round(speed) Print Speed Waitms 1000 Anzeige = Speed Porta = Anzeige Loop End
Funktioniert wunderbar aber momentan hab ich halt an PortA noch die ganze Zahl...
Aber wie gebe ich diese Bytezahl jetzt auf 3 7-Segment Anzeigen aus?
Ich hab jeweils vor jeder Anzeige einen Dekoder, der 4 Bits als Input erwartet.
Ich müsste also die Zahl 123 in 3 Bytes aufteilen die dann 1,2 und 3 lauten,
bzw bei 45 wären die dann 0,4,5.
Und dann wäre noch das Problem wie kann ich dann die 0 auf PortA.1-4 und die 4 auf PortA.5-8 ausgeben?
Vitis hats ja schon gepostet aber ich steig leider nicht durch
ohne Dir zu nah treten zu wollen ... das macht man nicht.
mal davon abgesehen, dass Du Dezimale berechnen musst
brauchts ne Menge teurer Bauteile und die Leiterbahnführung
wird auch recht kompliziert.
Normalerweise geht man hin
und hängt die Anzeigen einfach parallel auf nen Bus ausser
der jeweiligen gemiensamen Anode oder Kathode.
Die steuert man per Transistor an, das machts einfacher.
aber für den Fall den Du brauchst gehts in etwa so:
Dim A As Byte
Dim B As Byte
Dim Dezstellen(3) As Byte
A = 158
B = A / 100
Dezstellen(1) = B
B = B * 100
A = A - B
B = A / 10
Dezstellen(2) = B
B = B * 10
A = A - B
Dezstellen(3) = A
sollte gehen da nicht gerundet wird sondern nur die
ganzzahlign werte errechnet werden.
PortA.1-4 und die 4 auf PortA.5-8
shift Dezstellen(1),left,1
shift Dezstellen(2),left,5
porta = Dezstellen(1) or Dezstellen(2)
Vor den Erfolg haben die Götter den Schweiß gesetzt
Ah okay danke
Du trittst mir auf keinen Fall zu nahe, bin immer offen für Tips
Das mit den Dekodern ist mir auch nicht selber eingefallen sondern das wurde mir in nem anderen Thread geraten...
Ich überlege jetzt grad, ob ich die nochmal ablöte.
Transistoren hab ich glaube ich irgendwo rumliegen...
(Das ganze ist auf Lochraster aufgebaut wird mit Draht verbunden, das hab ich aber noch nicht gemacht.)
Es wäre also besser alle 3 Anzeigen parallel mit 7 Pins zu verbinden und dann jede Kathode über einen Transistor und die Basis davon an einen Pin ?
Also ganz normal Multiplexen oder?
Den Quellcode werd ich mir nochmal genauer anschauen, ich versteh ihn immer noch nicht so ganz *g*
Aber die Shift Funktion hab ich mir gestern noch angeschaut.
Multiplexen ist ja ok, aber speichern deine Anzeigen bzw. die BCD Decoder denn die Werte? Wenn nicht, dann müsstest du sehr schnell dauernd die Werte ausgeben, weil jede Anzeige ja nur ganz kurz dran ist und du dann ein Flimmern siehst.
Bei deinen fest zugeordneten Pins hast du das Problem nicht, dafür verbrauchst du aber mehr Pins. Zunächst hat dein Mega16 ja genug davon, was beim Wachsen deines Projektes dann Probleme geben könnte.
Gruß
Rolf
Also wenn ich die Dekoder weglasse und es machen wi Vitis meint müsste ich die Anzeigen immer abwechselnd anschalten, die speichern nichts.
Sind ja im Prinzip nur 7 LEDs.
Aber der ATmega16 wird ja mit 75Hz fertig werden, dann hätte ich eine Wiederholungsrate von 25Hz wenn ich pro "Bildaufbau" 3 Schritte brauche.
Warum willst du denn die Decoder weglassen? Dann sparst du dir 2 Pins (anstelle von 3x4 hast du dann 3+7) Und das wird es dir nicht leichter machen. Anstelle BCD auf 4 Pins musst du dann 7-Segment auf 7 Pins ausgeben. Welche Decoder hast du denn? Wenn die eine Enable/Select Leitung haben, kannst du genauso multiplexen. Evtl. speichern die sogar.Zitat von Lukas.
Unterschätze mal nicht den Aufwand. Hier sind schon einige gewesen, die Schwierigkeiten mit dem dauernden Ausgeben auf 7-Segment Anzeigen hatten, weil nicht hell genug, zuviel flimmern, ungleichmäßig hell usw.Zitat von Lukas.
Und es geht nur um eine 3-stellige Zahl auszugeben.
Gruß
Rolf
Lesezeichen