probier doch mal was bei
shift -3, left, 1
rauskommt.
wenn das ergebnis negativ ist, hat er oben ne 1 und keine 0 reingeschoben.
Druckbare Version
probier doch mal was bei
shift -3, left, 1
rauskommt.
wenn das ergebnis negativ ist, hat er oben ne 1 und keine 0 reingeschoben.
naja die Syntax bei Shift ist SHIFT Variable, Richtung, Weite.
Aufgefüllt wird hier dann immer mit 0.
Das komische ist ja, dass lt. Simulator alles korrekt verschoben wird; die eigentliche Funktion SendData bekommt dann auch (angeblich!) die Daten korrekt... naja...
Evtl doch ein Problem im Compiler...
Sodele... Fehler gefunden:
Nach einiger Probiererei in Sachen Zeitoptimierung hab ich das mit der Übergabe der getrennten Werte nochmals versucht... und (ich weiss nicht wie) bin auf die Idee gekommen: Hey, was is eigentlich mit dem Soft Stack? Kann ja dann nur daran liegen, dass zwar am PC genug Platz da ist, aber im AVR dann einfach selbiger ausgeht...
Nachgeschaut und Tatsache, der war "nur" auf 8 eingestellt; Nach dem Verdoppeln des Wertes auf 16 läuft diese Möglichkeit auch. Und da somit die ganze Umwandlung von String nach Byte etc. wegfällt, wurde Zeit eingespart und der Bildaufbau beschleunigt.
Jau, bei so komischem Verhalten und vielen Daten in den Subs muss man die Stacks anpassen...
ah ja, dann ist das eigentlich ein schwachpunkt der simulation, die sollte eigentlich merken,das der stack des conrollers hier nicht reicht, oder?
ich habe letztens auch die homepage von thomas pfeifer gefunden und dachte darüber nach den C quellcode in bascom zu übersetzen... währe es möglich das du deinen code hier veröffentlichst? es würden sich sicher viele darüber freuen :) insbesondere ich :)
gruss bluesmash
Also hier im Anhang ist mal der Code. Funktionen sind eigentlich nur das Setzen einzelner Pixel mit 16-Bit-Farbinformation. Aufruf erfolgt über den SetPixel-Befehl, gefolgt von den Werten für Rot, Grün, Blau; jeweils Bytes (0-255); werden dann automatisch in den 16-Bit-Code umgewandelt.
Der Code an sich liegt jetzt jedoch im Archiv, da ich kurz nach der Problemlösung herausgefunden hab, dass ja Bascom selbst bereits alle Befehle für die Ansteuerung dieser Displays bereitstellt (u.a. mit der Lib lcd-pcf8833.lbx)... man glaubt garnicht, wie ver*** man sich danach vorkommt, wenn man 2 Tage lang an nem Problem arbeitet und sucht und dann feststellt, dass es das ja alles schon fertig gibt... und dass das alles auch vielfach schneller läuft.
Naja, hat aber auch Vorteile; man lernt eben, wie man solche Displays zu Fuss ansteuert oder auch wie man die Bildausgabe um 90/180/270° drehen kann.
Hier der Code:
Code:'! Nur 16-Bit Ansteuerung funktionsfähig
' HW-Stack: 32
' Soft Stk: 16
' Framesize: 24
' µC: ATMega8 @ 8MHz
'-------------------------------------------------------------------------------
' Declaration: Subs
'-------------------------------------------------------------------------------
Declare Sub SendCMD(byval CMD as Byte)
Declare Sub SendDATA(byval CMD as Byte)
Declare Sub SetPixel(byval xRed as Byte , byval xGreen as Byte , byval xBlue as Byte)
'-------------------------------------------------------------------------------
' Declaration: Ports
'-------------------------------------------------------------------------------
config pinC.5 = output
config pinC.4 = output
config pinC.3 = output
config pinC.2 = output
Config PINC.1 = output
CS ALIAS PortC.5
CLK ALIAS PORTC.4
SDA ALIAS PORTC.3
RST ALIAS PORTC.2
LED ALIAS PORTC.1
'-------------------------------------------------------------------------------
' Declaration: Variables
'-------------------------------------------------------------------------------
DIM i as word
dim j as word
DIM ColorMode As Byte
DIM ColorString As String * 7
DIM R as Byte
DIM G1 as Byte
DIM G2 As Byte
DIM B1 as Byte
DIM ColorData1 As Byte
DIM ColorData2 As Byte
DIM ColorNibble As Byte
Dim CMDTEMP AS BYTE
'-------------------------------------------------------------------------------
' Declaration: Constants
'-------------------------------------------------------------------------------
Const Mode_8Bit = 8
CONST Mode_12Bit = 12
CONST Mode_16Bit = 16
'-------------------------------------------------------------------------------
' Display Initialization
'-------------------------------------------------------------------------------
ColorMode = MODE_16Bit
wait 1
CS = 0
SDA = 0
CLK = 1
RST = 1 : RST = 0 : RST = 1
CLK = 1 : SDA = 1 : CLK = 1
SendCMD &h01 'Software Reset
sendCMD &h11 'Sleep Out
SendCMD &h03 'Booster On
waitms 20
SendCMD &h29 'Display On
SendCMD &h13 ' Normal Mode
'sendCMD &H21 'Invert
sendCMD &HBA 'Data Order
sendCMD &h36 'MDAC
SendData 32 + 64 ' (RAM Y DIRECTION + MIRROR X = Rotate 90° CCW)
sendCMD &h3A ' 16 od. 12 Bit p. Pixel
If ColorMode = 8 Then SendData 2
If ColorMode = 12 Then SendData 3
IF ColorMode = 16 Then SendData 5
sendCMD &H25 'Contrast
sendData 63
sendCMD &H2A 'ColAdress
sendData 0
sendData 131
sendCMD &h2B 'PageAdress
sendData 0
sendData 131
sendCMD &h2c
'-------------------------------------------------------------------------------
' Test Screen: Color Bars
'-------------------------------------------------------------------------------
for j = 1 to 4
for i = 1 to 2112
Select Case j
Case 1 : SetPixel 255 , 255 , 255
Case 2 : SetPixel 000 , 255 , 255
Case 3 : SetPixel 255 , 000 , 255
Case 4 : SetPixel 255 , 255 , 000
End Select
next
Next
For j = 5 to 8
For i = 1 to 2113
Select Case j
Case 5 : SetPixel 000 , 000 , 255
Case 6 : SetPixel 255 , 000 , 000
Case 7 : SetPixel 000 , 255 , 000
Case 8 : SetPixel 000 , 000 , 000
End Select
Next
next
'-------------------------------------------------------------------------------
' MAIN LOOP
'-------------------------------------------------------------------------------
DO
Loop
End
'-------------------------------------------------------------------------------
' SUBs:
'-------------------------------------------------------------------------------
Sub SETPIXEL(BYVAL XRED AS BYTE , byval XGREEN AS BYTE , byval XBLUE AS BYTE)
'12-Bit Mode unvollständig!
If ColorMode = Mode_12Bit Then
R = xRed AND &B00001111
G1 = xGreen AND &B00001111
B1 = xBlue AND &B00001111
CLK = 0 : SDA = 1 : CLK = 1
ShiftOut SDA , CLK , R , 1 , 4 , 10
CLK = 0 : SDA = 1 : CLK = 1
ShiftOut SDA , CLK , G1 , 1 , 4 , 10
CLK = 0 : SDA = 1 : CLK = 1
ShiftOut SDA , CLK , B1 , 1 , 4 , 10
EndIf
If ColorMode = Mode_16Bit Then
R = xRed AND &B11111000
G1 = xGREEN AND &B11100000
G2 = xGREEN AND &B00011100
B1 = xBLue AND &B11111000
SHIFT G1 , right , 5
SHIFT G2 , left , 3
SHIFT B1 , right , 3
ColorData1 = R OR G1
ColorData2 = B1 OR G2
CLK = 0 : SDA = 1 : CLK = 1
ShiftOut SDA , CLK , ColorData1 , 1 , 8 , 0
CLK = 0 : SDA = 1 : CLK = 1
ShiftOut SDA , CLK , ColorData2 , 1 , 8 , 0
EndIf
End Sub
Sub SENDDATA(BYVAL CMD AS BYTE)
CLK = 0
waitus 10
SDA = 1
waitus 10
CLK = 1
waitus 10
ShiftOut SDA , CLK , CMD , 1 , 8 , 20
End Sub
Sub SENDCMD(BYVAL CMD AS BYTE)
CLK = 0
waitus 20
SDA = 0
waitus 20
CLK = 1
waitus 20
ShiftOut SDA , CLK , CMD , 1 , 8 , 30
End Sub