Second test: displaying text on a 20×4 LCD controlled by a HD44780 compatible driver chip. As you can see, it’s working
After Eric VDB pointed me to Codeshare in a comment on a previous post, I couldn’t resist searching for something that could help me get started.
And I found something useful here. Although the example that came with it was targeted for a Gadgeteer Extender Module (which I don’t have), I had no problems getting it to work. I created an additional constructor that would accept pin numbers, like this:
SerialLCDDisplay lcd = new SerialLCDDisplay( FEZ_Pin.Digital.Di21, // RS FEZ_Pin.Digital.Di23, // ENABLE FEZ_Pin.Digital.Di25, // DB4 FEZ_Pin.Digital.Di27, // DB5 FEZ_Pin.Digital.Di29, // DB6 FEZ_Pin.Digital.Di31); // DB7 |
It took me some time to figure that out, but within the hour I had the LCD running. I added an endless loop with an increasing counter and a delay of 1 second and let the sketch program run; at the time I took the picture it had been running for more than 4 hours.
One thing I noticed was that the LCD sometimes displayed garbage when the Panda was rebooted; after that everything worked OK, but startup looked a bit ugly. Maybe give the hardware connected to the Panda some more time to settle? I don’t know yet; we’ll see about that later. Another thing I need to have a look at is the fact that this SerialLCDDisplay class was apparently written for an LCD with 2 lines; cause line 0 (first line on the LCD) and 1 (second line on the LCD) were OK, but output destined for line 2 were shown on the first line of the LCD again – probably a minor issue.
And since I’ll have to change the class code for that anyway, I’ll also add 2 additional parameters with which I can set the number of rows and columns of the LCD – cause I have both 20×4 as well as 16×2 LCDs!
Oh, and I saw these automatically generated Debug messages appearing in the Debug output window in Visual Studio on my PC:
GC: 4msec 12132 bytes used, 52248 bytes available Type 0F (STRING ): 96 bytes Type 11 (CLASS ): 1596 bytes Type 12 (VALUETYPE ): 60 bytes Type 13 (SZARRAY ): 108 bytes Type 15 (FREEBLOCK ): 52248 bytes Type 17 (ASSEMBLY ): 7560 bytes Type 18 (WEAKCLASS ): 48 bytes Type 19 (REFLECTION ): 24 bytes Type 1B (DELEGATE_HEAD ): 72 bytes Type 1D (OBJECT_TO_EVENT ): 168 bytes Type 1E (BINARY_BLOB_HEAD ): 156 bytes Type 1F (THREAD ): 384 bytes Type 20 (SUBTHREAD ): 48 bytes Type 21 (STACK_FRAME ): 828 bytes Type 27 (FINALIZER_HEAD ): 168 bytes Type 31 (IO_PORT ): 252 bytes Type 34 (APPDOMAIN_HEAD ): 72 bytes Type 36 (APPDOMAIN_ASSEMBLY ): 492 bytes
This must be some diagnostic information from the GC process kicking in. 12 KB used? Woow… that’s 20%. But what’s the baseline of used memory, e.g. what does a program with an ‘empty’ main() use in terms of memory? Sounds like a good subject for another post..
http://www.partsim.com/
One thing I noticed was that the LCD sometimes displayed garbage when the Panda was rebooted
Thats due to the fact that you can’t control the io’s during startup. One solution is to add pull-down resistors on the datalines, that should prevent the garbage you are seeing.
Also, once you feel the driver is in a good shape, feel free to contribute back and place the driver on codeshare.
The 12kb used is not only your program, but includes also the netmf dll’s used by your program deployed to the panda.
I still have to see the 1st person on the forum that ran out of memory (with code only, you will run out of memory if you try to read a file from the sd card with a streamreader, instead use the filestream method to read in small chuncks)
Greetings,
Eric
Keep an eye on this thread for the 4 lines: http://www.tinyclr.com/forum/topic?id=7109
Eric,
I just posted a solution over there, thanks for your help.
Found it in the Arduino LiquidCrystal lib BTW; I knew I’d seen it somewhere sometime