PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Byte Zahlen



Lukas.
20.01.2009, 17:04
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:



Dim Var As Byte

Var = 2
PortA = Var


Dann geben die 8Pins von PortA die Bytezahl aus.
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

Vitis
20.01.2009, 18:02
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"

Lukas.
20.01.2009, 18:25
Uh danke für den Code,
aber ich verstehs leider gar nicht *g*

Shift werd ich mir mal anschauen, danke für den Tipp :)

Besserwessi
20.01.2009, 20:15
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.

Lukas.
20.01.2009, 20:38
Also ich bin soweit, dass ich am Ende eine Bytezahl rauskriege, die keine Nachkommastellen hat.
Geht ja glaube ich eh ned...



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


Das Programm steigert einfach immer die Zeit, ich wollte im Simulator mal schauen was so rauskommt.
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 :-k

Vitis
20.01.2009, 22:52
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)

Lukas.
21.01.2009, 07:07
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.

for_ro
21.01.2009, 10:03
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

Lukas.
21.01.2009, 10:09
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.

for_ro
21.01.2009, 12:24
Also wenn ich die Dekoder weglasse und es machen wi Vitis meint müsste ich die Anzeigen immer abwechselnd anschalten, die speichern nichts.
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.

Aber der ATmega16 wird ja mit 75Hz fertig werden, dann hätte ich eine Wiederholungsrate von 25Hz wenn ich pro "Bildaufbau" 3 Schritte brauche.
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.
Und es geht nur um eine 3-stellige Zahl auszugeben.

Gruß

Rolf

Lukas.
21.01.2009, 12:36
Vitis hat gemeint der Decoder wäre unnötig ;)

Die Dekoder sind folgende (http://www.reichelt.de/?;ACTION=7;LA=6;OPEN=1;INDEX=0;FILENAME=A240%252F7 4HC4543%2523STM.pdf;SID=27TkdVn6wQARsAAG2W9aI91bb7 b4f463e4be4e3165519f2c9caa5)

Naja vielleicht lasse ich sie doch drin...
Mal schaun ob ich den Code von Vitis verstehen kann, dann wäre das Problem ja eh gelöst :)

Vitis
21.01.2009, 14:40
nen Dekoder verwenden ist auch nicht verkehrt, nur eben
nicht 3 davon, das brauchts nicht und das Routing ist einfacher.
Ich hab erst n Projekt mit 5 Stück 16-Segment Anzeigen gemacht,
das läuft ohne Probleme beim Timing ohne Flackern oder
Hänger.
Ich hab einfach nen Timer verwendet, der zyklisch 1-5 hochzählt,
und dann immer ein Segemnt weiter schaltet und die jeweiligen
Signale an die Segmentanzeige schickt.
Mein Mega128 läuft auf ~12.280 MHz, reicht vom Timing her
locker aus.

Was ist den an dem Code unklar?

Lass ihn mal in Deinem Simulator vom Bascom laufen
und dir dabei die Variableninhalte anzeigen, dann wirds eventuell
klarer.

Lukas.
21.01.2009, 15:37
Achso, du meinst einen Decoder und dann Multiplexen...
Jetz hab ichs gecheckt, sorry ;)

Hm ja ich werd ihn mir nachher anschauen,
werd ich schon verstehn...

Lukas.
25.01.2009, 21:50
So, also den Code habe ich soweit eigentlich verstanden.
Wie Dezstellen(1) (2) und (3) erstellt werden ist mir jetzt klar,
ich hab nicht bedacht, dass bei Byte Variablen ja kein Komma übergeben wird ;)

Was Shift tut ist mir auch klar, allerdings verstehe ich nicht warum man Dezstellen(1) um 1 Dezstellen(2) um 5 geshiftet werden...
Müsste man nicht Dezstellen(1) so lassen und (2) um 4 nach links shiften?
So ist ja alles um ein Bit nach links verschoben...

Vitis
25.01.2009, 23:02
ich hatt mich hier auf :

Pin 1-4 eine Stelle und auf Pin 5-8 die 2.

bezogen ...

Die Ports werden von 0 bis 7 gezählt, daher hab ich gedacht,
dass Du A.0 den ADC anderweitig verwendest ... wenn Du am ersten
physischen Pin, also A.0 anfangen willst dann halt einmal ohne shift
und einmal nur um 4
dann haste porta.0 bis port a.3 den ersten bcd, und auf port a.4
bis a.7 den zweiten

Lukas.
26.01.2009, 14:21
Achso, weil ich oben 1-4 und 5-8 geschrieben habe...
Gut aber dann habe ich es verstanden :)
Danke