Small note on how to start LCD in 4 bit mode

When LCD is working in 4 bit mode, then data has to be sent by nibbles – portions of 4 bits. Just remember that first goes high nibble then follows lower one. Each nibble has to be strobed with control signal E separately. Following list is describing how to start LCD in 4 bit mode: Wait for 15 ms after power is switched on; Write 00000011 (0x03) to LCD; Wait for 5 ms; Write 00000011 (0x03) to LCD; Wait for 160 us; Write 00000011 (0x03) to LCD; Wait for 160 us; Write 00000010 to enable 4 bit mode (after this command start sending in nibbles); Set interface length; Turn off display (0x00 and 0x08 nibbles); Write 00000001 (0x00 and 0x01 in nibbles) to clear display; Set cursor move direction by setting cursor bits; Enable display; After initialization is complete you may write any character or command to it.

Continue reading

Connect LCD to Atmega using 3 wires

After I implemented interfacing LCD to ATmega8 using 2 wires https://scienceprog.com/interfacing-lcd-to-atmega-using-two-wires/ I decided to make another one example but with 3 wires. Using 3 wires makes control much simpler as it is easier to control data flow to shift register. Here I used the same super cheap 74HC164 serial in parallel out register. LCD to shift register is connected in 8 bit mode. LCD strobe pin E is controlled with Atmega PC2 pin. Register is clocked with PC1 and data is transferred with PC0 pin. Notice, that I used same data line (PC0) to control LCD RS pin. RS pin is controlled in this way: after 8 bits are sent to shift register, then enable data line by setting ‘1’ (PC0) without clocking and after this LCD E pin is strobed. For more details take a look at my source code at the end of article. If there is any questions, don hesitate to ask. Source code:3 Wire LCD interface to ATMEGA

Continue reading

RTC example on ARM7 LPC2148 using WinARM

Finally got my LPC2148 RTC working on my development board. arm7 base development board for lpc2148 I am quite new to ARM microcontrollers, so I managed to make few tests using them by driving some peripherals and writing some test routines. First code I tried was simple LED blink program first lpc2148 arm7 microcontroller test led blink This one is running microcontrollers real time clock (RTC) and generating interrupts every second. When Interrupt occurs microcontroller sends particular message to UART that I could see via Terminal program. The main program: /****************************************************************************** * * WinARM RTC application * * – UART0 send in Interrupt-Mode * – Sends message every seccond. * – RTC interupt every second ******************************************************************************/ #include “types.h” #include “LPC214x.h” #include “config.h” #include “armVIC.h” #include “uart.h” uint32_t time_toggle=0; static void rtc0(void) __attribute__ ((interrupt (“IRQ”))); static void lowInit(void) { // set PLL multiplier & divisor. // values computed from config.h PLLCFG = PLLCFG_MSEL | PLLCFG_PSEL; // enable PLL PLLCON = PLLCON_PLLE; PLLFEED = 0xAA; // Make it happen. These two updates PLLFEED = 0x55; // MUST occur in sequence. // setup the parallel port pin IO0CLR = PIO0_ZERO_BITS; // clear the ZEROs output IO0SET = PIO0_ONE_BITS; // set the ONEs output…

Continue reading

Microcontroller eats too much of RAM

All you know that microcontrollers have limited amount RAM and EEPROM. For instance ATMega128 has 4-Kbytes of RAM, 4-Kbyte of EEPROM. This may seem quite enough for some applications, but more complicated routines require more of RAM. And there is no compiler that can do better optimization on usage of ram than programmer. The main aim of reaching this is reducing dependence on global data, stack and the heap. So if your application running in microcontroller eats too much of RAM then you should develop some strategy of using its RAM. Lets see… if you use constants as global values, why not to move them to EEPROM area? You can easily do this by compiler when you declare your variables by using const keyword: const uint8_t a=10; I compiled some code using this declaration and compiler (AVR-GCC) compiled .eep file which can be burned to microcontrollers EEPROM. In this way you can store your constants to your EEPROM memory. Another factor eating microcontroller RAM is stacks. Try to use us much stack as your program require and leave some reserved space just in case. There are many techniques that can help define requirement of stack memory. One of them is…

Continue reading

Minimizing microcontroller code size

Reducing microcontroller code size isn’t ease task, but what if you want resulting code to fit your available memory? Minimizing microcontroller code size can be done in two ways: Firs is using compilers optimization feature by code size. This optimization is very dangerous. Your optimized code may not work as supposed to because compiler may eliminate some code like empty loops or adding zeros. For example compilers like to remove for(int i=0;i by leaving one or several iterations. So don’t think that your optimized code will work as un-optimized. There are other things you can do to minimize microcontroller code size. One of them is avoiding usage of standard libraries routines. Because these libraries are general and handles all standard possible execution cases. By including them in your design you include a bunch of code you dont need. If it is possible it is better to write your own routines or modify existing ones to fit your needs. Also try to use needed variable sizes. If you need unsigned integers use uint type if you need byte size avoid using int which usually is more than 8 bits (16 or 32). This may significantly reduce your code as there are fewer…

Continue reading

Increase microcontroller code efficiency

C compilers are getting more and more advanced, but there is always a trade off made between speed and code size. Compiled code can be faster or smaller but not both. So you have to choose which part is more important speed or code size. The Increase of microcontroller code efficiency can be done in many ways. Don’t trust compiler optimization features, as they might not bee as effective as you expect. It is better to grab some profiler and inspect what parts of your code takes the most time and size. It is better to follow some techniques that may reduce code execution time and increase microcontroller code efficiency:

Continue reading

Interfacing LCD to Atmega using two wires

This is not new Idea of interfacing LCD using two wires, but it can help in many situations when there is not enough of microcontroller pins. This example is based on Hitachi 44780 Alphanumerical LCD. This circuit I provide is only to represent an idea but I think it should work also if soldered. We know, that to make LCD working you need at least 6 (in 4 bit mode) wires to control. But what if you need as many pins as possible from your avr and still want to see results on LCD. Then you need to use serial LCD or make one. In this example you just need to convert serial data coming to LCD using shift register. I suggest using 74HC164. You need only two wires to push data to shift register and then give them to LCD using “E” strobe signal. So how this operates? Atmega’s PC1 pin clocks shift register and PC0 is data line. Before you write to shift register clean it by sending “0” in eight clock cycles. You can erase register with additional wire controlling register reset, but there would be 3 lines used. After register is cleared, send eight bits to…

Continue reading