- Akku Tests und Balkonkraftwerk Speicher         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 28

Thema: LEDschaltung im PingPong

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.694
    Danke euch dreien für die Ausführungen.

    Zitat Zitat von radbruch Beitrag anzeigen
    ... Das habe ich hier auch schon mal beschrieben ...
    Ja, das hatte ich (leider nur) überflogen, bevor mich die Schnapsidee überkam das selbst zu machen. Und so läuft das ja auch bei mir. Die LED-Ansteuerung hatte ich mir zu Beginn meiner Überlegungen am Oskar angesehen (2-Kanal analog) und daraus Timing und Schaltweise entnommen. Die Funktion LED=an wenn A high und K low ist war dann Ausgangspunkt für die Steuerung.

    Realisiert ist die Ansteuerung der LEDs in einer ISR die alle 250 µs aufgerufen wird. Darin wird die vorhergehende Zeile ausgeschaltet, das Schieberegister mit dem aktuellen Bitmuster versorgt, aktiv geschaltet und danach die neue Zeile eingeschaltet. Frisst rund 50% CPU-Zeit und ergibt eine augenfreundliche Frequenz von 400 Hz. Meine Annahme war dabei, dass die 2000 Maschinenzyklen zwischen zwei Interrupts genug wären um IRS und Hauptprogramm abzuarbeiten. Und das funktionierte schon prächtig : die beiden Rackets laufen mit Potisteuerung brav in ihren Grenzen auf und ab.
    Code:
    // ===============================================================================
    //      Interruptroutinen
    // ===============================================================================
    // ===============================================================================
    // ===  Initialisierung der Ports auf ATMEGA8 AU auf Vektor 10 (1-19) TIMER0 OVF
    //                      Timer/Counter0 Overflow mit ###>>> 250 µs bei 8 MHz
    //TCCR0 |= (1<<CS01);           // 1/8  Prescaler, 250 µs bei 8 MHz
                                    // entsprechend 250*8 = 2000 Maschinenzyklen
    // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
     ISR (TIMER0_OVF_vect)          // ISR schaltet LED der Reihe nach
     {                              //
    // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      SetBit (PORTD, 3);            // Zeitnahmeblink ein
      Izeit_1  ++;                  // Boardzeit hochtickern
      if (Izeit_1 == 4001) Izeit_1 = 1;   // ... und eingrenzen
      TC  ++;                       // ISR-Timercount incrementieren
      if (TC == 11) TC  = 1;        // ... und eingrenzen
                                    //
    // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    //      Es beginnt die Schalterei der LEDs, Zeile für Zeile,
    //      Zuerst "alte Zeile" ausschalten (case), danach Zeilenmuster einlesen
    // - - - - - - - - - - - - - - -
      switch (TC) {                 //
      case 1:                       //
        ClrBit (PORTB, 1);          // Zeile 0 aus - letzte Zeile
        break;                      // switch verlassen
      case 2:                       //
        ClrBit (PORTC, 0);          // Zeile 1 aus-
        break;                      // switch verlassen
      case 3:                       //
        ClrBit (PORTC, 1);          // Zeile 2 aus-
        break;                      // switch verlassen
      case 4:                       //
        ClrBit (PORTC, 2);          // Zeile 3 aus-
        break;                      // switch verlassen
    // - - - - - - - - - - - - - - -
      case 5:                       //
        ClrBit (PORTC, 3);          // Zeile 4 aus-
        break;                      // switch verlassen
      case 6:                       //
        ClrBit (PORTD, 4);          // Zeile 5 aus-
        break;                      // switch verlassen
      case 7:                       //
        ClrBit (PORTD, 5);          // Zeile 6 aus-
        break;                      // switch verlassen
      case 8:
        ClrBit (PORTD, 6);          // Zeile 7 aus-
        break;                      // switch verlassen
      case 9:
        ClrBit (PORTD, 7);          // Zeile 8 aus-
        break;                      // switch verlassen
      case 10:
        ClrBit (PORTB, 0);          // Zeile 9 aus-
        break;                      // switch verlassen
      default:
        break;
      }                             // Ende switch (TC), Zeile TC ausschalten
    // - - - - - - - - - - - - - - -
    //      "Alte Zeile" wurde ausgeschaltet, jetzt aktuelles Zeilenmuster einlesen
    //      Aktuell ist die Zeile TC
                                            //
      for (LPp = 4; LPp < 16; LPp++)
      {                                     //
        if (IsBitSet (L[TC], LPp))          // 
        { ClrBit (PORTB, dta); }            // Data low  <=> LED on
        else { SetBit (PORTB, dta); }       // Data high <=> LED off
        ClrBit (PORTB, clk);                // Clock low
        SetBit (PORTB, clk);                // Clock high
      }                             // Ende for (LPp = 0; LPp == 7; LPp++)
                                    //
    // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    //      Neue Zeilen einschalten mit case TC, danach strobe auf Schieberegister
    // - - - - - - - - - - - - - - -
      switch (TC) {                 //
      case 1:                       //
        SetBit (PORTC, 0);          // Zeile 1 ein - erste Zeile
        break;                      // switch verlassen
      case 2:                       //
        SetBit (PORTC, 1);          // Zeile 2 einschalten
        break;                      // switch verlassen
      case 3:                       //
        SetBit (PORTC, 2);          //
        break;                      //
      case 4:                       //
        SetBit (PORTC, 3);          //
        break;                      //
    // - - - - - - - - - - - - - - -
      case 5:                       //
        SetBit (PORTD, 4);          // Zeile 5 einschalten
        break;                      // switch verlassen
      case 6:                       //
        SetBit (PORTD, 5);          //
        break;                      //
      case 7:                       //
        SetBit (PORTD, 6);          //
        break;                      //
      case 8:                       //
        SetBit (PORTD, 7);          //
        break;                      //
      case 9:                       //
        SetBit (PORTB, 0);          //
        break;                      //
      case 10:                      //
        SetBit (PORTB, 1);          // Zeile 0 einschalten
        break;                      // switch verlassen
      default:
        break;
      }                             // Ende switch (TC), Zeile TC einschalten
    // - - - - - - - - - - - - - - -
    //      Neue Zeilen sind eingeschaltet, jetzt strobe
                                    //
      ClrBit (PORTB, str);          // Strobe low
      SetBit (PORTB, str);          // Strobe high
                                    // Ende Ausgabe für Zeilen
    // - - - - - - - - - - - - - - -
        ClrBit (PORTD, 3);            // Zeitnahmeblink aus
        //  Zeitnahme am 20. Feb. 2011: Routine x10 benötigt 
      return;                       // Ende ISR
     }                              //
    // ===============================================================================
    So - aufgefallen ist mir dabei, dass mehrere LEDs in einer Reihe leuchten können - ist ja klar, weil mehrere eben mehr Strom brauchen als eine *ggg*. Einfachstes Beispiel: beide Schläger stehen auf gleicher Höhe, es leuchten zwei LEDs in einer Reihe und damit sieht man ein klitzekleines Einbrechen der Helligkeit. Das stimmt ja auch mit einfachsten Überlegungen überein. Es ist kaum merklich - aber ich wollte wissen, ob diese Matrixfahrweise eben die LEDs einzeln oder zeilenweise ansteuert.

    Also - zeilenweise. Und der geringe Helligkeitseinbruch ist ja auch praktisch kaum zu sehen.

    Nochmal danke für die Hilfe.
    Ciao sagt der JoeamBerg

  2. #2
    Verwende für erste Versuch erstmal fertige Quellen in "C" -- http://www.elo-web.de/elo/mikrocontr...ng/laufschrift

    Ich selbst habe das Lauflicht auf 2 Module erweitert und keine delay-Schleifen mehr drinn -- der Quellcode ist aber schon sehr gut für den Anfang.

  3. #3
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.694
    Hi Jens, willkommen im Forum. Danke für Deine Hinweise.

    Zitat Zitat von Jens_Gr
    ... für erste Versuch erstmal fertige Quellen ... laufschrift ... habe ... keine delay-Schleifen mehr drinn ...
    Hmmmm - ich will ja kein Lauflicht machen sondern das PingPong in C möglichst genau nachbauen. Mir war im Eingangspost nicht klar, ob ich die Ansteuerung richtig verstanden hatte - weil es je nach Anzahl der leuchtenden LEDs in einer Zeile Helligkeitsunterschiede gibt. Und delays hab ich eigentlich nicht in die engere Wahl gezogen, der Controller läuft sowieso müde 8 MHz.

    Im gegenwärtigen Stand - Rackets bewegen - läuft die chose gut - siehe oberes Posting; demnächst kommt der Ball ins Spiel.
    Ciao sagt der JoeamBerg

  4. #4
    Benutzer Stammmitglied Avatar von funk3r
    Registriert seit
    13.10.2009
    Ort
    Niedernhall
    Beiträge
    41
    Hier gibt es eine Version in C
    http://blogs.zobniow.net/micro/2010/...onradde-board/

    @Laufschrift:
    Wie erweitert man das auf mehrere Module?
    Gibt es dazu fertigen Code?
    Grüßle Jo
    ______________
    ><(((°> Son of God through Jesus Christ his Son <°)))><
    Mein Blog: funk3r.de

  5. #5
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.694
    Zitat Zitat von funk3r
    Hier gibt es eine Version in C ...
    Diese Version von Piotr Platek hatte ich Anfang des Jahres getestet. Seltsamerweise lief ein eigenes Kompilat nicht sehr stabil und eine geringfügig veränderte Quelle (Starttext) lief mit wirren Zeichen und nicht reproduzierbar (irgendein Variablenüberlauf?). Die Kommentare fand ich auch etwas spärlich, jedenfalls kann ich mit meinen bescheidenen C-Kenntnissen den Ablauf nicht nachvollziehen.

    Es ist wie so oft: selbst geschrieben ist der Code meist verständlicher als abgekupfert (Ausnahmen von guten Codern gibts aber!). Daher auch meine eigenen Bemühungen - mit etwas mehr Kommentar und weniger Spaghetti.
    Ciao sagt der JoeamBerg

  6. #6
    Benutzer Stammmitglied Avatar von funk3r
    Registriert seit
    13.10.2009
    Ort
    Niedernhall
    Beiträge
    41
    Da ist natürlich was dran.
    Beim selber programmieren weiß man wenigstens was man hat
    Grüßle Jo
    ______________
    ><(((°> Son of God through Jesus Christ his Son <°)))><
    Mein Blog: funk3r.de

  7. #7
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.694
    Das PingPong ist ja etwas aus den Schlagzeilen. Aber ich bin mittlerweile weiter gekommen.

    Startsequenz und Racketsteuerung über Potentiometer läuft. Der Tongenerator im Test wird durch die Potentiometer gesteuert, die Racketstellung liefert in dieser Testversion die Information für die aktuelle Generatoreinstellung. Die Grundfrequenz ist 2 kHz => in der 4kHz-ISR für den LED-Refresh wird der Soundausgang getoggelt. Dazu die Teiler 1, 2, 3, 4, 5, 6, 7, 8 und 9 für div. Töne. Der 1-kHz-Ton hat bei meinem Beeper die größte Lautstärke. Ein 4,7 µF Elko macht den Ton des magnetischen Beepers etwas weicher.

    Eine höhere Tonfrequenz ist aktuell nicht ratsam/möglich, da der Beeperanschluss wegen der Kompatibilität mit dem Originalprogramm auf PD1 bleiben muss und die üblichen timersteuerbaren Ausgänge durch andere Belegungen nicht nutzbar sind.



    Wenn es RICHTIG weitergegangen ist und die ersten Spielversuche laufen, gibts auf Wunsch auch Code.
    Ciao sagt der JoeamBerg

  8. #8
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.694
    Die gute PingPong-Platine dient mir als schickes LED-Display. Numerische Anzeige, auch ein paar Buchstaben und Sonderzeichen, mit mega168 oder größer (ich arbeite daran) ginge auch das komplette Alphabet.

    Ciao sagt der JoeamBerg

  9. #9
    Erfahrener Benutzer Roboter Genie Avatar von Crazy Harry
    Registriert seit
    15.01.2006
    Ort
    Raum Augsburg - Ulm
    Beiträge
    1.310
    Bei dem Teil (hab auch noch so eine Platine rumliegen) fällt mir was anderes ein, das ich mal mit einer Propellerclock gemacht hab: ich habe ein grafisches LCD definiert und die Hardware-Ausgabe selber programmiert (das geht mit meinem Compiler). Der im RAM des Controllers liegende Videospeicher wurde aber über die Schieberegister der PC ausgegeben. Funktioniert hervorragend. Sinn und Zweck dieser Aktion: die PC verhält sich wie ein GLCD und ich kann alle Grafikfunktionen des Compilers nutzen.
    Auch bei der PingPong-Platine könnte man ein GLCD mit 16x16 (muß ein Vielfaches von 8 sein) Pixel definieren, HW-Ausgabe Proggen und auch dann die Grafikbefehle des Compilers nutzen.
    Miniaturansichten angehängter Grafiken Miniaturansichten angehängter Grafiken PD1_3.jpg  
    Ich programmiere mit AVRCo

  10. #10
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Die Widerstände sind so, das eigentlich immer nur eine LED pro Zeile gleichzeitig Leuchten sollte. Das passt auch zum langsamen Schieden des Schieberegisters. Der Bildaufbau erfolgt also Spalte für Spalte. Wegen der relativ schwachen Treiber der 4094 (wohl 74HC4094) wird es aber mit mehr als 1 LED Gleichzeitig schon schwer.

    Besser wäre es aber gewesen die Widerständen an die 4094 zu machen (halt 2 mehr) und dann Zeilenweise das Bild aufzubauen - die Treiber des AVRs sind meist etwas kräftiger als beim 4094. Dann wäre auch eine Ansteuerung per SPI Hardware besser.

    Der C Code wird ggf. noch etwas schneller wenn man wenn möglich lokale Variablen in der ISR nutzt.
    Es sollten auch etwa 120 Hz Widerhohlfrequenz ausreichen - die nötige Rechenzeit für die Darstellung reduziert sich damit auf etwa 1/3.

Seite 1 von 2 12 LetzteLetzte

Stichworte

Berechtigungen

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

Solar Speicher und Akkus Tests