- fchao-Sinus-Wechselrichter AliExpress         
Ergebnis 1 bis 10 von 10

Thema: 7 Segmentanzeige multiplexen

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    09.01.2005
    Alter
    41
    Beiträge
    76

    7 Segmentanzeige multiplexen

    Anzeige

    E-Bike
    Hallo Zusammen

    Ich habe hier einen ATmega32 vor mir. Mit dem möchte 2 7Segment LED Anzeigen ansteuern. Es soll eine Anzeige für einen Kickerkasten werden.

    Jedes dieser 7Segmentanzeigen ist 2-Stellig (geht also bis 99).
    Damit ich nicht zuviele Ports brauche möchte ich einen Port pro 2-Stellige Anzeige multiplexen.

    Also z.b. die Zahl 12 soll angezeigt werden.
    Zuerst soll am PortA die Zahl "1" ausgegeben werden und mit dem PortB0 soll die 2.Anzeige aktiviert werden.

    Beim nächsten Tackt wird die Zahl "2" am PortA ausgegeben aber diesmal wird PortB1 aktiviert und bringt so die 1.Anzeige zum leuchten.

    Weil dies mit 1MHz geht, kann das menschliche Auge nicht erkennen dass die LED der Anzeige aus- bzw. angehen und es erscheint die Zahl 12 auf der Anzeige.

    Nun hat jemand schon Code für so etwas?
    Ich hoffe ihr seit bei meiner Beschreibung draus gekommen.

  2. #2
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    15.07.2004
    Alter
    45
    Beiträge
    196
    code kenn ich keinen fertigen sollt aber auch nicht das Problem sein.
    Bei zu hohem Takt kommen aber die leds nicht hinterher
    mfg

  3. #3
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    52
    Beiträge
    2.236
    Hallo,
    sowas läßt sich ziemlich einfach programmieren, z.B. so:

    zuerst ein Array, wo die Zahlen 0-9 gespeichert sind bei mir so:
    Code:
    const uint8_t zeichen[] ={
    		0x3F,			/*0*/
    		0x18,			/*1*/
    		0x6D,			/*2*/
    		0x7C,			/*3*/
    		0x5A,			/*4*/
    		0x76,			/*5*/
    		0x77,			/*6*/
    		0x1C,			/*7*/
    		0x7F,			/*8*/
    		0x7E			/*9*/
    		};
    Dann brauchst Du zwei Variablen, die Deine zwei Zahlen darstellen:
    Code:
    volatile uint8_t erste = 1;
    volatile uint8_t zweite = 2;
    Jetzt schmeißt Du einen Timer an und in seinem Overflowinterrupt kommt folgendes rein :
    Code:
    static uint8_t zahl = 0;/*Spechert Welche Zahl dran ist*/
    
     if (zahl){
    	  PORTB &=~(1<<ENABLE2);
    	  PORTB |=(1<<ENABLE1);
    	  PORTD = ~(zeichen[erste]);
    	  zahl=0;
      } else {
    	  PORTB &=~(1<<ENABLE1);
    	  PORTB |=(1<<ENABLE2);
    	  PORTD = ~(zeichen[zweite]);
    	  zahl=1;
      }
    So, am PortD kamen bei mir die Anoden, und am PortB die Beiden Kathoden die mit ENABLE1 u. ENABLE2 definiert sind.

    Du brauchst auch kein Timer von 1 MHz, ich glaube ich habe irgendwas um 200 Hz oder so, muß mal probieren, was nicht mehr flackert.

    Ich hoffe, ich konnte Dir damit etwas helfen.

    Gruß Sebastian
    Software is like s e x: its better when its free.
    Linus Torvald

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    09.01.2005
    Alter
    41
    Beiträge
    76
    Ja Danke, ihr habt mir schon weitergeholfen.
    Ich hätte jetzt nicht daran gedacht, dass die LED's mit 1MHz nicht mehr nachkommen würden.
    Also werde ich es wohl mit einem Timer machen müssen.
    In meinem ersten Codeentwurf habe ich eine Funktion geschrieben, die eine Zahl in Zehner und Einer aufspaltet und dann mittels "switch" die richtigen Ausgänge ansteuert.
    Aber ein Array ist viel eleganter!!

    Noch eine Frage zum eine Zahl in Zehner und Einer zerlegen:
    Für die Einer würde ich z.b in Java die Modulo "mod(zahl/10)" Methode nehmen. Ich hab aber im "math.h" Includefile keine solche Funktion gesehen.
    Habt ihr mir auch für das einen guten Tipp?

    Vielen Dank

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    09.01.2005
    Alter
    41
    Beiträge
    76
    Ach ja, ich Depp!

    habs gerade gemerkt...
    Modulo in C = "%"

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    18.09.2004
    Beiträge
    26
    in java is modulo auch %...

  7. #7
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    52
    Beiträge
    2.236
    Noch eine Frage zum eine Zahl in Zehner und Einer zerlegen
    Frage, wozu zerlegen ????

    Du willst das für einen Kickerkasten machen, also direkt BCD rechnen, auf ein Ereignis, Tastendruck, oder was auch immer:
    Code:
    zweite++;
    if ( zweite > 9) {
    zweite = 0;
    erste ++;
    }
    if ( erste > 9) erste = 0;
    Dann brauchst Du nichts mehr umzurechnen...

    Gruß Sebastian
    Software is like s e x: its better when its free.
    Linus Torvald

  8. #8
    Benutzer Stammmitglied
    Registriert seit
    09.01.2005
    Alter
    41
    Beiträge
    76
    Du hast recht, das hab ich mir auch schon überlegt.

    Ich habe aber eine Klasse decToBcd geschrieben. Damit ich später diese Klasse wieder einmal verwenden kann.

    Ich möchte daher der Funktion nur einen Integer Wert mitgeben.

    Danke für die Hilfe.

  9. #9
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    52
    Beiträge
    2.236
    Ja gut, es war nur ein Tip

    So eine dec2Bcd Routine ist auch was feines, vor allem, wenn man ADC Messungen darstellen will.

    Gruß Sebastian
    Software is like s e x: its better when its free.
    Linus Torvald

  10. #10
    Neuer Benutzer Öfters hier
    Registriert seit
    01.06.2011
    Beiträge
    5
    Die Ausgabe von Zahlenwerten auf ein Text-LCD ist sicherlich das Nonplusultra, aber manchmal liegen die Dinge sehr viel einfacher. Um beispielsweise eine Temperatur anzuzeigen ist ein LCD etwas Overkill. In solchen Fällen kann die Ausgabe auf ein paar 7-Segmentanzeigen gemacht werden. Ausserdem haben 7-Segmentanzeigen einen ganz besonderen Charme

Berechtigungen

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

Solar Speicher und Akkus Tests