Developing in C for the ATmega328P: Example Code
Where I list all of the examples found in the examples folder for easy reference.
Introduction
When using a specific function or while attempting to understand a C programming concept, it is helpful to see a working example. The examples below, (except where noted), have all been tested and work on an Arduino Uno.
Examples
analogRead
Demonstrates analogRead() which reads the 10bit Analog-Digital Converter (ADC).
analogRead_16
Currently not a working example, a AVR program which demonstrates how to over-sample the ADC to derive a 16bit result.
analogWrite
Demonstrates analogWrite(), which configures one of the 6 PWM pins (those marked with "~" to deliver a PWM signal with a specific duty cycle.
blink
Classic blink routine, use to confirm everything is working.
blink_avr
A blink example using native bit-setting commands, use to understand how set bits for higher speeds.
blink_tog
Demonstrates how to use digitalWrite(pin, TOG) to flip a bit, as compared to a read-modify-write sequence, required by the Arduino framework.
blink_w_struct
Demonstrates blink_wo_delay using a struct to initialize and control the blinking.
blink_wo_delay
Adafruit example, blink_wo_delay in C from Multi-tasking the Arduino Part 1
button
Demonstrates how to use an ISR-based approach to debounce a set of buttons.
calculations
Demonstrates the impact of data types on math calculations.
constrain
Demonstrates how to write a constrain function, which could be used as the Arduino constrain function.
d_analogRead
Demonstrates a dummy version of analogRead() using a random number generator rand(). Remaining logic, is identical to analogRead() example.
digitalRead
Demonstrates how to use digitalRead()
durationTest
A very simple linear test to demonstrate tone(), plays “Shave and Haircut…”.
flashwithoutdelay
Adafruit State Machine example, flashwithoutdelay in C from Multi-tasking the Arduino Part 1
float_perf
Demonstrates integer vs. float performance when performing calculations, also demonstrates integer math errors of large numbers.
four_states
A multi-file demonstration of a state machine with each state using both a header and code file.
map
Demonstrates both types of mapping, one using shifts to move from 10bits to 8bits of a range and the other using a map function.
melody_array
Similar to durationTest, plays “Shave and a Haircut”, however, uses arrays for the notes and durations. Demonstrates a more similar to the way music would be constructed as compared to hard-coded in durationTest. See: Play a Melody using the tone function
micros - see ticks
millis
Demonstrates how to use millis(), how to set it up and how to use it.
min_max
A min_max example similar to the Arduino functions min() and max(), neither are implemented in AVR_C due to the proliferation of types, which would be needed. Use these examples as a guide to making your own.
multi_Ard
Very, very simple multi-tasking example using an Arduino digitalWrite(), which makes it pretty slow.
multi_struct
Demonstrates using a struct instead of using a class in implementing Adafruit’s multi-tasking example, “A Classy Approach”.
multi_struct_usec
A more precise (microseconds) demonstration using a struct instead of using a class in implementing Adafruit’s multi-tasking example, “A Classy Approach”.
multifunction
A very simple multi-tasking example which used function pointers to move between tasks. Each function can be a very different task with a simple round-robin scheduling technique. Uses AVR native commands for highest possible speed.
oneline_Ard and oneline_avr
Comparison of using the oneline multi-tasking concept comparing using native AVR commands vs. Arduino-style commands. Used to compare speed of execution.
powers
Calculates and prints the powers of 2 for each data type in C for the ATmega328P. Does not demonstrate data types for 64bits or long long as AVR-LIBC documentation for vprintf() states “But the ll length modifier will to [sic] abort the output, as this realization does not operate long long arguments.”
progmem
Demonstrates three methods of printing strings from PROGMEM. You use PROGMEM to store strings (or static data) in Flash to reduce the consumption of RAM.
rand_test
Simple test of the C language pseudo-random number generator (PRNG) rand().
serialio_char
Very simple serial test to demonstrate the setup required and how to puts() and printf().
serialio_string
Simple string I/O example to demonstrate the setup required and how to scanf() and printf().
serialRead
Demonstrates replacing analogRead() with the serialRead() function so that it is easier to debug a program. The function serialRead() provides the capability of using the serial port instead of an analog device.
ticks
Demonstrates how to use ticks() and ticks_ro() for measuring execution times. The Uno runs at 16MHz resulting in a 62.5nsec clock cycle, and ticks() rolls over every 65,535 times or 4.096ms. This example allows you to check it’s accuracy. Note: ticks() and ticks_ro() replaces micros(). Dividing the number of ticks by 16 gets you 1 microsecond, which is the same as shifting to the right, 4 times. So n usecs = (ticks() ยป 4).
tinymt
Demonstrates using Tiny Mersenne Twister pseudo-random number generator (PRNG), instead of the typical function, rand(). The Tiny Mersenne Twister is thought to be of much higher quality randomness than the rand() function.
Comments powered by Talkyard.