Using Atmega32 With Arduino IDE

112,844

70

131

Introduction: Using Atmega32 With Arduino IDE

Over time I have used all kinds of Atmel microcontrollers in various projects.

One of the most suitable was ATmega32. I have a small collection of development boards for Atmega32/16, some bought as-is, some made on stripboard.

Although the original Arduino boards offers a pleasant experience and a rapid development of the projects, when it was necessary to "extract" these projects to give them final shape I hit the well-known problem: arduino board must be "locked" in the project.

It is not only the price. Although a microcontroller in thru-hole package is significantly bigger than SMD version, it is still much smaller than an Arduino board.

And still I want to use the Arduino IDE to benefit from the collection of (very well made) (ready-to-use) libraries.

So I gathered together information useful for this purpose.

Step 1: Things You Will Need:

  1. Atmega32 microcontroller. :)
  2. Programmer (any programmer recognized by Arduino IDE). I use the USBasp programmer.
  3. Minimal setup for power-up Atmega32 microcontroller (breadboard, stribpoard or a classical development board).

We do not need all, photos above are for exemplification only.

Step 2: Software Set-up

  1. Download zip file attached to this instructables.
  2. Locate file boards.txt in arduino folder ...arduino-1.5.2\hardware\arduino\avr\boards.txt
  3. Append information from zip archive boards.txt to original boards.txt
  4. Make a folder named mega32 in ...arduino-1.5.2\hardware\arduino\avr\variants
  5. Copy file pins_arduino.h from the zip into folder created at step 4.
  6. Start Arduino IDE and select board.
  7. Select programmer

Later edit:

I removed link to github projet where I originally found. As long as there source changed and not fit this instructable.

After a message from the author: Eric Conner, I put back link to github project where I originally found this library:

https://github.com/eaconner/ATmega32-Arduino

Note: Zip file attached to this article is an older version of above library. This will work as this instructable was written.

Over time, after some feedback I noticed that source from github has changed.

Also, in comments you will see references to some errors, and how to to correct it.

This article and answers from comments is relate to version attached here, not github (newer) version.

Step 3: Done.

It's done.

Now you can try some simple examples that are already in Arduino.

Be very careful about correlation between ARDUINO pin and microcontroller pin.

Here is blink example: Files->Examples->Basics->Blink

Pin13 Arduino == Pin19 (PD5) Atmega32

/*Blink
  Turns on an LED on for one second, then off for one second, repeatedly.
  This example code is in the public domain.
 */
 
// Pin 13 has an LED connected on most Arduino boards.
// give it a name:
int led = 13;

// the setup routine runs once when you press reset:
void setup() {                
  // initialize the digital pin as an output.
  pinMode(led, OUTPUT);     
}

// the loop routine runs over and over again forever:
void loop() {
  digitalWrite(led, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1000);               // wait for a second
  digitalWrite(led, LOW);    // turn the LED off by making the voltage LOW
  delay(1000);               // wait for a second
}

After some comments I found two errors in the file pins_arduino.h

So I’ll post here the errors and correct values.

erroneous definition of SCL and SDA

const static uint8_t SDA = 8; //wrong
const static uint8_t SCL = 9; //wrong

must be changed in:

const static uint8_t SDA = 17; //correct
const static uint8_t SCL = 16; //correct

Since I am not the author of the project on github, it is subject to change beyond my control.

So please use code attached to this instructable and make above modifications.

UPDATE:

For Serial library to work properly must be made following changes to the file HardwareSerial.cpp
In ...\arduino-1.5.8\hardware\arduino\avr\cores\arduino\HardwareSerial.cpp

will replace:

#if defined(__AVR_ATmega8__)
	config |= 0x80; // select UCSRC register (shared with UBRRH) 
#endif

with:

#if defined(__AVR_ATmega8__) || defined(__AVR_ATmega32__) || defined(__AVR_ATmega16__)
	config |= 0x80; // select UCSRC register (shared with UBRRH) 
#endif

See also: https://www.instructables.com/id/ATmega-DIP40-Mini...

1 Person Made This Project!

