It probably isn't bricked
I've got quite a few Arduinos, and over the last few years have only ever "bricked" one, and I think that was by zapping it with static electricity. Unfortunately that particular one had a SMD (surface mounted) processor chip, so it isn't easy to try swapping it with another chip.
Stay calm, and try the following steps ...
When writing an Interrupt Service Routine (ISR):
Keep it short
Don't use delay ()
Don't do serial prints
Make variables shared with the main code volatile
Variables shared with main code may need to be protected by "critical sections" (see below)
Don't try to turn interrupts off or on
What are interrupts?
Most processors have interrupts. ...
The simplest thing to do is set them to INPUT_PULLUP. If you want a purely hardware solution then you could connect them to GND through some resistors (10kΩ or whatever you have in that kind of order of magnitude will do).
You don't want to just tie them directly to ground, and you don't want to link them directly together - that could lead to short ...
At least - as I assume you upload your sketch via avrdude - please give more information about the upload failure (e.g. output of sketch uploader) so people here can help you better.
Additionally to the great answer of Nick Gammon, please search for exclamation marks in your sketch. If your sketch contains a string with more than or equal to 3 exclamation ...
I made up a small torch locator which used an ATtiny85 powered from a button-cell (CR2032). It looks like this:
That currently weighs 5.9g. The battery-holder weighs 1.6g so you could save that by making a more light-weight holder (perhaps a bit of plastic for insulation, and soldering directly to the battery). The chip socket weighs at least 0....
It's called a "Wired Or" arrangement.
The Arduino's RESET pin has a pullup resistor in it (10KΩ). That keeps the RESET pin normally HIGH. To invoke a reset that pin needs pulling low, and that is done from a number of sources:
The RESET button
The DTR pin (through a 100nF capacitor) of the USB interface chip
The 555 watchdog circuit above
The critical ...
A board we make does this.
The RX pin is wired to INT0
INT0 pin set to input or input pullup depending on how the RX line is driven
On sleep, INT0 low level interrupt is enabled
//Clear software flag for rx interrupt
rx_interrupt_flag = 0;
//Clear hardware flag for rx interrupt
EIFR = _BV(INTF0);
//Re-attach interrupt 0
The answer needs to have multiple parts:
Yes, in principle you can create a bootloader for any microcontroller, which acts like the Arduino's.
Please be aware that there are different bootloaders, not just the common STK500 compatible one. Each of these bootloaders implements a certain protocol to transfer the binary code to the target system.
The main difference is the bit before the -. That is, the 328 vs the 328P. The "P" there denotes "Picopower" which allows the chip to run at very low power consumptions.
Basically the P version is a more modern version of the non-P chip. There are probably other internal differences too but you will have to check the datasheets thoroughly for those.
The clock speed selected will affect both delay*() and millis()/micros() as well as the functions in <util/delay.h>, therefore you must use the target system's correct clock speed if you are using any of these functions. This can be easily done by editing boards.txt and copying an existing entry for the Uno and changing the value of the f_cpu parameter ...
It's possible you have a non-fatal problem
reflash the Arduino bootloader
If your Arduino has a socketed microcontroller you can try swapping it out with one that has the bootloader preloaded.
It's because these are unprogrammed chips, meaning they haven't had a bootloader programmed into them yet. Here is a tutorial for using your Arduino board to program a bootloader into them (there are many such tutorials available).
It only needs to be done once per chip so it will be worth your while to program all of them, once you have set up to do one. ...
The reset on an Arduino does not erase anything. It merely restarts execution of an already uploaded program. Also the AVR needs to be powered on for it to realize whether it has been reset.
Every time you power on an Arduino it automatically starts code execution from the beginning of the program in the flash memory.
From the ATmega328P datasheet:
Within the range 2.7 V – 4.5 V, the maximum frequency is a
linear function of Vcc. From this graph, you can compute the minimum
value of Vcc required to run the microcontroller at 16 MHz: it's
If you do want to run at 16 MHz, in order to emulate an Arduino
Uno, it may become unreliable once the supply voltage drops ...
Yes you can use ATMega328P without arduino board. I always use the IC without arduino. There are two ways of doing it.
You can use arduino board with the IC. Program the IC and then take it out and use it in your circuit. You will have to use 16MHZ Oscillator with capacitors.
If you don't have arduino board, you can use other programmers like USBasp to ...
Officially, no. Practically, often but not always.
If I follow the datasheet to the the letter, this configuration should not work. BUT... After some test, it did work.
The data sheet does not say that it "should not" work, it says that it is that the part is not qualified for operation at 16 MHz below some voltage higher than you want to use. That ...
I would personnaly suggest an ATtiny 45/85. It is pretty much a small AVR with 5 GPIOs. You can program it with the Arduino IDE and use the Arduino as ISP. If you can design you own custom PCB, a SMD version of the ATtiny is small, low and compact. The total circuit to make the ATtiny function is also minimal.
Also, at a low clock speed (0-4MHz), you can ...
You cannot use Serial inside an interrupt. Transmitting Serial relies on interrupts being available, and from inside an interrupt they aren't.
All Serial communication must be done from loop().
So you need to just count the switch toggles and check to see if that value has changed in your loop.
volatile uint32_t toggles = 0;
uint32_t old_toggles = 0;
This is a X->Y problem. Here is a solution for X:
Bit 3 of high fuse of the ATmega328p controls if EEPROM memory is preserved through the chip erase. You can change the high fuse setting in boards.txt. Restart the IDE to apply the new setting.
The fuses are written when you select the "burn bootloader" option in the Arduino IDE.
Besides breaking a pin while removing the IC from its socket, or static electricity during manipulation, I don't see what could fry the ATmega.
However, it is possible that the R2 ATmega has a different bootloader and that may be an issue.
If I was you I would just remove the ATmega from the R3 board and test it on a breadboard (don't need a lot of ...
The formula seems to be volt*5.9-6.6=mhz (valid between 1.8v and 4.5v), so at 3.3v, this would give 12.8mhz. Be aware that, if you are running at 12.8mhz, ANY drop below 3.3v MAY cause problems (and very hard to diagnose, too!) or you MAY get away with it.
However, Arduino Atmega328p chips have a "brown-out" detection set at 4.3v - any drop below that, the ...
It can be done with one button, one resistor, one capacitor and one GPIO pin (in addition to the RESET pin):
simulate this circuit – Schematic created using CircuitLab
Pressing the button causes a LOW pulse on the RESET pin (in the exact same way as the USB interface does).
During your startup procedure you read the GPIO pin you have chosen. If it's ...
One microsecond is only 16 CPU cycles.
The CPU needs 4 cycles to prepare itself for servicing the interrupt
(save the program counter, load the interrupt vector and clear the I bit
in SREG). The interrupt vector itself is a jmp instruction that takes
2 cycles. When the ISR is done, it executes the reti instruction
(return from interrupt) that takes 4 cycles....
Certainly there is.
// disable ADC
ADCSRA = 0;
You can disable lots of internal modules like this:
power_all_disable(); // turn off all modules
See my page about power saving.
Majenko commented that turning off the ADC, while leaving the processor running was pointless. The real way to save battery power is to sleep, and it is possible to do ...
ATTINY's are designed to easily do this since they can wake from power down sleep mode by a pin change...
Basically you want to...
Connect a normally-open push button between an IO pin and ground.
Enable the pull-up on the IO.
Enable the pin change interrupt on the IO pin.
Enter "power down" sleep mode.
When the button is pushed, it ...
The issues regarding efficiency of power are:
The CPU speed
The Power Regulator (not supply)
Address each one of these and don't over look any of them. Or any sub component. But note that some are more impacting than others.
while it is possible to lower the speed, It is more practical to just sleep. As you have indicated you ...
Short answer: Yes. After all, Arduinos are made by starting with an ATMega (or other AVR) IC.
Longer answer: People - including myself - routinely build with a bare ATMega328p (or other MCU), programming them off-board on another system, or providing connections to allow programming them in place. Beyond that you only need the soldering skills for the chip ...