View previous topic :: View next topic |
Author |
Message |
Netzman
Joined: 25 Nov 2005 Posts: 127 Location: Graz
|
Posted: Mon Apr 20, 2015 9:19 pm Post subject: ILI9341 with SW/HW SPI, 8/16 Bit parallel mode |
|
|
Hi,
- SPI (Soft-/Hardware), 8/16 Bit parallel interface
- ATMega/ATXmega
- Fast assembler-optimized routines
- Backlight control (Digital IO or PWM)
- Screen rotation (4 directions), Standby, Color inversion
- Basic graphics, pictures (fast SRAM-pictures), fixed-font text
Demo video (with touch screen)
More info & download: ILI9341 Library 1.0 (Project from the video is included)
br _________________ LCD Menu | Proportional Fonts
Last edited by Netzman on Wed Apr 22, 2015 2:08 pm; edited 1 time in total |
|
Back to top |
|
|
Evert :-)
Joined: 18 Feb 2005 Posts: 2156
|
|
Back to top |
|
|
albertsm
Joined: 09 Apr 2004 Posts: 5913 Location: Holland
|
Posted: Mon Apr 20, 2015 11:09 pm Post subject: |
|
|
Thank you for sharing the fruits of your hard work. And of course also thanks for the video. Watching this video made my day.
As i wrote on YT :
Quote: | Wow, what can i say : it is fantastic ! It is that i downloaded the project and has a look at the source, otherwise i would have thought you were using a special graphic chip.
I like the quick drawing and the animation seemed like a video.
The matrix drop down and the 3D are my favorites too.
|
I see you split up the big project in multiple projects which is always a good idea.
I just see that the animation was created with jpg files. You could have fooled me _________________ Mark |
|
Back to top |
|
|
Netzman
Joined: 25 Nov 2005 Posts: 127 Location: Graz
|
Posted: Tue Apr 21, 2015 4:13 pm Post subject: |
|
|
Thank you
Sure, ARMs are better suited for such graphical displays, to do this with AVRs is hard on the edge, but possible!
No fake, all natural , although I have to admit the XMega is slightly overclocked, running at 48 MHz. But the animation still looks fine with 32 MHz / 16 Bit mode.
I've used a looped GIF animation where I extracted the frames to single files which are then drawn out of the SRAM.
Now, that you've mentioned it, I took another look at the SRAM-BIN-pic routine and found a bad mistake. Updated the download, about 10% speed increase.
br _________________ LCD Menu | Proportional Fonts |
|
Back to top |
|
|
aphawk
Joined: 23 Jan 2010 Posts: 168 Location: Brazil
|
Posted: Wed Apr 22, 2015 7:54 pm Post subject: |
|
|
Hi, Netzman,
Very good work !
I tried to use with an Atmega328, with none graphics image, but there is some erros when compile.
Is possible to use this library with an Atmega328 ?
Thanks a lot !
Paulo |
|
Back to top |
|
|
Netzman
Joined: 25 Nov 2005 Posts: 127 Location: Graz
|
Posted: Thu Apr 23, 2015 11:42 am Post subject: |
|
|
Hi,
it seems that Bascom tries to evaluate these #if statements:
Code: | #if Varptr( "Lcd_ctrl_port") = Varptr( "Portc") |
which are enclosed in an #if block which evaluates to false:
so normally the compiler should ignore these lines. I did not found this error, I've only tested if it compiles for the ATmega 128, which also has the Ports E and F, the Mega328 doesn't.
To get it to work, you need to comment out the lines 234-241:
Code: | #elseif Varptr( "Lcd_ctrl_port") = Varptr( "Porte")
Const Lcd_spi_ctrl = Spie_ctrl
Lcd_spi_status Alias Spie_status
Lcd_spi_data Alias Spie_data
#elseif Varptr( "Lcd_ctrl_port") = Varptr( "Portf")
Const Lcd_spi_ctrl = Spif_ctrl
Lcd_spi_status Alias Spif_status
Lcd_spi_data Alias Spif_data |
and the lines 374-385:
Code: | #elseif Varptr( "Lcd_backlight_port") = Varptr( "Porte")
#if Lcd_pin_backlight < 4
Const Lcd_pwm_ctrla = Tce0_ctrla
#else
Const Lcd_pwm_ctrla = Tce1_ctrla
#endif
#elseif Varptr( "Lcd_backlight_port") = Varptr( "Portf")
#if Lcd_pin_backlight < 4
Const Lcd_pwm_ctrla = Tcf0_ctrla
#else
Const Lcd_pwm_ctrla = Tcf1_ctrla
#endif |
or you could also just delete the #if _xmega = True code parts.
br _________________ LCD Menu | Proportional Fonts |
|
Back to top |
|
|
aphawk
Joined: 23 Jan 2010 Posts: 168 Location: Brazil
|
Posted: Sat Apr 25, 2015 3:05 pm Post subject: |
|
|
Hi, Netzman,
I tried the suggestions, but two errors remains that I can't resolve :
Error : 12 Line : 455 Unknown CONFIG parameter [COMPARE_PWM] , in File : ILI9341.inc
Error : 46 Line : 435 Assignment error, unknown variable (DIM) [COMPARE2: 0 VALUE: 2] , in File : ILI9341.inc
There are nothing with the line numbers 455 and 435...
Maybe some problem with the $regfile ?
Thanks !
Paulo |
|
Back to top |
|
|
Netzman
Joined: 25 Nov 2005 Posts: 127 Location: Graz
|
Posted: Mon Apr 27, 2015 10:49 pm Post subject: |
|
|
Hi,
try modifying line 425 to:
Code: | Config Lcd_backlight_timer = Pwm , Prescale = 8 , Pwm = On , Compare_pwm = Clear_up |
and line 435:
Here I have no errors:
Code: | $regfile = "m328def.dat"
$crystal = 16000000
$hwstack = 128
$swstack = 128
$framesize = 128
Config Submode = New
Const False = 0
Const True = 1
Const Lcd_enable_backlight_pwm = True
$include "ILI9341.inc"
Lcd_init |
Per default Timer2 is used as PWM timer. You can change it with:
Code: | Lcd_backlight_timer Alias Timer0 ' or Timer1 |
above the $include statement. Maybe you have to adjust the Config and the value settings according to the target controller.
I admit I did'nt spend very much time on the ATMega compatibility, thank you for testing and reporting this!
br _________________ LCD Menu | Proportional Fonts |
|
Back to top |
|
|
aphawk
Joined: 23 Jan 2010 Posts: 168 Location: Brazil
|
Posted: Wed Apr 29, 2015 11:33 am Post subject: |
|
|
Hi, Netzman,
This works, now compiles ok , thank you !!! I will make the hardware and test in this weekend.
I have yet made the change in line 435. But in line 425 I was using "Compare_a_pwm=Clear_Up" .
When I changed to "Compare_pwm=Clear_up", the error was gone .....
But I don't understand why this works.....
The Timer2 have two output pins, what is the difference betwen the commands "Compare_pwm" and "Compare_a_pwm" ?
Or this is a bug in compiler ?
Thanks again !
Paulo |
|
Back to top |
|
|
Netzman
Joined: 25 Nov 2005 Posts: 127 Location: Graz
|
Posted: Wed Apr 29, 2015 1:46 pm Post subject: |
|
|
Good to hear!
I was also wondering about this, it seems like a bug to me.
If it is not working, you could set the corresponding registers by hand after the config statement (Mega328 manual p. 153).
Let me know if you have success!
Br,
Matthias _________________ LCD Menu | Proportional Fonts |
|
Back to top |
|
|
Plons
Joined: 24 May 2005 Posts: 435 Location: Hilversum - The Netherlands
|
Posted: Wed May 13, 2015 10:16 pm Post subject: |
|
|
@Paulo, would you please be so kind to post your code for the Mega328 ?? I spent the whole day trying, and I just want to move on with the rest of the project.
@Matthias: compliments for the well structured SW you developed for this display. I especially like the way you translate a bitnumber to a mask: 2^lcd_pin_cs etc. First time I saw that.
Thanks guys
Nard _________________ Bascom AVR ver 2.0.8.6
Dragon-lair: http://www.aplomb.nl/TechStuff/Dragon/Dragon.html
"leef met vlag en wimpel, maar hou het simpel" |
|
Back to top |
|
|
Netzman
Joined: 25 Nov 2005 Posts: 127 Location: Graz
|
Posted: Thu May 14, 2015 1:04 am Post subject: |
|
|
Thanks
This way of declaring masks is very common in C!
Here you have the modified library for the M328, it compiles using the short test program from above.
Please let me know if you get it to work in hardware.
Br,
Matthias _________________ LCD Menu | Proportional Fonts |
|
Back to top |
|
|
Plons
Joined: 24 May 2005 Posts: 435 Location: Hilversum - The Netherlands
|
Posted: Thu May 14, 2015 1:43 am Post subject: |
|
|
Thank you, Matthias. Much appreciated.
I will let you know how it turns out.
Nard _________________ Bascom AVR ver 2.0.8.6
Dragon-lair: http://www.aplomb.nl/TechStuff/Dragon/Dragon.html
"leef met vlag en wimpel, maar hou het simpel" |
|
Back to top |
|
|
Plons
Joined: 24 May 2005 Posts: 435 Location: Hilversum - The Netherlands
|
Posted: Thu May 14, 2015 3:29 pm Post subject: |
|
|
After a good night of sleep: I forgot to mention that my display has an SPI interface, so I need either hard- or soft-SPI.
In ILI9341_M328.inc (added _M328 to the name to prevent confusion)
I modified line 12 - 20:
Code: | ' Enables the SPI- instead of the 8-Bit paralell interface
#if Not Varexist( "Lcd_enable_spi")
Const Lcd_enable_spi = True
#endif
' Use software SPI
#if Not Varexist( "Lcd_use_soft_spi") And Lcd_enable_spi = True
Const Lcd_use_soft_spi = False 'True
#endif
|
For the pinning (Lcd_ctrl_port = Portb) I modified line 80 - 111 to
Code: | #if Lcd_enable_spi = True
' SPI mode pin assignments
#if Not Varexist( "Lcd_pin_dc")
#if _xmega = True
Const Lcd_pin_dc = 1
#else
Const Lcd_pin_dc = 1
#endif
#endif
' (HW: fixed, SW: select any)
#if Not Varexist( "Lcd_pin_cs")
#if _xmega = True
Const Lcd_pin_cs = 4
#else
Const Lcd_pin_cs = 2
#endif
#endif
#if Not Varexist( "Lcd_pin_sdo")
#if _xmega = True
Const Lcd_pin_sdo = 5
#else
Const Lcd_pin_sdo = 3
#endif
#endif
#if Not Varexist( "Lcd_pin_clk")
#if _xmega = True
Const Lcd_pin_clk = 7
#else
Const Lcd_pin_clk = 5
#endif
#endif
Const Lcd_pin_sdi = 4 |
and for the backlight
Code: | ' Port of the backlight control signal
#if Not Varexist( "Lcd_backlight_port") And(lcd_enable_backlight = True Or Lcd_enable_backlight_pwm = True)
Const Lcd_backlight_port = Portd
#endif
' Pin of the backlight control signal
#if Not Varexist( "Lcd_pin_backlight" ) And(lcd_enable_backlight = True Or Lcd_enable_backlight_pwm = True)
#if _xmega = True
Const Lcd_pin_backlight = 0
#else
Const Lcd_pin_backlight = 3
#endif
#endif |
OC2A is not available (in use by MOSI), so Backlight moved to Timer2 OC2B
Code: | Macro Lcd_pwm_init
#if Varptr( "Lcd_backlight_timer" ) = Varptr( "TIMER0")
Config Lcd_backlight_timer = Pwm , Prescale = 8 , Pwm = On , Compare_pwm = Clear_up
#elseif Varptr( "Lcd_backlight_timer" ) = Varptr( "TIMER1")
Config Lcd_backlight_timer = Pwm , Prescale = 8 , Pwm = 8 , Compare_a_pwm = Clear_up
#elseif Varptr( "Lcd_backlight_timer" ) = Varptr( "TIMER2")
Config Lcd_backlight_timer = Pwm , Prescale = 8 , Pwm = On , Compare_b_pwm = Clear_up
#endif
End Macro
Sub Lcd_set_pwm(byval Value As Byte)
#if Varptr( "Lcd_backlight_timer" ) = Varptr( "TIMER0")
Compare0a = Value
#elseif Varptr( "Lcd_backlight_timer" ) = Varptr( "TIMER1")
Compare1a = Value
#elseif Varptr( "Lcd_backlight_timer" ) = Varptr( "TIMER2")
Compare2b = Value
#endif
End Sub |
The code compiles fine for HW SPI (Lcd_use_soft_spi = False in line 19) and SW SPI
In order to see signals on the oscilloscope, the main program was extended to:
Code: | $regfile = "m328pdef.dat"
$crystal = 16000000
$hwstack = 128
$swstack = 128
$framesize = 128
Config Submode = New
Const False = 0
Const True = 1
Const Lcd_enable_backlight_pwm = True
$include "ILI9341_M328.inc"
Sub Random_color()
R = Rnd(255)
G = Rnd(255)
B = Rnd(255)
Color = Color24to16(r , G , B)
End Sub
Dim Pixels As Word
Dim R As Byte , G As Byte , B As Byte
Dim X As Word , Y As Word , Color As Word
Dim X2 As Word , Y2 As Word , Radius As Word
Dim Statustext As String * 30
Restore Color8x8
Lcd_loadfont
Lcd_init
Do
' =========== Fixed Font Text ============
For Pixels = 1 To 1000
Random_color
X = Rnd(220)
Y = Rnd(310)
Lcd_text "Text" , X , Y , Color , Color_black
Next
Waitms 10
' Waitms 3000
Lcd_clear &H0000
Loop
End
$include "data\color8x8.font" |
Sck should be toggling fast (after the initial level-changes during the setup) but it's not. HW SPI keeps it low, with SW SPI it stays high.
..... some time later:
HW SPI: SPI pins SCK and MOSI are not set to outputs
That is okay btw with SW SPI
But in both instances there is no activity on SCK and MOSI
And to report at least ONE working bit: backlight behaves nicely with the timer2PWM: neat
I need a coffeebreak .... but
I'll be back
Nard _________________ Bascom AVR ver 2.0.8.6
Dragon-lair: http://www.aplomb.nl/TechStuff/Dragon/Dragon.html
"leef met vlag en wimpel, maar hou het simpel" |
|
Back to top |
|
|
Plons
Joined: 24 May 2005 Posts: 435 Location: Hilversum - The Netherlands
|
Posted: Thu May 14, 2015 3:57 pm Post subject: |
|
|
Coffee helps !
I have a working configuration now by adding a line in the main program, right after the Code: | $include "ILI9341_M328.inc" | and using soft SPI
I'll investigate further .... _________________ Bascom AVR ver 2.0.8.6
Dragon-lair: http://www.aplomb.nl/TechStuff/Dragon/Dragon.html
"leef met vlag en wimpel, maar hou het simpel" |
|
Back to top |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum You cannot attach files in this forum You cannot download files in this forum
|
|