-         

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 16

Thema: Byte Zahlen

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    13.01.2007
    Ort
    Dachau
    Alter
    28
    Beiträge
    53

    Byte Zahlen

    Anzeige

    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:

    Code:
    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

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von Vitis
    Registriert seit
    06.01.2005
    Ort
    Südpfalz
    Alter
    43
    Beiträge
    2.240
    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

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    13.01.2007
    Ort
    Dachau
    Alter
    28
    Beiträge
    53
    Uh danke für den Code,
    aber ich verstehs leider gar nicht *g*

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

  4. #4
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    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.

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    13.01.2007
    Ort
    Dachau
    Alter
    28
    Beiträge
    53
    Also ich bin soweit, dass ich am Ende eine Bytezahl rauskriege, die keine Nachkommastellen hat.
    Geht ja glaube ich eh ned...

    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
    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

  6. #6
    Erfahrener Benutzer Robotik Einstein Avatar von Vitis
    Registriert seit
    06.01.2005
    Ort
    Südpfalz
    Alter
    43
    Beiträge
    2.240
    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

  7. #7
    Benutzer Stammmitglied
    Registriert seit
    13.01.2007
    Ort
    Dachau
    Alter
    28
    Beiträge
    53
    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.

  8. #8
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.112
    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

  9. #9
    Benutzer Stammmitglied
    Registriert seit
    13.01.2007
    Ort
    Dachau
    Alter
    28
    Beiträge
    53
    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.

  10. #10
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.112
    Zitat Zitat von Lukas.
    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.
    Zitat Zitat von Lukas.
    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

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •