-         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 17

Thema: SHIFTOUT mit AVR-Clock

  1. #1
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.10.2008
    Ort
    Kehnert
    Beiträge
    1.143

    SHIFTOUT mit AVR-Clock

    Anzeige

    Für ein Anzeigeprojekt besteht die Forderung, ein
    längeres Bitmuster auf einen Ausgangsport zu legen.
    Es handelt sich um 600 bits mit einer Breite von 50ns.
    Um dieses Bitmuster zu berechnen, ist ausreichend
    Zeit vorhanden, während des Sendevorganges jedoch
    auf Grund der hohen Taktrate jedoch nicht mehr.
    Wir reden hier um 20MHz, so dass sich jetzt die Frage
    stellt; lassen sich mit SHIFTOUT diese Datenmengen
    im "AVR-Speed" ausgeben? Leider weiss ich nicht,
    wieviel Takte die entsprechende Shiftoperation
    benötigt. Vielleicht weiss da jemand Bescheid?
    Vielen Dank Micha
    Was brauche ich für Werkzeug - in dieser Reihenfolge seht ihr es:
    Vorschlaghammer, Notebook, BASCOM, Lötequipment, Rohrzange, Bolzenschneider ...

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    2.046
    Per Software SPI ist das sicher nicht möglich.
    Der Controller muss dazu auch mit 20MHz laufen
    Es muss das zu übertragende Bit auf einen Port gelegt werden und auf einem anderen Port muss der Shift Impuls genertiert werden = H,L,H.
    Jede Operation benötigt mindestens einen Prozessor Clock, auch wenn man das in Assembler macht.
    Auch die Hardware SPI kommt hier an Ihre Grenzen.
    Man müsste mal im Datenblatt des entsprechenden Controller gucken, ob sie sich überhaupt so hoch takten lässt.
    Ausserdem hat man somit auch nur maximal 8 Takte Zeit das SPI Daten Register neu zu beschreiben, sonst gibts Pausen im Signal.
    Das ist zwar im Prinzip nicht schlimm, aber die angestrebte Taktrate ist so nicht erreichbar.

    Das Ganze läuft auf jeden Fall an den hardwaretechnischen Grenzen eines AVR.

    EDIT:
    Hab mal im Datenblatt eines ATMEGA 8 nachgesehen.
    Für SCK ist eine maximale Taktrate von Fosz/2 möglich.
    Bei diesem Controller ist also eine SPI Taktfrequenz von 20MHz nicht möglich.
    Geändert von wkrug (19.05.2018 um 09:05 Uhr)

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.10.2008
    Ort
    Kehnert
    Beiträge
    1.143
    Die Idee war, eine Auflösung von 50ns zu erreichen, obwohl nur 24 BIT
    bei 800kHz übertragen werden sollen. Glücklich wäre ich also mit meiner
    ersten Idee damit auch nicht. Mit PWM und Timer zu arbeiten, würde
    das Problem auch nicht lösen. Dazu müsste der Prozessor während
    dieser Zeit zusätzlich noch rechnen.
    Immer mehr liebäugele ich daher mit einer Hardwarelösung, indem die
    H-Impulse als Spike auf einen eigenen MMV gegeben werden, ein 2ter
    Portausgang gibt das Datenpaket negiert aus, so dass die Ls eben-
    falls als H-Spikes wiederum einen eigenen MMV ansteuern.
    Die Ausgänge der MMVs werden dann zusammengeodert.
    Jetzt kann ich mit 4 MHz im AVR arbeiten, aus denen dann problemlos
    800 kHz Taktimpulse erzeugt werden können. Der AVR muss nicht
    alles alleine machen. Es geht um die Ansteuerung von RGBDIGITs.
    VG Micha
    Was brauche ich für Werkzeug - in dieser Reihenfolge seht ihr es:
    Vorschlaghammer, Notebook, BASCOM, Lötequipment, Rohrzange, Bolzenschneider ...

  4. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    22.06.2009
    Beiträge
    1.395
    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.

  5. #5
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.10.2008
    Ort
    Kehnert
    Beiträge
    1.143
    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 ...

  6. #6
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    07.03.2011
    Beiträge
    1.711
    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 !

  7. #7
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    2.046
    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.

  8. #8
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.10.2008
    Ort
    Kehnert
    Beiträge
    1.143
    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 ...

  9. #9
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    07.03.2011
    Beiträge
    1.711
    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 !

  10. #10
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.10.2008
    Ort
    Kehnert
    Beiträge
    1.143
    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 ...

Seite 1 von 2 12 LetzteLetzte

Ähnliche Themen

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

Berechtigungen

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