darxon69
01.08.2007, 09:04
Hallo Leute.
Ich versuche ein Siemens S65-GLCD anzusteuern. Dies geschieht mit Hardware SPI. Um die Geschwindigkeit zu testen habe ich einfach mal die CLS-Routine die beim Display dabei war (Display3000) umgeschrieben.
Die INitialisierung des SPI schaut so aus.
Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 0 , Clockrate = 4 , Noss = 1
Spiinit 'Initializing of the SPI interface
Set Spsr.spi2x 'hidden parameter: doubles the speed of the SPI output
Das Display hat eine Auflösung von 132x176 Pixeln Je Pixel braucht es 2 Byte für die Darstellung, womit man 46464 Bytes zum Löschen des Bildschirms übertragen muss. Ich habe, damit es schneller geht ein ByteArray mit 128byte Länge definiert und dieses mit 255 gefüllt. Dann wird das Ganze per SPIOUT 363 mal an das Display gesendet. Das mache ich 100 mal und messe die Zeit die dafür benötigt wird. Es dauert 19 Sekunden. Das bedeutet, daß pro Bildschirmlöschen 0,19 Sekunden benötigt werden. Mein Controller (Atmega2561) arbeitet mit einer externen Takfrequenz von 14,745600 MHz.
Laut CONFIG SPI sollte der SPI-Takt dann mit 1/4 Teilung und Speedverdopplung 7,372800 MHz betragen. Rechne ich aber die CLS Geschwindigkeit (46464 Bytes in 0,19 sek =371712 bits in 0,19sek = 1956378 Bits /sek)um, sokomme ich auf einen effektiven SPITakt von 1,956378MHz. Wo geht die Geschwindigkeit verloren? Ist BASCOM da so ineffektiv?
Die CLS Rountine schaut so aus und wird 100 mal hintereinander mit Call aufgerufen
Sub Lcd_cls 'Clears the screen - basically just writes 132x176x2=46464 times a color value into a full frame box
Local Or_old As Byte , Lcd_h As Word
Or_old = Orientation 'save orientation so we always clear screen in portrait mode
Orientation = Portrait
Lcd_x1 = 0
Lcd_y1 = 0
Lcd_x2 = 131
Lcd_y2 = 175
Gosub Window
For Lcd_h = 1 To 128 'Array Füllen 255= Weiss
Bigarray(lcd_h) = 255
Next Lcd_h
'set up an array with 128 Byte , So These 128 Bytes Can Be Faster Transmitted = Quicker Cls ; More Bytes Would Speed It Up Even More
For Lcd_h = 1 To 363 '132x176 pixel x 2 byte = 46464 byte needs to be transmitted = 363 x 128 bytes from the array
Spiout Bigarray(1) , 128
Next Lcd_h
Set Lcd_port.lcd_cs
Reset Lcd_port.lcd_cs
Orientation = Or_old 'set back orientation to the former state
End Sub
Die "Gosub Window" routine schickt nur 8 Byte mit der Bereichsdeinition per SPI an das Display, sollte also nicht die Bremse sein.
Ich versuche ein Siemens S65-GLCD anzusteuern. Dies geschieht mit Hardware SPI. Um die Geschwindigkeit zu testen habe ich einfach mal die CLS-Routine die beim Display dabei war (Display3000) umgeschrieben.
Die INitialisierung des SPI schaut so aus.
Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 0 , Clockrate = 4 , Noss = 1
Spiinit 'Initializing of the SPI interface
Set Spsr.spi2x 'hidden parameter: doubles the speed of the SPI output
Das Display hat eine Auflösung von 132x176 Pixeln Je Pixel braucht es 2 Byte für die Darstellung, womit man 46464 Bytes zum Löschen des Bildschirms übertragen muss. Ich habe, damit es schneller geht ein ByteArray mit 128byte Länge definiert und dieses mit 255 gefüllt. Dann wird das Ganze per SPIOUT 363 mal an das Display gesendet. Das mache ich 100 mal und messe die Zeit die dafür benötigt wird. Es dauert 19 Sekunden. Das bedeutet, daß pro Bildschirmlöschen 0,19 Sekunden benötigt werden. Mein Controller (Atmega2561) arbeitet mit einer externen Takfrequenz von 14,745600 MHz.
Laut CONFIG SPI sollte der SPI-Takt dann mit 1/4 Teilung und Speedverdopplung 7,372800 MHz betragen. Rechne ich aber die CLS Geschwindigkeit (46464 Bytes in 0,19 sek =371712 bits in 0,19sek = 1956378 Bits /sek)um, sokomme ich auf einen effektiven SPITakt von 1,956378MHz. Wo geht die Geschwindigkeit verloren? Ist BASCOM da so ineffektiv?
Die CLS Rountine schaut so aus und wird 100 mal hintereinander mit Call aufgerufen
Sub Lcd_cls 'Clears the screen - basically just writes 132x176x2=46464 times a color value into a full frame box
Local Or_old As Byte , Lcd_h As Word
Or_old = Orientation 'save orientation so we always clear screen in portrait mode
Orientation = Portrait
Lcd_x1 = 0
Lcd_y1 = 0
Lcd_x2 = 131
Lcd_y2 = 175
Gosub Window
For Lcd_h = 1 To 128 'Array Füllen 255= Weiss
Bigarray(lcd_h) = 255
Next Lcd_h
'set up an array with 128 Byte , So These 128 Bytes Can Be Faster Transmitted = Quicker Cls ; More Bytes Would Speed It Up Even More
For Lcd_h = 1 To 363 '132x176 pixel x 2 byte = 46464 byte needs to be transmitted = 363 x 128 bytes from the array
Spiout Bigarray(1) , 128
Next Lcd_h
Set Lcd_port.lcd_cs
Reset Lcd_port.lcd_cs
Orientation = Or_old 'set back orientation to the former state
End Sub
Die "Gosub Window" routine schickt nur 8 Byte mit der Bereichsdeinition per SPI an das Display, sollte also nicht die Bremse sein.