- LiFePO4 Speicher Test         
Ergebnis 1 bis 10 von 17

Thema: SHIFTOUT mit AVR-Clock

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    shedepe
    Gast
    Hallo,
    warum brauchst du denn so eine hohe Auflösung von 50ns ? Wenn ich mir die RGBDigit Seite so anschaue würde ich darauf tippen, dass das defintiv nicht notwendig ist, sonst wäre das ganze ja nicht Arduino kompatibel.
    Wenn es dir im mehrere Anzeigen geht könntest du dir einen Atmega oder Atxmega mit mehreren SPI Controllern suchen und damit parallel die Daten raushauen.

    Wenn du wirklich 50ns haben willst, könntest du ja auch gleich einen ARM Controller nehmen. Damit kannst du dann locker 50 MHz Toggle Rate an einem IO Pin erreichen.

    EDIT: Ich nehme mal an du redest über diese Dinger hier: http://rgbdigit.com/Documents/RGBDigit_datasheet_V4.pdf

    Dann kannst du Seite 4 sehen: Deine Data transfer time ist mindestens 1,25 us. Wenn du da 50ns Pulse generierst wird das Anzeige Modul vermutlich nicht das anzeigen was du erwartest.

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.10.2008
    Ort
    Kehnert
    Beiträge
    1.159
    Das Timing ohne Toleranz basiert auf 50ns (20MHz), die volle Ausnutzung der
    Toleranzen lässt eine Auflösung von 200ns (5MHz) zu. Es werden für den
    Zusammenbau der Impule daher das Vielfache von Takten benötigt, als für
    die eigentliche Datenübertragung notwendig sind. Das war mein ursprüng-
    licher Gedankengang, um RC-Abgleicharbeiten von MMVs zu vermeiden.
    Eine andere Möglichkeit, welche ich in Erwägung ziehe, ist ein kleines,
    jedoch schnelles direkt adressierbares EEPROM zu nutzen, die Datenbits
    als Adresse reinzusenden und dieses gibt die endgültigen Impukspakete
    aus. Immer noch weniger Schaltaufwand als zig Decoder, LED-Begrenzer-
    widerstände oder Multiplextreiber ohne Farbsteuerung und Erweiterbarkeit.
    VG Micha

    - - - Aktualisiert - - -

    PS:
    Der Link ist korrekt.
    Sollten ARMs in BASIC programmierbar sein, könnte man drüber reden
    VG Micha
    Was brauche ich für Werkzeug - in dieser Reihenfolge seht ihr es:
    Vorschlaghammer, Notebook, BASCOM, Lötequipment, Rohrzange, Bolzenschneider ...

  3. #3
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    07.03.2011
    Beiträge
    1.899
    Zitat Zitat von shedepe Beitrag anzeigen
    Hallo,
    warum brauchst du denn so eine hohe Auflösung von 50ns ? Wenn ich mir die RGBDigit Seite so anschaue würde ich darauf tippen, dass das defintiv nicht notwendig ist, sonst wäre das ganze ja nicht Arduino kompatibel.
    Richtig. Man muß alle 1250ns einen Puls von entweder 400ns oder 850ns erzeugen. Die aufgeschriebenen Toleranzen von 150ns sind recht großzügig, Das mit Bitbanging zu erzeugen, ist aber sportlich. Man muß ja nicht nur das Timing erzeugen, sondern auch noch die Bits aus den Bilddaten extrahieren.

    Da kommt die Idee ins Spiel, die SPI-Hardware zu benutzen, um die CPU zu entlasten. Wenn man als SPI-Clock 2,5 MHz benutzt, dauert ein Bit 400ns. 3 Bits sind dann 1200ns, gut in der Toleranz der 1250ns. Um ein Bit als 0 zu kodieren, schickt man binär 100, für eine 1 binär 110. Diese Bitfolgen muß man dann natürlich vorher berechnen und dabei 2 2/3 Farbbits in ein Byte packen. Das ganze macht aber nur dann Sinn, wenn man Hardware-SPI verwendet, besser ist es noch, wenn SPI über ein FIFO verfügt oder DMA verfügbar ist. Vom SPI wird hier nur MOSI benutzt.

    Software SPI macht gar keinen Sinn, da kann man auch gleich das richtige Protokoll erzeugen.

    Was man auch noch überlegen könnte, ist ein Protokollbit in 4 SPI-Bits zu kodieren. Wenn man die Erfahrungen von Siro berücksichtigt, das eine Bitzeit auch größer als 1250ns funtioniert, sollten auch 1600ns passen. Eine 0 wäre dann 0b1000, eine 1 0b1100. Diese Kodierung könnte man möglicherweise live erzeugen, während die Hardware-SPI läuft.

    Wenn es dir im mehrere Anzeigen geht könntest du dir einen Atmega oder Atxmega mit mehreren SPI Controllern suchen und damit parallel die Daten raushauen.
    Das macht keinen wirklichen Sinn. Man hat schon Mühe genug, einen SPI-Controler mit Daten zu füttern. Da man die WS2812 hintereinander schalten kann, ist es auch nicht nötig. 100 Neopixel und mehr sind kein wirkliches Problem, wie andere Projekte zeigen. Das sind dann 12 und mehr Digits.

    MfG Klebwax
    Strom fließt auch durch krumme Drähte !

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    2.236
    Jetzt kann ich mit 4 MHz im AVR arbeiten, aus denen dann problemlos
    800 kHz Taktimpulse erzeugt werden können.
    Mein Vorschlag war ja mit der Hardware SPI zu arbeiten.
    Da sind dann bei 20MHz Taktfrequenz 10MHz Clockrate bei SPI Master möglich.
    Im SPI Slave Mode - den Du ja nicht brauchst - wären es dann immer noch 5MHz.
    Das Ganze SPI Geschäft läuft rein in Hardware ohne zusätzliche Prozessorlast.
    Lediglich das Abfragen ob das SPIDR leer ist und das Beschreiben des selben müsste man softwaretechnisch lösen.
    Dazu würde ich aber bei dieser Geschwindigkeit Assembler verwenden und die Daten aus einer vorberechneten Tabelle holen.
    Im entsprechenden AVR Datenblatt ist da sogar ein Programmbeispiel dafür drin.

  5. #5
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.10.2008
    Ort
    Kehnert
    Beiträge
    1.159
    Zum Berechnen der Bitfolge ist ausreichend Zeit vorhanden. Um eine sichere Arbeitsweise zu erhalten, möchte ich (erstmal) keine Toleranzen einplanen und für ein wenig mehr Hardware hätte ich auch noch Platz. Um nun auch geringste Phasenverschiebungen zu vermeiden könnte man über ein PINOUT 24 Spices mit 1,25 ms Abstand auf 2 AND-Tore geben, dabei wird noch 1 PINOUT mit Negator gebraucht, welches ein Tor bei H und ein Tor bei L öffnet. dahinter können dann die Spices den entsprechenden Eingängen eines dopelten Monoflops zugeführt werden, welche dann jeweils Impulse von 400 ns und 850 ns erzeugen und die Ausgänge verodert werden. Mit einer 800kHz-Timerinterrupt- routine sollte die Spiceerzeugung und das Rausshiften der 24 BIT dann kein Problem mehr sein. Die Pausen von 50000 ns reichen aus, um ein neues Bitmuster für die nächste RGB-LED aus dem vorhandenen Anzeigespeicher zu holen. Die eigentliche Segment- und Ziffernzuordnung wird eh inner- halb der Hauptroutine von ca 0,8 Sekunden berechnet. VG Micha werden noch 2 zusätzliche
    Was brauche ich für Werkzeug - in dieser Reihenfolge seht ihr es:
    Vorschlaghammer, Notebook, BASCOM, Lötequipment, Rohrzange, Bolzenschneider ...

  6. #6
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    07.03.2011
    Beiträge
    1.899
    Zitat Zitat von hardware.bas Beitrag anzeigen
    Mit einer 800kHz-Timerinterrupt- routine sollte die Spiceerzeugung und das Rausshiften der 24 BIT dann kein Problem mehr sein.
    Ich komme nicht auf 24 Bit sondern auf 8*24, also 192 Bits pro Digit. Und da sehe ich in der Spec auch keine Pause. Ich glaube auch nicht, daß ein 800kHz Timmerinterrupt funktionieren wird. 1,2 µs werden nicht mal für einen leeren Interrupthandler reichen.

    MfG Klebwax
    Strom fließt auch durch krumme Drähte !

  7. #7
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.10.2008
    Ort
    Kehnert
    Beiträge
    1.159
    Der Datasheet der RGBDIGITs entspricht genau dem Datasheet der
    offensichtlich dort verbauten hintereinandergeschalteten intelligenten
    RGB-LEDs, darum ist korrekt, dass für die Ansteuerung eines Digits
    8x24 BITs gebraucht werden. Das Protokoll für eine 8-stellige Anzeige
    besteht also in 64 Datenpaketen - Dauer mit Pause knapp 100 Mikro-
    sekunden - also insgesamt für die Komplette Anzeigenaktualisierung
    weit weniger als 10 ms. Die Interuptroutine von 1250ns muss reichen,
    einen einzigen Spike zu senden und Longvariable um eine Stelle in
    einen Ausgangspin zu schieben. Die 50 Mikrosekunden-Pause dient
    dazu, die Longvariable (obwohl nur 3 Byte benötigt werden) neu
    zu beschreiben. und einen Zeiger zu incrementieren.
    Alle anderen Berechnungen befinden sich in der Hauptroutine.
    Als Chip ist ein ATMega162 vorgesehen, wo genügend Speicher-
    arrays etabliert werden können.
    VG Micha

    - - - Aktualisiert - - -

    PS. In die Interruptroutine muss natürlich die Timervoreinstellung
    noch rein. Ansonsten kann ich natürlich die Taktfrequenz noch
    erhöhen, der genaue Wert ist für die im Projekt genutzten 2 UARTs
    jeweils nur 1200 BAUD für RS232 und RS485.
    VG Micha
    Was brauche ich für Werkzeug - in dieser Reihenfolge seht ihr es:
    Vorschlaghammer, Notebook, BASCOM, Lötequipment, Rohrzange, Bolzenschneider ...

  8. #8
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    07.03.2011
    Beiträge
    1.899
    Zitat Zitat von hardware.bas Beitrag anzeigen
    Der Datasheet der RGBDIGITs entspricht genau dem Datasheet der offensichtlich dort verbauten hintereinandergeschalteten intelligenten RGB-LEDs, darum ist korrekt, dass für die Ansteuerung eines Digits 8x24 BITs gebraucht werden.
    Da gibt es aber keine Pause. Die 192 Bits müssen am Stück raus. Kommt da eine Pause drin vor, wird wieder die erste LED angesteuert.

    Das Protokoll für eine 8-stellige Anzeige besteht also in 64 Datenpaketen
    Wenn man die Digits einzeln ansteuert, sind es 8 Datenpakete, eins pro Digit, mit einer Länge von 192 Bits.

    Eigentlich macht man das aber anders. Man schaltet die Digits einfach hintereinander. Es sind ja "nur" 64 LEDs für die 8 Digits. In anderen Projekten werden 100 oder auch 200 LEDs so gesteuert. Ich hab eine Matrix mit 144 (12*12) LEDs in Betrieb, aber mit einer fertigen Library, deren innere Funktion ich nicht kenne. Das entspricht einer Anzeige mit 18 Digits.

    Die Interuptroutine von 1250ns muss reichen, einen einzigen Spike zu senden und Longvariable um eine Stelle in einen Ausgangspin zu schieben. Die 50 Mikrosekunden-Pause dient dazu, die Longvariable (obwohl nur 3 Byte benötigt werden) neu zu beschreiben. und einen Zeiger zu incrementieren.
    Auf einem 8-Bitter werden aus einem Shift eines Longs 4 Shifts eines Bytes. Dazu braucht man noch einen Zähler, der die 24 Bit abzählt. Und da es diese "50 Mikrosekunden-Pause" nicht gibt, muß man sich in den 1250ns alle 24 Bits noch um das Nachladen kümmern. Dazu werden am Anfang des Interrupts noch einige Register gerettet, die am Ende wieder hergestellt werden müssen. Die Neopixel-Libraries schieben 1000 und mehr Bits in einem Rutsch raus.

    MfG Klebwax
    Strom fließt auch durch krumme Drähte !

Ähnliche Themen

  1. Probleme mit Shiftout
    Von rauf81 im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 4
    Letzter Beitrag: 22.05.2011, 16:31
  2. SHIFTOUT mit externem Takt möglich?
    Von stefan_Z im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 5
    Letzter Beitrag: 27.11.2007, 12:10
  3. ShiftOut und ShiftIn in Assembler einbinden
    Von Ruppi im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 2
    Letzter Beitrag: 31.12.2005, 17:37
  4. [ERLEDIGT] Verständnisfrage shiftout / HC595
    Von Jürgen200 im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 5
    Letzter Beitrag: 10.01.2005, 13:25
  5. Shiftout geht nicht?
    Von x-ryder im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 1
    Letzter Beitrag: 01.12.2004, 16:05

Berechtigungen

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

fchao-Sinus-Wechselrichter AliExpress