Spi mit xv-display Geschwindigkeit

Thomasdergrosse

Neues Mitglied
03. Okt. 2014
3
0
0
Sprachen
Hallo Forum, mein erster beitrag

Ich habe eine Frage zur Geschwindigkeit der xv- Display mit SPI Interface.
Ich habe jetzt im Einsatz ein xmega 256 mit einem 4D Display und einem Picaso Sgc Controller.
Der xmega ist mit 32 MHz getaktet und die RS232 zum Display mit 256000 baud.
Weiter ist ein drehencoder mit 128 Takte pro Umdrehung am xmega angeschlossen.
Mit dem Encoder wird die Frequenz verstellt und die soll natürlich schnell und fliessend auf dem Display angezeigt
Werden. Vor und zurück.

Leider stosse ich jetzt an die Grenzen der seriellen Kommunikation der Rs232, die Verzögerungen mit Wert senden
Auf Antwort warten. - nächsten Wert senden wieder warten braucht einfach zu lange. Die Anzeige ist stockend.

Deshalb meine Frage schaffe ich das mit SPI.

Gruss thomas
 
Hallo Thomas,

bei beiden Displays muss das Kommando mit Parametern übertragen werden und das Display benötigt Zeit, um das Kommando abzuarbeiten. Du wirst hier auch nicht mit einer höheren Übertragungsrate zum Display sehr viel weiter kommen, da der Inkrementalencoder ziemlich hoch auflöst. In einer Sekunde hat man den um 360 Grad gedreht und es müssen in dieser Zeit 128 Displayausgaben gemacht werden (poblematischer wird es dann, wenn du selber noch Grafikdaten übertragen musst, was hier aber bei den Displays nicht der Fall ist).

Ich würde hier bei deiner Software ansetzen!

Der Inkrementalencoder ist zeitkritisch. Die Signale würde ich in jedemfall in einer ExtInterrupt ISR auswerten. In der ISR dann auch die Variable der Frequenz erhöhen bzw. verringern und wenn sich etwas ändert dort ein Signal-Flag setzen, welches dem Hauptprogramm mitteilt, dass eine Ausgabe auf dem Display gemacht werden muss. Im Hauptprogramm fragst du dieses Signal ab und falls gesetzt, dann löschen und Displayausgabe machen. Wenn nun der Encoder zu schnell gedreht wird, werden nich alle Frequenzwerte ausgegeben, das muss aber sicher auch nicht sein. Der letzte aktuelle Wert wird immer ausgegeben. Wenn du das so löst, kannst du den Encoder auch erheblich schneller drehen (Problem könnte noch ein Prellen sein, aber der Inkrementalencoder ist sicherlich optisch).

Willkommen im Forum :)

Dirk :ciao:
 
Hallo Dirk
Danke für die Infos.
Der Encoder ist optisch und wird per Interrupts bedient. Der Encoder muss hoch auflösend sein :cool:
Schliesslich müssen je nach Frequenz Band ein paar 100000 Impulse abgegeben werden.
Bis jetzt habe ich am Schluss der INT Routine immer den total Wert als Änderung zum Display geschickt. Wenn du schnell drehst ist die Anzeige sprunghaft, aber sofort da. Beim langsamen drehen ist alles ok. Ich hoffte auf eine fliessende, schnelle Displayanzeige. :confused:
Aber du hast mich auf zwei Ideen gebracht!
Die erste:
Bis jetzt hatte ich um schneller zum Ende / Anfang zu kommen 3steps auf einer Taste abgelegt.
Step 1 = Faktor 10, Step 2 = Faktor 100, Step 3= Faktor 1000
nun werde ich die wert Änderung adaptiv der Geschwindigkeit anpassen, je schneller desto grösser.
Die zweite:
Ich werde mal für mich testen ob ich das Display direkt ansteuere. Ohne Controller

Danke für die begrüssung :hello:
Gruss Thomas
 
Hallo Thomas,

wenn du den Encoder schnell drehst, kann es passieren, dass mehrere Interrupts vom Encoder auftreten. Erst wenn die ISR abgearbeitet ist, wird diese sofort wieder aufgerufen. Je nachdem, wieviele Interrupts zwischenzeitlich aufgetreten sind kommt es dann zum Inkrementieren oder Dekrementieren, deswegen "sprunghaft". Die Displayausgabe ist nicht zeitkritisch und blockiert nur die Auswertung des Inkrementalencoders. Mach die Displayausgabe wie ich im Beitrag zuvor beschrieben habe im Hauptprogramm, und arbeite mit einem Signalflag zwischen ISR und Hauptprogramm, dann tritt das Problem nicht mehr auf.

Um für den großen Wertebereich nicht so oft drehen zu muessen, könntest du einen Times mit ins Spiel bringen. Wenn schnell gedreht wird könntest du zum Beispiel 100er oder 1000er Stellen inkrementieren bzw dekrementieren. Oder du verwendest Taster um die zu aendernden Stellen zu aendern.

Dirk :ciao:
 
Hallo Dirk

Das Display wird schon in der Hauptroutine angesteuert. Ich addiere in der Main einfach den letzten Wert des Encoder (Anzahl Impluse) zum bestehendem Wert der Frequenz.
Deshalb ist es Sprunghaft. Das läuft jetzt sehr schnell und problemlos. Ich habe aber dann versuchsweise eine FOR NEXT Schlaufe in der MAIN eingebaut und den WERT der Frequenz bis zum Encoder Wert INCR oder DECR. Nach jedem INCR oder DECR wird die Änderung zum Display geschickt. Doch für diese Schlaufe (128 Anweisungen zum Display schicken pro Umdrehung und auf Antwort warten) ist das Display es zu langsam.
Auch mit 256000 BAUD ist die Verarbeitung zu langsam :mad:. Ich habe die Kommunikation im DO schön mitverfolgt, eine schnelle Umdrehung des Encoder und die Schlaufe brauchte ein paar Sekunden um nach zu kommen :D
Ich wollte einfach das man das Hoch oder Runter Zählen schön am Display sieht - nur fürs Auge, aber ich glaube ich lasse es so wie es ist :cool:
Widmen wir uns der nächsten Aufgabe die Ansteuerung des DDS, die I2C Abfrage der Expander, und die RS232 Kommunikation mit der PC Software muss noch gestrickt werden ;)

Gruss Thomas




Ich habe noch zum Verständnis die Encoder Routine angehängt.


'Ports für Encoder
Config Portb.0 = Input : Set Portb.0 : S_start Alias Pinb.0 'Senden Start Detektor
Config Portb.1 = Input : Set Portb.1 : S_end Alias Pinb.1 'Senden End detektor
Config Portb.2 = Input : Set Portb.2 : Encoderb Alias Pinb.3 'Encoder Signal A
Config Portb.3 = Input : Set Portb.3 : Encodera Alias Pinb.2 'Encoder Signal B
Portb_pin0ctrl = &B00_011_010
Portb_pin1ctrl = &B00_011_010
Portb_pin2ctrl = &B00_011_010
Portb_pin3ctrl = &B00_011_010
Portb_int0mask = &B0000_1100
Portb_int1mask = &B0000_0011
On Portb_int0 Drehencoder
On Portb_int1 Senden
Enable Portb_int0 , Lo
Enable Portb_int1 , Lo


'Routine Encoder
Sub Drehencoder()
Zustand.0 = Encodera
Zustand.1 = Encoderb
Select Case Zustand
Case &H0_2 : Incr enc_var
Case &H0_1 : Decr enc_var
Select
Encoder_flag = 1
End Sub Drehencoder()
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)