-         

Ergebnis 1 bis 7 von 7

Thema: wert auf 2 siebensegmenteanzeigen ausgeben

  1. #1
    Erfahrener Benutzer Begeisterter Techniker Avatar von RobbyMartin
    Registriert seit
    31.12.2009
    Ort
    Leverkusen
    Alter
    24
    Beiträge
    206

    wert auf 2 siebensegmenteanzeigen ausgeben

    Anzeige

    Hallo ich möchte den wert des potentiometers auf 2 siebensegmente anzeigen darstelellen von 0 - 99 doch ich habe keine ahnung wie ich es realisieren soll...

    $regfile "m8def.dat"

    $crystal = 1000000

    Dim Ad As Word

    Config Portb = Output
    Config Adc = Single , Prescaler = Auto , Reference = Avcc

    Start Adc

    Do
    Ad = Getadc(0)
    If Ad <= 340 Then
    Portb.0 = 1 : Portb.1 = 0 : Portb.2 = 0
    Elseif Ad > 340 And Ad <= 680 Then
    Portb.0 = 0 : Portb.1 = 1 : Portb.2 = 0
    Elseif Ad > 680 Then
    Portb.0 = 0 : Portb.1 = 0 : Portb.2 = 1
    End If
    Loop


    das ist das programm um zumindestens schonmal 3 leds zum leuchten zu bringen aber wie ich es auf einer sieben segmente anzeige anzeigen soll weiß ich nicht könnte mir jemand helfen ??

    das programm ist für den atmega 8

    auch ein kleiner schaltplan wo ich dann die sieben segmenteanzeigen anschliesen muss wäre nett

    auf antworten freue ich mich sehr

    lg
    martin

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.112
    Hallo Martin,
    wichtig ist zunächst mal, ob der Mega8 noch andere Sachen machen soll oder ob du 14 Pins für die 2 7-Segment Anzeigen frei hast.
    Wenn ja, kannst du einen Anschluss der Anzeige direkt von einem Pin des µC treiben lassen. Da muss dann nur noch ein Vorwiderstand dazwischen, um den Strom auf 20mA zu begrenzen.
    Dann ist es am einfachsten, wenn du eine Anzeige auf einen kompletten Port legen kannst. Dass geht beim Mega8 mit PortB und PortD. Bei PortB kannst du dann aber keinen Quarz anschließen. Ist bei deinem bisherigen Programm auch unnötig.

    Die Anzeigen haben eine gemeinsame Anode oder Kathode, die an VCC bzw. GND kommt.
    Die Segmentanschlüsse legst du dann z.B. so
    Seg A -> PortB.0
    Seg B -> PortB.1
    Seg C -> PortB.2
    Seg D -> PortB.3
    Seg E -> PortB.4
    Seg F -> PortB.5
    Seg G -> PortB.6

    .A.
    F B
    .G.
    E C
    .D.

    Entsprechend für die zweite Stelle.
    Dann speicherst du dir in einem Feld zu den Ziffern 0-9 die entsprechenden Werte ab. Bei gemeinsamer Kathode (dann müssen die Segmente auf 1 um an zu sein) also z.B.
    PortB = &B0000_0110 '1
    PortB = &B0110_0110 '4
    Die Zahlen von 0-99 zerlegst du in die Ziffern z.B. mit
    Zehner = Ad / 10
    Einer = Ad Mod 10
    und gibst dann die Feldwerte für die beiden Stellen aus.

    Klar?

    Edit: Ich habe die Segmente mal so abgeändert, wie Jaecko meinte. Passt dann auch zu Ches Programm.

  3. #3
    Erfahrener Benutzer Robotik Einstein Avatar von Jaecko
    Registriert seit
    16.10.2006
    Ort
    Lkr. Rottal/Inn
    Alter
    35
    Beiträge
    1.987
    Glaub, dass die Segmentanordnung nicht ganz stimmt.
    Der "Ring" aussen rum ist um 1 Schritt verdreht; A ist ganz oben, F links oben.
    #ifndef MfG
    #define MfG

  4. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.09.2007
    Ort
    Berlin
    Alter
    24
    Beiträge
    1.544
    Hallo Martin,

    hier mal ein Code von mir, hab ihn nur auf die schnelle zusammengebastelt, aber ich denke, er müsste funktionieren, wenn du ihn auf deine Hardware (mega8 , quarz) abstimmst.
    Code:
    $regfile = "m32def.dat"
    $crystal = 16000000
    $framesize = 80
    $hwstack = 80
    $swstack = 80
    
    
    Ddra.0 = 0
    Porta.0 = 0
    Ddrc = 255
    Ddrd.0 = 1
    Ddrd.1 = 1
    
    Trans_left Alias Portd.0
    Trans_right Alias Portd.1
    
    Trans_left = 1
    Trans_right = 0
    
    
    Config Adc = Single , Prescaler = Auto
    Start Adc
    
    Config Timer2 = Timer , Prescale = 256
    Timer2 = 131
    On Timer2 Multiplex
    Enable Timer2
    
    
    Dim Poti_wert As Word
    Dim Anzeige As Single
    Dim String_1 As String * 3
    Dim Anzeige_left_string As String * 2
    Dim Anzeige_right_string As String * 2
    Dim Anzeige_left As Byte
    Dim Anzeige_right As Byte
    Dim Anzeige_numb As Bit
    
    
    Enable Interrupts
    
    
    Do
    
    Poti_wert = Getadc(0)
    Anzeige = Poti_wert / 1024
    Anzeige = Anzeige * 99
    String_1 = Str(anzeige)
    Anzeige_left_string = Left(string_1 , 1)
    Anzeige_right_string = Right(string_1 , 1)
    
    Anzeige_left = Val(anzeige_left_string)
    Anzeige_right = Val(anzeige_right_string)
    
    Anzeige_left = Lookup(anzeige_left , Seven_segment_tab)
    Anzeige_right = Lookup(anzeige_right , Seven_segment_tab)
    
    If Anzeige_numb = 1 Then
    Portc = Anzeige_left
    Elseif Anzeige_numb = 0 Then
    Portc = Anzeige_right
    End If
    
    Loop
    
    End
    
    
    Multiplex:
    Timer2 = 131
    Toggle Trans_left
    Toggle Trans_right
    Toggle Anzeige_numb
    Return
    
    
    
    Seven_segment_tab:
    'Data &B00000001 , &B00000110 , &B00011000 , &B00110000 , &B01100000 , &B01110111 , &B01111111 , &B10000011 , &B10111111 , &B11111111
    Ganz am Schluss musst du den "Kommentar" wegmachen und für die Anzeigen passende Werte einfügen.
    Einen Schaltplan kann / will ich dir jetzt nicht geben, aber im Prinzip ist es ganz einfach:
    Du schließt zwei 7 Segmentanzeigen parrallel an, nur die gemeinsame Anode / Kathode nicht. Diese hängst du jeweils an einen Transistor (also trans_left (Portd.0) und trans_right (Portd.1)). Die restlichten parallelen Anschlüsse kommen alle an Portc. Das kannst du natürlich auf jeden beliebigen Port umbauen.
    Der Vorteil bei dem Parralel schalten ist, dass du dir ein Paar pins sparst, indem die beiden Anzeigen gemultiplext werden.
    Mit diesen Timerwerten läuft die Anzeige auf 500Hz. Ich denke das reicht, falls es aber doch flimmern sollte, musst du die Frequenz erhöhen.

    Wenn du noch Fragen hast, melde dich einfach.

    Gruß
    Chris

  5. #5
    Erfahrener Benutzer Begeisterter Techniker Avatar von RobbyMartin
    Registriert seit
    31.12.2009
    Ort
    Leverkusen
    Alter
    24
    Beiträge
    206
    also die lösung von che guevara klingt schon ganz gut ich denke nicht das ich keinen externen quarz benötige der interne oszilator genügt, da ich keine weiteren auswertungen ^vornehmen werde

    was ich nur noch gerne wissen wollte
    was ich in die letzte zeile einfügen soll wenn die anzeige von 0-99 hoch gehen soll

    Seven_segment_tab:
    'Data &B00000001 , &B00000110 , &B00011000 , &B00110000 , &B01100000 , &B01110111 , &B01111111 , &B10000011 , &B10111111 , &B11111111

    trotzdem danke für die schnelle antwort

    lg
    martin

  6. #6
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.09.2007
    Ort
    Berlin
    Alter
    24
    Beiträge
    1.544
    Du musst nur die Werte des Ports für die Ziffern 0-9 einfügen.
    Wenn eine 0 z.b. &B01111110 ist, dann ist das der erste Wert.
    Wenn eine 1 z.b. &B01000010 ist, dann ist das der zweite Wert.
    usw...

    Am besten, du siehst dir dazu nochmal den Beitrag von for_ro an

    Gruß
    Chris

  7. #7
    Benutzer Stammmitglied
    Registriert seit
    20.01.2008
    Beiträge
    66
    Hi,

    hab vor kurzem das selbe gemacht.
    Schau mal hier:
    http://www.roboternetz.de/phpBB2/zei...087&highlight=

    Das ist genau was du suchst

Berechtigungen

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