Menu

728x90

468x60

Navbar

Showing posts with label ATMega32. Show all posts
Showing posts with label ATMega32. Show all posts

Sunday, February 8, 2026

ATMega32 TWI and SH1106 128x64 OLED Example

The SH1106 is a 132 X 64 Dot Matrix OLED/PLED Segment/Common Driver with Controller manufactured by SINO WEALTH. This chip is applicable for many low cost display. A low cost monochrome OLED display for Arduino is very popular among student and electronic hobbyists. It cost around 2USD. This chip has many communication interface depend on the display manufacturers, 8-bit 6800-series parallel interface, 8-bit 8080-series parallel interface, 3-wire & 4-wire serial peripheral interface, 400KHz fast I2C bus interface. However an SPI or an I2C OLED display module is common due complexity of wiring. An SPI display yield a high speed data transmission and reception compares to the I2C communication interface.

ATMega32 TWI and SH1106 128x64 OLED Example 

 

 ATMega32 TWI and SH1106 128x64 OLED Example

This display is easy to control via an 8-bit micro-controller especially the Arduino. The SSD1306 is its equivalent display controller manufactured by solomon-systech. It contains command and data similar to the old KS0108 display controller.

ATMega32 TWI and SH1106 128x64 OLED Example 


I bought a cheap SH1106 1.3" OLED display from a local electronics component store. It works fine at lower I2C frequency around 100kHz. At higher data rate it become halted. I already tested it with Arduino and PIC16F887 micro-controller. For more detail about configuration and display data sending to this display module please visit this post.

In this example I use my ATMega32 to display text on the SH1106 display. At this time I have problem with the ATMega644P TWI. So I use this smaller memory micro-controller.

Source Code:

  1. /*
  2. * 10-twi_sh1106.c
  3. *
  4. * Created: 2/7/2026 5:21:04 PM
  5. * Author : Admin
  6. */

  7. #define F_CPU 16000000UL
  8. #include <avr/io.h>
  9. #include <util/delay.h>

  10. void show_text(void){
  11. display_xy(0,0);
  12. display_text("ATMega32 SH1106");
  13. display_xy(0,1);
  14. display_text("TWI Programming");
  15. display_xy(0,2);
  16. display_text("Microchip Studio");
  17. display_xy(0,3);
  18. display_text("v.7.0.2542");
  19. display_xy(0,4);
  20. display_text("1.3 I2C OLED ");
  21. display_xy(0,5);
  22. display_text("Display Module");
  23. display_xy(0,6);
  24. display_text("AKI-Technical");
  25. display_xy(0,7);
  26. display_text("2026/02/08 Sun");
  27. }

  28. int main(void)
  29. {
  30. /* Replace with your application code */
  31. _delay_ms(1000);
  32. display_init();
  33. display_clear(0);
  34. show_text();
  35. _delay_ms(5000);
  36. display_clear(0);
  37. while (1)
  38. {
  39. display_clear(0);
  40. show_text();
  41. _delay_ms(2500);
  42. display_clear(0);
  43. _delay_ms(2500);
  44. display_clear(0xFF);
  45. _delay_ms(2500);
  46. display_clear(0);
  47. show_text();
  48. _delay_ms(2500);
  49. display_clear(0xAA);
  50. _delay_ms(2500);
  51. }
  52. }


I place its twi.c and oled.c libraries in different files. Click here to download its source file.

ATMega32 TWI and SH1106 128x64 OLED Example
Schematic and Simulation

 The ATMega32 run very well at 16MHz and high SCL frequency.

ATMega32 TWI and SH1106 128x64 OLED Example
ATMega32 AVR Prototype Board

 

This PCB was offered by PCBWay (pcbway.com).

I have been using PCBWay for many years now. PCBWay fabricate PCBs at low cost, fast processing time for only 24 hours, and fast delivery time using any carrier options. This double side 10cmx10cm can be fabricate at only 5USD for 5 to 10pcs by PCBWay. It's a standard PCB with silk screen and solder mask.

A DIY dsPIC30F2010 and dsPIC30F1010 Prototype Board with Programmer
10 PCBs for only 5USD
 