Recommendations

  • Organization Contest

    Organization Contest
  • Lamps and Lighting Contest

    Lamps and Lighting Contest
  • 3D Printed Student Design Challenge

    3D Printed Student Design Challenge

131 Comments

0
mpiran79
mpiran79

Question 22 days ago

for recicle the old wrong buy atmega 32-16pu i use arduino ide 1.0.6 (on recent, that i use wht arduino board have a lot of error)
on some libraies get an error:
\libraries\Servo\src/Servo.h:77:2: error: #error "This library only supports boards with an AVR, SAM, SAMD, NRF52 or STM32F4 processor."

0
zamany
zamany

Question 7 months ago on Step 3

No matter how hard I try, I can not understand how to program microcontrol with Ardino. Please learn the steps with a picture.

0
mbkh1382
mbkh1382

7 months ago

Hello i got this error
avrdude: invalid baud rate specified '{upload.speed}'
An error occurred while uploading the sketch
please help this is very important for me

0
TelekikeG
TelekikeG

9 months ago on Step 3

Hello, Nice and good work.
It was very useful for me, I was able to recover previous projects to the arduino and reprogram easily (without Bascom lol).
I write because, from the last version of the Arduino IDE, it has changed and no longer works, now they have grouped it by boards and even though I copy the files the boards do not appear in the list.Has anyone found a solution? I will continue investigating, if I find the solution I post it ..

0
TelekikeG
TelekikeG

Reply 9 months ago

Hello again.I answer to myself, because I think I found the solution quickly.You simply have to modify the files and directories, not only (I already had them modifying before) in the
C:\Arduino\hardware\arduino\avr, but also in: C:\Users\(username)\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3, or, C:\Users\(username)\AppData\Local \Arduino15\packages\arduino\hardware\megaavr\1.8.6\. It now depends on where you want it to appear in the menu.
This article was useful to me:https://forum.arduino.cc/index.php?topic=393434.0
I hope it works for somebody.

0
gadjet rathnayake

I completed the "step - 2 software setup" as instructed.

but I cannot see atmega32 boards in boards dropdown menu of arduino IDE

version of IDE is 1.8.5

0
TomO26
TomO26

5 years ago

Hello,

I'm having a problem with pin interrupts using this set-up

I can get INT0 and INT0 to work correctly, enabling the internal pull-up resistors and then using:

attachInterrupt(digitalPinToInterrupt(10), footOne, CHANGE); // Foot One - Pin 10

attachInterrupt(digitalPinToInterrupt(11), footTwo, CHANGE); // Foot Two - Pin 11

but if i try the same for INT2:

attachInterrupt(digitalPinToInterrupt(2), footThree, CHANGE); // Foot Three - Pin 02,

I the interrupt never gets triggered, despite each pin being set up in the same way with the same debouncing circuit.

Any ideas how to get INT2 to work correctly?

thanks

0
Vitalhb
Vitalhb

Reply 3 years ago

Hello TomO26,

INT2 only works with RISING and FALLING. CHANGE only works for INT0 and INT1 on ATmega32.

0
Silvius
Silvius

Reply 5 years ago

There is no quick solution to this ... I just did some tests...

It seems that the problem is in arduino core files WInterrupts.c and wiring_private.h, there should be added support for ATmega32/16, but I can't do that in so little time.

Anyway It's interesting "bug"... I never feel need to use INT2 until now... When I needed more external interrupts I moved to ATmega1284 and i use PCINT...

I think there are some modified cores ... but i don't now what are their limits.. try to study "Sanguino", "Bobuino", "Mighty-1284P", I know about them, but I never study in detail...

I try to not modify too much default core files... to be easy to remake when arduino cores are upgraded... so I look inside WInterrupts.c and wiring_private.h but I can't see a quick solution...
0
TomO26
TomO26

Reply 5 years ago

Hi Silvus, Thanks so much for getting back to me!

For the particular application I managed to find a work-around:

(used the same interrupt pin for 2 of the switches, and send the output of one of the switches to a different digital pin, so that during the interrupt, the digital pin can be read and the correct switch chosen)

