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…

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…

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…

Continue reading

Power sources for AVR

Power sources for AVR are very important part in projects. Avery circuit has to be powered from some source like battery or from AC adapter 110V/220V. Using batteries is more convenient way to power the microcontroller projects as the circuits are simpler and constructed devices become portable. There are many types of batteries in shapes and sizes or capacities. So when choosing battery you should consider many factors: Capacity – this is very important parameter measured in mA/h. This parameter defines how long your microcontroller project will be working before recharging or replacing batteries. Rule is simple – as bigger battery capacity as longer your circuit will be working, but in other hand your project may become more expensive or even heavier because of bigger batteries. Second parameter is battery Voltage. If Voltage of battery is to small for tou circuit, youll have to connect several batteries in series. Other…

Continue reading

Atmega EEPROM memory writing

All atmega family microcontrollers have internal EEPROM memory. They can have from 512bytes to 4kBytes. EEPROM memory has its own memory space and is linearly organized. In order to access EEPROM mempry in atmega there are three registers used: Address register, Data register and Control register. Address register EEAR (EEPROM Address Register) is made of two 8 bit registers EEARH:EEARL. In this register the EEPROM cell address has to be loaded. Data register EEDR (EEPROM Data Register). When writing to EEPROM the data is loaded to this register. When getting data from EEPROM – you read data from this register. Control register EECR (EEPROM Control Register) is used to control access to EEPROM memory. EERIE – EEPROM Ready Interrupt Enable. This bit generates interrupt after write cycle is finished. If bit is set to ‘1’ and also I bit SREG, then EEPROM Ready interrupt is enabled. If bit is set…

Continue reading

Consider PWM signal

When using microcontroller and want to drive motor control or control led intensity you can use DAC to generate analog output voltage. But there is an easier way of doing this. You can use digital output to reach same results. This technique is known as PWM -Pulse Width Modulation. In this picture you can see 50% duty cycle square wave form. The width of ‘0’ is equal to ‘1’ level, this means if signal amplitude is 5V, then average voltage over one cycle is 2.5V. It is as though  of hawing constant 2.5V voltage.

Continue reading