For different size of PCB we can instantly quote on PCBWay website using a zip PCB Gerber file without account.

A DIY dsPIC30F2010 and dsPIC30F1010 Prototype Board with Programmer
PCBWay Instant Quote

 Now I create a bigger fonts function to make displaying text more visible.

  1. void display_char_8x16(unsigned char x, unsigned char y, char ch){
  2. y=y*2;
  3. display_xy(x,y);
  4. uint16_t temp;
  5. ch=ch-32;
  6. temp=ch*16;
  7. char i=0;
  8. for(i=0;i<8;i++) display_data(font_8x16[temp+i]);
  9. display_xy(x,y+1);
  10. for(i=8;i<16;i++) display_data(font_8x16[temp+i]);
  11. }

  12. void display_text_8x16(unsigned char x, unsigned char y, char *txt){
  13. while(*txt){ display_char_8x16(x,y,*txt++); x=x+8;}
  14. }

This example the SH1106 will display ASCII characters and numbers.

Source Code: 

 

  1. /*
  2. * 10-i2c_sh1106_2.c
  3. *
  4. * Created: 2/8/2026 7:59:35 PM
  5. * Author : Admin
  6. */

  7. #include <avr/io.h>
  8. #include <util/delay.h>
  9. #define F_CPU 16000000UL

  10. int main(void)
  11. {
  12. /* Replace with your application code */
  13. _delay_ms(1000);
  14. display_init();
  15. display_clear(0);
  16. display_text_8x16(0,0,"SH1106 I2C OLED");
  17. display_text_8x16(0,1,"And ATMega32");
  18. display_text_8x16(0,2,"Programming With");
  19. display_text_8x16(0,3,"Microchip Studio");
  20. _delay_ms(10000);
  21. display_clear(0x00);
  22. while (1)
  23. {
  24. display_text_8x16(0,0,"ATMega32 SH1106");
  25. _delay_ms(2500);
  26. uint8_t h=15;
  27. for(uint8_t i=0;i<10;i++) {
  28. display_char_8x16(h,1,'0'+i);
  29. h+=10;
  30. }
  31. _delay_ms(2500);
  32. h=0;
  33. for(uint8_t i=0;i<14;i++) {
  34. display_char_8x16(h,2,'A'+i);
  35. h+=10;
  36. }
  37. _delay_ms(2500);
  38. h=0;
  39. for(uint8_t i=0;i<14;i++) {
  40. display_char_8x16(h,3,'N'+i);
  41. h+=10;
  42. }
  43. _delay_ms(10000);
  44. display_clear(255);
  45. _delay_ms(10000);
  46. display_clear(0);
  47. _delay_ms(1000);
  48. }
  49. }


Click here to download this example. 

ATMega32 TWI and SH1106 128x64 OLED Example
Running Program on ATMega32 Prototype Board

The schematic is the same to previous example. 

There two on-board TWI devices, a ds1307 and a AT24L16B. So the MCU will read the RTC data from ds1307 and display it on the SH1106 OLED. Two ADC inputs, ADC0(PA0) connects to a POT, and ADC1(PA1) connects to the LM35 temperature sensor. However the LM35 was a fake TO-92 chip. Time to time it burned out due to heat dissipation.

ATMega32 TWI and SH1106 128x64 OLED Example 

Proteus has only a model for the SSD1306 that almost equivalent to the SH1106. However its simulation speed is very low compare to the parallel port base graphical LCD. But running this program using a real MCU and OLED it operate very well due to the high speed MCU  and SCL clock frequency.

To add any floating point value to a string we need to configure some parameters in the Microchip Studio IDE before compiling.

ATMega32 TWI and SH1106 128x64 OLED Example

ATMega32 TWI and SH1106 128x64 OLED Example 

ATMega32 TWI and SH1106 128x64 OLED Example 

The linker flag is  -lprintf_flt . Click save and close it before building the project.