But next time if i need lots of interrupts I'll switch to a different chip! (my choice of the 32 was fairly arbitrary in this case as I'm new to micro controllers, all I knew was i needed more pins that the 328p)

0
Silvius
Silvius

Reply 5 years ago

a quick and dirty solution to use INT2:

put this in setup()

MCUCR |= (1 << ISC2);
GICR |= (1 << INT2);
sei();

and make a function exactly like this:

ISR(INT2_vect)
{
// code for int2 ....
}

you can put this function before.. or after main function (I tested with function after main()... )

so you can write something like this:

ISR(INT2_vect)
{
// code for int2 ....
CHANGE();
}

I tested right now and work ...

0
TomO26
TomO26

Reply 5 years ago

Thanks again for your help.

I've been coming across an other issue, digital pins 18 19 20 & 21 aren't working properly.
I can't even get them to blink an LED

if i use the basic arduino example blink: it works correctly for the digital pins such as 15 16 17 22 & 23, but if I chance the pin in the program and on the breadboard, nothing happens. any ideas?

////////////////////////////////////////////////

const int LED = 18;

// the setup function runs once when you press reset or power the board

void setup() {

// initialize digital pin as an output.

pinMode(LED, OUTPUT);

}

// the loop function runs over and over again forever

void loop() {

digitalWrite(LED, HIGH); // turn the LED on (HIGH is the voltage level)

delay(1000); // wait for a second

digitalWrite(LED, LOW); // turn the LED off by making the voltage LOW

delay(1000); // wait for a second

}

0
Silvius
Silvius

Reply 5 years ago

those pins have dual function I/O and JTAG. you must disable JTAG...

or by setting fusebits or by program... see this for more info:

http://www.avrfreaks.net/forum/portc-and-jtag-disa...

for begining you can put this in setup function:

MCUCSR = (1<<JTD);
MCUCSR = (1<<JTD);

twice is not a mistake ...

Have fun!

0
TomO26
TomO26

Reply 5 years ago

Thanks! That's worked perfectly! hopefully I won't need to ask any questions as I've got all my inputs and outputs working!

0
majidmp97
majidmp97

Question 3 years ago

HOW WE CAN USER PWM TIMER ?

0
rochaksharma7
rochaksharma7

3 years ago

PLEASE HELP ME GUYS!!!!

ADC is not working on hardware but its works on proteus (software simulation).

i use USB-asp for uploading hex

0
thomas000bauer
thomas000bauer

3 years ago

Hello together,

i've encountered a problem. I've tried to read the ADC via "analogRead(A0)" for example. And the compiler responded with the error "'A4' was not declared in this scope".

also the function #define doesn't accept the argument A0 up to A7; does anybody else have expierenced this problem?

I also tried to read the value by using its digital Pin Number, but there is for example ADC5 = D26, but i need to insert "analogRead(27)" to get the corresponding value for ADC5;

thanks if you could help me with my problem here

0
Silvius
Silvius

Reply 3 years ago

analogRead(0); //-> physical pin 40 (ADC0)
analogRead(1); //-> physical pin 39 (ADC1)
.......
analogRead(7); //-> physical pin 33 (ADC7)

Pins A0-A7 are not defined. These definitions make sense for standard Arduino boards, where these pins are labeled on the PCB.

For this approach, I think is more intuitive as shown above.

0
ambivert guy
ambivert guy

4 years ago

I AM HAVING ERROR IN THIS CODE AS : "A0" WAS NOT DECLARED IN THE SCOPE. I CANNOT ANALOG READ A DATA ON ATMEGA32 USING ARDUINO IDE. PLEASE HELP

#include<LiquidCrystal.h>

LiquidCrystal lcd (5, 4, 3, 2, 1, 0);

const int ldrPin = A0;

void setup() {

lcd.begin(16, 2);

pinMode(ldrPin, INPUT);

}

void loop() {

int ldrStatus = analogRead(ldrPin);

if (ldrStatus <=300) {

lcd.setCursor (0, 0);

lcd.print ("XX");

}

else {

lcd.setCursor (0, 1);

lcd.print ("YY");

}

}