Source Code:

  1. /*
  2. * twi.c
  3. *
  4. * Created: 2/4/2026 10:22:02 AM
  5. * Author: Admin
  6. */

  7. #define F_CPU 16000000UL

  8. #include <avr/io.h>
  9. #include <util/delay.h>

  10. void twi_init(void){
  11. TWSR|=0x01; //Prescaler Selection Bit
  12. TWBR=0x05; //Baud Rate Generator
  13. TWCR=(1<<TWEN); //Enable The TWI Module
  14. PORTC|=(1<<0);
  15. PORTC|=(1<<1);
  16. }

  17. void twi_start(void){
  18. TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
  19. while((TWCR&(1<<TWINT))==0);
  20. }

  21. void twi_write(unsigned char data){
  22. TWDR=data;
  23. TWCR=(1<<TWINT)|(1<<TWEN);
  24. while((TWCR&(1<<TWINT))==0);
  25. }

  26. unsigned char twi_read(char ACK){
  27. if(ACK==0)
  28. TWCR=(1<<TWINT)|(1<<TWEN)|(1<<TWEA);
  29. else
  30. TWCR=(1<<TWINT)|(1<<TWEN);
  31. while((TWCR&(1<<TWINT))==0);
  32. return TWDR;
  33. }

  34. void twi_stop(){
  35. TWCR=(1<<TWINT)|(1<<TWEN)|(1<<TWSTO);
  36. //_delay_us(10);
  37. }

I tested this firmware using the AMTega32 on my AVR Prototype Board. However it works on the ATMega16 or the ATMega644P with a proper software configurations. 

ATMega32 TWI and SH1106 128x64 OLED Example 


ATMega32 TWI and SH1106 128x64 OLED Example

 

Click here to download its source file. 




 

 


Sunday, July 13, 2025

A DIY ATMega32 Prototype Board

Overview

AVR micro-controller is a popular embedded controller for electronic students, engineers and hobbyists. Making a PCB for for micro-controller is exiting stuff for novice electronic practicing. It's is hard at first time but we can easily use it for firmware and circuit testing for later on.

A DIY ATMega32 Prototype Board 

A DIY ATMega32 Prototype Board

A DIY ATMega32 Prototype Board

A DIY ATMega32 Prototype Board

A DIY ATMega32 Prototype Board


I have some components I left a long time ago. So I designed my own test board for 40-pin AVR microcontrollers. I have ATMega644, ATMega32 and ATMega16 in my project box. I also have some USB PIC microcontroller, PIC18F2550. It can be use to make a DIY PICKit2 programmer that able to program any AVR microcontroller using AVRdude IDE. This software is very user-friendly. 

Some AVR micro-controller users prefer a USBasp or an FTDI chip with AVRdude to program this these chips. But currently I don't have them at my workshop. 

Schematic 

I use Protues VSM since it's easy to use for circuit and PCB design. I put some blocks on this board,

  1. A PICKit2 programmer and AVR ISP header
  2. A On-board 12VDC to 5VDC regulator
  3. A RS-232 to TTL converter
  4. A Reset button and external crystal oscillator
  5. Three buttons for ATMega32 external interrupts
  6. LED(s) with DIP switch connects to PORTC
  7. SPI header
  8. Two potentiometers for ADC input
  9. DIP switch for ADC configuration
  10. A DS1207 I2C RTC 
  11. A  40-pin ZIF socket for ATMega32, ATMega16, etc.

 The pictures below are its circuit diagram.

A DIY ATMega32 Prototype Board
Schematic Sheet #1

A DIY ATMega32 Prototype Board
Schematic Sheet #2

A DIY ATMega32 Prototype Board
Schematic Sheet #3

 It contains three A4-size sheets.

Printed Circuit Board (PCB)

This PCB is quite large (173.7 x 111.2mm(6.84 x 4.38 inches). We can fabricate it by hand using a simple tone transfer paper method because it contain a dozen of wire jumpers on top copper layer.

A DIY ATMega32 Prototype Board
Top Copper Layer

A DIY ATMega32 Prototype Board
Bottom Copper Layer

 I you prefer a simple tone transfer method, use the patterns below.

A DIY ATMega32 Prototype Board
Top Copper Layer

A DIY ATMega32 Prototype Board
Bottom Copper Layer

A DIY ATMega32 Prototype Board
Top Silk Layer

A DIY ATMega32 Prototype Board
Bottom Resist Layer

 Some PCB fabrication could fabricate it for around 40USD.

However I made the earlier version of this board by hand using a simple toner transfer method and and FR-4 copper clad board. I use ferric chloride acid to etch the copper clad. It's very low cost and fast. 

A DIY ATMega32 Prototype Board

A DIY ATMega32 Prototype Board

A DIY ATMega32 Prototype Board

A DIY ATMega32 Prototype Board

A DIY ATMega32 Prototype Board

A DIY ATMega32 Prototype Board

A DIY ATMega32 Prototype Board

A DIY ATMega32 Prototype Board

A DIY ATMega32 Prototype Board

 

 Click here to download this PCB project.
















Friday, July 22, 2022

Atmega32 EEPROM Programming Example

There are two main memory spaces in Atmega32 microcontroller, the Data Memory and the Program Memory space. An additional EEPROM Memory is useful for data storage. It's non-volatile. Hence this controller has three memory space. They are linear and regular.

EEPROM memory space contains up to 1024 bytes of data. It's separated from data space. It's single byte readable and writable. It endurance is up to 100,000 write/erase cycles. Its access time is around 8.5ms for the internal RC clock of 1MHz.

During the device is in power-down sleep mode, the EEPROM write operation still continuous. But it's not completely power down. So the the programmer must verify the EEPROM first before setting the device to entirely power-down mode.

EEPROM corruption can occur whenever the supply voltage is too low, that the instruction execution is incorrect. We can prevent it by enabling the internal Brown-out Detector (BOD). If the BOD can not help ,we can add an additional VCC reset Protection circuit. 

For low level programming like the Assembly language, the programmer must use the I/O and Peripheral Register. However in C programming for the AVR it's invisible for the programmer.

There are some registers that we have to use before accessing the EEPROM memory.

Atmega32 EEPROM Programming Example
The EEPROM Address Register – EEARH and EEARL
The address register is a 16-bit pair. But it has only 10-bit in use. So it's 10-bit (1024) address. The user can access up to 1024 bytes of EEPROM memory.

Atmega32 EEPROM Programming Example
The EEPROM Data Register – EEDR

The data register is single byte read/write.

Atmega32 EEPROM Programming Example
The EEPROM Control
Register – EECR

This memory contains,

  • Bits 7..4 – Reserved Bits
  • Bit 3 – EERIE: EEPROM Ready Interrupt Enable
  • Bit 2 – EEMWE: EEPROM Master Write Enable
  • Bit 1 – EEWE: EEPROM Write Enable
  • Bit 0 – EERE: EEPROM Read Enable

For AVR Lib-C for AVR device, we don't need to care about these registers. the programmer can use the eeprom.h library, and call its read and write function to access the EEPROM memory.

In this programming example we will use all these registers. The example below will show a simple way to access the internal EEPROM.

Atmega32 EEPROM Programming Example

Program Simulation

The controller will read and write the internal EEPROM data. The data will display on PortC.

  1. /*
  2.  * m32Eeprom.c
  3.  *
  4.  * Created: 7/20/2022 6:43:00 PM
  5.  * Author : desktop
  6.  */
  7.  
  8. #include <avr/io.h>
  9.  
  10. /*Write button connects to PD6*/
  11. #define writeButton ((PIND&0x40)==0)
  12. /*Read button connects to PD7*/
  13. #define readButton ((PIND&0x80)==0)
  14.  
  15. /*EEPROM Write Function*/
  16. void eepromWrite(unsigned int addr,unsigned char dat){
  17. /*Wait for completion of previous write*/
  18. while(EECR&(1<<EEWE));
  19. /*Set up address and data registers*/
  20. EEAR=addr;
  21. EEDR=dat;
  22. /*Write logical 1 to EEMWE*/
  23. EECR|=(1<<EEMWE);
  24. /*Start eeprom write by setting EEWE*/
  25. EECR|=(1<<EEWE);
  26. }
  27.  
  28. /*EEPROM Read Function*/
  29. unsigned char eepromRead(unsigned int addr){
  30. /*Wait for completion of previous write*/
  31. while(EECR&(1<<EEWE));
  32. /*Set up address register*/
  33. EEAR=addr;
  34. /*Start eeprom read by writing EERE*/
  35. EECR|=(1<<EERE);
  36. /*Return data from data register*/
  37. return EEDR;
  38. }
  39.  
  40. int main(void)
  41. {
  42. /*PORTC Output*/
  43. DDRC=0xFF;
  44. /*PA0...PA3 Input*/
  45. DDRA=0xF0;
  46. /*PORTB Input*/
  47. DDRB=0x00;
  48. /*Turn on porta and portb high*/
  49. PORTA=0x0F;
  50. PORTB=0xFF;
  51. /*Turn on PD6 and PD7*/
  52. PORTD=(1<<6)|(1<<7);
  53. while (1)
  54. {
  55. /*eeprom read task*/
  56. if (readButton)
  57. {
  58. /*Wait until the button released*/
  59. while(readButton);
  60. PORTC=eepromRead(PINA);
  61. }
  62. /*eeprom write task*/
  63. if (writeButton)
  64. {
  65. /*Wait until the button released*/
  66. while(writeButton);
  67. eepromWrite(PINA,PINB);
  68. }
  69. }
  70. }
  71.  
  72.  

Click here to download its source file.

Atmega32 EEPROM Programming Example
Schematic

PortA is used for address input. We use only four bits that contain up to 16 addresses.  PortB is used for data input for internal EEPROM writing. Write button connect to PD6 pin while read button connect to PD7 pin. PortC connects to a bar graph LED to display the data reading from internal EEPROM.


 

If you want a standard PCB for ATMega32 micro-controller, you can order my AVR Microcontroller project from PCBWay with a reasonable price. Click here to get a free $5 credit for new account.


336x280

Search This Blog

Labels

23K256 (1) 24C16B (2) 25AA010A (2) 8051 (7) 93AA46B (1) ADC (34) Analog Comparator (1) Arduino (16) ARM (13) AT89C52 (7) ATMega32 (58) ATMega644P (27) AVR (87) AVR PCB (2) Bootloader (1) CCS PICC (31) Change Notify Interrupt (CNI) (2) DAC (2) DHT11 (4) Display (133) Distance Sensor (3) ds1307 (10) DS18B20 (5) ds3231 (1) ds3232 (2) dsPIC (5) dsPIC30F1010 (3) dsPIC30F2010 (5) EEPROM (5) Environment Sensor (5) ESP32 (1) esp8266 (1) Graphical LCD (2) I2C (38) ILI9341 (1) Input/Output (76) Interrupt (22) IoT PCB (1) Keil (5) Keypad (16) KS0108 (2) LCD (75) LM35 (3) Master/Slave (2) MAX7221 (1) MCP23017 (8) MCP23S17 (7) MCP4921 (1) MCP4922 (2) Meter (3) MikroC (2) Module PCB (1) Motor (15) MPLABX (73) Nokia 5110 LCD (4) OLED (2) One-Wire (7) Oscillator (8) PCB (10) PCD8544 (3) PCF8574 (10) PIC (108) PIC12F (3) PIC16 (105) PIC16F628A (3) PIC16F630 (2) PIC16F716 (4) PIC16F818 (11) PIC16F818/819 (3) PIC16F84A (16) PIC16F876A (2) PIC16F877A (9) PIC16F88 (2) PIC16F887 (60) PIC18 (19) PIC18F1220 (5) PIC18F2550 (5) PIC18F4550 (12) PICKit2 (1) PICMicro PCB (4) Pin Change Interrupt (1) PWM (12) RTC (12) SBN0064G (1) Sensor (13) SH1106 (3) Shift Register (13) Shift Registers (10) Software TWI (2) SPI (39) ST7735 (1) STM32 (11) STM32 Black Pill (1) STM32 Blue Pill (12) STM32 HAL (5) STM32CubeIDE (13) STM32F103C8T6 (9) STM32F401CCU6 (1) SysTick (4) temperature sensor (13) TFT (1) TG12864A (1) Thermometer (22) Timer/Counter (32) TM1637 (2) twi (10) UART (8) Ultrasonic (4) Voltmeter (7) WDT (1) XC16 (2) XC8 (96)