From 361a828c46670c6340a7d8a5d3a1d852b3788a5f Mon Sep 17 00:00:00 2001 From: Dan Date: Tue, 20 Sep 2022 01:08:01 -0400 Subject: [PATCH] Started following some tutorial on att85 usi. Downloaded example code from make avr book. --- .../AVR-Programming-Library/.gitignore | 2 + .../AVR-Programming-Library/Makefile | 196 + .../AVR-Programming-Library/README.md | 30 + .../AVR-Programming-Library/USART.c | 137 + .../AVR-Programming-Library/USART.h | 45 + .../AVR-Programming-Library/binaryMacro.h | 45 + .../AVR-Programming-Library/macros.h | 26 + .../AVR-Programming-Library/pinDefines.h | 91 + .../AVR-Programming-Library/portpins.h | 549 + .../blinkLED/Makefile | 196 + .../blinkLED/blinkLED.c | 26 + .../blinkLED_AVR_style/Makefile | 196 + .../blinkLED_AVR_style/blinkLED_AVRStyle.c | 32 + .../Chapter03_Digital-Output/povToy/Makefile | 196 + .../Chapter03_Digital-Output/povToy/povToy.c | 34 + .../Chapter03_Digital-Output/povToy_1up/1up.c | 59 + .../povToy_1up/Makefile | 196 + .../povToy_cylonEyes/Makefile | 196 + .../povToy_cylonEyes/cylonEyes_POV.c | 34 + .../povToy_invaders/Makefile | 196 + .../povToy_invaders/invaders.c | 70 + .../cylonEyes/Makefile | 196 + .../cylonEyes/cylonEyes.c | 36 + .../cylonEyes_16LFSR/16LFSR.c | 71 + .../cylonEyes_16LFSR/Makefile | 196 + .../cylonEyes_8LFSR/8LFSR.c | 70 + .../cylonEyes_8LFSR/Makefile | 196 + .../cylonEyes_counting/Makefile | 196 + .../cylonEyes_counting/counting.c | 15 + .../cylonEyes_halfStepping/Makefile | 196 + .../cylonEyes_halfStepping.c | 45 + .../cylonEyes_naive/Makefile | 196 + .../cylonEyes_naive/cylonEyes_naive.c | 42 + .../cylonEyes_quasiRandomToggle/Makefile | 196 + .../quasiRandomToggle.c | 30 + .../showingOffBits/Makefile | 196 + .../showingOffBits/showingOffBits.c | 59 + .../serialLoopback/Makefile | 196 + .../serialLoopback/serialLoopback.c | 31 + .../Chapter05_Serial-IO/serialOrgan/Makefile | 196 + .../serialOrgan/autoPlay.py | 50 + .../Chapter05_Serial-IO/serialOrgan/organ.c | 26 + .../Chapter05_Serial-IO/serialOrgan/organ.h | 9 + .../Chapter05_Serial-IO/serialOrgan/scale16.h | 99 + .../serialOrgan/scaleGenerator.py | 46 + .../serialOrgan/serialOrgan.c | 74 + .../avrMusicBox/Makefile | 196 + .../avrMusicBox/avrMusicBox.c | 48 + .../avrMusicBox/organ.c | 26 + .../avrMusicBox/organ.h | 9 + .../avrMusicBox/scale16.h | 99 + .../avrMusicBox/scaleGenerator.py | 46 + .../bossButton/Makefile | 196 + .../bossButton/bossButton.c | 46 + .../bossButton/bossButton.py | 31 + .../debouncer/Makefile | 196 + .../debouncer/debouncer.c | 40 + .../simpleButton/Makefile | 196 + .../simpleButton/simpleButton.c | 27 + .../toggleButton/Makefile | 196 + .../toggleButton/toggleButton.c | 28 + .../toggleButton_debounced/Makefile | 196 + .../toggleButton_debounced.c | 42 + .../lightSensor/.gitignore | 1 + .../lightSensor/Makefile | 196 + .../lightSensor/lightSensor.c | 41 + .../nightLight/Makefile | 196 + .../nightLight/nightLight.c | 39 + .../slowScope/Makefile | 196 + .../slowScope/serialScope.py | 35 + .../slowScope/slowScope.c | 33 + .../capSense/Makefile | 196 + .../capSense/capSense.c | 67 + .../capSense/serialScope.py | 35 + .../helloInterrupt/Makefile | 196 + .../helloInterrupt/helloInterrupt.c | 45 + .../helloPinChangeInterrupt/Makefile | 196 + .../helloPinChangeInterrupt.c | 39 + .../amRadio/Makefile | 196 + .../amRadio/amRadio.c | 81 + .../amRadio/scale16.h | 78 + .../reactionTimer/Makefile | 196 + .../reactionTimer/reactionTimer.c | 68 + .../reactionTimer/support.c | 92 + .../reactionTimer/support.h | 24 + .../timerAudio/Makefile | 196 + .../timerAudio/scale8.h | 48 + .../timerAudio/timerAudio.c | 49 + .../bruteForcePWM/Makefile | 196 + .../bruteForcePWM/pwm.c | 47 + .../pwm/Makefile | 196 + .../pwm/pinDefines.h | 93 + .../pwm/pwm.c | 45 + .../pwmOnAnyPin/Makefile | 196 + .../pwmOnAnyPin/pwmOnAnyPin.c | 59 + .../pwmTimers/Makefile | 196 + .../pwmTimers/pwmTimers.c | 50 + .../pwm_cross-fading_cylons/Makefile | 196 + .../cross-fading_cylons.c | 60 + .../servoSundial/Makefile | 196 + .../servoSundial/_servoClockFunctions.c | 45 + .../servoSundial/_servoClockFunctions.h | 18 + .../servoSundial/_servoSerialHelpers.c | 34 + .../servoSundial/_servoSerialHelpers.h | 8 + .../servoSundial/calibrateTime.py | 86 + .../servoSundial/justSetTime.py | 6 + .../servoSundial/servoSundial.c | 81 + .../servoSundial/servoSundial.h | 53 + .../servoSundial/stepHours.py | 17 + .../servoWorkout/Makefile | 196 + .../servoWorkout/servoWorkout.c | 94 + .../footstepDetector/Makefile | 196 + .../footstepDetector/footstepDetector.c | 98 + .../voltmeter/Makefile | 196 + .../voltmeter/voltmeter.c | 85 + .../adsr/Makefile | 196 + .../Chapter13_Advanced-PWM-Tricks/adsr/adsr.c | 86 + .../Chapter13_Advanced-PWM-Tricks/adsr/adsr.h | 81 + .../adsr/fullSaw15.h | 34 + .../adsr/fullSaw3.h | 34 + .../adsr/fullSaw7.h | 34 + .../adsr/fullTri15.h | 34 + .../adsr/fullTri3.h | 34 + .../adsr/fullTri7.h | 34 + .../adsr/fullTriangle.h | 34 + .../adsr/generateScale.py | 44 + .../adsr/generateWavetables.py | 101 + .../adsr/scale.h | 72 + .../arpeggiator/Makefile | 196 + .../arpeggiator/arpeggiator.c | 78 + .../arpeggiator/music_formula_collection.txt | 320 + .../dds/Makefile | 196 + .../Chapter13_Advanced-PWM-Tricks/dds/dds.c | 56 + .../dds/fullSaw15.h | 34 + .../dds/fullSaw3.h | 34 + .../dds/fullSaw7.h | 34 + .../dds/fullSine.h | 34 + .../dds/fullSquare15.h | 34 + .../dds/fullSquare3.h | 34 + .../dds/fullSquare7.h | 34 + .../dds/fullTri15.h | 34 + .../dds/fullTri3.h | 34 + .../dds/fullTri7.h | 34 + .../dds/fullTriangle.h | 34 + .../dds/generateWavetables.py | 101 + .../dds_interrupts/Makefile | 196 + .../dds_interrupts/dds_interrupts.c | 74 + .../dds_interrupts/fullSaw15.h | 34 + .../dds_interrupts/fullSaw3.h | 34 + .../dds_interrupts/fullSaw7.h | 34 + .../dds_interrupts/fullSine.h | 34 + .../dds_interrupts/fullSquare15.h | 34 + .../dds_interrupts/fullSquare3.h | 34 + .../dds_interrupts/fullSquare7.h | 34 + .../dds_interrupts/fullTri15.h | 34 + .../dds_interrupts/fullTri3.h | 34 + .../dds_interrupts/fullTri7.h | 34 + .../dds_interrupts/fullTriangle.h | 34 + .../dds_interrupts/generateWavetables.py | 101 + .../dds_saw15/Makefile | 196 + .../dds_saw15/dds_saw15.c | 56 + .../dds_saw15/fullSaw15.h | 34 + .../dds_saw15/fullSaw3.h | 34 + .../dds_saw15/fullSaw7.h | 34 + .../dds_saw15/fullSine.h | 34 + .../dds_saw15/fullSquare15.h | 34 + .../dds_saw15/fullSquare3.h | 34 + .../dds_saw15/fullSquare7.h | 34 + .../dds_saw15/fullTri15.h | 34 + .../dds_saw15/fullTri3.h | 34 + .../dds_saw15/fullTri7.h | 34 + .../dds_saw15/fullTriangle.h | 34 + .../dds_saw15/generateWavetables.py | 101 + .../dialTone/Makefile | 196 + .../dialTone/dialTone.c | 85 + .../dialTone/fullSine.h | 34 + .../dialTone/generateWavetables.py | 101 + .../fatSaw/Makefile | 196 + .../fatSaw/fatSaw.c | 56 + .../fatSaw/fatSaw.h | 36 + .../fatSaw/fullSaw15.h | 34 + .../fatSaw/fullSaw3.h | 34 + .../fatSaw/fullSaw7.h | 34 + .../fatSaw/generateWavetables.py | 101 + .../dcMotorWorkout/Makefile | 196 + .../dcMotorWorkout/dcMotorWorkout.c | 61 + .../hBridgeWorkout/Makefile | 196 + .../hBridgeWorkout/hBridgeWorkout.c | 63 + .../stepperWorkout/Makefile | 196 + .../stepperWorkout/half_stepping.h | 17 + .../stepperWorkout/stepperWorkout.c | 137 + .../Chapter16_SPI/spiEEPROMDemo/25LC256.c | 105 + .../Chapter16_SPI/spiEEPROMDemo/25LC256.h | 60 + .../Chapter16_SPI/spiEEPROMDemo/Makefile | 196 + .../spiEEPROMDemo/spiEEPROMDemo.c | 55 + .../Chapter17_I2C/i2cThermometer/Makefile | 196 + .../Chapter17_I2C/i2cThermometer/i2c.c | 38 + .../Chapter17_I2C/i2cThermometer/i2c.h | 22 + .../i2cThermometer/i2cThermometer.c | 60 + .../loggingThermometer/25LC256.c | 105 + .../loggingThermometer/25LC256.h | 60 + .../Chapter17_I2C/loggingThermometer/Makefile | 196 + .../Chapter17_I2C/loggingThermometer/i2c.c | 39 + .../Chapter17_I2C/loggingThermometer/i2c.h | 22 + .../loggingThermometer/loggingThermometer.c | 172 + .../progmemDemo1/Makefile | 196 + .../progmemDemo1/progmemDemo1.c | 32 + .../progmemDemo2/Makefile | 196 + .../progmemDemo2/progmemDemo2.c | 37 + .../progmemDemo3/Makefile | 196 + .../progmemDemo3/progmemDemo3.c | 33 + .../progmemDemo4/Makefile | 196 + .../progmemDemo4/progmemDemo4.c | 36 + .../progmemDemo5/Makefile | 196 + .../progmemDemo5/progmemDemo5.c | 68 + .../talkingVoltmeter/Makefile | 196 + .../talkingVoltmeter/allDigits.h | 14923 +++++++++++++++ .../cornell/dpcm_1bit/Makefile | 186 + .../cornell/dpcm_1bit/Speech_1_bit_diff.m | 84 + .../cornell/dpcm_1bit/Welcome4760small.wav | Bin 0 -> 44228 bytes .../cornell/dpcm_1bit/mega644_1_bit.h | 1 + .../cornell/dpcm_1bit/speech_1_bit_diff.c | 113 + .../cornell/dpcm_2bit/.gitignore | 3 + .../cornell/dpcm_2bit/Find2Code476.m | 24 + .../cornell/dpcm_2bit/FindOpt.m | 16 + .../cornell/dpcm_2bit/Makefile | 186 + .../cornell/dpcm_2bit/Speech_encode_GCC.m | 83 + .../cornell/dpcm_2bit/downsample.m | 5 + .../cornell/dpcm_2bit/sineWave.py | 38 + .../cornell/dpcm_2bit/speech_644_GCC.c | 109 + .../cornell/dpcm_2bit/wave2DPCM.py | 128 + .../elliot_speaking/.gitignore | 4 + .../elliot_speaking/allDigits.h | 14923 +++++++++++++++ .../elliot_speaking/eight.wav | Bin 0 -> 30790 bytes .../talkingVoltmeter/elliot_speaking/five.wav | Bin 0 -> 42054 bytes .../talkingVoltmeter/elliot_speaking/four.wav | Bin 0 -> 42054 bytes .../talkingVoltmeter/elliot_speaking/nine.wav | Bin 0 -> 56390 bytes .../talkingVoltmeter/elliot_speaking/one.wav | Bin 0 -> 54340 bytes .../elliot_speaking/point.wav | Bin 0 -> 51270 bytes .../elliot_speaking/seven.wav | Bin 0 -> 45126 bytes .../talkingVoltmeter/elliot_speaking/six.wav | Bin 0 -> 48196 bytes .../elliot_speaking/talkingvoltmeter.wav | Bin 0 -> 96338 bytes .../elliot_speaking/thankyou.wav | Bin 0 -> 45130 bytes .../elliot_speaking/three.wav | Bin 0 -> 46150 bytes .../talkingVoltmeter/elliot_speaking/two.wav | Bin 0 -> 45124 bytes .../elliot_speaking/volts.wav | Bin 0 -> 50246 bytes .../elliot_speaking/wave2DPCM.py | 136 + .../talkingVoltmeter/elliot_speaking/zero.wav | Bin 0 -> 50246 bytes .../talkingVoltmeter/rich_speaking/.gitignore | 2 + .../rich_speaking/allDigits.h | 15353 ++++++++++++++++ .../talkingVoltmeter/rich_speaking/begin.wav | Bin 0 -> 22764 bytes .../talkingVoltmeter/rich_speaking/eight.wav | Bin 0 -> 17004 bytes .../talkingVoltmeter/rich_speaking/five.wav | Bin 0 -> 23404 bytes .../talkingVoltmeter/rich_speaking/four.wav | Bin 0 -> 21484 bytes .../talkingVoltmeter/rich_speaking/go.wav | Bin 0 -> 24044 bytes .../rich_speaking/hello_world.wav | Bin 0 -> 25964 bytes .../talkingVoltmeter/rich_speaking/nine.wav | Bin 0 -> 22124 bytes .../talkingVoltmeter/rich_speaking/one.wav | Bin 0 -> 18924 bytes .../talkingVoltmeter/rich_speaking/point.wav | Bin 0 -> 21484 bytes .../talkingVoltmeter/rich_speaking/seven.wav | Bin 0 -> 21804 bytes .../talkingVoltmeter/rich_speaking/six.wav | Bin 0 -> 22124 bytes .../rich_speaking/speaking_digits.wav | Bin 0 -> 193964 bytes .../talkingVoltmeter/rich_speaking/ten.wav | Bin 0 -> 18604 bytes .../talkingVoltmeter/rich_speaking/three.wav | Bin 0 -> 15724 bytes .../talkingVoltmeter/rich_speaking/two.wav | Bin 0 -> 15724 bytes .../talkingVoltmeter/rich_speaking/volts.wav | Bin 0 -> 24044 bytes .../talkingVoltmeter/rich_speaking/zero.wav | Bin 0 -> 22124 bytes .../talkingVoltmeter/talkingVoltmeter.c | 125 + .../talkingVoltmeter/talkingVoltmeter.h | 91 + .../talkingVoltmeter/wave2DPCM.py | 119 + .../Chapter19_EEPROM/eememDemo/.gitignore | 3 + .../Chapter19_EEPROM/eememDemo/Makefile | 196 + .../Chapter19_EEPROM/eememDemo/eememDemo.c | 39 + .../Chapter19_EEPROM/favoriteColor/.gitignore | 3 + .../Chapter19_EEPROM/favoriteColor/Makefile | 196 + .../favoriteColor/favoriteColor.c | 38 + .../Chapter19_EEPROM/quickDemo/.gitignore | 3 + .../Chapter19_EEPROM/quickDemo/Makefile | 196 + .../Chapter19_EEPROM/quickDemo/quickDemo.c | 19 + .../vigenereCipher/.gitignore | 1 + .../Chapter19_EEPROM/vigenereCipher/Makefile | 196 + .../vigenereCipher/vigenereCipher.c | 146 + .../vigenereCipher/vigenereCipher.c_outline | 55 + .../vigenereCipher/vigenereCipher.h | 50 + Make AVR Examples/LICENSE.txt | 24 + Make AVR Examples/README.md | 107 + Make AVR Examples/allProjectsList | 69 + Make AVR Examples/setupProject/Makefile | 196 + Make AVR Examples/setupProject/USART.c | 137 + Make AVR Examples/setupProject/USART.h | 44 + .../setupProject/createPinDefines.py | 61 + Make AVR Examples/setupProject/macros.h | 26 + Make AVR Examples/setupProject/main.c | 22 + Make AVR Examples/setupProject/main.h | 19 + .../setupProject/setupProject.py | 41 + 295 files changed, 68746 insertions(+) create mode 100644 Make AVR Examples/AVR-Programming-Library/.gitignore create mode 100644 Make AVR Examples/AVR-Programming-Library/Makefile create mode 100644 Make AVR Examples/AVR-Programming-Library/README.md create mode 100644 Make AVR Examples/AVR-Programming-Library/USART.c create mode 100644 Make AVR Examples/AVR-Programming-Library/USART.h create mode 100644 Make AVR Examples/AVR-Programming-Library/binaryMacro.h create mode 100644 Make AVR Examples/AVR-Programming-Library/macros.h create mode 100644 Make AVR Examples/AVR-Programming-Library/pinDefines.h create mode 100644 Make AVR Examples/AVR-Programming-Library/portpins.h create mode 100644 Make AVR Examples/Chapter02_Programming-AVRs/blinkLED/Makefile create mode 100644 Make AVR Examples/Chapter02_Programming-AVRs/blinkLED/blinkLED.c create mode 100644 Make AVR Examples/Chapter02_Programming-AVRs/blinkLED_AVR_style/Makefile create mode 100644 Make AVR Examples/Chapter02_Programming-AVRs/blinkLED_AVR_style/blinkLED_AVRStyle.c create mode 100644 Make AVR Examples/Chapter03_Digital-Output/povToy/Makefile create mode 100644 Make AVR Examples/Chapter03_Digital-Output/povToy/povToy.c create mode 100644 Make AVR Examples/Chapter03_Digital-Output/povToy_1up/1up.c create mode 100644 Make AVR Examples/Chapter03_Digital-Output/povToy_1up/Makefile create mode 100644 Make AVR Examples/Chapter03_Digital-Output/povToy_cylonEyes/Makefile create mode 100644 Make AVR Examples/Chapter03_Digital-Output/povToy_cylonEyes/cylonEyes_POV.c create mode 100644 Make AVR Examples/Chapter03_Digital-Output/povToy_invaders/Makefile create mode 100644 Make AVR Examples/Chapter03_Digital-Output/povToy_invaders/invaders.c create mode 100644 Make AVR Examples/Chapter04_Bit-Twiddling/cylonEyes/Makefile create mode 100644 Make AVR Examples/Chapter04_Bit-Twiddling/cylonEyes/cylonEyes.c create mode 100644 Make AVR Examples/Chapter04_Bit-Twiddling/cylonEyes_16LFSR/16LFSR.c create mode 100644 Make AVR Examples/Chapter04_Bit-Twiddling/cylonEyes_16LFSR/Makefile create mode 100644 Make AVR Examples/Chapter04_Bit-Twiddling/cylonEyes_8LFSR/8LFSR.c create mode 100644 Make AVR Examples/Chapter04_Bit-Twiddling/cylonEyes_8LFSR/Makefile create mode 100644 Make AVR Examples/Chapter04_Bit-Twiddling/cylonEyes_counting/Makefile create mode 100644 Make AVR Examples/Chapter04_Bit-Twiddling/cylonEyes_counting/counting.c create mode 100644 Make AVR Examples/Chapter04_Bit-Twiddling/cylonEyes_halfStepping/Makefile create mode 100644 Make AVR Examples/Chapter04_Bit-Twiddling/cylonEyes_halfStepping/cylonEyes_halfStepping.c create mode 100644 Make AVR Examples/Chapter04_Bit-Twiddling/cylonEyes_naive/Makefile create mode 100644 Make AVR Examples/Chapter04_Bit-Twiddling/cylonEyes_naive/cylonEyes_naive.c create mode 100644 Make AVR Examples/Chapter04_Bit-Twiddling/cylonEyes_quasiRandomToggle/Makefile create mode 100644 Make AVR Examples/Chapter04_Bit-Twiddling/cylonEyes_quasiRandomToggle/quasiRandomToggle.c create mode 100644 Make AVR Examples/Chapter04_Bit-Twiddling/showingOffBits/Makefile create mode 100644 Make AVR Examples/Chapter04_Bit-Twiddling/showingOffBits/showingOffBits.c create mode 100644 Make AVR Examples/Chapter05_Serial-IO/serialLoopback/Makefile create mode 100644 Make AVR Examples/Chapter05_Serial-IO/serialLoopback/serialLoopback.c create mode 100644 Make AVR Examples/Chapter05_Serial-IO/serialOrgan/Makefile create mode 100644 Make AVR Examples/Chapter05_Serial-IO/serialOrgan/autoPlay.py create mode 100644 Make AVR Examples/Chapter05_Serial-IO/serialOrgan/organ.c create mode 100644 Make AVR Examples/Chapter05_Serial-IO/serialOrgan/organ.h create mode 100644 Make AVR Examples/Chapter05_Serial-IO/serialOrgan/scale16.h create mode 100644 Make AVR Examples/Chapter05_Serial-IO/serialOrgan/scaleGenerator.py create mode 100644 Make AVR Examples/Chapter05_Serial-IO/serialOrgan/serialOrgan.c create mode 100644 Make AVR Examples/Chapter06_Digital-Input/avrMusicBox/Makefile create mode 100644 Make AVR Examples/Chapter06_Digital-Input/avrMusicBox/avrMusicBox.c create mode 100644 Make AVR Examples/Chapter06_Digital-Input/avrMusicBox/organ.c create mode 100644 Make AVR Examples/Chapter06_Digital-Input/avrMusicBox/organ.h create mode 100644 Make AVR Examples/Chapter06_Digital-Input/avrMusicBox/scale16.h create mode 100644 Make AVR Examples/Chapter06_Digital-Input/avrMusicBox/scaleGenerator.py create mode 100644 Make AVR Examples/Chapter06_Digital-Input/bossButton/Makefile create mode 100644 Make AVR Examples/Chapter06_Digital-Input/bossButton/bossButton.c create mode 100644 Make AVR Examples/Chapter06_Digital-Input/bossButton/bossButton.py create mode 100644 Make AVR Examples/Chapter06_Digital-Input/debouncer/Makefile create mode 100644 Make AVR Examples/Chapter06_Digital-Input/debouncer/debouncer.c create mode 100644 Make AVR Examples/Chapter06_Digital-Input/simpleButton/Makefile create mode 100644 Make AVR Examples/Chapter06_Digital-Input/simpleButton/simpleButton.c create mode 100644 Make AVR Examples/Chapter06_Digital-Input/toggleButton/Makefile create mode 100644 Make AVR Examples/Chapter06_Digital-Input/toggleButton/toggleButton.c create mode 100644 Make AVR Examples/Chapter06_Digital-Input/toggleButton_debounced/Makefile create mode 100644 Make AVR Examples/Chapter06_Digital-Input/toggleButton_debounced/toggleButton_debounced.c create mode 100644 Make AVR Examples/Chapter07_Analog-to-Digital-Conversion-I/lightSensor/.gitignore create mode 100644 Make AVR Examples/Chapter07_Analog-to-Digital-Conversion-I/lightSensor/Makefile create mode 100644 Make AVR Examples/Chapter07_Analog-to-Digital-Conversion-I/lightSensor/lightSensor.c create mode 100644 Make AVR Examples/Chapter07_Analog-to-Digital-Conversion-I/nightLight/Makefile create mode 100644 Make AVR Examples/Chapter07_Analog-to-Digital-Conversion-I/nightLight/nightLight.c create mode 100644 Make AVR Examples/Chapter07_Analog-to-Digital-Conversion-I/slowScope/Makefile create mode 100644 Make AVR Examples/Chapter07_Analog-to-Digital-Conversion-I/slowScope/serialScope.py create mode 100644 Make AVR Examples/Chapter07_Analog-to-Digital-Conversion-I/slowScope/slowScope.c create mode 100644 Make AVR Examples/Chapter08_Hardware-Interrupts/capSense/Makefile create mode 100644 Make AVR Examples/Chapter08_Hardware-Interrupts/capSense/capSense.c create mode 100644 Make AVR Examples/Chapter08_Hardware-Interrupts/capSense/serialScope.py create mode 100644 Make AVR Examples/Chapter08_Hardware-Interrupts/helloInterrupt/Makefile create mode 100644 Make AVR Examples/Chapter08_Hardware-Interrupts/helloInterrupt/helloInterrupt.c create mode 100644 Make AVR Examples/Chapter08_Hardware-Interrupts/helloPinChangeInterrupt/Makefile create mode 100644 Make AVR Examples/Chapter08_Hardware-Interrupts/helloPinChangeInterrupt/helloPinChangeInterrupt.c create mode 100644 Make AVR Examples/Chapter09_Introduction-to-Timer-Counter-Hardware/amRadio/Makefile create mode 100644 Make AVR Examples/Chapter09_Introduction-to-Timer-Counter-Hardware/amRadio/amRadio.c create mode 100644 Make AVR Examples/Chapter09_Introduction-to-Timer-Counter-Hardware/amRadio/scale16.h create mode 100644 Make AVR Examples/Chapter09_Introduction-to-Timer-Counter-Hardware/reactionTimer/Makefile create mode 100644 Make AVR Examples/Chapter09_Introduction-to-Timer-Counter-Hardware/reactionTimer/reactionTimer.c create mode 100644 Make AVR Examples/Chapter09_Introduction-to-Timer-Counter-Hardware/reactionTimer/support.c create mode 100644 Make AVR Examples/Chapter09_Introduction-to-Timer-Counter-Hardware/reactionTimer/support.h create mode 100644 Make AVR Examples/Chapter09_Introduction-to-Timer-Counter-Hardware/timerAudio/Makefile create mode 100644 Make AVR Examples/Chapter09_Introduction-to-Timer-Counter-Hardware/timerAudio/scale8.h create mode 100644 Make AVR Examples/Chapter09_Introduction-to-Timer-Counter-Hardware/timerAudio/timerAudio.c create mode 100644 Make AVR Examples/Chapter10_Pulse-Width-Modulation/bruteForcePWM/Makefile create mode 100644 Make AVR Examples/Chapter10_Pulse-Width-Modulation/bruteForcePWM/pwm.c create mode 100644 Make AVR Examples/Chapter10_Pulse-Width-Modulation/pwm/Makefile create mode 100644 Make AVR Examples/Chapter10_Pulse-Width-Modulation/pwm/pinDefines.h create mode 100644 Make AVR Examples/Chapter10_Pulse-Width-Modulation/pwm/pwm.c create mode 100644 Make AVR Examples/Chapter10_Pulse-Width-Modulation/pwmOnAnyPin/Makefile create mode 100644 Make AVR Examples/Chapter10_Pulse-Width-Modulation/pwmOnAnyPin/pwmOnAnyPin.c create mode 100644 Make AVR Examples/Chapter10_Pulse-Width-Modulation/pwmTimers/Makefile create mode 100644 Make AVR Examples/Chapter10_Pulse-Width-Modulation/pwmTimers/pwmTimers.c create mode 100644 Make AVR Examples/Chapter10_Pulse-Width-Modulation/pwm_cross-fading_cylons/Makefile create mode 100644 Make AVR Examples/Chapter10_Pulse-Width-Modulation/pwm_cross-fading_cylons/cross-fading_cylons.c create mode 100644 Make AVR Examples/Chapter11_Driving-Servo-Motors/servoSundial/Makefile create mode 100644 Make AVR Examples/Chapter11_Driving-Servo-Motors/servoSundial/_servoClockFunctions.c create mode 100644 Make AVR Examples/Chapter11_Driving-Servo-Motors/servoSundial/_servoClockFunctions.h create mode 100644 Make AVR Examples/Chapter11_Driving-Servo-Motors/servoSundial/_servoSerialHelpers.c create mode 100644 Make AVR Examples/Chapter11_Driving-Servo-Motors/servoSundial/_servoSerialHelpers.h create mode 100644 Make AVR Examples/Chapter11_Driving-Servo-Motors/servoSundial/calibrateTime.py create mode 100644 Make AVR Examples/Chapter11_Driving-Servo-Motors/servoSundial/justSetTime.py create mode 100644 Make AVR Examples/Chapter11_Driving-Servo-Motors/servoSundial/servoSundial.c create mode 100644 Make AVR Examples/Chapter11_Driving-Servo-Motors/servoSundial/servoSundial.h create mode 100644 Make AVR Examples/Chapter11_Driving-Servo-Motors/servoSundial/stepHours.py create mode 100644 Make AVR Examples/Chapter11_Driving-Servo-Motors/servoWorkout/Makefile create mode 100644 Make AVR Examples/Chapter11_Driving-Servo-Motors/servoWorkout/servoWorkout.c create mode 100644 Make AVR Examples/Chapter12_Analog-to-Digital-Conversion-II/footstepDetector/Makefile create mode 100644 Make AVR Examples/Chapter12_Analog-to-Digital-Conversion-II/footstepDetector/footstepDetector.c create mode 100644 Make AVR Examples/Chapter12_Analog-to-Digital-Conversion-II/voltmeter/Makefile create mode 100644 Make AVR Examples/Chapter12_Analog-to-Digital-Conversion-II/voltmeter/voltmeter.c create mode 100644 Make AVR Examples/Chapter13_Advanced-PWM-Tricks/adsr/Makefile create mode 100644 Make AVR Examples/Chapter13_Advanced-PWM-Tricks/adsr/adsr.c create mode 100644 Make AVR Examples/Chapter13_Advanced-PWM-Tricks/adsr/adsr.h create mode 100644 Make AVR Examples/Chapter13_Advanced-PWM-Tricks/adsr/fullSaw15.h create mode 100644 Make AVR Examples/Chapter13_Advanced-PWM-Tricks/adsr/fullSaw3.h create mode 100644 Make AVR Examples/Chapter13_Advanced-PWM-Tricks/adsr/fullSaw7.h create mode 100644 Make AVR Examples/Chapter13_Advanced-PWM-Tricks/adsr/fullTri15.h create mode 100644 Make AVR Examples/Chapter13_Advanced-PWM-Tricks/adsr/fullTri3.h create mode 100644 Make AVR Examples/Chapter13_Advanced-PWM-Tricks/adsr/fullTri7.h create mode 100644 Make AVR Examples/Chapter13_Advanced-PWM-Tricks/adsr/fullTriangle.h create mode 100644 Make AVR Examples/Chapter13_Advanced-PWM-Tricks/adsr/generateScale.py create mode 100644 Make AVR Examples/Chapter13_Advanced-PWM-Tricks/adsr/generateWavetables.py create mode 100644 Make AVR Examples/Chapter13_Advanced-PWM-Tricks/adsr/scale.h create mode 100644 Make AVR Examples/Chapter13_Advanced-PWM-Tricks/arpeggiator/Makefile create mode 100644 Make AVR Examples/Chapter13_Advanced-PWM-Tricks/arpeggiator/arpeggiator.c create mode 100644 Make AVR Examples/Chapter13_Advanced-PWM-Tricks/arpeggiator/music_formula_collection.txt create mode 100644 Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds/Makefile create mode 100644 Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds/dds.c create mode 100644 Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds/fullSaw15.h create mode 100644 Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds/fullSaw3.h create mode 100644 Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds/fullSaw7.h create mode 100644 Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds/fullSine.h create mode 100644 Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds/fullSquare15.h create mode 100644 Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds/fullSquare3.h create mode 100644 Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds/fullSquare7.h create mode 100644 Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds/fullTri15.h create mode 100644 Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds/fullTri3.h create mode 100644 Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds/fullTri7.h create mode 100644 Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds/fullTriangle.h create mode 100644 Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds/generateWavetables.py create mode 100644 Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds_interrupts/Makefile create mode 100644 Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds_interrupts/dds_interrupts.c create mode 100644 Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds_interrupts/fullSaw15.h create mode 100644 Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds_interrupts/fullSaw3.h create mode 100644 Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds_interrupts/fullSaw7.h create mode 100644 Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds_interrupts/fullSine.h create mode 100644 Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds_interrupts/fullSquare15.h create mode 100644 Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds_interrupts/fullSquare3.h create mode 100644 Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds_interrupts/fullSquare7.h create mode 100644 Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds_interrupts/fullTri15.h create mode 100644 Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds_interrupts/fullTri3.h create mode 100644 Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds_interrupts/fullTri7.h create mode 100644 Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds_interrupts/fullTriangle.h create mode 100644 Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds_interrupts/generateWavetables.py create mode 100644 Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds_saw15/Makefile create mode 100644 Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds_saw15/dds_saw15.c create mode 100644 Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds_saw15/fullSaw15.h create mode 100644 Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds_saw15/fullSaw3.h create mode 100644 Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds_saw15/fullSaw7.h create mode 100644 Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds_saw15/fullSine.h create mode 100644 Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds_saw15/fullSquare15.h create mode 100644 Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds_saw15/fullSquare3.h create mode 100644 Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds_saw15/fullSquare7.h create mode 100644 Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds_saw15/fullTri15.h create mode 100644 Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds_saw15/fullTri3.h create mode 100644 Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds_saw15/fullTri7.h create mode 100644 Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds_saw15/fullTriangle.h create mode 100644 Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds_saw15/generateWavetables.py create mode 100644 Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dialTone/Makefile create mode 100644 Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dialTone/dialTone.c create mode 100644 Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dialTone/fullSine.h create mode 100644 Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dialTone/generateWavetables.py create mode 100644 Make AVR Examples/Chapter13_Advanced-PWM-Tricks/fatSaw/Makefile create mode 100644 Make AVR Examples/Chapter13_Advanced-PWM-Tricks/fatSaw/fatSaw.c create mode 100644 Make AVR Examples/Chapter13_Advanced-PWM-Tricks/fatSaw/fatSaw.h create mode 100644 Make AVR Examples/Chapter13_Advanced-PWM-Tricks/fatSaw/fullSaw15.h create mode 100644 Make AVR Examples/Chapter13_Advanced-PWM-Tricks/fatSaw/fullSaw3.h create mode 100644 Make AVR Examples/Chapter13_Advanced-PWM-Tricks/fatSaw/fullSaw7.h create mode 100644 Make AVR Examples/Chapter13_Advanced-PWM-Tricks/fatSaw/generateWavetables.py create mode 100644 Make AVR Examples/Chapter14_Switches/dcMotorWorkout/Makefile create mode 100644 Make AVR Examples/Chapter14_Switches/dcMotorWorkout/dcMotorWorkout.c create mode 100644 Make AVR Examples/Chapter15_Advanced-Motors/hBridgeWorkout/Makefile create mode 100644 Make AVR Examples/Chapter15_Advanced-Motors/hBridgeWorkout/hBridgeWorkout.c create mode 100644 Make AVR Examples/Chapter15_Advanced-Motors/stepperWorkout/Makefile create mode 100644 Make AVR Examples/Chapter15_Advanced-Motors/stepperWorkout/half_stepping.h create mode 100644 Make AVR Examples/Chapter15_Advanced-Motors/stepperWorkout/stepperWorkout.c create mode 100644 Make AVR Examples/Chapter16_SPI/spiEEPROMDemo/25LC256.c create mode 100644 Make AVR Examples/Chapter16_SPI/spiEEPROMDemo/25LC256.h create mode 100644 Make AVR Examples/Chapter16_SPI/spiEEPROMDemo/Makefile create mode 100644 Make AVR Examples/Chapter16_SPI/spiEEPROMDemo/spiEEPROMDemo.c create mode 100644 Make AVR Examples/Chapter17_I2C/i2cThermometer/Makefile create mode 100644 Make AVR Examples/Chapter17_I2C/i2cThermometer/i2c.c create mode 100644 Make AVR Examples/Chapter17_I2C/i2cThermometer/i2c.h create mode 100644 Make AVR Examples/Chapter17_I2C/i2cThermometer/i2cThermometer.c create mode 100644 Make AVR Examples/Chapter17_I2C/loggingThermometer/25LC256.c create mode 100644 Make AVR Examples/Chapter17_I2C/loggingThermometer/25LC256.h create mode 100644 Make AVR Examples/Chapter17_I2C/loggingThermometer/Makefile create mode 100644 Make AVR Examples/Chapter17_I2C/loggingThermometer/i2c.c create mode 100644 Make AVR Examples/Chapter17_I2C/loggingThermometer/i2c.h create mode 100644 Make AVR Examples/Chapter17_I2C/loggingThermometer/loggingThermometer.c create mode 100644 Make AVR Examples/Chapter18_Using-Flash-Program-Memory/progmemDemo1/Makefile create mode 100644 Make AVR Examples/Chapter18_Using-Flash-Program-Memory/progmemDemo1/progmemDemo1.c create mode 100644 Make AVR Examples/Chapter18_Using-Flash-Program-Memory/progmemDemo2/Makefile create mode 100644 Make AVR Examples/Chapter18_Using-Flash-Program-Memory/progmemDemo2/progmemDemo2.c create mode 100644 Make AVR Examples/Chapter18_Using-Flash-Program-Memory/progmemDemo3/Makefile create mode 100644 Make AVR Examples/Chapter18_Using-Flash-Program-Memory/progmemDemo3/progmemDemo3.c create mode 100644 Make AVR Examples/Chapter18_Using-Flash-Program-Memory/progmemDemo4/Makefile create mode 100644 Make AVR Examples/Chapter18_Using-Flash-Program-Memory/progmemDemo4/progmemDemo4.c create mode 100644 Make AVR Examples/Chapter18_Using-Flash-Program-Memory/progmemDemo5/Makefile create mode 100644 Make AVR Examples/Chapter18_Using-Flash-Program-Memory/progmemDemo5/progmemDemo5.c create mode 100644 Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/Makefile create mode 100644 Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/allDigits.h create mode 100644 Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/cornell/dpcm_1bit/Makefile create mode 100644 Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/cornell/dpcm_1bit/Speech_1_bit_diff.m create mode 100644 Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/cornell/dpcm_1bit/Welcome4760small.wav create mode 100644 Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/cornell/dpcm_1bit/mega644_1_bit.h create mode 100644 Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/cornell/dpcm_1bit/speech_1_bit_diff.c create mode 100644 Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/cornell/dpcm_2bit/.gitignore create mode 100644 Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/cornell/dpcm_2bit/Find2Code476.m create mode 100644 Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/cornell/dpcm_2bit/FindOpt.m create mode 100644 Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/cornell/dpcm_2bit/Makefile create mode 100644 Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/cornell/dpcm_2bit/Speech_encode_GCC.m create mode 100644 Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/cornell/dpcm_2bit/downsample.m create mode 100644 Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/cornell/dpcm_2bit/sineWave.py create mode 100644 Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/cornell/dpcm_2bit/speech_644_GCC.c create mode 100644 Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/cornell/dpcm_2bit/wave2DPCM.py create mode 100644 Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/elliot_speaking/.gitignore create mode 100644 Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/elliot_speaking/allDigits.h create mode 100644 Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/elliot_speaking/eight.wav create mode 100644 Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/elliot_speaking/five.wav create mode 100644 Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/elliot_speaking/four.wav create mode 100644 Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/elliot_speaking/nine.wav create mode 100644 Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/elliot_speaking/one.wav create mode 100644 Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/elliot_speaking/point.wav create mode 100644 Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/elliot_speaking/seven.wav create mode 100644 Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/elliot_speaking/six.wav create mode 100644 Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/elliot_speaking/talkingvoltmeter.wav create mode 100644 Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/elliot_speaking/thankyou.wav create mode 100644 Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/elliot_speaking/three.wav create mode 100644 Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/elliot_speaking/two.wav create mode 100644 Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/elliot_speaking/volts.wav create mode 100644 Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/elliot_speaking/wave2DPCM.py create mode 100644 Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/elliot_speaking/zero.wav create mode 100644 Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/rich_speaking/.gitignore create mode 100644 Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/rich_speaking/allDigits.h create mode 100644 Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/rich_speaking/begin.wav create mode 100644 Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/rich_speaking/eight.wav create mode 100644 Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/rich_speaking/five.wav create mode 100644 Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/rich_speaking/four.wav create mode 100644 Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/rich_speaking/go.wav create mode 100644 Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/rich_speaking/hello_world.wav create mode 100644 Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/rich_speaking/nine.wav create mode 100644 Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/rich_speaking/one.wav create mode 100644 Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/rich_speaking/point.wav create mode 100644 Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/rich_speaking/seven.wav create mode 100644 Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/rich_speaking/six.wav create mode 100644 Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/rich_speaking/speaking_digits.wav create mode 100644 Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/rich_speaking/ten.wav create mode 100644 Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/rich_speaking/three.wav create mode 100644 Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/rich_speaking/two.wav create mode 100644 Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/rich_speaking/volts.wav create mode 100644 Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/rich_speaking/zero.wav create mode 100644 Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/talkingVoltmeter.c create mode 100644 Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/talkingVoltmeter.h create mode 100644 Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/wave2DPCM.py create mode 100644 Make AVR Examples/Chapter19_EEPROM/eememDemo/.gitignore create mode 100644 Make AVR Examples/Chapter19_EEPROM/eememDemo/Makefile create mode 100644 Make AVR Examples/Chapter19_EEPROM/eememDemo/eememDemo.c create mode 100644 Make AVR Examples/Chapter19_EEPROM/favoriteColor/.gitignore create mode 100644 Make AVR Examples/Chapter19_EEPROM/favoriteColor/Makefile create mode 100644 Make AVR Examples/Chapter19_EEPROM/favoriteColor/favoriteColor.c create mode 100644 Make AVR Examples/Chapter19_EEPROM/quickDemo/.gitignore create mode 100644 Make AVR Examples/Chapter19_EEPROM/quickDemo/Makefile create mode 100644 Make AVR Examples/Chapter19_EEPROM/quickDemo/quickDemo.c create mode 100644 Make AVR Examples/Chapter19_EEPROM/vigenereCipher/.gitignore create mode 100644 Make AVR Examples/Chapter19_EEPROM/vigenereCipher/Makefile create mode 100644 Make AVR Examples/Chapter19_EEPROM/vigenereCipher/vigenereCipher.c create mode 100644 Make AVR Examples/Chapter19_EEPROM/vigenereCipher/vigenereCipher.c_outline create mode 100644 Make AVR Examples/Chapter19_EEPROM/vigenereCipher/vigenereCipher.h create mode 100644 Make AVR Examples/LICENSE.txt create mode 100644 Make AVR Examples/README.md create mode 100644 Make AVR Examples/allProjectsList create mode 100644 Make AVR Examples/setupProject/Makefile create mode 100644 Make AVR Examples/setupProject/USART.c create mode 100644 Make AVR Examples/setupProject/USART.h create mode 100644 Make AVR Examples/setupProject/createPinDefines.py create mode 100644 Make AVR Examples/setupProject/macros.h create mode 100644 Make AVR Examples/setupProject/main.c create mode 100644 Make AVR Examples/setupProject/main.h create mode 100644 Make AVR Examples/setupProject/setupProject.py diff --git a/Make AVR Examples/AVR-Programming-Library/.gitignore b/Make AVR Examples/AVR-Programming-Library/.gitignore new file mode 100644 index 0000000..df3d5dd --- /dev/null +++ b/Make AVR Examples/AVR-Programming-Library/.gitignore @@ -0,0 +1,2 @@ +binaryMacroDemo.c + diff --git a/Make AVR Examples/AVR-Programming-Library/Makefile b/Make AVR Examples/AVR-Programming-Library/Makefile new file mode 100644 index 0000000..3d9e544 --- /dev/null +++ b/Make AVR Examples/AVR-Programming-Library/Makefile @@ -0,0 +1,196 @@ + +##########------------------------------------------------------########## +########## Project-specific Details ########## +########## Check these every time you start a new project ########## +##########------------------------------------------------------########## + +MCU = atmega168p +F_CPU = 1000000UL +BAUD = 9600UL +## Also try BAUD = 19200 or 38400 if you're feeling lucky. + +## A directory for common include files and the simple USART library. +## If you move either the current folder or the Library folder, you'll +## need to change this path to match. +LIBDIR = ../../AVR-Programming-Library + +##########------------------------------------------------------########## +########## Programmer Defaults ########## +########## Set up once, then forget about it ########## +########## (Can override. See bottom of file.) ########## +##########------------------------------------------------------########## + +PROGRAMMER_TYPE = usbtiny +# extra arguments to avrdude: baud rate, chip type, -F flag, etc. +PROGRAMMER_ARGS = + +##########------------------------------------------------------########## +########## Program Locations ########## +########## Won't need to change if they're in your PATH ########## +##########------------------------------------------------------########## + +CC = avr-gcc +OBJCOPY = avr-objcopy +OBJDUMP = avr-objdump +AVRSIZE = avr-size +AVRDUDE = avrdude + +##########------------------------------------------------------########## +########## Makefile Magic! ########## +########## Summary: ########## +########## We want a .hex file ########## +########## Compile source files into .elf ########## +########## Convert .elf file into .hex ########## +########## You shouldn't need to edit below. ########## +##########------------------------------------------------------########## + +## The name of your project (without the .c) +# TARGET = blinkLED +## Or name it automatically after the enclosing directory +TARGET = $(lastword $(subst /, ,$(CURDIR))) + +# Object files: will find all .c/.h files in current directory +# and in LIBDIR. If you have any other (sub-)directories with code, +# you can add them in to SOURCES below in the wildcard statement. +SOURCES=$(wildcard *.c $(LIBDIR)/*.c) +OBJECTS=$(SOURCES:.c=.o) +HEADERS=$(SOURCES:.c=.h) + +## Compilation options, type man avr-gcc if you're curious. +CPPFLAGS = -DF_CPU=$(F_CPU) -DBAUD=$(BAUD) -I. -I$(LIBDIR) +CFLAGS = -Os -g -std=gnu99 -Wall +## Use short (8-bit) data types +CFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums +## Splits up object files per function +CFLAGS += -ffunction-sections -fdata-sections +LDFLAGS = -Wl,-Map,$(TARGET).map +## Optional, but often ends up with smaller code +LDFLAGS += -Wl,--gc-sections +## Relax shrinks code even more, but makes disassembly messy +## LDFLAGS += -Wl,--relax +## LDFLAGS += -Wl,-u,vfprintf -lprintf_flt -lm ## for floating-point printf +## LDFLAGS += -Wl,-u,vfprintf -lprintf_min ## for smaller printf +TARGET_ARCH = -mmcu=$(MCU) + +## Explicit pattern rules: +## To make .o files from .c files +%.o: %.c $(HEADERS) Makefile + $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c -o $@ $<; + +$(TARGET).elf: $(OBJECTS) + $(CC) $(LDFLAGS) $(TARGET_ARCH) $^ $(LDLIBS) -o $@ + +%.hex: %.elf + $(OBJCOPY) -j .text -j .data -O ihex $< $@ + +%.eeprom: %.elf + $(OBJCOPY) -j .eeprom --change-section-lma .eeprom=0 -O ihex $< $@ + +%.lst: %.elf + $(OBJDUMP) -S $< > $@ + +## These targets don't have files named after them +.PHONY: all disassemble disasm eeprom size clean squeaky_clean flash fuses + +all: $(TARGET).hex + +debug: + @echo + @echo "Source files:" $(SOURCES) + @echo "MCU, F_CPU, BAUD:" $(MCU), $(F_CPU), $(BAUD) + @echo + +# Optionally create listing file from .elf +# This creates approximate assembly-language equivalent of your code. +# Useful for debugging time-sensitive bits, +# or making sure the compiler does what you want. +disassemble: $(TARGET).lst + +disasm: disassemble + +# Optionally show how big the resulting program is +size: $(TARGET).elf + $(AVRSIZE) -C --mcu=$(MCU) $(TARGET).elf + +clean: + rm -f $(TARGET).elf $(TARGET).hex $(TARGET).obj \ + $(TARGET).o $(TARGET).d $(TARGET).eep $(TARGET).lst \ + $(TARGET).lss $(TARGET).sym $(TARGET).map $(TARGET)~ \ + $(TARGET).eeprom + +squeaky_clean: + rm -f *.elf *.hex *.obj *.o *.d *.eep *.lst *.lss *.sym *.map *~ *.eeprom + +##########------------------------------------------------------########## +########## Programmer-specific details ########## +########## Flashing code to AVR using avrdude ########## +##########------------------------------------------------------########## + +flash: $(TARGET).hex + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U flash:w:$< + +## An alias +program: flash + +flash_eeprom: $(TARGET).eeprom + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U eeprom:w:$< + +avrdude_terminal: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nt + +## If you've got multiple programmers that you use, +## you can define them here so that it's easy to switch. +## To invoke, use something like `make flash_arduinoISP` +flash_usbtiny: PROGRAMMER_TYPE = usbtiny +flash_usbtiny: PROGRAMMER_ARGS = # USBTiny works with no further arguments +flash_usbtiny: flash + +flash_usbasp: PROGRAMMER_TYPE = usbasp +flash_usbasp: PROGRAMMER_ARGS = # USBasp works with no further arguments +flash_usbasp: flash + +flash_arduinoISP: PROGRAMMER_TYPE = avrisp +flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P /dev/ttyACM0 +## (for windows) flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P com5 +flash_arduinoISP: flash + +flash_109: PROGRAMMER_TYPE = avr109 +flash_109: PROGRAMMER_ARGS = -b 9600 -P /dev/ttyUSB0 +flash_109: flash + +##########------------------------------------------------------########## +########## Fuse settings and suitable defaults ########## +##########------------------------------------------------------########## + +## Mega 48, 88, 168, 328 default values +LFUSE = 0x62 +HFUSE = 0xdf +EFUSE = 0x00 + +## Generic +FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m + +fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) \ + $(PROGRAMMER_ARGS) $(FUSE_STRING) +show_fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nv + +## Called with no extra definitions, sets to defaults +set_default_fuses: FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m +set_default_fuses: fuses + +## Set the fuse byte for full-speed mode +## Note: can also be set in firmware for modern chips +set_fast_fuse: LFUSE = 0xE2 +set_fast_fuse: FUSE_STRING = -U lfuse:w:$(LFUSE):m +set_fast_fuse: fuses + +## Set the EESAVE fuse byte to preserve EEPROM across flashes +set_eeprom_save_fuse: HFUSE = 0xD7 +set_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +set_eeprom_save_fuse: fuses + +## Clear the EESAVE fuse byte +clear_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +clear_eeprom_save_fuse: fuses diff --git a/Make AVR Examples/AVR-Programming-Library/README.md b/Make AVR Examples/AVR-Programming-Library/README.md new file mode 100644 index 0000000..1bed580 --- /dev/null +++ b/Make AVR Examples/AVR-Programming-Library/README.md @@ -0,0 +1,30 @@ +AVR-Programming-Library +======================= + +Files that are re-used throughout the book *Make: AVR Programming* + +* **pinDefines.h** + Includes all of the pin definitions for the projects in *Make: AVR Programming*. When you + need to know what to hook up where, have a look here. + +* **USART.c** and **USART.h** + These are the main utility files used for serial input/output in the book. They're not + particularly clever, but they have a tiny memory and resource footprint and get you + up and running very quickly. + +* **binaryMacro.h** + If you're using a compiler other than a recent AVR-GCC, it may not support + native binary digits (e.g. 0b00111010). If so, this include file has a pre-processor + macro that will let you enter them similarly: B8(01010101). + +* **macros.h** + This file includes pre-processor macro definitions for bit-twiddling: + set_bit, clear_bit, and toggle_bit. Useful for those days when you're feeling + lazy, or have forgotten your bit-wise logic operations. + +* **portpins.h** + This is a recent version of the portpins.h file included with the Arduino environment. + It includes the AVR pin definitions of the form PB1 and similar. The version included + with Arduino is very old -- you'll want to replace it with this one if you want to write + in C using the Arduino IDE. Or you can include this file directly in your code. + diff --git a/Make AVR Examples/AVR-Programming-Library/USART.c b/Make AVR Examples/AVR-Programming-Library/USART.c new file mode 100644 index 0000000..7e8139a --- /dev/null +++ b/Make AVR Examples/AVR-Programming-Library/USART.c @@ -0,0 +1,137 @@ + +/* + Quick and dirty functions that make serial communications work. + + Note that receiveByte() blocks -- it sits and waits _forever_ for + a byte to come in. If you're doing anything that's more interesting, + you'll want to implement this with interrupts. + + initUSART requires BAUDRATE to be defined in order to calculate + the bit-rate multiplier. 9600 is a reasonable default. + + May not work with some of the older chips: + Tiny2313, Mega8, Mega16, Mega32 have different pin macros + If you're using these chips, see (e.g.) iom8.h for how it's done. + These old chips don't specify UDR0 vs UDR1. + Correspondingly, the macros will just be defined as UDR. +*/ + +#include +#include "USART.h" +#include + +void initUSART(void) { /* requires BAUD */ + UBRR0H = UBRRH_VALUE; /* defined in setbaud.h */ + UBRR0L = UBRRL_VALUE; +#if USE_2X + UCSR0A |= (1 << U2X0); +#else + UCSR0A &= ~(1 << U2X0); +#endif + /* Enable USART transmitter/receiver */ + UCSR0B = (1 << TXEN0) | (1 << RXEN0); + UCSR0C = (1 << UCSZ01) | (1 << UCSZ00); /* 8 data bits, 1 stop bit */ +} + + +void transmitByte(uint8_t data) { + /* Wait for empty transmit buffer */ + loop_until_bit_is_set(UCSR0A, UDRE0); + UDR0 = data; /* send data */ +} + +uint8_t receiveByte(void) { + loop_until_bit_is_set(UCSR0A, RXC0); /* Wait for incoming data */ + return UDR0; /* return register value */ +} + + + /* Here are a bunch of useful printing commands */ + +void printString(const char myString[]) { + uint8_t i = 0; + while (myString[i]) { + transmitByte(myString[i]); + i++; + } +} + +void readString(char myString[], uint8_t maxLength) { + char response; + uint8_t i; + i = 0; + while (i < (maxLength - 1)) { /* prevent over-runs */ + response = receiveByte(); + transmitByte(response); /* echo */ + if (response == '\r') { /* enter marks the end */ + break; + } + else { + myString[i] = response; /* add in a letter */ + i++; + } + } + myString[i] = 0; /* terminal NULL character */ +} + +void printByte(uint8_t byte) { + /* Converts a byte to a string of decimal text, sends it */ + transmitByte('0' + (byte / 100)); /* Hundreds */ + transmitByte('0' + ((byte / 10) % 10)); /* Tens */ + transmitByte('0' + (byte % 10)); /* Ones */ +} + +void printWord(uint16_t word) { + transmitByte('0' + (word / 10000)); /* Ten-thousands */ + transmitByte('0' + ((word / 1000) % 10)); /* Thousands */ + transmitByte('0' + ((word / 100) % 10)); /* Hundreds */ + transmitByte('0' + ((word / 10) % 10)); /* Tens */ + transmitByte('0' + (word % 10)); /* Ones */ +} + +void printBinaryByte(uint8_t byte) { + /* Prints out a byte as a series of 1's and 0's */ + uint8_t bit; + for (bit = 7; bit < 255; bit--) { + if (bit_is_set(byte, bit)) + transmitByte('1'); + else + transmitByte('0'); + } +} + +char nibbleToHexCharacter(uint8_t nibble) { + /* Converts 4 bits into hexadecimal */ + if (nibble < 10) { + return ('0' + nibble); + } + else { + return ('A' + nibble - 10); + } +} + +void printHexByte(uint8_t byte) { + /* Prints a byte as its hexadecimal equivalent */ + uint8_t nibble; + nibble = (byte & 0b11110000) >> 4; + transmitByte(nibbleToHexCharacter(nibble)); + nibble = byte & 0b00001111; + transmitByte(nibbleToHexCharacter(nibble)); +} + +uint8_t getNumber(void) { + // Gets a numerical 0-255 from the serial port. + // Converts from string to number. + char hundreds = '0'; + char tens = '0'; + char ones = '0'; + char thisChar = '0'; + do { /* shift over */ + hundreds = tens; + tens = ones; + ones = thisChar; + thisChar = receiveByte(); /* get a new character */ + transmitByte(thisChar); /* echo */ + } while (thisChar != '\r'); /* until type return */ + return (100 * (hundreds - '0') + 10 * (tens - '0') + ones - '0'); +} diff --git a/Make AVR Examples/AVR-Programming-Library/USART.h b/Make AVR Examples/AVR-Programming-Library/USART.h new file mode 100644 index 0000000..8d02081 --- /dev/null +++ b/Make AVR Examples/AVR-Programming-Library/USART.h @@ -0,0 +1,45 @@ +/* Functions to initialize, send, receive over USART + + initUSART requires BAUD to be defined in order to calculate + the bit-rate multiplier. + */ + +#ifndef BAUD /* if not defined in Makefile... */ +#define BAUD 9600 /* set a safe default baud rate */ +#endif + + /* These are defined for convenience */ +#define USART_HAS_DATA bit_is_set(UCSR0A, RXC0) +#define USART_READY bit_is_set(UCSR0A, UDRE0) + +/* Takes the defined BAUD and F_CPU, + calculates the bit-clock multiplier, + and configures the hardware USART */ +void initUSART(void); + +/* Blocking transmit and receive functions. + When you call receiveByte() your program will hang until + data comes through. We'll improve on this later. */ +void transmitByte(uint8_t data); +uint8_t receiveByte(void); + +void printString(const char myString[]); + /* Utility function to transmit an entire string from RAM */ +void readString(char myString[], uint8_t maxLength); +/* Define a string variable, pass it to this function + The string will contain whatever you typed over serial */ + +void printByte(uint8_t byte); + /* Prints a byte out as its 3-digit ascii equivalent */ +void printWord(uint16_t word); + /* Prints a word (16-bits) out as its 5-digit ascii equivalent */ + +void printBinaryByte(uint8_t byte); + /* Prints a byte out in 1s and 0s */ +char nibbleToHex(uint8_t nibble); +char nibbleToHexCharacter(uint8_t nibble); +void printHexByte(uint8_t byte); + /* Prints a byte out in hexadecimal */ +uint8_t getNumber(void); +/* takes in up to three ascii digits, + converts them to a byte when press enter */ diff --git a/Make AVR Examples/AVR-Programming-Library/binaryMacro.h b/Make AVR Examples/AVR-Programming-Library/binaryMacro.h new file mode 100644 index 0000000..9dff3c1 --- /dev/null +++ b/Make AVR Examples/AVR-Programming-Library/binaryMacro.h @@ -0,0 +1,45 @@ +/* Binary constant generator macro +By Tom Torfs - donated to the public domain +*/ + +/* All macro's evaluate to compile-time constants */ + +/* *** helper macros *** / + +/* turn a numeric literal into a hex constant +(avoids problems with leading zeroes) +8-bit constants max value 0x11111111, always fits in unsigned long +*/ +#define HEX__(n) 0x##n##LU + +/* 8-bit conversion function */ +#define B8__(x) ((x&0x0000000FLU)?1:0) \ ++((x&0x000000F0LU)?2:0) \ ++((x&0x00000F00LU)?4:0) \ ++((x&0x0000F000LU)?8:0) \ ++((x&0x000F0000LU)?16:0) \ ++((x&0x00F00000LU)?32:0) \ ++((x&0x0F000000LU)?64:0) \ ++((x&0xF0000000LU)?128:0) + +/* *** user macros *** / + +/* for upto 8-bit binary constants */ +#define B8(d) ((unsigned char)B8__(HEX__(d))) + +/* for upto 16-bit binary constants, MSB first */ +#define B16(dmsb,dlsb) (((unsigned short)B8(dmsb)<<8) \ ++ B8(dlsb)) + +/* for upto 32-bit binary constants, MSB first */ +#define B32(dmsb,db2,db3,dlsb) (((unsigned long)B8(dmsb)<<24) \ ++ ((unsigned long)B8(db2)<<16) \ ++ ((unsigned long)B8(db3)<<8) \ ++ B8(dlsb)) + +/* Sample usage: +B8(01010101) = 85 +B16(10101010,01010101) = 43605 +B32(10000000,11111111,10101010,01010101) = 2164238933 +*/ + diff --git a/Make AVR Examples/AVR-Programming-Library/macros.h b/Make AVR Examples/AVR-Programming-Library/macros.h new file mode 100644 index 0000000..7987b22 --- /dev/null +++ b/Make AVR Examples/AVR-Programming-Library/macros.h @@ -0,0 +1,26 @@ + +/* Standard Macros */ +/* You can totally get by without these, but why? */ + +/* Make sure we've already got io / sfr / pindefs loaded */ +#ifndef _AVR_IO_H_ +#include +#endif + +/* Reminder: the following useful bit-twiddling macros are + always included in avr/sfr_defs.h, which is called from + avr/io.h + + bit_is_set(sfr, bit) + bit_is_clear(sfr, bit) + loop_until_bit_is_set(sfr, bit) + loop_until_bit_is_clear(sfr, bit) + +*/ + +/* Define up the full complement of bit-twiddling macros */ +#define BV(bit) (1 << bit) +#define set_bit(sfr, bit) (_SFR_BYTE(sfr) |= BV(bit)) // old sbi() +#define clear_bit(sfr, bit) (_SFR_BYTE(sfr) &= ~BV(bit)) // old cbi() +#define toggle_bit(sfr, bit) (_SFR_BYTE(sfr) ^= BV(bit)) + diff --git a/Make AVR Examples/AVR-Programming-Library/pinDefines.h b/Make AVR Examples/AVR-Programming-Library/pinDefines.h new file mode 100644 index 0000000..36cd2f0 --- /dev/null +++ b/Make AVR Examples/AVR-Programming-Library/pinDefines.h @@ -0,0 +1,91 @@ +// --------------- +// Pin Defines +// --------------- + +#define LED_PORT PORTB +#define LED_PIN PINB +#define LED_DDR DDRB + +#define LED0 PB0 +#define LED1 PB1 +#define LED2 PB2 +#define LED3 PB3 +#define LED4 PB4 +#define LED5 PB5 +#define LED6 PB6 +#define LED7 PB7 + +#define BUTTON_PORT PORTD +#define BUTTON_PIN PIND +#define BUTTON_DDR DDRD + +#define BUTTON PD2 +#define BUTTON2 PD3 +#define BUTTON3 PD4 + +#define SPEAKER PD6 /* OC0A */ +#define SPEAKER_PORT PORTD +#define SPEAKER_PIN PIND +#define SPEAKER_DDR DDRD + +#define ANTENNA PD5 /* OC0B */ +#define ANTENNA_PORT PORTD +#define ANTENNA_PIN PIND +#define ANTENNA_DDR DDRD + +#define MODULATION PD3 /* OC2B */ +#define MODULATION_PORT PORTD +#define MODULATION_PIN PIND +#define MODULATION_DDR DDRD + +#define LIGHT_SENSOR PC0 /* ADC0 */ +#define LIGHT_SENSOR_PORT PORTC +#define LIGHT_SENSOR_PIN PINC +#define LIGHT_SENSOR_DDR DDRC + +#define CAP_SENSOR PC1 /* ADC1 */ +#define CAP_SENSOR_PORT PORTC +#define CAP_SENSOR_PIN PINC +#define CAP_SENSOR_DDR DDRC + +#define PIEZO PC2 /* ADC2 */ +#define PIEZO_PORT PORTC +#define PIEZO_PIN PINC +#define PIEZO_DDR DDRC + +#define POT PC3 /* ADC3 */ +#define POT_PORT PORTC +#define POT_PIN PINC +#define POT_DDR DDRC + +// SPI and I2C serial mode defines + +#define SPI_SS PB2 +#define SPI_SS_PORT PORTB +#define SPI_SS_PIN PINB +#define SPI_SS_DDR DDRB + +#define SPI_MOSI PB3 +#define SPI_MOSI_PORT PORTB +#define SPI_MOSI_PIN PINB +#define SPI_MOSI_DDR DDRB + +#define SPI_MISO PB4 +#define SPI_MISO_PORT PORTB +#define SPI_MISO_PIN PINB +#define SPI_MISO_DDR DDRB + +#define SPI_SCK PB5 +#define SPI_SCK_PORT PORTB +#define SPI_SCK_PIN PINB +#define SPI_SCK_DDR DDRB + +#define I2C_SDA PC4 +#define I2C_SDA_PORT PORTC +#define I2C_SDA_PIN PINC +#define I2C_SDA_DDR DDRC + +#define I2C_SCL PC5 +#define I2C_SCL_PORT PORTC +#define I2C_SCL_PIN PINC +#define I2C_SCL_DDR DDRC diff --git a/Make AVR Examples/AVR-Programming-Library/portpins.h b/Make AVR Examples/AVR-Programming-Library/portpins.h new file mode 100644 index 0000000..6a24830 --- /dev/null +++ b/Make AVR Examples/AVR-Programming-Library/portpins.h @@ -0,0 +1,549 @@ +/* Copyright (c) 2003 Theodore A. Roth + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + + * Neither the name of the copyright holders nor the names of + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. */ + +/* $Id: portpins.h 1936 2009-03-19 22:19:26Z arcanum $ */ + +#ifndef _AVR_PORTPINS_H_ +#define _AVR_PORTPINS_H_ 1 + +/* This file should only be included from , never directly. */ + +#ifndef _AVR_IO_H_ +# error "Include instead of this file." +#endif + +/* Define Generic PORTn, DDn, and PINn values. */ + +/* Port Data Register (generic) */ +#define PORT7 7 +#define PORT6 6 +#define PORT5 5 +#define PORT4 4 +#define PORT3 3 +#define PORT2 2 +#define PORT1 1 +#define PORT0 0 + +/* Port Data Direction Register (generic) */ +#define DD7 7 +#define DD6 6 +#define DD5 5 +#define DD4 4 +#define DD3 3 +#define DD2 2 +#define DD1 1 +#define DD0 0 + +/* Port Input Pins (generic) */ +#define PIN7 7 +#define PIN6 6 +#define PIN5 5 +#define PIN4 4 +#define PIN3 3 +#define PIN2 2 +#define PIN1 1 +#define PIN0 0 + +/* Define PORTxn an Pxn values for all possible port pins if not defined already by io.h. */ + +/* PORT A */ + +#if defined(PA0) && !defined(PORTA0) +# define PORTA0 PA0 +#elif defined(PORTA0) && !defined(PA0) +# define PA0 PORTA0 +#endif +#if defined(PA1) && !defined(PORTA1) +# define PORTA1 PA1 +#elif defined(PORTA1) && !defined(PA1) +# define PA1 PORTA1 +#endif +#if defined(PA2) && !defined(PORTA2) +# define PORTA2 PA2 +#elif defined(PORTA2) && !defined(PA2) +# define PA2 PORTA2 +#endif +#if defined(PA3) && !defined(PORTA3) +# define PORTA3 PA3 +#elif defined(PORTA3) && !defined(PA3) +# define PA3 PORTA3 +#endif +#if defined(PA4) && !defined(PORTA4) +# define PORTA4 PA4 +#elif defined(PORTA4) && !defined(PA4) +# define PA4 PORTA4 +#endif +#if defined(PA5) && !defined(PORTA5) +# define PORTA5 PA5 +#elif defined(PORTA5) && !defined(PA5) +# define PA5 PORTA5 +#endif +#if defined(PA6) && !defined(PORTA6) +# define PORTA6 PA6 +#elif defined(PORTA6) && !defined(PA6) +# define PA6 PORTA6 +#endif +#if defined(PA7) && !defined(PORTA7) +# define PORTA7 PA7 +#elif defined(PORTA7) && !defined(PA7) +# define PA7 PORTA7 +#endif + +/* PORT B */ + +#if defined(PB0) && !defined(PORTB0) +# define PORTB0 PB0 +#elif defined(PORTB0) && !defined(PB0) +# define PB0 PORTB0 +#endif +#if defined(PB1) && !defined(PORTB1) +# define PORTB1 PB1 +#elif defined(PORTB1) && !defined(PB1) +# define PB1 PORTB1 +#endif +#if defined(PB2) && !defined(PORTB2) +# define PORTB2 PB2 +#elif defined(PORTB2) && !defined(PB2) +# define PB2 PORTB2 +#endif +#if defined(PB3) && !defined(PORTB3) +# define PORTB3 PB3 +#elif defined(PORTB3) && !defined(PB3) +# define PB3 PORTB3 +#endif +#if defined(PB4) && !defined(PORTB4) +# define PORTB4 PB4 +#elif defined(PORTB4) && !defined(PB4) +# define PB4 PORTB4 +#endif +#if defined(PB5) && !defined(PORTB5) +# define PORTB5 PB5 +#elif defined(PORTB5) && !defined(PB5) +# define PB5 PORTB5 +#endif +#if defined(PB6) && !defined(PORTB6) +# define PORTB6 PB6 +#elif defined(PORTB6) && !defined(PB6) +# define PB6 PORTB6 +#endif +#if defined(PB7) && !defined(PORTB7) +# define PORTB7 PB7 +#elif defined(PORTB7) && !defined(PB7) +# define PB7 PORTB7 +#endif + +/* PORT C */ + +#if defined(PC0) && !defined(PORTC0) +# define PORTC0 PC0 +#elif defined(PORTC0) && !defined(PC0) +# define PC0 PORTC0 +#endif +#if defined(PC1) && !defined(PORTC1) +# define PORTC1 PC1 +#elif defined(PORTC1) && !defined(PC1) +# define PC1 PORTC1 +#endif +#if defined(PC2) && !defined(PORTC2) +# define PORTC2 PC2 +#elif defined(PORTC2) && !defined(PC2) +# define PC2 PORTC2 +#endif +#if defined(PC3) && !defined(PORTC3) +# define PORTC3 PC3 +#elif defined(PORTC3) && !defined(PC3) +# define PC3 PORTC3 +#endif +#if defined(PC4) && !defined(PORTC4) +# define PORTC4 PC4 +#elif defined(PORTC4) && !defined(PC4) +# define PC4 PORTC4 +#endif +#if defined(PC5) && !defined(PORTC5) +# define PORTC5 PC5 +#elif defined(PORTC5) && !defined(PC5) +# define PC5 PORTC5 +#endif +#if defined(PC6) && !defined(PORTC6) +# define PORTC6 PC6 +#elif defined(PORTC6) && !defined(PC6) +# define PC6 PORTC6 +#endif +#if defined(PC7) && !defined(PORTC7) +# define PORTC7 PC7 +#elif defined(PORTC7) && !defined(PC7) +# define PC7 PORTC7 +#endif + +/* PORT D */ + +#if defined(PD0) && !defined(PORTD0) +# define PORTD0 PD0 +#elif defined(PORTD0) && !defined(PD0) +# define PD0 PORTD0 +#endif +#if defined(PD1) && !defined(PORTD1) +# define PORTD1 PD1 +#elif defined(PORTD1) && !defined(PD1) +# define PD1 PORTD1 +#endif +#if defined(PD2) && !defined(PORTD2) +# define PORTD2 PD2 +#elif defined(PORTD2) && !defined(PD2) +# define PD2 PORTD2 +#endif +#if defined(PD3) && !defined(PORTD3) +# define PORTD3 PD3 +#elif defined(PORTD3) && !defined(PD3) +# define PD3 PORTD3 +#endif +#if defined(PD4) && !defined(PORTD4) +# define PORTD4 PD4 +#elif defined(PORTD4) && !defined(PD4) +# define PD4 PORTD4 +#endif +#if defined(PD5) && !defined(PORTD5) +# define PORTD5 PD5 +#elif defined(PORTD5) && !defined(PD5) +# define PD5 PORTD5 +#endif +#if defined(PD6) && !defined(PORTD6) +# define PORTD6 PD6 +#elif defined(PORTD6) && !defined(PD6) +# define PD6 PORTD6 +#endif +#if defined(PD7) && !defined(PORTD7) +# define PORTD7 PD7 +#elif defined(PORTD7) && !defined(PD7) +# define PD7 PORTD7 +#endif + +/* PORT E */ + +#if defined(PE0) && !defined(PORTE0) +# define PORTE0 PE0 +#elif defined(PORTE0) && !defined(PE0) +# define PE0 PORTE0 +#endif +#if defined(PE1) && !defined(PORTE1) +# define PORTE1 PE1 +#elif defined(PORTE1) && !defined(PE1) +# define PE1 PORTE1 +#endif +#if defined(PE2) && !defined(PORTE2) +# define PORTE2 PE2 +#elif defined(PORTE2) && !defined(PE2) +# define PE2 PORTE2 +#endif +#if defined(PE3) && !defined(PORTE3) +# define PORTE3 PE3 +#elif defined(PORTE3) && !defined(PE3) +# define PE3 PORTE3 +#endif +#if defined(PE4) && !defined(PORTE4) +# define PORTE4 PE4 +#elif defined(PORTE4) && !defined(PE4) +# define PE4 PORTE4 +#endif +#if defined(PE5) && !defined(PORTE5) +# define PORTE5 PE5 +#elif defined(PORTE5) && !defined(PE5) +# define PE5 PORTE5 +#endif +#if defined(PE6) && !defined(PORTE6) +# define PORTE6 PE6 +#elif defined(PORTE6) && !defined(PE6) +# define PE6 PORTE6 +#endif +#if defined(PE7) && !defined(PORTE7) +# define PORTE7 PE7 +#elif defined(PORTE7) && !defined(PE7) +# define PE7 PORTE7 +#endif + +/* PORT F */ + +#if defined(PF0) && !defined(PORTF0) +# define PORTF0 PF0 +#elif defined(PORTF0) && !defined(PF0) +# define PF0 PORTF0 +#endif +#if defined(PF1) && !defined(PORTF1) +# define PORTF1 PF1 +#elif defined(PORTF1) && !defined(PF1) +# define PF1 PORTF1 +#endif +#if defined(PF2) && !defined(PORTF2) +# define PORTF2 PF2 +#elif defined(PORTF2) && !defined(PF2) +# define PF2 PORTF2 +#endif +#if defined(PF3) && !defined(PORTF3) +# define PORTF3 PF3 +#elif defined(PORTF3) && !defined(PF3) +# define PF3 PORTF3 +#endif +#if defined(PF4) && !defined(PORTF4) +# define PORTF4 PF4 +#elif defined(PORTF4) && !defined(PF4) +# define PF4 PORTF4 +#endif +#if defined(PF5) && !defined(PORTF5) +# define PORTF5 PF5 +#elif defined(PORTF5) && !defined(PF5) +# define PF5 PORTF5 +#endif +#if defined(PF6) && !defined(PORTF6) +# define PORTF6 PF6 +#elif defined(PORTF6) && !defined(PF6) +# define PF6 PORTF6 +#endif +#if defined(PF7) && !defined(PORTF7) +# define PORTF7 PF7 +#elif defined(PORTF7) && !defined(PF7) +# define PF7 PORTF7 +#endif + +/* PORT G */ + +#if defined(PG0) && !defined(PORTG0) +# define PORTG0 PG0 +#elif defined(PORTG0) && !defined(PG0) +# define PG0 PORTG0 +#endif +#if defined(PG1) && !defined(PORTG1) +# define PORTG1 PG1 +#elif defined(PORTG1) && !defined(PG1) +# define PG1 PORTG1 +#endif +#if defined(PG2) && !defined(PORTG2) +# define PORTG2 PG2 +#elif defined(PORTG2) && !defined(PG2) +# define PG2 PORTG2 +#endif +#if defined(PG3) && !defined(PORTG3) +# define PORTG3 PG3 +#elif defined(PORTG3) && !defined(PG3) +# define PG3 PORTG3 +#endif +#if defined(PG4) && !defined(PORTG4) +# define PORTG4 PG4 +#elif defined(PORTG4) && !defined(PG4) +# define PG4 PORTG4 +#endif +#if defined(PG5) && !defined(PORTG5) +# define PORTG5 PG5 +#elif defined(PORTG5) && !defined(PG5) +# define PG5 PORTG5 +#endif +#if defined(PG6) && !defined(PORTG6) +# define PORTG6 PG6 +#elif defined(PORTG6) && !defined(PG6) +# define PG6 PORTG6 +#endif +#if defined(PG7) && !defined(PORTG7) +# define PORTG7 PG7 +#elif defined(PORTG7) && !defined(PG7) +# define PG7 PORTG7 +#endif + +/* PORT H */ + +#if defined(PH0) && !defined(PORTH0) +# define PORTH0 PH0 +#elif defined(PORTH0) && !defined(PH0) +# define PH0 PORTH0 +#endif +#if defined(PH1) && !defined(PORTH1) +# define PORTH1 PH1 +#elif defined(PORTH1) && !defined(PH1) +# define PH1 PORTH1 +#endif +#if defined(PH2) && !defined(PORTH2) +# define PORTH2 PH2 +#elif defined(PORTH2) && !defined(PH2) +# define PH2 PORTH2 +#endif +#if defined(PH3) && !defined(PORTH3) +# define PORTH3 PH3 +#elif defined(PORTH3) && !defined(PH3) +# define PH3 PORTH3 +#endif +#if defined(PH4) && !defined(PORTH4) +# define PORTH4 PH4 +#elif defined(PORTH4) && !defined(PH4) +# define PH4 PORTH4 +#endif +#if defined(PH5) && !defined(PORTH5) +# define PORTH5 PH5 +#elif defined(PORTH5) && !defined(PH5) +# define PH5 PORTH5 +#endif +#if defined(PH6) && !defined(PORTH6) +# define PORTH6 PH6 +#elif defined(PORTH6) && !defined(PH6) +# define PH6 PORTH6 +#endif +#if defined(PH7) && !defined(PORTH7) +# define PORTH7 PH7 +#elif defined(PORTH7) && !defined(PH7) +# define PH7 PORTH7 +#endif + +/* PORT J */ + +#if defined(PJ0) && !defined(PORTJ0) +# define PORTJ0 PJ0 +#elif defined(PORTJ0) && !defined(PJ0) +# define PJ0 PORTJ0 +#endif +#if defined(PJ1) && !defined(PORTJ1) +# define PORTJ1 PJ1 +#elif defined(PORTJ1) && !defined(PJ1) +# define PJ1 PORTJ1 +#endif +#if defined(PJ2) && !defined(PORTJ2) +# define PORTJ2 PJ2 +#elif defined(PORTJ2) && !defined(PJ2) +# define PJ2 PORTJ2 +#endif +#if defined(PJ3) && !defined(PORTJ3) +# define PORTJ3 PJ3 +#elif defined(PORTJ3) && !defined(PJ3) +# define PJ3 PORTJ3 +#endif +#if defined(PJ4) && !defined(PORTJ4) +# define PORTJ4 PJ4 +#elif defined(PORTJ4) && !defined(PJ4) +# define PJ4 PORTJ4 +#endif +#if defined(PJ5) && !defined(PORTJ5) +# define PORTJ5 PJ5 +#elif defined(PORTJ5) && !defined(PJ5) +# define PJ5 PORTJ5 +#endif +#if defined(PJ6) && !defined(PORTJ6) +# define PORTJ6 PJ6 +#elif defined(PORTJ6) && !defined(PJ6) +# define PJ6 PORTJ6 +#endif +#if defined(PJ7) && !defined(PORTJ7) +# define PORTJ7 PJ7 +#elif defined(PORTJ7) && !defined(PJ7) +# define PJ7 PORTJ7 +#endif + +/* PORT K */ + +#if defined(PK0) && !defined(PORTK0) +# define PORTK0 PK0 +#elif defined(PORTK0) && !defined(PK0) +# define PK0 PORTK0 +#endif +#if defined(PK1) && !defined(PORTK1) +# define PORTK1 PK1 +#elif defined(PORTK1) && !defined(PK1) +# define PK1 PORTK1 +#endif +#if defined(PK2) && !defined(PORTK2) +# define PORTK2 PK2 +#elif defined(PORTK2) && !defined(PK2) +# define PK2 PORTK2 +#endif +#if defined(PK3) && !defined(PORTK3) +# define PORTK3 PK3 +#elif defined(PORTK3) && !defined(PK3) +# define PK3 PORTK3 +#endif +#if defined(PK4) && !defined(PORTK4) +# define PORTK4 PK4 +#elif defined(PORTK4) && !defined(PK4) +# define PK4 PORTK4 +#endif +#if defined(PK5) && !defined(PORTK5) +# define PORTK5 PK5 +#elif defined(PORTK5) && !defined(PK5) +# define PK5 PORTK5 +#endif +#if defined(PK6) && !defined(PORTK6) +# define PORTK6 PK6 +#elif defined(PORTK6) && !defined(PK6) +# define PK6 PORTK6 +#endif +#if defined(PK7) && !defined(PORTK7) +# define PORTK7 PK7 +#elif defined(PORTK7) && !defined(PK7) +# define PK7 PORTK7 +#endif + +/* PORT L */ + +#if defined(PL0) && !defined(PORTL0) +# define PORTL0 PL0 +#elif defined(PORTL0) && !defined(PL0) +# define PL0 PORTL0 +#endif +#if defined(PL1) && !defined(PORTL1) +# define PORTL1 PL1 +#elif defined(PORTL1) && !defined(PL1) +# define PL1 PORTL1 +#endif +#if defined(PL2) && !defined(PORTL2) +# define PORTL2 PL2 +#elif defined(PORTL2) && !defined(PL2) +# define PL2 PORTL2 +#endif +#if defined(PL3) && !defined(PORTL3) +# define PORTL3 PL3 +#elif defined(PORTL3) && !defined(PL3) +# define PL3 PORTL3 +#endif +#if defined(PL4) && !defined(PORTL4) +# define PORTL4 PL4 +#elif defined(PORTL4) && !defined(PL4) +# define PL4 PORTL4 +#endif +#if defined(PL5) && !defined(PORTL5) +# define PORTL5 PL5 +#elif defined(PORTL5) && !defined(PL5) +# define PL5 PORTL5 +#endif +#if defined(PL6) && !defined(PORTL6) +# define PORTL6 PL6 +#elif defined(PORTL6) && !defined(PL6) +# define PL6 PORTL6 +#endif +#if defined(PL7) && !defined(PORTL7) +# define PORTL7 PL7 +#elif defined(PORTL7) && !defined(PL7) +# define PL7 PORTL7 +#endif + +#endif /* _AVR_PORTPINS_H_ */ diff --git a/Make AVR Examples/Chapter02_Programming-AVRs/blinkLED/Makefile b/Make AVR Examples/Chapter02_Programming-AVRs/blinkLED/Makefile new file mode 100644 index 0000000..3d9e544 --- /dev/null +++ b/Make AVR Examples/Chapter02_Programming-AVRs/blinkLED/Makefile @@ -0,0 +1,196 @@ + +##########------------------------------------------------------########## +########## Project-specific Details ########## +########## Check these every time you start a new project ########## +##########------------------------------------------------------########## + +MCU = atmega168p +F_CPU = 1000000UL +BAUD = 9600UL +## Also try BAUD = 19200 or 38400 if you're feeling lucky. + +## A directory for common include files and the simple USART library. +## If you move either the current folder or the Library folder, you'll +## need to change this path to match. +LIBDIR = ../../AVR-Programming-Library + +##########------------------------------------------------------########## +########## Programmer Defaults ########## +########## Set up once, then forget about it ########## +########## (Can override. See bottom of file.) ########## +##########------------------------------------------------------########## + +PROGRAMMER_TYPE = usbtiny +# extra arguments to avrdude: baud rate, chip type, -F flag, etc. +PROGRAMMER_ARGS = + +##########------------------------------------------------------########## +########## Program Locations ########## +########## Won't need to change if they're in your PATH ########## +##########------------------------------------------------------########## + +CC = avr-gcc +OBJCOPY = avr-objcopy +OBJDUMP = avr-objdump +AVRSIZE = avr-size +AVRDUDE = avrdude + +##########------------------------------------------------------########## +########## Makefile Magic! ########## +########## Summary: ########## +########## We want a .hex file ########## +########## Compile source files into .elf ########## +########## Convert .elf file into .hex ########## +########## You shouldn't need to edit below. ########## +##########------------------------------------------------------########## + +## The name of your project (without the .c) +# TARGET = blinkLED +## Or name it automatically after the enclosing directory +TARGET = $(lastword $(subst /, ,$(CURDIR))) + +# Object files: will find all .c/.h files in current directory +# and in LIBDIR. If you have any other (sub-)directories with code, +# you can add them in to SOURCES below in the wildcard statement. +SOURCES=$(wildcard *.c $(LIBDIR)/*.c) +OBJECTS=$(SOURCES:.c=.o) +HEADERS=$(SOURCES:.c=.h) + +## Compilation options, type man avr-gcc if you're curious. +CPPFLAGS = -DF_CPU=$(F_CPU) -DBAUD=$(BAUD) -I. -I$(LIBDIR) +CFLAGS = -Os -g -std=gnu99 -Wall +## Use short (8-bit) data types +CFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums +## Splits up object files per function +CFLAGS += -ffunction-sections -fdata-sections +LDFLAGS = -Wl,-Map,$(TARGET).map +## Optional, but often ends up with smaller code +LDFLAGS += -Wl,--gc-sections +## Relax shrinks code even more, but makes disassembly messy +## LDFLAGS += -Wl,--relax +## LDFLAGS += -Wl,-u,vfprintf -lprintf_flt -lm ## for floating-point printf +## LDFLAGS += -Wl,-u,vfprintf -lprintf_min ## for smaller printf +TARGET_ARCH = -mmcu=$(MCU) + +## Explicit pattern rules: +## To make .o files from .c files +%.o: %.c $(HEADERS) Makefile + $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c -o $@ $<; + +$(TARGET).elf: $(OBJECTS) + $(CC) $(LDFLAGS) $(TARGET_ARCH) $^ $(LDLIBS) -o $@ + +%.hex: %.elf + $(OBJCOPY) -j .text -j .data -O ihex $< $@ + +%.eeprom: %.elf + $(OBJCOPY) -j .eeprom --change-section-lma .eeprom=0 -O ihex $< $@ + +%.lst: %.elf + $(OBJDUMP) -S $< > $@ + +## These targets don't have files named after them +.PHONY: all disassemble disasm eeprom size clean squeaky_clean flash fuses + +all: $(TARGET).hex + +debug: + @echo + @echo "Source files:" $(SOURCES) + @echo "MCU, F_CPU, BAUD:" $(MCU), $(F_CPU), $(BAUD) + @echo + +# Optionally create listing file from .elf +# This creates approximate assembly-language equivalent of your code. +# Useful for debugging time-sensitive bits, +# or making sure the compiler does what you want. +disassemble: $(TARGET).lst + +disasm: disassemble + +# Optionally show how big the resulting program is +size: $(TARGET).elf + $(AVRSIZE) -C --mcu=$(MCU) $(TARGET).elf + +clean: + rm -f $(TARGET).elf $(TARGET).hex $(TARGET).obj \ + $(TARGET).o $(TARGET).d $(TARGET).eep $(TARGET).lst \ + $(TARGET).lss $(TARGET).sym $(TARGET).map $(TARGET)~ \ + $(TARGET).eeprom + +squeaky_clean: + rm -f *.elf *.hex *.obj *.o *.d *.eep *.lst *.lss *.sym *.map *~ *.eeprom + +##########------------------------------------------------------########## +########## Programmer-specific details ########## +########## Flashing code to AVR using avrdude ########## +##########------------------------------------------------------########## + +flash: $(TARGET).hex + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U flash:w:$< + +## An alias +program: flash + +flash_eeprom: $(TARGET).eeprom + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U eeprom:w:$< + +avrdude_terminal: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nt + +## If you've got multiple programmers that you use, +## you can define them here so that it's easy to switch. +## To invoke, use something like `make flash_arduinoISP` +flash_usbtiny: PROGRAMMER_TYPE = usbtiny +flash_usbtiny: PROGRAMMER_ARGS = # USBTiny works with no further arguments +flash_usbtiny: flash + +flash_usbasp: PROGRAMMER_TYPE = usbasp +flash_usbasp: PROGRAMMER_ARGS = # USBasp works with no further arguments +flash_usbasp: flash + +flash_arduinoISP: PROGRAMMER_TYPE = avrisp +flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P /dev/ttyACM0 +## (for windows) flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P com5 +flash_arduinoISP: flash + +flash_109: PROGRAMMER_TYPE = avr109 +flash_109: PROGRAMMER_ARGS = -b 9600 -P /dev/ttyUSB0 +flash_109: flash + +##########------------------------------------------------------########## +########## Fuse settings and suitable defaults ########## +##########------------------------------------------------------########## + +## Mega 48, 88, 168, 328 default values +LFUSE = 0x62 +HFUSE = 0xdf +EFUSE = 0x00 + +## Generic +FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m + +fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) \ + $(PROGRAMMER_ARGS) $(FUSE_STRING) +show_fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nv + +## Called with no extra definitions, sets to defaults +set_default_fuses: FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m +set_default_fuses: fuses + +## Set the fuse byte for full-speed mode +## Note: can also be set in firmware for modern chips +set_fast_fuse: LFUSE = 0xE2 +set_fast_fuse: FUSE_STRING = -U lfuse:w:$(LFUSE):m +set_fast_fuse: fuses + +## Set the EESAVE fuse byte to preserve EEPROM across flashes +set_eeprom_save_fuse: HFUSE = 0xD7 +set_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +set_eeprom_save_fuse: fuses + +## Clear the EESAVE fuse byte +clear_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +clear_eeprom_save_fuse: fuses diff --git a/Make AVR Examples/Chapter02_Programming-AVRs/blinkLED/blinkLED.c b/Make AVR Examples/Chapter02_Programming-AVRs/blinkLED/blinkLED.c new file mode 100644 index 0000000..46a5e54 --- /dev/null +++ b/Make AVR Examples/Chapter02_Programming-AVRs/blinkLED/blinkLED.c @@ -0,0 +1,26 @@ + /* Blinker Demo */ + +// ------- Preamble -------- // +#include /* Defines pins, ports, etc */ +#include /* Functions to waste time */ + + +int main(void) { + + // -------- Inits --------- // + DDRB |= 0b00000001; /* Data Direction Register B: + writing a one to the bit + enables output. */ + + // ------ Event loop ------ // + while (1) { + + PORTB = 0b00000001; /* Turn on first LED bit/pin in PORTB */ + _delay_ms(1000); /* wait */ + + PORTB = 0b00000000; /* Turn off all B pins, including LED */ + _delay_ms(1000); /* wait */ + + } /* End event loop */ + return 0; /* This line is never reached */ +} diff --git a/Make AVR Examples/Chapter02_Programming-AVRs/blinkLED_AVR_style/Makefile b/Make AVR Examples/Chapter02_Programming-AVRs/blinkLED_AVR_style/Makefile new file mode 100644 index 0000000..3d9e544 --- /dev/null +++ b/Make AVR Examples/Chapter02_Programming-AVRs/blinkLED_AVR_style/Makefile @@ -0,0 +1,196 @@ + +##########------------------------------------------------------########## +########## Project-specific Details ########## +########## Check these every time you start a new project ########## +##########------------------------------------------------------########## + +MCU = atmega168p +F_CPU = 1000000UL +BAUD = 9600UL +## Also try BAUD = 19200 or 38400 if you're feeling lucky. + +## A directory for common include files and the simple USART library. +## If you move either the current folder or the Library folder, you'll +## need to change this path to match. +LIBDIR = ../../AVR-Programming-Library + +##########------------------------------------------------------########## +########## Programmer Defaults ########## +########## Set up once, then forget about it ########## +########## (Can override. See bottom of file.) ########## +##########------------------------------------------------------########## + +PROGRAMMER_TYPE = usbtiny +# extra arguments to avrdude: baud rate, chip type, -F flag, etc. +PROGRAMMER_ARGS = + +##########------------------------------------------------------########## +########## Program Locations ########## +########## Won't need to change if they're in your PATH ########## +##########------------------------------------------------------########## + +CC = avr-gcc +OBJCOPY = avr-objcopy +OBJDUMP = avr-objdump +AVRSIZE = avr-size +AVRDUDE = avrdude + +##########------------------------------------------------------########## +########## Makefile Magic! ########## +########## Summary: ########## +########## We want a .hex file ########## +########## Compile source files into .elf ########## +########## Convert .elf file into .hex ########## +########## You shouldn't need to edit below. ########## +##########------------------------------------------------------########## + +## The name of your project (without the .c) +# TARGET = blinkLED +## Or name it automatically after the enclosing directory +TARGET = $(lastword $(subst /, ,$(CURDIR))) + +# Object files: will find all .c/.h files in current directory +# and in LIBDIR. If you have any other (sub-)directories with code, +# you can add them in to SOURCES below in the wildcard statement. +SOURCES=$(wildcard *.c $(LIBDIR)/*.c) +OBJECTS=$(SOURCES:.c=.o) +HEADERS=$(SOURCES:.c=.h) + +## Compilation options, type man avr-gcc if you're curious. +CPPFLAGS = -DF_CPU=$(F_CPU) -DBAUD=$(BAUD) -I. -I$(LIBDIR) +CFLAGS = -Os -g -std=gnu99 -Wall +## Use short (8-bit) data types +CFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums +## Splits up object files per function +CFLAGS += -ffunction-sections -fdata-sections +LDFLAGS = -Wl,-Map,$(TARGET).map +## Optional, but often ends up with smaller code +LDFLAGS += -Wl,--gc-sections +## Relax shrinks code even more, but makes disassembly messy +## LDFLAGS += -Wl,--relax +## LDFLAGS += -Wl,-u,vfprintf -lprintf_flt -lm ## for floating-point printf +## LDFLAGS += -Wl,-u,vfprintf -lprintf_min ## for smaller printf +TARGET_ARCH = -mmcu=$(MCU) + +## Explicit pattern rules: +## To make .o files from .c files +%.o: %.c $(HEADERS) Makefile + $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c -o $@ $<; + +$(TARGET).elf: $(OBJECTS) + $(CC) $(LDFLAGS) $(TARGET_ARCH) $^ $(LDLIBS) -o $@ + +%.hex: %.elf + $(OBJCOPY) -j .text -j .data -O ihex $< $@ + +%.eeprom: %.elf + $(OBJCOPY) -j .eeprom --change-section-lma .eeprom=0 -O ihex $< $@ + +%.lst: %.elf + $(OBJDUMP) -S $< > $@ + +## These targets don't have files named after them +.PHONY: all disassemble disasm eeprom size clean squeaky_clean flash fuses + +all: $(TARGET).hex + +debug: + @echo + @echo "Source files:" $(SOURCES) + @echo "MCU, F_CPU, BAUD:" $(MCU), $(F_CPU), $(BAUD) + @echo + +# Optionally create listing file from .elf +# This creates approximate assembly-language equivalent of your code. +# Useful for debugging time-sensitive bits, +# or making sure the compiler does what you want. +disassemble: $(TARGET).lst + +disasm: disassemble + +# Optionally show how big the resulting program is +size: $(TARGET).elf + $(AVRSIZE) -C --mcu=$(MCU) $(TARGET).elf + +clean: + rm -f $(TARGET).elf $(TARGET).hex $(TARGET).obj \ + $(TARGET).o $(TARGET).d $(TARGET).eep $(TARGET).lst \ + $(TARGET).lss $(TARGET).sym $(TARGET).map $(TARGET)~ \ + $(TARGET).eeprom + +squeaky_clean: + rm -f *.elf *.hex *.obj *.o *.d *.eep *.lst *.lss *.sym *.map *~ *.eeprom + +##########------------------------------------------------------########## +########## Programmer-specific details ########## +########## Flashing code to AVR using avrdude ########## +##########------------------------------------------------------########## + +flash: $(TARGET).hex + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U flash:w:$< + +## An alias +program: flash + +flash_eeprom: $(TARGET).eeprom + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U eeprom:w:$< + +avrdude_terminal: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nt + +## If you've got multiple programmers that you use, +## you can define them here so that it's easy to switch. +## To invoke, use something like `make flash_arduinoISP` +flash_usbtiny: PROGRAMMER_TYPE = usbtiny +flash_usbtiny: PROGRAMMER_ARGS = # USBTiny works with no further arguments +flash_usbtiny: flash + +flash_usbasp: PROGRAMMER_TYPE = usbasp +flash_usbasp: PROGRAMMER_ARGS = # USBasp works with no further arguments +flash_usbasp: flash + +flash_arduinoISP: PROGRAMMER_TYPE = avrisp +flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P /dev/ttyACM0 +## (for windows) flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P com5 +flash_arduinoISP: flash + +flash_109: PROGRAMMER_TYPE = avr109 +flash_109: PROGRAMMER_ARGS = -b 9600 -P /dev/ttyUSB0 +flash_109: flash + +##########------------------------------------------------------########## +########## Fuse settings and suitable defaults ########## +##########------------------------------------------------------########## + +## Mega 48, 88, 168, 328 default values +LFUSE = 0x62 +HFUSE = 0xdf +EFUSE = 0x00 + +## Generic +FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m + +fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) \ + $(PROGRAMMER_ARGS) $(FUSE_STRING) +show_fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nv + +## Called with no extra definitions, sets to defaults +set_default_fuses: FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m +set_default_fuses: fuses + +## Set the fuse byte for full-speed mode +## Note: can also be set in firmware for modern chips +set_fast_fuse: LFUSE = 0xE2 +set_fast_fuse: FUSE_STRING = -U lfuse:w:$(LFUSE):m +set_fast_fuse: fuses + +## Set the EESAVE fuse byte to preserve EEPROM across flashes +set_eeprom_save_fuse: HFUSE = 0xD7 +set_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +set_eeprom_save_fuse: fuses + +## Clear the EESAVE fuse byte +clear_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +clear_eeprom_save_fuse: fuses diff --git a/Make AVR Examples/Chapter02_Programming-AVRs/blinkLED_AVR_style/blinkLED_AVRStyle.c b/Make AVR Examples/Chapter02_Programming-AVRs/blinkLED_AVR_style/blinkLED_AVRStyle.c new file mode 100644 index 0000000..42d2e16 --- /dev/null +++ b/Make AVR Examples/Chapter02_Programming-AVRs/blinkLED_AVR_style/blinkLED_AVRStyle.c @@ -0,0 +1,32 @@ + /* Blinker Demo II */ + +#include +#include + +#define LED PB0 +#define LED_DDR DDRB +#define LED_PORT PORTB + +#define DELAYTIME 200 + +#define setBit(sfr, bit) (_SFR_BYTE(sfr) |= (1 << bit)) +#define clearBit(sfr, bit) (_SFR_BYTE(sfr) &= ~(1 << bit)) +#define toggleBit(sfr, bit) (_SFR_BYTE(sfr) ^= (1 << bit)) + +int main(void) { + + // Init + setBit(LED_DDR, LED); /* set LED pin for output */ + + // Mainloop + while (1) { + + setBit(LED_PORT, LED); + _delay_ms(DELAYTIME); + + clearBit(LED_PORT, LED); + _delay_ms(DELAYTIME); + + } + return 0; /* end mainloop */ +} diff --git a/Make AVR Examples/Chapter03_Digital-Output/povToy/Makefile b/Make AVR Examples/Chapter03_Digital-Output/povToy/Makefile new file mode 100644 index 0000000..3d9e544 --- /dev/null +++ b/Make AVR Examples/Chapter03_Digital-Output/povToy/Makefile @@ -0,0 +1,196 @@ + +##########------------------------------------------------------########## +########## Project-specific Details ########## +########## Check these every time you start a new project ########## +##########------------------------------------------------------########## + +MCU = atmega168p +F_CPU = 1000000UL +BAUD = 9600UL +## Also try BAUD = 19200 or 38400 if you're feeling lucky. + +## A directory for common include files and the simple USART library. +## If you move either the current folder or the Library folder, you'll +## need to change this path to match. +LIBDIR = ../../AVR-Programming-Library + +##########------------------------------------------------------########## +########## Programmer Defaults ########## +########## Set up once, then forget about it ########## +########## (Can override. See bottom of file.) ########## +##########------------------------------------------------------########## + +PROGRAMMER_TYPE = usbtiny +# extra arguments to avrdude: baud rate, chip type, -F flag, etc. +PROGRAMMER_ARGS = + +##########------------------------------------------------------########## +########## Program Locations ########## +########## Won't need to change if they're in your PATH ########## +##########------------------------------------------------------########## + +CC = avr-gcc +OBJCOPY = avr-objcopy +OBJDUMP = avr-objdump +AVRSIZE = avr-size +AVRDUDE = avrdude + +##########------------------------------------------------------########## +########## Makefile Magic! ########## +########## Summary: ########## +########## We want a .hex file ########## +########## Compile source files into .elf ########## +########## Convert .elf file into .hex ########## +########## You shouldn't need to edit below. ########## +##########------------------------------------------------------########## + +## The name of your project (without the .c) +# TARGET = blinkLED +## Or name it automatically after the enclosing directory +TARGET = $(lastword $(subst /, ,$(CURDIR))) + +# Object files: will find all .c/.h files in current directory +# and in LIBDIR. If you have any other (sub-)directories with code, +# you can add them in to SOURCES below in the wildcard statement. +SOURCES=$(wildcard *.c $(LIBDIR)/*.c) +OBJECTS=$(SOURCES:.c=.o) +HEADERS=$(SOURCES:.c=.h) + +## Compilation options, type man avr-gcc if you're curious. +CPPFLAGS = -DF_CPU=$(F_CPU) -DBAUD=$(BAUD) -I. -I$(LIBDIR) +CFLAGS = -Os -g -std=gnu99 -Wall +## Use short (8-bit) data types +CFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums +## Splits up object files per function +CFLAGS += -ffunction-sections -fdata-sections +LDFLAGS = -Wl,-Map,$(TARGET).map +## Optional, but often ends up with smaller code +LDFLAGS += -Wl,--gc-sections +## Relax shrinks code even more, but makes disassembly messy +## LDFLAGS += -Wl,--relax +## LDFLAGS += -Wl,-u,vfprintf -lprintf_flt -lm ## for floating-point printf +## LDFLAGS += -Wl,-u,vfprintf -lprintf_min ## for smaller printf +TARGET_ARCH = -mmcu=$(MCU) + +## Explicit pattern rules: +## To make .o files from .c files +%.o: %.c $(HEADERS) Makefile + $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c -o $@ $<; + +$(TARGET).elf: $(OBJECTS) + $(CC) $(LDFLAGS) $(TARGET_ARCH) $^ $(LDLIBS) -o $@ + +%.hex: %.elf + $(OBJCOPY) -j .text -j .data -O ihex $< $@ + +%.eeprom: %.elf + $(OBJCOPY) -j .eeprom --change-section-lma .eeprom=0 -O ihex $< $@ + +%.lst: %.elf + $(OBJDUMP) -S $< > $@ + +## These targets don't have files named after them +.PHONY: all disassemble disasm eeprom size clean squeaky_clean flash fuses + +all: $(TARGET).hex + +debug: + @echo + @echo "Source files:" $(SOURCES) + @echo "MCU, F_CPU, BAUD:" $(MCU), $(F_CPU), $(BAUD) + @echo + +# Optionally create listing file from .elf +# This creates approximate assembly-language equivalent of your code. +# Useful for debugging time-sensitive bits, +# or making sure the compiler does what you want. +disassemble: $(TARGET).lst + +disasm: disassemble + +# Optionally show how big the resulting program is +size: $(TARGET).elf + $(AVRSIZE) -C --mcu=$(MCU) $(TARGET).elf + +clean: + rm -f $(TARGET).elf $(TARGET).hex $(TARGET).obj \ + $(TARGET).o $(TARGET).d $(TARGET).eep $(TARGET).lst \ + $(TARGET).lss $(TARGET).sym $(TARGET).map $(TARGET)~ \ + $(TARGET).eeprom + +squeaky_clean: + rm -f *.elf *.hex *.obj *.o *.d *.eep *.lst *.lss *.sym *.map *~ *.eeprom + +##########------------------------------------------------------########## +########## Programmer-specific details ########## +########## Flashing code to AVR using avrdude ########## +##########------------------------------------------------------########## + +flash: $(TARGET).hex + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U flash:w:$< + +## An alias +program: flash + +flash_eeprom: $(TARGET).eeprom + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U eeprom:w:$< + +avrdude_terminal: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nt + +## If you've got multiple programmers that you use, +## you can define them here so that it's easy to switch. +## To invoke, use something like `make flash_arduinoISP` +flash_usbtiny: PROGRAMMER_TYPE = usbtiny +flash_usbtiny: PROGRAMMER_ARGS = # USBTiny works with no further arguments +flash_usbtiny: flash + +flash_usbasp: PROGRAMMER_TYPE = usbasp +flash_usbasp: PROGRAMMER_ARGS = # USBasp works with no further arguments +flash_usbasp: flash + +flash_arduinoISP: PROGRAMMER_TYPE = avrisp +flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P /dev/ttyACM0 +## (for windows) flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P com5 +flash_arduinoISP: flash + +flash_109: PROGRAMMER_TYPE = avr109 +flash_109: PROGRAMMER_ARGS = -b 9600 -P /dev/ttyUSB0 +flash_109: flash + +##########------------------------------------------------------########## +########## Fuse settings and suitable defaults ########## +##########------------------------------------------------------########## + +## Mega 48, 88, 168, 328 default values +LFUSE = 0x62 +HFUSE = 0xdf +EFUSE = 0x00 + +## Generic +FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m + +fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) \ + $(PROGRAMMER_ARGS) $(FUSE_STRING) +show_fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nv + +## Called with no extra definitions, sets to defaults +set_default_fuses: FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m +set_default_fuses: fuses + +## Set the fuse byte for full-speed mode +## Note: can also be set in firmware for modern chips +set_fast_fuse: LFUSE = 0xE2 +set_fast_fuse: FUSE_STRING = -U lfuse:w:$(LFUSE):m +set_fast_fuse: fuses + +## Set the EESAVE fuse byte to preserve EEPROM across flashes +set_eeprom_save_fuse: HFUSE = 0xD7 +set_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +set_eeprom_save_fuse: fuses + +## Clear the EESAVE fuse byte +clear_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +clear_eeprom_save_fuse: fuses diff --git a/Make AVR Examples/Chapter03_Digital-Output/povToy/povToy.c b/Make AVR Examples/Chapter03_Digital-Output/povToy/povToy.c new file mode 100644 index 0000000..88410ec --- /dev/null +++ b/Make AVR Examples/Chapter03_Digital-Output/povToy/povToy.c @@ -0,0 +1,34 @@ +// POV toy demo framework // + +// ------- Preamble -------- // +#include +#include + +// -------- Functions --------- // +void POVDisplay(uint8_t oneByte) { + PORTB = oneByte; + _delay_ms(2); +} + +int main(void) { + // -------- Inits --------- // + DDRB = 0xff; /* Set up all of LED pins for output */ + // ------ Event loop ------ // + while (1) { /* mainloop */ + POVDisplay(0b00001110); + POVDisplay(0b00011000); + POVDisplay(0b10111101); + POVDisplay(0b01110110); + POVDisplay(0b00111100); + POVDisplay(0b00111100); + POVDisplay(0b00111100); + POVDisplay(0b01110110); + POVDisplay(0b10111101); + POVDisplay(0b00011000); + POVDisplay(0b00001110); + + PORTB = 0; + _delay_ms(10); + } /* end mainloop */ + return 0; +} diff --git a/Make AVR Examples/Chapter03_Digital-Output/povToy_1up/1up.c b/Make AVR Examples/Chapter03_Digital-Output/povToy_1up/1up.c new file mode 100644 index 0000000..5a1f25a --- /dev/null +++ b/Make AVR Examples/Chapter03_Digital-Output/povToy_1up/1up.c @@ -0,0 +1,59 @@ +/* + POV demo by Patrick Roanhouse +*/ + +#include +#include +#define DELAYTIME 2 /* ms */ + +uint8_t Star1UP[] = { + 0b10000100, + 0b01101100, + 0b01111110, + 0b00011111, + 0b01111110, + 0b01101100, + 0b10000100, + 0b00000000, + 0b00000000, + 0b00000000, + 0b10000010, + 0b11111111, + 0b11111111, + 0b10000000, + 0b00000000, + 0b00000000, + 0b01111111, + 0b11111111, + 0b10000000, + 0b11111111, + 0b01111111, + 0b00000000, + 0b00000000, + 0b11111111, + 0b11111111, + 0b00110011, + 0b00110011, + 0b00011110, + 0b00011110, +}; + + +int main(void) { + uint8_t i; + + DDRB = 0xff; /* all output */ + + while (1) { /* mainloop */ + for (i = 0; i < sizeof(Star1UP); i++) { + /* sizeof(Star1UP) returns the number of bytes in our array, */ + PORTB = Star1UP[i]; + _delay_ms(DELAYTIME); + } + + PORTB = 0; /* blank for gap between repetitions */ + _delay_ms(5 * DELAYTIME); + + } /* end mainloop */ + return 0; +} diff --git a/Make AVR Examples/Chapter03_Digital-Output/povToy_1up/Makefile b/Make AVR Examples/Chapter03_Digital-Output/povToy_1up/Makefile new file mode 100644 index 0000000..3d9e544 --- /dev/null +++ b/Make AVR Examples/Chapter03_Digital-Output/povToy_1up/Makefile @@ -0,0 +1,196 @@ + +##########------------------------------------------------------########## +########## Project-specific Details ########## +########## Check these every time you start a new project ########## +##########------------------------------------------------------########## + +MCU = atmega168p +F_CPU = 1000000UL +BAUD = 9600UL +## Also try BAUD = 19200 or 38400 if you're feeling lucky. + +## A directory for common include files and the simple USART library. +## If you move either the current folder or the Library folder, you'll +## need to change this path to match. +LIBDIR = ../../AVR-Programming-Library + +##########------------------------------------------------------########## +########## Programmer Defaults ########## +########## Set up once, then forget about it ########## +########## (Can override. See bottom of file.) ########## +##########------------------------------------------------------########## + +PROGRAMMER_TYPE = usbtiny +# extra arguments to avrdude: baud rate, chip type, -F flag, etc. +PROGRAMMER_ARGS = + +##########------------------------------------------------------########## +########## Program Locations ########## +########## Won't need to change if they're in your PATH ########## +##########------------------------------------------------------########## + +CC = avr-gcc +OBJCOPY = avr-objcopy +OBJDUMP = avr-objdump +AVRSIZE = avr-size +AVRDUDE = avrdude + +##########------------------------------------------------------########## +########## Makefile Magic! ########## +########## Summary: ########## +########## We want a .hex file ########## +########## Compile source files into .elf ########## +########## Convert .elf file into .hex ########## +########## You shouldn't need to edit below. ########## +##########------------------------------------------------------########## + +## The name of your project (without the .c) +# TARGET = blinkLED +## Or name it automatically after the enclosing directory +TARGET = $(lastword $(subst /, ,$(CURDIR))) + +# Object files: will find all .c/.h files in current directory +# and in LIBDIR. If you have any other (sub-)directories with code, +# you can add them in to SOURCES below in the wildcard statement. +SOURCES=$(wildcard *.c $(LIBDIR)/*.c) +OBJECTS=$(SOURCES:.c=.o) +HEADERS=$(SOURCES:.c=.h) + +## Compilation options, type man avr-gcc if you're curious. +CPPFLAGS = -DF_CPU=$(F_CPU) -DBAUD=$(BAUD) -I. -I$(LIBDIR) +CFLAGS = -Os -g -std=gnu99 -Wall +## Use short (8-bit) data types +CFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums +## Splits up object files per function +CFLAGS += -ffunction-sections -fdata-sections +LDFLAGS = -Wl,-Map,$(TARGET).map +## Optional, but often ends up with smaller code +LDFLAGS += -Wl,--gc-sections +## Relax shrinks code even more, but makes disassembly messy +## LDFLAGS += -Wl,--relax +## LDFLAGS += -Wl,-u,vfprintf -lprintf_flt -lm ## for floating-point printf +## LDFLAGS += -Wl,-u,vfprintf -lprintf_min ## for smaller printf +TARGET_ARCH = -mmcu=$(MCU) + +## Explicit pattern rules: +## To make .o files from .c files +%.o: %.c $(HEADERS) Makefile + $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c -o $@ $<; + +$(TARGET).elf: $(OBJECTS) + $(CC) $(LDFLAGS) $(TARGET_ARCH) $^ $(LDLIBS) -o $@ + +%.hex: %.elf + $(OBJCOPY) -j .text -j .data -O ihex $< $@ + +%.eeprom: %.elf + $(OBJCOPY) -j .eeprom --change-section-lma .eeprom=0 -O ihex $< $@ + +%.lst: %.elf + $(OBJDUMP) -S $< > $@ + +## These targets don't have files named after them +.PHONY: all disassemble disasm eeprom size clean squeaky_clean flash fuses + +all: $(TARGET).hex + +debug: + @echo + @echo "Source files:" $(SOURCES) + @echo "MCU, F_CPU, BAUD:" $(MCU), $(F_CPU), $(BAUD) + @echo + +# Optionally create listing file from .elf +# This creates approximate assembly-language equivalent of your code. +# Useful for debugging time-sensitive bits, +# or making sure the compiler does what you want. +disassemble: $(TARGET).lst + +disasm: disassemble + +# Optionally show how big the resulting program is +size: $(TARGET).elf + $(AVRSIZE) -C --mcu=$(MCU) $(TARGET).elf + +clean: + rm -f $(TARGET).elf $(TARGET).hex $(TARGET).obj \ + $(TARGET).o $(TARGET).d $(TARGET).eep $(TARGET).lst \ + $(TARGET).lss $(TARGET).sym $(TARGET).map $(TARGET)~ \ + $(TARGET).eeprom + +squeaky_clean: + rm -f *.elf *.hex *.obj *.o *.d *.eep *.lst *.lss *.sym *.map *~ *.eeprom + +##########------------------------------------------------------########## +########## Programmer-specific details ########## +########## Flashing code to AVR using avrdude ########## +##########------------------------------------------------------########## + +flash: $(TARGET).hex + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U flash:w:$< + +## An alias +program: flash + +flash_eeprom: $(TARGET).eeprom + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U eeprom:w:$< + +avrdude_terminal: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nt + +## If you've got multiple programmers that you use, +## you can define them here so that it's easy to switch. +## To invoke, use something like `make flash_arduinoISP` +flash_usbtiny: PROGRAMMER_TYPE = usbtiny +flash_usbtiny: PROGRAMMER_ARGS = # USBTiny works with no further arguments +flash_usbtiny: flash + +flash_usbasp: PROGRAMMER_TYPE = usbasp +flash_usbasp: PROGRAMMER_ARGS = # USBasp works with no further arguments +flash_usbasp: flash + +flash_arduinoISP: PROGRAMMER_TYPE = avrisp +flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P /dev/ttyACM0 +## (for windows) flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P com5 +flash_arduinoISP: flash + +flash_109: PROGRAMMER_TYPE = avr109 +flash_109: PROGRAMMER_ARGS = -b 9600 -P /dev/ttyUSB0 +flash_109: flash + +##########------------------------------------------------------########## +########## Fuse settings and suitable defaults ########## +##########------------------------------------------------------########## + +## Mega 48, 88, 168, 328 default values +LFUSE = 0x62 +HFUSE = 0xdf +EFUSE = 0x00 + +## Generic +FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m + +fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) \ + $(PROGRAMMER_ARGS) $(FUSE_STRING) +show_fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nv + +## Called with no extra definitions, sets to defaults +set_default_fuses: FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m +set_default_fuses: fuses + +## Set the fuse byte for full-speed mode +## Note: can also be set in firmware for modern chips +set_fast_fuse: LFUSE = 0xE2 +set_fast_fuse: FUSE_STRING = -U lfuse:w:$(LFUSE):m +set_fast_fuse: fuses + +## Set the EESAVE fuse byte to preserve EEPROM across flashes +set_eeprom_save_fuse: HFUSE = 0xD7 +set_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +set_eeprom_save_fuse: fuses + +## Clear the EESAVE fuse byte +clear_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +clear_eeprom_save_fuse: fuses diff --git a/Make AVR Examples/Chapter03_Digital-Output/povToy_cylonEyes/Makefile b/Make AVR Examples/Chapter03_Digital-Output/povToy_cylonEyes/Makefile new file mode 100644 index 0000000..3d9e544 --- /dev/null +++ b/Make AVR Examples/Chapter03_Digital-Output/povToy_cylonEyes/Makefile @@ -0,0 +1,196 @@ + +##########------------------------------------------------------########## +########## Project-specific Details ########## +########## Check these every time you start a new project ########## +##########------------------------------------------------------########## + +MCU = atmega168p +F_CPU = 1000000UL +BAUD = 9600UL +## Also try BAUD = 19200 or 38400 if you're feeling lucky. + +## A directory for common include files and the simple USART library. +## If you move either the current folder or the Library folder, you'll +## need to change this path to match. +LIBDIR = ../../AVR-Programming-Library + +##########------------------------------------------------------########## +########## Programmer Defaults ########## +########## Set up once, then forget about it ########## +########## (Can override. See bottom of file.) ########## +##########------------------------------------------------------########## + +PROGRAMMER_TYPE = usbtiny +# extra arguments to avrdude: baud rate, chip type, -F flag, etc. +PROGRAMMER_ARGS = + +##########------------------------------------------------------########## +########## Program Locations ########## +########## Won't need to change if they're in your PATH ########## +##########------------------------------------------------------########## + +CC = avr-gcc +OBJCOPY = avr-objcopy +OBJDUMP = avr-objdump +AVRSIZE = avr-size +AVRDUDE = avrdude + +##########------------------------------------------------------########## +########## Makefile Magic! ########## +########## Summary: ########## +########## We want a .hex file ########## +########## Compile source files into .elf ########## +########## Convert .elf file into .hex ########## +########## You shouldn't need to edit below. ########## +##########------------------------------------------------------########## + +## The name of your project (without the .c) +# TARGET = blinkLED +## Or name it automatically after the enclosing directory +TARGET = $(lastword $(subst /, ,$(CURDIR))) + +# Object files: will find all .c/.h files in current directory +# and in LIBDIR. If you have any other (sub-)directories with code, +# you can add them in to SOURCES below in the wildcard statement. +SOURCES=$(wildcard *.c $(LIBDIR)/*.c) +OBJECTS=$(SOURCES:.c=.o) +HEADERS=$(SOURCES:.c=.h) + +## Compilation options, type man avr-gcc if you're curious. +CPPFLAGS = -DF_CPU=$(F_CPU) -DBAUD=$(BAUD) -I. -I$(LIBDIR) +CFLAGS = -Os -g -std=gnu99 -Wall +## Use short (8-bit) data types +CFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums +## Splits up object files per function +CFLAGS += -ffunction-sections -fdata-sections +LDFLAGS = -Wl,-Map,$(TARGET).map +## Optional, but often ends up with smaller code +LDFLAGS += -Wl,--gc-sections +## Relax shrinks code even more, but makes disassembly messy +## LDFLAGS += -Wl,--relax +## LDFLAGS += -Wl,-u,vfprintf -lprintf_flt -lm ## for floating-point printf +## LDFLAGS += -Wl,-u,vfprintf -lprintf_min ## for smaller printf +TARGET_ARCH = -mmcu=$(MCU) + +## Explicit pattern rules: +## To make .o files from .c files +%.o: %.c $(HEADERS) Makefile + $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c -o $@ $<; + +$(TARGET).elf: $(OBJECTS) + $(CC) $(LDFLAGS) $(TARGET_ARCH) $^ $(LDLIBS) -o $@ + +%.hex: %.elf + $(OBJCOPY) -j .text -j .data -O ihex $< $@ + +%.eeprom: %.elf + $(OBJCOPY) -j .eeprom --change-section-lma .eeprom=0 -O ihex $< $@ + +%.lst: %.elf + $(OBJDUMP) -S $< > $@ + +## These targets don't have files named after them +.PHONY: all disassemble disasm eeprom size clean squeaky_clean flash fuses + +all: $(TARGET).hex + +debug: + @echo + @echo "Source files:" $(SOURCES) + @echo "MCU, F_CPU, BAUD:" $(MCU), $(F_CPU), $(BAUD) + @echo + +# Optionally create listing file from .elf +# This creates approximate assembly-language equivalent of your code. +# Useful for debugging time-sensitive bits, +# or making sure the compiler does what you want. +disassemble: $(TARGET).lst + +disasm: disassemble + +# Optionally show how big the resulting program is +size: $(TARGET).elf + $(AVRSIZE) -C --mcu=$(MCU) $(TARGET).elf + +clean: + rm -f $(TARGET).elf $(TARGET).hex $(TARGET).obj \ + $(TARGET).o $(TARGET).d $(TARGET).eep $(TARGET).lst \ + $(TARGET).lss $(TARGET).sym $(TARGET).map $(TARGET)~ \ + $(TARGET).eeprom + +squeaky_clean: + rm -f *.elf *.hex *.obj *.o *.d *.eep *.lst *.lss *.sym *.map *~ *.eeprom + +##########------------------------------------------------------########## +########## Programmer-specific details ########## +########## Flashing code to AVR using avrdude ########## +##########------------------------------------------------------########## + +flash: $(TARGET).hex + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U flash:w:$< + +## An alias +program: flash + +flash_eeprom: $(TARGET).eeprom + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U eeprom:w:$< + +avrdude_terminal: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nt + +## If you've got multiple programmers that you use, +## you can define them here so that it's easy to switch. +## To invoke, use something like `make flash_arduinoISP` +flash_usbtiny: PROGRAMMER_TYPE = usbtiny +flash_usbtiny: PROGRAMMER_ARGS = # USBTiny works with no further arguments +flash_usbtiny: flash + +flash_usbasp: PROGRAMMER_TYPE = usbasp +flash_usbasp: PROGRAMMER_ARGS = # USBasp works with no further arguments +flash_usbasp: flash + +flash_arduinoISP: PROGRAMMER_TYPE = avrisp +flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P /dev/ttyACM0 +## (for windows) flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P com5 +flash_arduinoISP: flash + +flash_109: PROGRAMMER_TYPE = avr109 +flash_109: PROGRAMMER_ARGS = -b 9600 -P /dev/ttyUSB0 +flash_109: flash + +##########------------------------------------------------------########## +########## Fuse settings and suitable defaults ########## +##########------------------------------------------------------########## + +## Mega 48, 88, 168, 328 default values +LFUSE = 0x62 +HFUSE = 0xdf +EFUSE = 0x00 + +## Generic +FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m + +fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) \ + $(PROGRAMMER_ARGS) $(FUSE_STRING) +show_fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nv + +## Called with no extra definitions, sets to defaults +set_default_fuses: FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m +set_default_fuses: fuses + +## Set the fuse byte for full-speed mode +## Note: can also be set in firmware for modern chips +set_fast_fuse: LFUSE = 0xE2 +set_fast_fuse: FUSE_STRING = -U lfuse:w:$(LFUSE):m +set_fast_fuse: fuses + +## Set the EESAVE fuse byte to preserve EEPROM across flashes +set_eeprom_save_fuse: HFUSE = 0xD7 +set_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +set_eeprom_save_fuse: fuses + +## Clear the EESAVE fuse byte +clear_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +clear_eeprom_save_fuse: fuses diff --git a/Make AVR Examples/Chapter03_Digital-Output/povToy_cylonEyes/cylonEyes_POV.c b/Make AVR Examples/Chapter03_Digital-Output/povToy_cylonEyes/cylonEyes_POV.c new file mode 100644 index 0000000..588efa6 --- /dev/null +++ b/Make AVR Examples/Chapter03_Digital-Output/povToy_cylonEyes/cylonEyes_POV.c @@ -0,0 +1,34 @@ +/* + +Cylon eyes actually turns out to be a decent POV routine. +The only change here is in DELAYTIME. + + */ + + +#include /* Defines pins, ports, etc */ +#include /* Functions to waste time */ + +#define DELAYTIME 2 /* milliseconds */ + +int main(void) { + uint8_t i=0; + DDRB = 0b11111111; /* Data Direction Register B: all on */ + + while (1) { + + while (i < 7) { + PORTB = (1 << i); /* illuminate only i'th pin */ + _delay_ms(DELAYTIME); /* wait */ + i = i + 1; /* move to the next LED */ + } + + while (i > 0) { + PORTB = (1 << i); /* illuminate only i'th pin */ + _delay_ms(DELAYTIME); /* wait */ + i = i - 1; /* move to the previous LED */ + } + } + + return 0; +} diff --git a/Make AVR Examples/Chapter03_Digital-Output/povToy_invaders/Makefile b/Make AVR Examples/Chapter03_Digital-Output/povToy_invaders/Makefile new file mode 100644 index 0000000..3d9e544 --- /dev/null +++ b/Make AVR Examples/Chapter03_Digital-Output/povToy_invaders/Makefile @@ -0,0 +1,196 @@ + +##########------------------------------------------------------########## +########## Project-specific Details ########## +########## Check these every time you start a new project ########## +##########------------------------------------------------------########## + +MCU = atmega168p +F_CPU = 1000000UL +BAUD = 9600UL +## Also try BAUD = 19200 or 38400 if you're feeling lucky. + +## A directory for common include files and the simple USART library. +## If you move either the current folder or the Library folder, you'll +## need to change this path to match. +LIBDIR = ../../AVR-Programming-Library + +##########------------------------------------------------------########## +########## Programmer Defaults ########## +########## Set up once, then forget about it ########## +########## (Can override. See bottom of file.) ########## +##########------------------------------------------------------########## + +PROGRAMMER_TYPE = usbtiny +# extra arguments to avrdude: baud rate, chip type, -F flag, etc. +PROGRAMMER_ARGS = + +##########------------------------------------------------------########## +########## Program Locations ########## +########## Won't need to change if they're in your PATH ########## +##########------------------------------------------------------########## + +CC = avr-gcc +OBJCOPY = avr-objcopy +OBJDUMP = avr-objdump +AVRSIZE = avr-size +AVRDUDE = avrdude + +##########------------------------------------------------------########## +########## Makefile Magic! ########## +########## Summary: ########## +########## We want a .hex file ########## +########## Compile source files into .elf ########## +########## Convert .elf file into .hex ########## +########## You shouldn't need to edit below. ########## +##########------------------------------------------------------########## + +## The name of your project (without the .c) +# TARGET = blinkLED +## Or name it automatically after the enclosing directory +TARGET = $(lastword $(subst /, ,$(CURDIR))) + +# Object files: will find all .c/.h files in current directory +# and in LIBDIR. If you have any other (sub-)directories with code, +# you can add them in to SOURCES below in the wildcard statement. +SOURCES=$(wildcard *.c $(LIBDIR)/*.c) +OBJECTS=$(SOURCES:.c=.o) +HEADERS=$(SOURCES:.c=.h) + +## Compilation options, type man avr-gcc if you're curious. +CPPFLAGS = -DF_CPU=$(F_CPU) -DBAUD=$(BAUD) -I. -I$(LIBDIR) +CFLAGS = -Os -g -std=gnu99 -Wall +## Use short (8-bit) data types +CFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums +## Splits up object files per function +CFLAGS += -ffunction-sections -fdata-sections +LDFLAGS = -Wl,-Map,$(TARGET).map +## Optional, but often ends up with smaller code +LDFLAGS += -Wl,--gc-sections +## Relax shrinks code even more, but makes disassembly messy +## LDFLAGS += -Wl,--relax +## LDFLAGS += -Wl,-u,vfprintf -lprintf_flt -lm ## for floating-point printf +## LDFLAGS += -Wl,-u,vfprintf -lprintf_min ## for smaller printf +TARGET_ARCH = -mmcu=$(MCU) + +## Explicit pattern rules: +## To make .o files from .c files +%.o: %.c $(HEADERS) Makefile + $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c -o $@ $<; + +$(TARGET).elf: $(OBJECTS) + $(CC) $(LDFLAGS) $(TARGET_ARCH) $^ $(LDLIBS) -o $@ + +%.hex: %.elf + $(OBJCOPY) -j .text -j .data -O ihex $< $@ + +%.eeprom: %.elf + $(OBJCOPY) -j .eeprom --change-section-lma .eeprom=0 -O ihex $< $@ + +%.lst: %.elf + $(OBJDUMP) -S $< > $@ + +## These targets don't have files named after them +.PHONY: all disassemble disasm eeprom size clean squeaky_clean flash fuses + +all: $(TARGET).hex + +debug: + @echo + @echo "Source files:" $(SOURCES) + @echo "MCU, F_CPU, BAUD:" $(MCU), $(F_CPU), $(BAUD) + @echo + +# Optionally create listing file from .elf +# This creates approximate assembly-language equivalent of your code. +# Useful for debugging time-sensitive bits, +# or making sure the compiler does what you want. +disassemble: $(TARGET).lst + +disasm: disassemble + +# Optionally show how big the resulting program is +size: $(TARGET).elf + $(AVRSIZE) -C --mcu=$(MCU) $(TARGET).elf + +clean: + rm -f $(TARGET).elf $(TARGET).hex $(TARGET).obj \ + $(TARGET).o $(TARGET).d $(TARGET).eep $(TARGET).lst \ + $(TARGET).lss $(TARGET).sym $(TARGET).map $(TARGET)~ \ + $(TARGET).eeprom + +squeaky_clean: + rm -f *.elf *.hex *.obj *.o *.d *.eep *.lst *.lss *.sym *.map *~ *.eeprom + +##########------------------------------------------------------########## +########## Programmer-specific details ########## +########## Flashing code to AVR using avrdude ########## +##########------------------------------------------------------########## + +flash: $(TARGET).hex + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U flash:w:$< + +## An alias +program: flash + +flash_eeprom: $(TARGET).eeprom + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U eeprom:w:$< + +avrdude_terminal: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nt + +## If you've got multiple programmers that you use, +## you can define them here so that it's easy to switch. +## To invoke, use something like `make flash_arduinoISP` +flash_usbtiny: PROGRAMMER_TYPE = usbtiny +flash_usbtiny: PROGRAMMER_ARGS = # USBTiny works with no further arguments +flash_usbtiny: flash + +flash_usbasp: PROGRAMMER_TYPE = usbasp +flash_usbasp: PROGRAMMER_ARGS = # USBasp works with no further arguments +flash_usbasp: flash + +flash_arduinoISP: PROGRAMMER_TYPE = avrisp +flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P /dev/ttyACM0 +## (for windows) flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P com5 +flash_arduinoISP: flash + +flash_109: PROGRAMMER_TYPE = avr109 +flash_109: PROGRAMMER_ARGS = -b 9600 -P /dev/ttyUSB0 +flash_109: flash + +##########------------------------------------------------------########## +########## Fuse settings and suitable defaults ########## +##########------------------------------------------------------########## + +## Mega 48, 88, 168, 328 default values +LFUSE = 0x62 +HFUSE = 0xdf +EFUSE = 0x00 + +## Generic +FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m + +fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) \ + $(PROGRAMMER_ARGS) $(FUSE_STRING) +show_fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nv + +## Called with no extra definitions, sets to defaults +set_default_fuses: FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m +set_default_fuses: fuses + +## Set the fuse byte for full-speed mode +## Note: can also be set in firmware for modern chips +set_fast_fuse: LFUSE = 0xE2 +set_fast_fuse: FUSE_STRING = -U lfuse:w:$(LFUSE):m +set_fast_fuse: fuses + +## Set the EESAVE fuse byte to preserve EEPROM across flashes +set_eeprom_save_fuse: HFUSE = 0xD7 +set_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +set_eeprom_save_fuse: fuses + +## Clear the EESAVE fuse byte +clear_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +clear_eeprom_save_fuse: fuses diff --git a/Make AVR Examples/Chapter03_Digital-Output/povToy_invaders/invaders.c b/Make AVR Examples/Chapter03_Digital-Output/povToy_invaders/invaders.c new file mode 100644 index 0000000..99586a7 --- /dev/null +++ b/Make AVR Examples/Chapter03_Digital-Output/povToy_invaders/invaders.c @@ -0,0 +1,70 @@ +/* + Space Invaders POV demo by Elliot Williams + This version stores the displays in arrays, + loops over their elements in a function. +*/ + +#include +#include +#define DELAYTIME 2 /* ms */ + +#define LED_PORT PORTB +#define LED_DDR DDRB + +uint8_t invaderData1[] = { + 0b01110000, + 0b00011000, + 0b11111101, + 0b10110110, + 0b00111100, + 0b00111100, + 0b00111100, + 0b10110110, + 0b11111101, + 0b00011000, + 0b01110000 +}; + +uint8_t invaderData2[] = { + 0b00001110, + 0b00011000, + 0b10111101, + 0b01110110, + 0b00111100, + 0b00111100, + 0b00111100, + 0b01110110, + 0b10111101, + 0b00011000, + 0b00001110 +}; + + +void pause(void){ + uint8_t i; + for (i=0; i<5; i++){ + _delay_ms(DELAYTIME); + } +} + +void POVDisplay(uint8_t povData[], uint8_t numberRows) { + uint8_t i; + for (i = 0; i < numberRows; ++i) { + LED_PORT = povData[i]; + _delay_ms(DELAYTIME); + } + pause(); +} + +int main(void) { + + LED_DDR = 0xff; /* set all LEDs to output */ + + while (1) { /* mainloop */ + + POVDisplay(invaderData1, sizeof(invaderData1)); + POVDisplay(invaderData2, sizeof(invaderData2)); + + } /* end mainloop */ + return 0; +} diff --git a/Make AVR Examples/Chapter04_Bit-Twiddling/cylonEyes/Makefile b/Make AVR Examples/Chapter04_Bit-Twiddling/cylonEyes/Makefile new file mode 100644 index 0000000..3d9e544 --- /dev/null +++ b/Make AVR Examples/Chapter04_Bit-Twiddling/cylonEyes/Makefile @@ -0,0 +1,196 @@ + +##########------------------------------------------------------########## +########## Project-specific Details ########## +########## Check these every time you start a new project ########## +##########------------------------------------------------------########## + +MCU = atmega168p +F_CPU = 1000000UL +BAUD = 9600UL +## Also try BAUD = 19200 or 38400 if you're feeling lucky. + +## A directory for common include files and the simple USART library. +## If you move either the current folder or the Library folder, you'll +## need to change this path to match. +LIBDIR = ../../AVR-Programming-Library + +##########------------------------------------------------------########## +########## Programmer Defaults ########## +########## Set up once, then forget about it ########## +########## (Can override. See bottom of file.) ########## +##########------------------------------------------------------########## + +PROGRAMMER_TYPE = usbtiny +# extra arguments to avrdude: baud rate, chip type, -F flag, etc. +PROGRAMMER_ARGS = + +##########------------------------------------------------------########## +########## Program Locations ########## +########## Won't need to change if they're in your PATH ########## +##########------------------------------------------------------########## + +CC = avr-gcc +OBJCOPY = avr-objcopy +OBJDUMP = avr-objdump +AVRSIZE = avr-size +AVRDUDE = avrdude + +##########------------------------------------------------------########## +########## Makefile Magic! ########## +########## Summary: ########## +########## We want a .hex file ########## +########## Compile source files into .elf ########## +########## Convert .elf file into .hex ########## +########## You shouldn't need to edit below. ########## +##########------------------------------------------------------########## + +## The name of your project (without the .c) +# TARGET = blinkLED +## Or name it automatically after the enclosing directory +TARGET = $(lastword $(subst /, ,$(CURDIR))) + +# Object files: will find all .c/.h files in current directory +# and in LIBDIR. If you have any other (sub-)directories with code, +# you can add them in to SOURCES below in the wildcard statement. +SOURCES=$(wildcard *.c $(LIBDIR)/*.c) +OBJECTS=$(SOURCES:.c=.o) +HEADERS=$(SOURCES:.c=.h) + +## Compilation options, type man avr-gcc if you're curious. +CPPFLAGS = -DF_CPU=$(F_CPU) -DBAUD=$(BAUD) -I. -I$(LIBDIR) +CFLAGS = -Os -g -std=gnu99 -Wall +## Use short (8-bit) data types +CFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums +## Splits up object files per function +CFLAGS += -ffunction-sections -fdata-sections +LDFLAGS = -Wl,-Map,$(TARGET).map +## Optional, but often ends up with smaller code +LDFLAGS += -Wl,--gc-sections +## Relax shrinks code even more, but makes disassembly messy +## LDFLAGS += -Wl,--relax +## LDFLAGS += -Wl,-u,vfprintf -lprintf_flt -lm ## for floating-point printf +## LDFLAGS += -Wl,-u,vfprintf -lprintf_min ## for smaller printf +TARGET_ARCH = -mmcu=$(MCU) + +## Explicit pattern rules: +## To make .o files from .c files +%.o: %.c $(HEADERS) Makefile + $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c -o $@ $<; + +$(TARGET).elf: $(OBJECTS) + $(CC) $(LDFLAGS) $(TARGET_ARCH) $^ $(LDLIBS) -o $@ + +%.hex: %.elf + $(OBJCOPY) -j .text -j .data -O ihex $< $@ + +%.eeprom: %.elf + $(OBJCOPY) -j .eeprom --change-section-lma .eeprom=0 -O ihex $< $@ + +%.lst: %.elf + $(OBJDUMP) -S $< > $@ + +## These targets don't have files named after them +.PHONY: all disassemble disasm eeprom size clean squeaky_clean flash fuses + +all: $(TARGET).hex + +debug: + @echo + @echo "Source files:" $(SOURCES) + @echo "MCU, F_CPU, BAUD:" $(MCU), $(F_CPU), $(BAUD) + @echo + +# Optionally create listing file from .elf +# This creates approximate assembly-language equivalent of your code. +# Useful for debugging time-sensitive bits, +# or making sure the compiler does what you want. +disassemble: $(TARGET).lst + +disasm: disassemble + +# Optionally show how big the resulting program is +size: $(TARGET).elf + $(AVRSIZE) -C --mcu=$(MCU) $(TARGET).elf + +clean: + rm -f $(TARGET).elf $(TARGET).hex $(TARGET).obj \ + $(TARGET).o $(TARGET).d $(TARGET).eep $(TARGET).lst \ + $(TARGET).lss $(TARGET).sym $(TARGET).map $(TARGET)~ \ + $(TARGET).eeprom + +squeaky_clean: + rm -f *.elf *.hex *.obj *.o *.d *.eep *.lst *.lss *.sym *.map *~ *.eeprom + +##########------------------------------------------------------########## +########## Programmer-specific details ########## +########## Flashing code to AVR using avrdude ########## +##########------------------------------------------------------########## + +flash: $(TARGET).hex + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U flash:w:$< + +## An alias +program: flash + +flash_eeprom: $(TARGET).eeprom + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U eeprom:w:$< + +avrdude_terminal: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nt + +## If you've got multiple programmers that you use, +## you can define them here so that it's easy to switch. +## To invoke, use something like `make flash_arduinoISP` +flash_usbtiny: PROGRAMMER_TYPE = usbtiny +flash_usbtiny: PROGRAMMER_ARGS = # USBTiny works with no further arguments +flash_usbtiny: flash + +flash_usbasp: PROGRAMMER_TYPE = usbasp +flash_usbasp: PROGRAMMER_ARGS = # USBasp works with no further arguments +flash_usbasp: flash + +flash_arduinoISP: PROGRAMMER_TYPE = avrisp +flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P /dev/ttyACM0 +## (for windows) flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P com5 +flash_arduinoISP: flash + +flash_109: PROGRAMMER_TYPE = avr109 +flash_109: PROGRAMMER_ARGS = -b 9600 -P /dev/ttyUSB0 +flash_109: flash + +##########------------------------------------------------------########## +########## Fuse settings and suitable defaults ########## +##########------------------------------------------------------########## + +## Mega 48, 88, 168, 328 default values +LFUSE = 0x62 +HFUSE = 0xdf +EFUSE = 0x00 + +## Generic +FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m + +fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) \ + $(PROGRAMMER_ARGS) $(FUSE_STRING) +show_fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nv + +## Called with no extra definitions, sets to defaults +set_default_fuses: FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m +set_default_fuses: fuses + +## Set the fuse byte for full-speed mode +## Note: can also be set in firmware for modern chips +set_fast_fuse: LFUSE = 0xE2 +set_fast_fuse: FUSE_STRING = -U lfuse:w:$(LFUSE):m +set_fast_fuse: fuses + +## Set the EESAVE fuse byte to preserve EEPROM across flashes +set_eeprom_save_fuse: HFUSE = 0xD7 +set_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +set_eeprom_save_fuse: fuses + +## Clear the EESAVE fuse byte +clear_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +clear_eeprom_save_fuse: fuses diff --git a/Make AVR Examples/Chapter04_Bit-Twiddling/cylonEyes/cylonEyes.c b/Make AVR Examples/Chapter04_Bit-Twiddling/cylonEyes/cylonEyes.c new file mode 100644 index 0000000..d60f293 --- /dev/null +++ b/Make AVR Examples/Chapter04_Bit-Twiddling/cylonEyes/cylonEyes.c @@ -0,0 +1,36 @@ + /* Cylon Eyes */ + +// ------- Preamble -------- // +#include /* Defines pins, ports, etc */ +#include /* Functions to waste time */ + +#define DELAYTIME 85 /* milliseconds */ +#define LED_PORT PORTB +#define LED_PIN PINB +#define LED_DDR DDRB + +int main(void) { + + // -------- Inits --------- // + uint8_t i=0; + LED_DDR = 0xff; /* Data Direction Register B: + all set up for output */ + + // ------ Event loop ------ // + while (1) { + + while (i < 7) { + LED_PORT = (1 << i); /* illuminate only i'th pin */ + _delay_ms(DELAYTIME); /* wait */ + i = i + 1; /* move to the next LED */ + } + + while (i > 0) { + LED_PORT = (1 << i); /* illuminate only i'th pin */ + _delay_ms(DELAYTIME); /* wait */ + i = i - 1; /* move to the previous LED */ + } + + } /* End event loop */ + return 0; +} diff --git a/Make AVR Examples/Chapter04_Bit-Twiddling/cylonEyes_16LFSR/16LFSR.c b/Make AVR Examples/Chapter04_Bit-Twiddling/cylonEyes_16LFSR/16LFSR.c new file mode 100644 index 0000000..64b987a --- /dev/null +++ b/Make AVR Examples/Chapter04_Bit-Twiddling/cylonEyes_16LFSR/16LFSR.c @@ -0,0 +1,71 @@ +// ------- Preamble -------- // +#include +#include + +#define DELAY 100 /* ms */ + +static inline uint8_t LFSR8_step(uint8_t random); +static inline uint16_t LFSR16(uint16_t random); + +int main(void) { + + // -------- Inits --------- // + + DDRB = 0xff; /* output on all LEDs */ + uint16_t random = 123; /* can't init to 0, any other is ok */ + + // ------ Event loop ------ // + while (1) { + + /* Display and output */ + random = LFSR16(random); + PORTB = (random >> 8); + _delay_ms(DELAY); + + } /* End event loop */ + return 0; +} + + +// ----------------- LFSR Routines ---------------- // + +inline uint8_t LFSR8_step(uint8_t random) { + /* + Takes an 8-bit number, takes one step in a () LFSR. + [3, 4, 5, 7] is the set of taps for 8-bits that goes through + the whole cycle before repeating. + + If you're really serious about randomness, you'll want a different + algorithm. In fact, this is a great demo of how "predictable" + the "pseudo-random" sequence is. + + Note that this is not a very efficient way to code this up, + but it's meant mostly for teaching and is plenty fast + because the compiler does an OK job with it. + */ + uint8_t tap1, tap2, tap3, tap4; + uint8_t newBit; + tap1 = 1 & (random >> 3); + tap2 = 1 & (random >> 4); + tap3 = 1 & (random >> 5); + tap4 = 1 & (random >> 7); + + newBit = tap1 ^ tap2 ^ tap3 ^ tap4; + random = ((random << 1) | newBit); + return (random); +} + + +inline uint16_t LFSR16(uint16_t random) { + // 3, 12, 14, 15 are the maximal taps for 16 bits. + uint16_t tap1, tap2, tap3, tap4; + uint16_t newBit; + tap1 = 1 & (random >> 3); + tap2 = 1 & (random >> 12); + tap3 = 1 & (random >> 14); + tap4 = 1 & (random >> 15); + + newBit = tap1 ^ tap2 ^ tap3 ^ tap4; + random = ((random << 1) | newBit); + return (random); +} diff --git a/Make AVR Examples/Chapter04_Bit-Twiddling/cylonEyes_16LFSR/Makefile b/Make AVR Examples/Chapter04_Bit-Twiddling/cylonEyes_16LFSR/Makefile new file mode 100644 index 0000000..3d9e544 --- /dev/null +++ b/Make AVR Examples/Chapter04_Bit-Twiddling/cylonEyes_16LFSR/Makefile @@ -0,0 +1,196 @@ + +##########------------------------------------------------------########## +########## Project-specific Details ########## +########## Check these every time you start a new project ########## +##########------------------------------------------------------########## + +MCU = atmega168p +F_CPU = 1000000UL +BAUD = 9600UL +## Also try BAUD = 19200 or 38400 if you're feeling lucky. + +## A directory for common include files and the simple USART library. +## If you move either the current folder or the Library folder, you'll +## need to change this path to match. +LIBDIR = ../../AVR-Programming-Library + +##########------------------------------------------------------########## +########## Programmer Defaults ########## +########## Set up once, then forget about it ########## +########## (Can override. See bottom of file.) ########## +##########------------------------------------------------------########## + +PROGRAMMER_TYPE = usbtiny +# extra arguments to avrdude: baud rate, chip type, -F flag, etc. +PROGRAMMER_ARGS = + +##########------------------------------------------------------########## +########## Program Locations ########## +########## Won't need to change if they're in your PATH ########## +##########------------------------------------------------------########## + +CC = avr-gcc +OBJCOPY = avr-objcopy +OBJDUMP = avr-objdump +AVRSIZE = avr-size +AVRDUDE = avrdude + +##########------------------------------------------------------########## +########## Makefile Magic! ########## +########## Summary: ########## +########## We want a .hex file ########## +########## Compile source files into .elf ########## +########## Convert .elf file into .hex ########## +########## You shouldn't need to edit below. ########## +##########------------------------------------------------------########## + +## The name of your project (without the .c) +# TARGET = blinkLED +## Or name it automatically after the enclosing directory +TARGET = $(lastword $(subst /, ,$(CURDIR))) + +# Object files: will find all .c/.h files in current directory +# and in LIBDIR. If you have any other (sub-)directories with code, +# you can add them in to SOURCES below in the wildcard statement. +SOURCES=$(wildcard *.c $(LIBDIR)/*.c) +OBJECTS=$(SOURCES:.c=.o) +HEADERS=$(SOURCES:.c=.h) + +## Compilation options, type man avr-gcc if you're curious. +CPPFLAGS = -DF_CPU=$(F_CPU) -DBAUD=$(BAUD) -I. -I$(LIBDIR) +CFLAGS = -Os -g -std=gnu99 -Wall +## Use short (8-bit) data types +CFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums +## Splits up object files per function +CFLAGS += -ffunction-sections -fdata-sections +LDFLAGS = -Wl,-Map,$(TARGET).map +## Optional, but often ends up with smaller code +LDFLAGS += -Wl,--gc-sections +## Relax shrinks code even more, but makes disassembly messy +## LDFLAGS += -Wl,--relax +## LDFLAGS += -Wl,-u,vfprintf -lprintf_flt -lm ## for floating-point printf +## LDFLAGS += -Wl,-u,vfprintf -lprintf_min ## for smaller printf +TARGET_ARCH = -mmcu=$(MCU) + +## Explicit pattern rules: +## To make .o files from .c files +%.o: %.c $(HEADERS) Makefile + $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c -o $@ $<; + +$(TARGET).elf: $(OBJECTS) + $(CC) $(LDFLAGS) $(TARGET_ARCH) $^ $(LDLIBS) -o $@ + +%.hex: %.elf + $(OBJCOPY) -j .text -j .data -O ihex $< $@ + +%.eeprom: %.elf + $(OBJCOPY) -j .eeprom --change-section-lma .eeprom=0 -O ihex $< $@ + +%.lst: %.elf + $(OBJDUMP) -S $< > $@ + +## These targets don't have files named after them +.PHONY: all disassemble disasm eeprom size clean squeaky_clean flash fuses + +all: $(TARGET).hex + +debug: + @echo + @echo "Source files:" $(SOURCES) + @echo "MCU, F_CPU, BAUD:" $(MCU), $(F_CPU), $(BAUD) + @echo + +# Optionally create listing file from .elf +# This creates approximate assembly-language equivalent of your code. +# Useful for debugging time-sensitive bits, +# or making sure the compiler does what you want. +disassemble: $(TARGET).lst + +disasm: disassemble + +# Optionally show how big the resulting program is +size: $(TARGET).elf + $(AVRSIZE) -C --mcu=$(MCU) $(TARGET).elf + +clean: + rm -f $(TARGET).elf $(TARGET).hex $(TARGET).obj \ + $(TARGET).o $(TARGET).d $(TARGET).eep $(TARGET).lst \ + $(TARGET).lss $(TARGET).sym $(TARGET).map $(TARGET)~ \ + $(TARGET).eeprom + +squeaky_clean: + rm -f *.elf *.hex *.obj *.o *.d *.eep *.lst *.lss *.sym *.map *~ *.eeprom + +##########------------------------------------------------------########## +########## Programmer-specific details ########## +########## Flashing code to AVR using avrdude ########## +##########------------------------------------------------------########## + +flash: $(TARGET).hex + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U flash:w:$< + +## An alias +program: flash + +flash_eeprom: $(TARGET).eeprom + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U eeprom:w:$< + +avrdude_terminal: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nt + +## If you've got multiple programmers that you use, +## you can define them here so that it's easy to switch. +## To invoke, use something like `make flash_arduinoISP` +flash_usbtiny: PROGRAMMER_TYPE = usbtiny +flash_usbtiny: PROGRAMMER_ARGS = # USBTiny works with no further arguments +flash_usbtiny: flash + +flash_usbasp: PROGRAMMER_TYPE = usbasp +flash_usbasp: PROGRAMMER_ARGS = # USBasp works with no further arguments +flash_usbasp: flash + +flash_arduinoISP: PROGRAMMER_TYPE = avrisp +flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P /dev/ttyACM0 +## (for windows) flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P com5 +flash_arduinoISP: flash + +flash_109: PROGRAMMER_TYPE = avr109 +flash_109: PROGRAMMER_ARGS = -b 9600 -P /dev/ttyUSB0 +flash_109: flash + +##########------------------------------------------------------########## +########## Fuse settings and suitable defaults ########## +##########------------------------------------------------------########## + +## Mega 48, 88, 168, 328 default values +LFUSE = 0x62 +HFUSE = 0xdf +EFUSE = 0x00 + +## Generic +FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m + +fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) \ + $(PROGRAMMER_ARGS) $(FUSE_STRING) +show_fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nv + +## Called with no extra definitions, sets to defaults +set_default_fuses: FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m +set_default_fuses: fuses + +## Set the fuse byte for full-speed mode +## Note: can also be set in firmware for modern chips +set_fast_fuse: LFUSE = 0xE2 +set_fast_fuse: FUSE_STRING = -U lfuse:w:$(LFUSE):m +set_fast_fuse: fuses + +## Set the EESAVE fuse byte to preserve EEPROM across flashes +set_eeprom_save_fuse: HFUSE = 0xD7 +set_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +set_eeprom_save_fuse: fuses + +## Clear the EESAVE fuse byte +clear_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +clear_eeprom_save_fuse: fuses diff --git a/Make AVR Examples/Chapter04_Bit-Twiddling/cylonEyes_8LFSR/8LFSR.c b/Make AVR Examples/Chapter04_Bit-Twiddling/cylonEyes_8LFSR/8LFSR.c new file mode 100644 index 0000000..aa33648 --- /dev/null +++ b/Make AVR Examples/Chapter04_Bit-Twiddling/cylonEyes_8LFSR/8LFSR.c @@ -0,0 +1,70 @@ +// ------- Preamble -------- // +#include +#include + +#define DELAY 100 /* ms */ + +static inline uint8_t LFSR8_step(uint8_t random); + +int main(void) { + + // -------- Inits --------- // + + DDRB = 0xff; /* output on all LEDs */ + uint8_t random = 1; /* can't init to 0, any other is ok */ + + // ------ Event loop ------ // + while (1) { + + /* Display and output */ + random = LFSR8_step(random); + PORTB = random; + _delay_ms(DELAY); + + } /* End event loop */ + return 0; +} + + +// ----------------- LFSR Routines ---------------- // + +inline uint8_t LFSR8_step(uint8_t random) { + /* + Takes an 8-bit number, takes one step in a () LFSR. + [3, 4, 5, 7] is the set of taps for 8-bits that goes through + the whole cycle before repeating. + + If you're really serious about randomness, you'll want a different + algorithm. In fact, this is a great demo of how "predictable" + the "pseudo-random" sequence is. + + Note that this is not a very efficient way to code this up, + but it's meant mostly for teaching and is plenty fast + because the compiler does an OK job with it. + */ + uint8_t tap1, tap2, tap3, tap4; + uint8_t newBit; + tap1 = 1 & (random >> 3); + tap2 = 1 & (random >> 4); + tap3 = 1 & (random >> 5); + tap4 = 1 & (random >> 7); + + newBit = tap1 ^ tap2 ^ tap3 ^ tap4; + random = ((random << 1) | newBit); + return (random); +} + + +inline uint16_t LFSR16(uint16_t random) { + // 3, 12, 14, 15 are the maximal taps for 16 bits. + uint16_t tap1, tap2, tap3, tap4; + uint16_t newBit; + tap1 = 1 & (random >> 3); + tap2 = 1 & (random >> 12); + tap3 = 1 & (random >> 14); + tap4 = 1 & (random >> 15); + + newBit = tap1 ^ tap2 ^ tap3 ^ tap4; + random = ((random << 1) | newBit); + return (random); +} diff --git a/Make AVR Examples/Chapter04_Bit-Twiddling/cylonEyes_8LFSR/Makefile b/Make AVR Examples/Chapter04_Bit-Twiddling/cylonEyes_8LFSR/Makefile new file mode 100644 index 0000000..3d9e544 --- /dev/null +++ b/Make AVR Examples/Chapter04_Bit-Twiddling/cylonEyes_8LFSR/Makefile @@ -0,0 +1,196 @@ + +##########------------------------------------------------------########## +########## Project-specific Details ########## +########## Check these every time you start a new project ########## +##########------------------------------------------------------########## + +MCU = atmega168p +F_CPU = 1000000UL +BAUD = 9600UL +## Also try BAUD = 19200 or 38400 if you're feeling lucky. + +## A directory for common include files and the simple USART library. +## If you move either the current folder or the Library folder, you'll +## need to change this path to match. +LIBDIR = ../../AVR-Programming-Library + +##########------------------------------------------------------########## +########## Programmer Defaults ########## +########## Set up once, then forget about it ########## +########## (Can override. See bottom of file.) ########## +##########------------------------------------------------------########## + +PROGRAMMER_TYPE = usbtiny +# extra arguments to avrdude: baud rate, chip type, -F flag, etc. +PROGRAMMER_ARGS = + +##########------------------------------------------------------########## +########## Program Locations ########## +########## Won't need to change if they're in your PATH ########## +##########------------------------------------------------------########## + +CC = avr-gcc +OBJCOPY = avr-objcopy +OBJDUMP = avr-objdump +AVRSIZE = avr-size +AVRDUDE = avrdude + +##########------------------------------------------------------########## +########## Makefile Magic! ########## +########## Summary: ########## +########## We want a .hex file ########## +########## Compile source files into .elf ########## +########## Convert .elf file into .hex ########## +########## You shouldn't need to edit below. ########## +##########------------------------------------------------------########## + +## The name of your project (without the .c) +# TARGET = blinkLED +## Or name it automatically after the enclosing directory +TARGET = $(lastword $(subst /, ,$(CURDIR))) + +# Object files: will find all .c/.h files in current directory +# and in LIBDIR. If you have any other (sub-)directories with code, +# you can add them in to SOURCES below in the wildcard statement. +SOURCES=$(wildcard *.c $(LIBDIR)/*.c) +OBJECTS=$(SOURCES:.c=.o) +HEADERS=$(SOURCES:.c=.h) + +## Compilation options, type man avr-gcc if you're curious. +CPPFLAGS = -DF_CPU=$(F_CPU) -DBAUD=$(BAUD) -I. -I$(LIBDIR) +CFLAGS = -Os -g -std=gnu99 -Wall +## Use short (8-bit) data types +CFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums +## Splits up object files per function +CFLAGS += -ffunction-sections -fdata-sections +LDFLAGS = -Wl,-Map,$(TARGET).map +## Optional, but often ends up with smaller code +LDFLAGS += -Wl,--gc-sections +## Relax shrinks code even more, but makes disassembly messy +## LDFLAGS += -Wl,--relax +## LDFLAGS += -Wl,-u,vfprintf -lprintf_flt -lm ## for floating-point printf +## LDFLAGS += -Wl,-u,vfprintf -lprintf_min ## for smaller printf +TARGET_ARCH = -mmcu=$(MCU) + +## Explicit pattern rules: +## To make .o files from .c files +%.o: %.c $(HEADERS) Makefile + $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c -o $@ $<; + +$(TARGET).elf: $(OBJECTS) + $(CC) $(LDFLAGS) $(TARGET_ARCH) $^ $(LDLIBS) -o $@ + +%.hex: %.elf + $(OBJCOPY) -j .text -j .data -O ihex $< $@ + +%.eeprom: %.elf + $(OBJCOPY) -j .eeprom --change-section-lma .eeprom=0 -O ihex $< $@ + +%.lst: %.elf + $(OBJDUMP) -S $< > $@ + +## These targets don't have files named after them +.PHONY: all disassemble disasm eeprom size clean squeaky_clean flash fuses + +all: $(TARGET).hex + +debug: + @echo + @echo "Source files:" $(SOURCES) + @echo "MCU, F_CPU, BAUD:" $(MCU), $(F_CPU), $(BAUD) + @echo + +# Optionally create listing file from .elf +# This creates approximate assembly-language equivalent of your code. +# Useful for debugging time-sensitive bits, +# or making sure the compiler does what you want. +disassemble: $(TARGET).lst + +disasm: disassemble + +# Optionally show how big the resulting program is +size: $(TARGET).elf + $(AVRSIZE) -C --mcu=$(MCU) $(TARGET).elf + +clean: + rm -f $(TARGET).elf $(TARGET).hex $(TARGET).obj \ + $(TARGET).o $(TARGET).d $(TARGET).eep $(TARGET).lst \ + $(TARGET).lss $(TARGET).sym $(TARGET).map $(TARGET)~ \ + $(TARGET).eeprom + +squeaky_clean: + rm -f *.elf *.hex *.obj *.o *.d *.eep *.lst *.lss *.sym *.map *~ *.eeprom + +##########------------------------------------------------------########## +########## Programmer-specific details ########## +########## Flashing code to AVR using avrdude ########## +##########------------------------------------------------------########## + +flash: $(TARGET).hex + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U flash:w:$< + +## An alias +program: flash + +flash_eeprom: $(TARGET).eeprom + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U eeprom:w:$< + +avrdude_terminal: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nt + +## If you've got multiple programmers that you use, +## you can define them here so that it's easy to switch. +## To invoke, use something like `make flash_arduinoISP` +flash_usbtiny: PROGRAMMER_TYPE = usbtiny +flash_usbtiny: PROGRAMMER_ARGS = # USBTiny works with no further arguments +flash_usbtiny: flash + +flash_usbasp: PROGRAMMER_TYPE = usbasp +flash_usbasp: PROGRAMMER_ARGS = # USBasp works with no further arguments +flash_usbasp: flash + +flash_arduinoISP: PROGRAMMER_TYPE = avrisp +flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P /dev/ttyACM0 +## (for windows) flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P com5 +flash_arduinoISP: flash + +flash_109: PROGRAMMER_TYPE = avr109 +flash_109: PROGRAMMER_ARGS = -b 9600 -P /dev/ttyUSB0 +flash_109: flash + +##########------------------------------------------------------########## +########## Fuse settings and suitable defaults ########## +##########------------------------------------------------------########## + +## Mega 48, 88, 168, 328 default values +LFUSE = 0x62 +HFUSE = 0xdf +EFUSE = 0x00 + +## Generic +FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m + +fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) \ + $(PROGRAMMER_ARGS) $(FUSE_STRING) +show_fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nv + +## Called with no extra definitions, sets to defaults +set_default_fuses: FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m +set_default_fuses: fuses + +## Set the fuse byte for full-speed mode +## Note: can also be set in firmware for modern chips +set_fast_fuse: LFUSE = 0xE2 +set_fast_fuse: FUSE_STRING = -U lfuse:w:$(LFUSE):m +set_fast_fuse: fuses + +## Set the EESAVE fuse byte to preserve EEPROM across flashes +set_eeprom_save_fuse: HFUSE = 0xD7 +set_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +set_eeprom_save_fuse: fuses + +## Clear the EESAVE fuse byte +clear_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +clear_eeprom_save_fuse: fuses diff --git a/Make AVR Examples/Chapter04_Bit-Twiddling/cylonEyes_counting/Makefile b/Make AVR Examples/Chapter04_Bit-Twiddling/cylonEyes_counting/Makefile new file mode 100644 index 0000000..3d9e544 --- /dev/null +++ b/Make AVR Examples/Chapter04_Bit-Twiddling/cylonEyes_counting/Makefile @@ -0,0 +1,196 @@ + +##########------------------------------------------------------########## +########## Project-specific Details ########## +########## Check these every time you start a new project ########## +##########------------------------------------------------------########## + +MCU = atmega168p +F_CPU = 1000000UL +BAUD = 9600UL +## Also try BAUD = 19200 or 38400 if you're feeling lucky. + +## A directory for common include files and the simple USART library. +## If you move either the current folder or the Library folder, you'll +## need to change this path to match. +LIBDIR = ../../AVR-Programming-Library + +##########------------------------------------------------------########## +########## Programmer Defaults ########## +########## Set up once, then forget about it ########## +########## (Can override. See bottom of file.) ########## +##########------------------------------------------------------########## + +PROGRAMMER_TYPE = usbtiny +# extra arguments to avrdude: baud rate, chip type, -F flag, etc. +PROGRAMMER_ARGS = + +##########------------------------------------------------------########## +########## Program Locations ########## +########## Won't need to change if they're in your PATH ########## +##########------------------------------------------------------########## + +CC = avr-gcc +OBJCOPY = avr-objcopy +OBJDUMP = avr-objdump +AVRSIZE = avr-size +AVRDUDE = avrdude + +##########------------------------------------------------------########## +########## Makefile Magic! ########## +########## Summary: ########## +########## We want a .hex file ########## +########## Compile source files into .elf ########## +########## Convert .elf file into .hex ########## +########## You shouldn't need to edit below. ########## +##########------------------------------------------------------########## + +## The name of your project (without the .c) +# TARGET = blinkLED +## Or name it automatically after the enclosing directory +TARGET = $(lastword $(subst /, ,$(CURDIR))) + +# Object files: will find all .c/.h files in current directory +# and in LIBDIR. If you have any other (sub-)directories with code, +# you can add them in to SOURCES below in the wildcard statement. +SOURCES=$(wildcard *.c $(LIBDIR)/*.c) +OBJECTS=$(SOURCES:.c=.o) +HEADERS=$(SOURCES:.c=.h) + +## Compilation options, type man avr-gcc if you're curious. +CPPFLAGS = -DF_CPU=$(F_CPU) -DBAUD=$(BAUD) -I. -I$(LIBDIR) +CFLAGS = -Os -g -std=gnu99 -Wall +## Use short (8-bit) data types +CFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums +## Splits up object files per function +CFLAGS += -ffunction-sections -fdata-sections +LDFLAGS = -Wl,-Map,$(TARGET).map +## Optional, but often ends up with smaller code +LDFLAGS += -Wl,--gc-sections +## Relax shrinks code even more, but makes disassembly messy +## LDFLAGS += -Wl,--relax +## LDFLAGS += -Wl,-u,vfprintf -lprintf_flt -lm ## for floating-point printf +## LDFLAGS += -Wl,-u,vfprintf -lprintf_min ## for smaller printf +TARGET_ARCH = -mmcu=$(MCU) + +## Explicit pattern rules: +## To make .o files from .c files +%.o: %.c $(HEADERS) Makefile + $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c -o $@ $<; + +$(TARGET).elf: $(OBJECTS) + $(CC) $(LDFLAGS) $(TARGET_ARCH) $^ $(LDLIBS) -o $@ + +%.hex: %.elf + $(OBJCOPY) -j .text -j .data -O ihex $< $@ + +%.eeprom: %.elf + $(OBJCOPY) -j .eeprom --change-section-lma .eeprom=0 -O ihex $< $@ + +%.lst: %.elf + $(OBJDUMP) -S $< > $@ + +## These targets don't have files named after them +.PHONY: all disassemble disasm eeprom size clean squeaky_clean flash fuses + +all: $(TARGET).hex + +debug: + @echo + @echo "Source files:" $(SOURCES) + @echo "MCU, F_CPU, BAUD:" $(MCU), $(F_CPU), $(BAUD) + @echo + +# Optionally create listing file from .elf +# This creates approximate assembly-language equivalent of your code. +# Useful for debugging time-sensitive bits, +# or making sure the compiler does what you want. +disassemble: $(TARGET).lst + +disasm: disassemble + +# Optionally show how big the resulting program is +size: $(TARGET).elf + $(AVRSIZE) -C --mcu=$(MCU) $(TARGET).elf + +clean: + rm -f $(TARGET).elf $(TARGET).hex $(TARGET).obj \ + $(TARGET).o $(TARGET).d $(TARGET).eep $(TARGET).lst \ + $(TARGET).lss $(TARGET).sym $(TARGET).map $(TARGET)~ \ + $(TARGET).eeprom + +squeaky_clean: + rm -f *.elf *.hex *.obj *.o *.d *.eep *.lst *.lss *.sym *.map *~ *.eeprom + +##########------------------------------------------------------########## +########## Programmer-specific details ########## +########## Flashing code to AVR using avrdude ########## +##########------------------------------------------------------########## + +flash: $(TARGET).hex + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U flash:w:$< + +## An alias +program: flash + +flash_eeprom: $(TARGET).eeprom + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U eeprom:w:$< + +avrdude_terminal: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nt + +## If you've got multiple programmers that you use, +## you can define them here so that it's easy to switch. +## To invoke, use something like `make flash_arduinoISP` +flash_usbtiny: PROGRAMMER_TYPE = usbtiny +flash_usbtiny: PROGRAMMER_ARGS = # USBTiny works with no further arguments +flash_usbtiny: flash + +flash_usbasp: PROGRAMMER_TYPE = usbasp +flash_usbasp: PROGRAMMER_ARGS = # USBasp works with no further arguments +flash_usbasp: flash + +flash_arduinoISP: PROGRAMMER_TYPE = avrisp +flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P /dev/ttyACM0 +## (for windows) flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P com5 +flash_arduinoISP: flash + +flash_109: PROGRAMMER_TYPE = avr109 +flash_109: PROGRAMMER_ARGS = -b 9600 -P /dev/ttyUSB0 +flash_109: flash + +##########------------------------------------------------------########## +########## Fuse settings and suitable defaults ########## +##########------------------------------------------------------########## + +## Mega 48, 88, 168, 328 default values +LFUSE = 0x62 +HFUSE = 0xdf +EFUSE = 0x00 + +## Generic +FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m + +fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) \ + $(PROGRAMMER_ARGS) $(FUSE_STRING) +show_fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nv + +## Called with no extra definitions, sets to defaults +set_default_fuses: FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m +set_default_fuses: fuses + +## Set the fuse byte for full-speed mode +## Note: can also be set in firmware for modern chips +set_fast_fuse: LFUSE = 0xE2 +set_fast_fuse: FUSE_STRING = -U lfuse:w:$(LFUSE):m +set_fast_fuse: fuses + +## Set the EESAVE fuse byte to preserve EEPROM across flashes +set_eeprom_save_fuse: HFUSE = 0xD7 +set_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +set_eeprom_save_fuse: fuses + +## Clear the EESAVE fuse byte +clear_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +clear_eeprom_save_fuse: fuses diff --git a/Make AVR Examples/Chapter04_Bit-Twiddling/cylonEyes_counting/counting.c b/Make AVR Examples/Chapter04_Bit-Twiddling/cylonEyes_counting/counting.c new file mode 100644 index 0000000..018fe6c --- /dev/null +++ b/Make AVR Examples/Chapter04_Bit-Twiddling/cylonEyes_counting/counting.c @@ -0,0 +1,15 @@ +#include /* Defines pins, ports, etc */ +#define F_CPU 1000000UL /* Sets up the chip speed for delay.h */ +#include /* Functions to waste time */ + +#define DELAYTIME 100 + +int main(void) { + DDRB = 0b11111111; + PORTB = 0; + + while (1) { + PORTB = PORTB + 1; + _delay_ms(DELAYTIME); + } +} diff --git a/Make AVR Examples/Chapter04_Bit-Twiddling/cylonEyes_halfStepping/Makefile b/Make AVR Examples/Chapter04_Bit-Twiddling/cylonEyes_halfStepping/Makefile new file mode 100644 index 0000000..3d9e544 --- /dev/null +++ b/Make AVR Examples/Chapter04_Bit-Twiddling/cylonEyes_halfStepping/Makefile @@ -0,0 +1,196 @@ + +##########------------------------------------------------------########## +########## Project-specific Details ########## +########## Check these every time you start a new project ########## +##########------------------------------------------------------########## + +MCU = atmega168p +F_CPU = 1000000UL +BAUD = 9600UL +## Also try BAUD = 19200 or 38400 if you're feeling lucky. + +## A directory for common include files and the simple USART library. +## If you move either the current folder or the Library folder, you'll +## need to change this path to match. +LIBDIR = ../../AVR-Programming-Library + +##########------------------------------------------------------########## +########## Programmer Defaults ########## +########## Set up once, then forget about it ########## +########## (Can override. See bottom of file.) ########## +##########------------------------------------------------------########## + +PROGRAMMER_TYPE = usbtiny +# extra arguments to avrdude: baud rate, chip type, -F flag, etc. +PROGRAMMER_ARGS = + +##########------------------------------------------------------########## +########## Program Locations ########## +########## Won't need to change if they're in your PATH ########## +##########------------------------------------------------------########## + +CC = avr-gcc +OBJCOPY = avr-objcopy +OBJDUMP = avr-objdump +AVRSIZE = avr-size +AVRDUDE = avrdude + +##########------------------------------------------------------########## +########## Makefile Magic! ########## +########## Summary: ########## +########## We want a .hex file ########## +########## Compile source files into .elf ########## +########## Convert .elf file into .hex ########## +########## You shouldn't need to edit below. ########## +##########------------------------------------------------------########## + +## The name of your project (without the .c) +# TARGET = blinkLED +## Or name it automatically after the enclosing directory +TARGET = $(lastword $(subst /, ,$(CURDIR))) + +# Object files: will find all .c/.h files in current directory +# and in LIBDIR. If you have any other (sub-)directories with code, +# you can add them in to SOURCES below in the wildcard statement. +SOURCES=$(wildcard *.c $(LIBDIR)/*.c) +OBJECTS=$(SOURCES:.c=.o) +HEADERS=$(SOURCES:.c=.h) + +## Compilation options, type man avr-gcc if you're curious. +CPPFLAGS = -DF_CPU=$(F_CPU) -DBAUD=$(BAUD) -I. -I$(LIBDIR) +CFLAGS = -Os -g -std=gnu99 -Wall +## Use short (8-bit) data types +CFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums +## Splits up object files per function +CFLAGS += -ffunction-sections -fdata-sections +LDFLAGS = -Wl,-Map,$(TARGET).map +## Optional, but often ends up with smaller code +LDFLAGS += -Wl,--gc-sections +## Relax shrinks code even more, but makes disassembly messy +## LDFLAGS += -Wl,--relax +## LDFLAGS += -Wl,-u,vfprintf -lprintf_flt -lm ## for floating-point printf +## LDFLAGS += -Wl,-u,vfprintf -lprintf_min ## for smaller printf +TARGET_ARCH = -mmcu=$(MCU) + +## Explicit pattern rules: +## To make .o files from .c files +%.o: %.c $(HEADERS) Makefile + $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c -o $@ $<; + +$(TARGET).elf: $(OBJECTS) + $(CC) $(LDFLAGS) $(TARGET_ARCH) $^ $(LDLIBS) -o $@ + +%.hex: %.elf + $(OBJCOPY) -j .text -j .data -O ihex $< $@ + +%.eeprom: %.elf + $(OBJCOPY) -j .eeprom --change-section-lma .eeprom=0 -O ihex $< $@ + +%.lst: %.elf + $(OBJDUMP) -S $< > $@ + +## These targets don't have files named after them +.PHONY: all disassemble disasm eeprom size clean squeaky_clean flash fuses + +all: $(TARGET).hex + +debug: + @echo + @echo "Source files:" $(SOURCES) + @echo "MCU, F_CPU, BAUD:" $(MCU), $(F_CPU), $(BAUD) + @echo + +# Optionally create listing file from .elf +# This creates approximate assembly-language equivalent of your code. +# Useful for debugging time-sensitive bits, +# or making sure the compiler does what you want. +disassemble: $(TARGET).lst + +disasm: disassemble + +# Optionally show how big the resulting program is +size: $(TARGET).elf + $(AVRSIZE) -C --mcu=$(MCU) $(TARGET).elf + +clean: + rm -f $(TARGET).elf $(TARGET).hex $(TARGET).obj \ + $(TARGET).o $(TARGET).d $(TARGET).eep $(TARGET).lst \ + $(TARGET).lss $(TARGET).sym $(TARGET).map $(TARGET)~ \ + $(TARGET).eeprom + +squeaky_clean: + rm -f *.elf *.hex *.obj *.o *.d *.eep *.lst *.lss *.sym *.map *~ *.eeprom + +##########------------------------------------------------------########## +########## Programmer-specific details ########## +########## Flashing code to AVR using avrdude ########## +##########------------------------------------------------------########## + +flash: $(TARGET).hex + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U flash:w:$< + +## An alias +program: flash + +flash_eeprom: $(TARGET).eeprom + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U eeprom:w:$< + +avrdude_terminal: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nt + +## If you've got multiple programmers that you use, +## you can define them here so that it's easy to switch. +## To invoke, use something like `make flash_arduinoISP` +flash_usbtiny: PROGRAMMER_TYPE = usbtiny +flash_usbtiny: PROGRAMMER_ARGS = # USBTiny works with no further arguments +flash_usbtiny: flash + +flash_usbasp: PROGRAMMER_TYPE = usbasp +flash_usbasp: PROGRAMMER_ARGS = # USBasp works with no further arguments +flash_usbasp: flash + +flash_arduinoISP: PROGRAMMER_TYPE = avrisp +flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P /dev/ttyACM0 +## (for windows) flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P com5 +flash_arduinoISP: flash + +flash_109: PROGRAMMER_TYPE = avr109 +flash_109: PROGRAMMER_ARGS = -b 9600 -P /dev/ttyUSB0 +flash_109: flash + +##########------------------------------------------------------########## +########## Fuse settings and suitable defaults ########## +##########------------------------------------------------------########## + +## Mega 48, 88, 168, 328 default values +LFUSE = 0x62 +HFUSE = 0xdf +EFUSE = 0x00 + +## Generic +FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m + +fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) \ + $(PROGRAMMER_ARGS) $(FUSE_STRING) +show_fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nv + +## Called with no extra definitions, sets to defaults +set_default_fuses: FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m +set_default_fuses: fuses + +## Set the fuse byte for full-speed mode +## Note: can also be set in firmware for modern chips +set_fast_fuse: LFUSE = 0xE2 +set_fast_fuse: FUSE_STRING = -U lfuse:w:$(LFUSE):m +set_fast_fuse: fuses + +## Set the EESAVE fuse byte to preserve EEPROM across flashes +set_eeprom_save_fuse: HFUSE = 0xD7 +set_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +set_eeprom_save_fuse: fuses + +## Clear the EESAVE fuse byte +clear_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +clear_eeprom_save_fuse: fuses diff --git a/Make AVR Examples/Chapter04_Bit-Twiddling/cylonEyes_halfStepping/cylonEyes_halfStepping.c b/Make AVR Examples/Chapter04_Bit-Twiddling/cylonEyes_halfStepping/cylonEyes_halfStepping.c new file mode 100644 index 0000000..c1418ee --- /dev/null +++ b/Make AVR Examples/Chapter04_Bit-Twiddling/cylonEyes_halfStepping/cylonEyes_halfStepping.c @@ -0,0 +1,45 @@ +/* Cylon Eyes + Half-stepping turns the next light on for a little bit, + makes the pattern visually smoother, improves overall + cylonity. +*/ + +// ------- Preamble -------- // +#include /* Defines pins, ports, etc */ +#include /* Functions to waste time */ + +#define DELAYTIME 85 /* milliseconds, 50-75 is good for smooth eyes */ + +int main(void) { + + // -------- Inits --------- // + uint8_t i; + DDRB = 0xff; /* Data Direction Register B: + all set up for output */ + + // ------ Event loop ------ // + while (1) { /* mainloop */ + + for (i = 0; i < 7; i++) { /* count i from 0 to 6 */ + PORTB |= (1 << i); /* turn on led i */ + _delay_ms(DELAYTIME); /* wait */ + + PORTB |= (1 << (i + 1)); /* turn the next led on */ + _delay_ms(DELAYTIME / 2); + + PORTB &= ~(1 << i); /* turn off led i */ + } + + for (i = 7; i > 0; i--) { /* count i from 7 to 1 */ + PORTB |= (1 << i); + _delay_ms(DELAYTIME); + + PORTB |= (1 << (i - 1)); /* turn the next led on */ + _delay_ms(DELAYTIME / 2); + + PORTB &= ~(1 << i); /* turn off led i */ + } + + } /* End event loop */ + return 0; +} /* end main */ diff --git a/Make AVR Examples/Chapter04_Bit-Twiddling/cylonEyes_naive/Makefile b/Make AVR Examples/Chapter04_Bit-Twiddling/cylonEyes_naive/Makefile new file mode 100644 index 0000000..3d9e544 --- /dev/null +++ b/Make AVR Examples/Chapter04_Bit-Twiddling/cylonEyes_naive/Makefile @@ -0,0 +1,196 @@ + +##########------------------------------------------------------########## +########## Project-specific Details ########## +########## Check these every time you start a new project ########## +##########------------------------------------------------------########## + +MCU = atmega168p +F_CPU = 1000000UL +BAUD = 9600UL +## Also try BAUD = 19200 or 38400 if you're feeling lucky. + +## A directory for common include files and the simple USART library. +## If you move either the current folder or the Library folder, you'll +## need to change this path to match. +LIBDIR = ../../AVR-Programming-Library + +##########------------------------------------------------------########## +########## Programmer Defaults ########## +########## Set up once, then forget about it ########## +########## (Can override. See bottom of file.) ########## +##########------------------------------------------------------########## + +PROGRAMMER_TYPE = usbtiny +# extra arguments to avrdude: baud rate, chip type, -F flag, etc. +PROGRAMMER_ARGS = + +##########------------------------------------------------------########## +########## Program Locations ########## +########## Won't need to change if they're in your PATH ########## +##########------------------------------------------------------########## + +CC = avr-gcc +OBJCOPY = avr-objcopy +OBJDUMP = avr-objdump +AVRSIZE = avr-size +AVRDUDE = avrdude + +##########------------------------------------------------------########## +########## Makefile Magic! ########## +########## Summary: ########## +########## We want a .hex file ########## +########## Compile source files into .elf ########## +########## Convert .elf file into .hex ########## +########## You shouldn't need to edit below. ########## +##########------------------------------------------------------########## + +## The name of your project (without the .c) +# TARGET = blinkLED +## Or name it automatically after the enclosing directory +TARGET = $(lastword $(subst /, ,$(CURDIR))) + +# Object files: will find all .c/.h files in current directory +# and in LIBDIR. If you have any other (sub-)directories with code, +# you can add them in to SOURCES below in the wildcard statement. +SOURCES=$(wildcard *.c $(LIBDIR)/*.c) +OBJECTS=$(SOURCES:.c=.o) +HEADERS=$(SOURCES:.c=.h) + +## Compilation options, type man avr-gcc if you're curious. +CPPFLAGS = -DF_CPU=$(F_CPU) -DBAUD=$(BAUD) -I. -I$(LIBDIR) +CFLAGS = -Os -g -std=gnu99 -Wall +## Use short (8-bit) data types +CFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums +## Splits up object files per function +CFLAGS += -ffunction-sections -fdata-sections +LDFLAGS = -Wl,-Map,$(TARGET).map +## Optional, but often ends up with smaller code +LDFLAGS += -Wl,--gc-sections +## Relax shrinks code even more, but makes disassembly messy +## LDFLAGS += -Wl,--relax +## LDFLAGS += -Wl,-u,vfprintf -lprintf_flt -lm ## for floating-point printf +## LDFLAGS += -Wl,-u,vfprintf -lprintf_min ## for smaller printf +TARGET_ARCH = -mmcu=$(MCU) + +## Explicit pattern rules: +## To make .o files from .c files +%.o: %.c $(HEADERS) Makefile + $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c -o $@ $<; + +$(TARGET).elf: $(OBJECTS) + $(CC) $(LDFLAGS) $(TARGET_ARCH) $^ $(LDLIBS) -o $@ + +%.hex: %.elf + $(OBJCOPY) -j .text -j .data -O ihex $< $@ + +%.eeprom: %.elf + $(OBJCOPY) -j .eeprom --change-section-lma .eeprom=0 -O ihex $< $@ + +%.lst: %.elf + $(OBJDUMP) -S $< > $@ + +## These targets don't have files named after them +.PHONY: all disassemble disasm eeprom size clean squeaky_clean flash fuses + +all: $(TARGET).hex + +debug: + @echo + @echo "Source files:" $(SOURCES) + @echo "MCU, F_CPU, BAUD:" $(MCU), $(F_CPU), $(BAUD) + @echo + +# Optionally create listing file from .elf +# This creates approximate assembly-language equivalent of your code. +# Useful for debugging time-sensitive bits, +# or making sure the compiler does what you want. +disassemble: $(TARGET).lst + +disasm: disassemble + +# Optionally show how big the resulting program is +size: $(TARGET).elf + $(AVRSIZE) -C --mcu=$(MCU) $(TARGET).elf + +clean: + rm -f $(TARGET).elf $(TARGET).hex $(TARGET).obj \ + $(TARGET).o $(TARGET).d $(TARGET).eep $(TARGET).lst \ + $(TARGET).lss $(TARGET).sym $(TARGET).map $(TARGET)~ \ + $(TARGET).eeprom + +squeaky_clean: + rm -f *.elf *.hex *.obj *.o *.d *.eep *.lst *.lss *.sym *.map *~ *.eeprom + +##########------------------------------------------------------########## +########## Programmer-specific details ########## +########## Flashing code to AVR using avrdude ########## +##########------------------------------------------------------########## + +flash: $(TARGET).hex + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U flash:w:$< + +## An alias +program: flash + +flash_eeprom: $(TARGET).eeprom + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U eeprom:w:$< + +avrdude_terminal: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nt + +## If you've got multiple programmers that you use, +## you can define them here so that it's easy to switch. +## To invoke, use something like `make flash_arduinoISP` +flash_usbtiny: PROGRAMMER_TYPE = usbtiny +flash_usbtiny: PROGRAMMER_ARGS = # USBTiny works with no further arguments +flash_usbtiny: flash + +flash_usbasp: PROGRAMMER_TYPE = usbasp +flash_usbasp: PROGRAMMER_ARGS = # USBasp works with no further arguments +flash_usbasp: flash + +flash_arduinoISP: PROGRAMMER_TYPE = avrisp +flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P /dev/ttyACM0 +## (for windows) flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P com5 +flash_arduinoISP: flash + +flash_109: PROGRAMMER_TYPE = avr109 +flash_109: PROGRAMMER_ARGS = -b 9600 -P /dev/ttyUSB0 +flash_109: flash + +##########------------------------------------------------------########## +########## Fuse settings and suitable defaults ########## +##########------------------------------------------------------########## + +## Mega 48, 88, 168, 328 default values +LFUSE = 0x62 +HFUSE = 0xdf +EFUSE = 0x00 + +## Generic +FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m + +fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) \ + $(PROGRAMMER_ARGS) $(FUSE_STRING) +show_fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nv + +## Called with no extra definitions, sets to defaults +set_default_fuses: FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m +set_default_fuses: fuses + +## Set the fuse byte for full-speed mode +## Note: can also be set in firmware for modern chips +set_fast_fuse: LFUSE = 0xE2 +set_fast_fuse: FUSE_STRING = -U lfuse:w:$(LFUSE):m +set_fast_fuse: fuses + +## Set the EESAVE fuse byte to preserve EEPROM across flashes +set_eeprom_save_fuse: HFUSE = 0xD7 +set_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +set_eeprom_save_fuse: fuses + +## Clear the EESAVE fuse byte +clear_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +clear_eeprom_save_fuse: fuses diff --git a/Make AVR Examples/Chapter04_Bit-Twiddling/cylonEyes_naive/cylonEyes_naive.c b/Make AVR Examples/Chapter04_Bit-Twiddling/cylonEyes_naive/cylonEyes_naive.c new file mode 100644 index 0000000..434fa93 --- /dev/null +++ b/Make AVR Examples/Chapter04_Bit-Twiddling/cylonEyes_naive/cylonEyes_naive.c @@ -0,0 +1,42 @@ +#include /* Defines pins, ports, etc */ +#define F_CPU 1000000UL /* Sets up the chip speed for delay.h */ +#include /* Functions to waste time */ + +#define DELAYTIME 75 /* milliseconds */ + +int main(void) { + + DDRB = 0b11111111; /* Data Direction Register B: + all set up for output */ + + while (1) { + PORTB = 0b00000001; + _delay_ms(DELAYTIME); + PORTB = 0b00000010; + _delay_ms(DELAYTIME); + PORTB = 0b00000100; + _delay_ms(DELAYTIME); + PORTB = 0b00001000; + _delay_ms(DELAYTIME); + PORTB = 0b00010000; + _delay_ms(DELAYTIME); + PORTB = 0b00100000; + _delay_ms(DELAYTIME); + PORTB = 0b01000000; + _delay_ms(DELAYTIME); + PORTB = 0b10000000; + _delay_ms(DELAYTIME); + PORTB = 0b01000000; + _delay_ms(DELAYTIME); + PORTB = 0b00100000; + _delay_ms(DELAYTIME); + PORTB = 0b00010000; + _delay_ms(DELAYTIME); + PORTB = 0b00001000; + _delay_ms(DELAYTIME); + PORTB = 0b00000100; + _delay_ms(DELAYTIME); + PORTB = 0b00000010; + _delay_ms(DELAYTIME); + } +} diff --git a/Make AVR Examples/Chapter04_Bit-Twiddling/cylonEyes_quasiRandomToggle/Makefile b/Make AVR Examples/Chapter04_Bit-Twiddling/cylonEyes_quasiRandomToggle/Makefile new file mode 100644 index 0000000..3d9e544 --- /dev/null +++ b/Make AVR Examples/Chapter04_Bit-Twiddling/cylonEyes_quasiRandomToggle/Makefile @@ -0,0 +1,196 @@ + +##########------------------------------------------------------########## +########## Project-specific Details ########## +########## Check these every time you start a new project ########## +##########------------------------------------------------------########## + +MCU = atmega168p +F_CPU = 1000000UL +BAUD = 9600UL +## Also try BAUD = 19200 or 38400 if you're feeling lucky. + +## A directory for common include files and the simple USART library. +## If you move either the current folder or the Library folder, you'll +## need to change this path to match. +LIBDIR = ../../AVR-Programming-Library + +##########------------------------------------------------------########## +########## Programmer Defaults ########## +########## Set up once, then forget about it ########## +########## (Can override. See bottom of file.) ########## +##########------------------------------------------------------########## + +PROGRAMMER_TYPE = usbtiny +# extra arguments to avrdude: baud rate, chip type, -F flag, etc. +PROGRAMMER_ARGS = + +##########------------------------------------------------------########## +########## Program Locations ########## +########## Won't need to change if they're in your PATH ########## +##########------------------------------------------------------########## + +CC = avr-gcc +OBJCOPY = avr-objcopy +OBJDUMP = avr-objdump +AVRSIZE = avr-size +AVRDUDE = avrdude + +##########------------------------------------------------------########## +########## Makefile Magic! ########## +########## Summary: ########## +########## We want a .hex file ########## +########## Compile source files into .elf ########## +########## Convert .elf file into .hex ########## +########## You shouldn't need to edit below. ########## +##########------------------------------------------------------########## + +## The name of your project (without the .c) +# TARGET = blinkLED +## Or name it automatically after the enclosing directory +TARGET = $(lastword $(subst /, ,$(CURDIR))) + +# Object files: will find all .c/.h files in current directory +# and in LIBDIR. If you have any other (sub-)directories with code, +# you can add them in to SOURCES below in the wildcard statement. +SOURCES=$(wildcard *.c $(LIBDIR)/*.c) +OBJECTS=$(SOURCES:.c=.o) +HEADERS=$(SOURCES:.c=.h) + +## Compilation options, type man avr-gcc if you're curious. +CPPFLAGS = -DF_CPU=$(F_CPU) -DBAUD=$(BAUD) -I. -I$(LIBDIR) +CFLAGS = -Os -g -std=gnu99 -Wall +## Use short (8-bit) data types +CFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums +## Splits up object files per function +CFLAGS += -ffunction-sections -fdata-sections +LDFLAGS = -Wl,-Map,$(TARGET).map +## Optional, but often ends up with smaller code +LDFLAGS += -Wl,--gc-sections +## Relax shrinks code even more, but makes disassembly messy +## LDFLAGS += -Wl,--relax +## LDFLAGS += -Wl,-u,vfprintf -lprintf_flt -lm ## for floating-point printf +## LDFLAGS += -Wl,-u,vfprintf -lprintf_min ## for smaller printf +TARGET_ARCH = -mmcu=$(MCU) + +## Explicit pattern rules: +## To make .o files from .c files +%.o: %.c $(HEADERS) Makefile + $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c -o $@ $<; + +$(TARGET).elf: $(OBJECTS) + $(CC) $(LDFLAGS) $(TARGET_ARCH) $^ $(LDLIBS) -o $@ + +%.hex: %.elf + $(OBJCOPY) -j .text -j .data -O ihex $< $@ + +%.eeprom: %.elf + $(OBJCOPY) -j .eeprom --change-section-lma .eeprom=0 -O ihex $< $@ + +%.lst: %.elf + $(OBJDUMP) -S $< > $@ + +## These targets don't have files named after them +.PHONY: all disassemble disasm eeprom size clean squeaky_clean flash fuses + +all: $(TARGET).hex + +debug: + @echo + @echo "Source files:" $(SOURCES) + @echo "MCU, F_CPU, BAUD:" $(MCU), $(F_CPU), $(BAUD) + @echo + +# Optionally create listing file from .elf +# This creates approximate assembly-language equivalent of your code. +# Useful for debugging time-sensitive bits, +# or making sure the compiler does what you want. +disassemble: $(TARGET).lst + +disasm: disassemble + +# Optionally show how big the resulting program is +size: $(TARGET).elf + $(AVRSIZE) -C --mcu=$(MCU) $(TARGET).elf + +clean: + rm -f $(TARGET).elf $(TARGET).hex $(TARGET).obj \ + $(TARGET).o $(TARGET).d $(TARGET).eep $(TARGET).lst \ + $(TARGET).lss $(TARGET).sym $(TARGET).map $(TARGET)~ \ + $(TARGET).eeprom + +squeaky_clean: + rm -f *.elf *.hex *.obj *.o *.d *.eep *.lst *.lss *.sym *.map *~ *.eeprom + +##########------------------------------------------------------########## +########## Programmer-specific details ########## +########## Flashing code to AVR using avrdude ########## +##########------------------------------------------------------########## + +flash: $(TARGET).hex + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U flash:w:$< + +## An alias +program: flash + +flash_eeprom: $(TARGET).eeprom + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U eeprom:w:$< + +avrdude_terminal: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nt + +## If you've got multiple programmers that you use, +## you can define them here so that it's easy to switch. +## To invoke, use something like `make flash_arduinoISP` +flash_usbtiny: PROGRAMMER_TYPE = usbtiny +flash_usbtiny: PROGRAMMER_ARGS = # USBTiny works with no further arguments +flash_usbtiny: flash + +flash_usbasp: PROGRAMMER_TYPE = usbasp +flash_usbasp: PROGRAMMER_ARGS = # USBasp works with no further arguments +flash_usbasp: flash + +flash_arduinoISP: PROGRAMMER_TYPE = avrisp +flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P /dev/ttyACM0 +## (for windows) flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P com5 +flash_arduinoISP: flash + +flash_109: PROGRAMMER_TYPE = avr109 +flash_109: PROGRAMMER_ARGS = -b 9600 -P /dev/ttyUSB0 +flash_109: flash + +##########------------------------------------------------------########## +########## Fuse settings and suitable defaults ########## +##########------------------------------------------------------########## + +## Mega 48, 88, 168, 328 default values +LFUSE = 0x62 +HFUSE = 0xdf +EFUSE = 0x00 + +## Generic +FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m + +fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) \ + $(PROGRAMMER_ARGS) $(FUSE_STRING) +show_fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nv + +## Called with no extra definitions, sets to defaults +set_default_fuses: FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m +set_default_fuses: fuses + +## Set the fuse byte for full-speed mode +## Note: can also be set in firmware for modern chips +set_fast_fuse: LFUSE = 0xE2 +set_fast_fuse: FUSE_STRING = -U lfuse:w:$(LFUSE):m +set_fast_fuse: fuses + +## Set the EESAVE fuse byte to preserve EEPROM across flashes +set_eeprom_save_fuse: HFUSE = 0xD7 +set_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +set_eeprom_save_fuse: fuses + +## Clear the EESAVE fuse byte +clear_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +clear_eeprom_save_fuse: fuses diff --git a/Make AVR Examples/Chapter04_Bit-Twiddling/cylonEyes_quasiRandomToggle/quasiRandomToggle.c b/Make AVR Examples/Chapter04_Bit-Twiddling/cylonEyes_quasiRandomToggle/quasiRandomToggle.c new file mode 100644 index 0000000..2b0ff82 --- /dev/null +++ b/Make AVR Examples/Chapter04_Bit-Twiddling/cylonEyes_quasiRandomToggle/quasiRandomToggle.c @@ -0,0 +1,30 @@ + /* Cylon Eyes */ + +// ------- Preamble -------- // +#include /* Defines pins, ports, etc */ +#include /* Functions to waste time */ + +#define DELAYTIME 45 /* milliseconds */ +#define LED_PORT PORTB +#define LED_PIN PINB +#define LED_DDR DDRB + +int main(void) { + + // -------- Inits --------- // + uint16_t x = 0x1234; + uint8_t y; + LED_DDR = 0xff; /* Data Direction Register B: + all set up for output */ + + // ------ Event loop ------ // + while (1) { + + x = 2053 * x + 13849; /* "random" number generator */ + y = (x >> 8) & 0b00000111; /* pick three bits from high byte */ + LED_PORT ^= (1 << y); /* toggle one bit */ + _delay_ms(100); + + } /* End event loop */ + return 0; +} diff --git a/Make AVR Examples/Chapter04_Bit-Twiddling/showingOffBits/Makefile b/Make AVR Examples/Chapter04_Bit-Twiddling/showingOffBits/Makefile new file mode 100644 index 0000000..3d9e544 --- /dev/null +++ b/Make AVR Examples/Chapter04_Bit-Twiddling/showingOffBits/Makefile @@ -0,0 +1,196 @@ + +##########------------------------------------------------------########## +########## Project-specific Details ########## +########## Check these every time you start a new project ########## +##########------------------------------------------------------########## + +MCU = atmega168p +F_CPU = 1000000UL +BAUD = 9600UL +## Also try BAUD = 19200 or 38400 if you're feeling lucky. + +## A directory for common include files and the simple USART library. +## If you move either the current folder or the Library folder, you'll +## need to change this path to match. +LIBDIR = ../../AVR-Programming-Library + +##########------------------------------------------------------########## +########## Programmer Defaults ########## +########## Set up once, then forget about it ########## +########## (Can override. See bottom of file.) ########## +##########------------------------------------------------------########## + +PROGRAMMER_TYPE = usbtiny +# extra arguments to avrdude: baud rate, chip type, -F flag, etc. +PROGRAMMER_ARGS = + +##########------------------------------------------------------########## +########## Program Locations ########## +########## Won't need to change if they're in your PATH ########## +##########------------------------------------------------------########## + +CC = avr-gcc +OBJCOPY = avr-objcopy +OBJDUMP = avr-objdump +AVRSIZE = avr-size +AVRDUDE = avrdude + +##########------------------------------------------------------########## +########## Makefile Magic! ########## +########## Summary: ########## +########## We want a .hex file ########## +########## Compile source files into .elf ########## +########## Convert .elf file into .hex ########## +########## You shouldn't need to edit below. ########## +##########------------------------------------------------------########## + +## The name of your project (without the .c) +# TARGET = blinkLED +## Or name it automatically after the enclosing directory +TARGET = $(lastword $(subst /, ,$(CURDIR))) + +# Object files: will find all .c/.h files in current directory +# and in LIBDIR. If you have any other (sub-)directories with code, +# you can add them in to SOURCES below in the wildcard statement. +SOURCES=$(wildcard *.c $(LIBDIR)/*.c) +OBJECTS=$(SOURCES:.c=.o) +HEADERS=$(SOURCES:.c=.h) + +## Compilation options, type man avr-gcc if you're curious. +CPPFLAGS = -DF_CPU=$(F_CPU) -DBAUD=$(BAUD) -I. -I$(LIBDIR) +CFLAGS = -Os -g -std=gnu99 -Wall +## Use short (8-bit) data types +CFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums +## Splits up object files per function +CFLAGS += -ffunction-sections -fdata-sections +LDFLAGS = -Wl,-Map,$(TARGET).map +## Optional, but often ends up with smaller code +LDFLAGS += -Wl,--gc-sections +## Relax shrinks code even more, but makes disassembly messy +## LDFLAGS += -Wl,--relax +## LDFLAGS += -Wl,-u,vfprintf -lprintf_flt -lm ## for floating-point printf +## LDFLAGS += -Wl,-u,vfprintf -lprintf_min ## for smaller printf +TARGET_ARCH = -mmcu=$(MCU) + +## Explicit pattern rules: +## To make .o files from .c files +%.o: %.c $(HEADERS) Makefile + $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c -o $@ $<; + +$(TARGET).elf: $(OBJECTS) + $(CC) $(LDFLAGS) $(TARGET_ARCH) $^ $(LDLIBS) -o $@ + +%.hex: %.elf + $(OBJCOPY) -j .text -j .data -O ihex $< $@ + +%.eeprom: %.elf + $(OBJCOPY) -j .eeprom --change-section-lma .eeprom=0 -O ihex $< $@ + +%.lst: %.elf + $(OBJDUMP) -S $< > $@ + +## These targets don't have files named after them +.PHONY: all disassemble disasm eeprom size clean squeaky_clean flash fuses + +all: $(TARGET).hex + +debug: + @echo + @echo "Source files:" $(SOURCES) + @echo "MCU, F_CPU, BAUD:" $(MCU), $(F_CPU), $(BAUD) + @echo + +# Optionally create listing file from .elf +# This creates approximate assembly-language equivalent of your code. +# Useful for debugging time-sensitive bits, +# or making sure the compiler does what you want. +disassemble: $(TARGET).lst + +disasm: disassemble + +# Optionally show how big the resulting program is +size: $(TARGET).elf + $(AVRSIZE) -C --mcu=$(MCU) $(TARGET).elf + +clean: + rm -f $(TARGET).elf $(TARGET).hex $(TARGET).obj \ + $(TARGET).o $(TARGET).d $(TARGET).eep $(TARGET).lst \ + $(TARGET).lss $(TARGET).sym $(TARGET).map $(TARGET)~ \ + $(TARGET).eeprom + +squeaky_clean: + rm -f *.elf *.hex *.obj *.o *.d *.eep *.lst *.lss *.sym *.map *~ *.eeprom + +##########------------------------------------------------------########## +########## Programmer-specific details ########## +########## Flashing code to AVR using avrdude ########## +##########------------------------------------------------------########## + +flash: $(TARGET).hex + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U flash:w:$< + +## An alias +program: flash + +flash_eeprom: $(TARGET).eeprom + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U eeprom:w:$< + +avrdude_terminal: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nt + +## If you've got multiple programmers that you use, +## you can define them here so that it's easy to switch. +## To invoke, use something like `make flash_arduinoISP` +flash_usbtiny: PROGRAMMER_TYPE = usbtiny +flash_usbtiny: PROGRAMMER_ARGS = # USBTiny works with no further arguments +flash_usbtiny: flash + +flash_usbasp: PROGRAMMER_TYPE = usbasp +flash_usbasp: PROGRAMMER_ARGS = # USBasp works with no further arguments +flash_usbasp: flash + +flash_arduinoISP: PROGRAMMER_TYPE = avrisp +flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P /dev/ttyACM0 +## (for windows) flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P com5 +flash_arduinoISP: flash + +flash_109: PROGRAMMER_TYPE = avr109 +flash_109: PROGRAMMER_ARGS = -b 9600 -P /dev/ttyUSB0 +flash_109: flash + +##########------------------------------------------------------########## +########## Fuse settings and suitable defaults ########## +##########------------------------------------------------------########## + +## Mega 48, 88, 168, 328 default values +LFUSE = 0x62 +HFUSE = 0xdf +EFUSE = 0x00 + +## Generic +FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m + +fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) \ + $(PROGRAMMER_ARGS) $(FUSE_STRING) +show_fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nv + +## Called with no extra definitions, sets to defaults +set_default_fuses: FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m +set_default_fuses: fuses + +## Set the fuse byte for full-speed mode +## Note: can also be set in firmware for modern chips +set_fast_fuse: LFUSE = 0xE2 +set_fast_fuse: FUSE_STRING = -U lfuse:w:$(LFUSE):m +set_fast_fuse: fuses + +## Set the EESAVE fuse byte to preserve EEPROM across flashes +set_eeprom_save_fuse: HFUSE = 0xD7 +set_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +set_eeprom_save_fuse: fuses + +## Clear the EESAVE fuse byte +clear_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +clear_eeprom_save_fuse: fuses diff --git a/Make AVR Examples/Chapter04_Bit-Twiddling/showingOffBits/showingOffBits.c b/Make AVR Examples/Chapter04_Bit-Twiddling/showingOffBits/showingOffBits.c new file mode 100644 index 0000000..2c1a7ca --- /dev/null +++ b/Make AVR Examples/Chapter04_Bit-Twiddling/showingOffBits/showingOffBits.c @@ -0,0 +1,59 @@ + /* Showing off some patterns to practice our bit-twiddling */ + +// ------- Preamble -------- // +#include +#include +#include /* Functions to waste time */ + +#define DELAYTIME 85 /* milliseconds */ +#define LED_PORT PORTB +#define LED_DDR DDRB + +int main(void) { + + uint8_t i; + uint8_t repetitions; + uint8_t whichLED; + uint16_t randomNumber = 0x1234; + + // -------- Inits --------- // + LED_DDR = 0xff; /* all LEDs configured for output */ + // ------ Event loop ------ // + while (1) { + /* Go Left */ + for (i = 0; i < 8; i++) { + LED_PORT |= (1 << i); /* turn on the i'th pin */ + _delay_ms(DELAYTIME); /* wait */ + } + for (i = 0; i < 8; i++) { + LED_PORT &= ~(1 << i); /* turn off the i'th pin */ + _delay_ms(DELAYTIME); /* wait */ + } + _delay_ms(5 * DELAYTIME); /* pause */ + + /* Go Right */ + for (i = 7; i < 255; i--) { + LED_PORT |= (1 << i); /* turn on the i'th pin */ + _delay_ms(DELAYTIME); /* wait */ + } + for (i = 7; i < 255; i--) { + LED_PORT &= ~(1 << i); /* turn off the i'th pin */ + _delay_ms(DELAYTIME); /* wait */ + } + _delay_ms(5 * DELAYTIME); /* pause */ + + /* Toggle "random" bits for a while */ + for (repetitions = 0; repetitions < 75; repetitions++) { + /* "random" number generator */ + randomNumber = 2053 * randomNumber + 13849; + /* low three bits from high byte */ + whichLED = (randomNumber >> 8) & 0b00000111; + LED_PORT ^= (1 << whichLED); /* toggle our LED */ + _delay_ms(DELAYTIME); + } + LED_PORT = 0; /* all LEDs off */ + _delay_ms(5 * DELAYTIME); /* pause */ + + } /* End event loop */ + return 0; /* This line is never reached */ +} diff --git a/Make AVR Examples/Chapter05_Serial-IO/serialLoopback/Makefile b/Make AVR Examples/Chapter05_Serial-IO/serialLoopback/Makefile new file mode 100644 index 0000000..3d9e544 --- /dev/null +++ b/Make AVR Examples/Chapter05_Serial-IO/serialLoopback/Makefile @@ -0,0 +1,196 @@ + +##########------------------------------------------------------########## +########## Project-specific Details ########## +########## Check these every time you start a new project ########## +##########------------------------------------------------------########## + +MCU = atmega168p +F_CPU = 1000000UL +BAUD = 9600UL +## Also try BAUD = 19200 or 38400 if you're feeling lucky. + +## A directory for common include files and the simple USART library. +## If you move either the current folder or the Library folder, you'll +## need to change this path to match. +LIBDIR = ../../AVR-Programming-Library + +##########------------------------------------------------------########## +########## Programmer Defaults ########## +########## Set up once, then forget about it ########## +########## (Can override. See bottom of file.) ########## +##########------------------------------------------------------########## + +PROGRAMMER_TYPE = usbtiny +# extra arguments to avrdude: baud rate, chip type, -F flag, etc. +PROGRAMMER_ARGS = + +##########------------------------------------------------------########## +########## Program Locations ########## +########## Won't need to change if they're in your PATH ########## +##########------------------------------------------------------########## + +CC = avr-gcc +OBJCOPY = avr-objcopy +OBJDUMP = avr-objdump +AVRSIZE = avr-size +AVRDUDE = avrdude + +##########------------------------------------------------------########## +########## Makefile Magic! ########## +########## Summary: ########## +########## We want a .hex file ########## +########## Compile source files into .elf ########## +########## Convert .elf file into .hex ########## +########## You shouldn't need to edit below. ########## +##########------------------------------------------------------########## + +## The name of your project (without the .c) +# TARGET = blinkLED +## Or name it automatically after the enclosing directory +TARGET = $(lastword $(subst /, ,$(CURDIR))) + +# Object files: will find all .c/.h files in current directory +# and in LIBDIR. If you have any other (sub-)directories with code, +# you can add them in to SOURCES below in the wildcard statement. +SOURCES=$(wildcard *.c $(LIBDIR)/*.c) +OBJECTS=$(SOURCES:.c=.o) +HEADERS=$(SOURCES:.c=.h) + +## Compilation options, type man avr-gcc if you're curious. +CPPFLAGS = -DF_CPU=$(F_CPU) -DBAUD=$(BAUD) -I. -I$(LIBDIR) +CFLAGS = -Os -g -std=gnu99 -Wall +## Use short (8-bit) data types +CFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums +## Splits up object files per function +CFLAGS += -ffunction-sections -fdata-sections +LDFLAGS = -Wl,-Map,$(TARGET).map +## Optional, but often ends up with smaller code +LDFLAGS += -Wl,--gc-sections +## Relax shrinks code even more, but makes disassembly messy +## LDFLAGS += -Wl,--relax +## LDFLAGS += -Wl,-u,vfprintf -lprintf_flt -lm ## for floating-point printf +## LDFLAGS += -Wl,-u,vfprintf -lprintf_min ## for smaller printf +TARGET_ARCH = -mmcu=$(MCU) + +## Explicit pattern rules: +## To make .o files from .c files +%.o: %.c $(HEADERS) Makefile + $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c -o $@ $<; + +$(TARGET).elf: $(OBJECTS) + $(CC) $(LDFLAGS) $(TARGET_ARCH) $^ $(LDLIBS) -o $@ + +%.hex: %.elf + $(OBJCOPY) -j .text -j .data -O ihex $< $@ + +%.eeprom: %.elf + $(OBJCOPY) -j .eeprom --change-section-lma .eeprom=0 -O ihex $< $@ + +%.lst: %.elf + $(OBJDUMP) -S $< > $@ + +## These targets don't have files named after them +.PHONY: all disassemble disasm eeprom size clean squeaky_clean flash fuses + +all: $(TARGET).hex + +debug: + @echo + @echo "Source files:" $(SOURCES) + @echo "MCU, F_CPU, BAUD:" $(MCU), $(F_CPU), $(BAUD) + @echo + +# Optionally create listing file from .elf +# This creates approximate assembly-language equivalent of your code. +# Useful for debugging time-sensitive bits, +# or making sure the compiler does what you want. +disassemble: $(TARGET).lst + +disasm: disassemble + +# Optionally show how big the resulting program is +size: $(TARGET).elf + $(AVRSIZE) -C --mcu=$(MCU) $(TARGET).elf + +clean: + rm -f $(TARGET).elf $(TARGET).hex $(TARGET).obj \ + $(TARGET).o $(TARGET).d $(TARGET).eep $(TARGET).lst \ + $(TARGET).lss $(TARGET).sym $(TARGET).map $(TARGET)~ \ + $(TARGET).eeprom + +squeaky_clean: + rm -f *.elf *.hex *.obj *.o *.d *.eep *.lst *.lss *.sym *.map *~ *.eeprom + +##########------------------------------------------------------########## +########## Programmer-specific details ########## +########## Flashing code to AVR using avrdude ########## +##########------------------------------------------------------########## + +flash: $(TARGET).hex + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U flash:w:$< + +## An alias +program: flash + +flash_eeprom: $(TARGET).eeprom + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U eeprom:w:$< + +avrdude_terminal: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nt + +## If you've got multiple programmers that you use, +## you can define them here so that it's easy to switch. +## To invoke, use something like `make flash_arduinoISP` +flash_usbtiny: PROGRAMMER_TYPE = usbtiny +flash_usbtiny: PROGRAMMER_ARGS = # USBTiny works with no further arguments +flash_usbtiny: flash + +flash_usbasp: PROGRAMMER_TYPE = usbasp +flash_usbasp: PROGRAMMER_ARGS = # USBasp works with no further arguments +flash_usbasp: flash + +flash_arduinoISP: PROGRAMMER_TYPE = avrisp +flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P /dev/ttyACM0 +## (for windows) flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P com5 +flash_arduinoISP: flash + +flash_109: PROGRAMMER_TYPE = avr109 +flash_109: PROGRAMMER_ARGS = -b 9600 -P /dev/ttyUSB0 +flash_109: flash + +##########------------------------------------------------------########## +########## Fuse settings and suitable defaults ########## +##########------------------------------------------------------########## + +## Mega 48, 88, 168, 328 default values +LFUSE = 0x62 +HFUSE = 0xdf +EFUSE = 0x00 + +## Generic +FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m + +fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) \ + $(PROGRAMMER_ARGS) $(FUSE_STRING) +show_fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nv + +## Called with no extra definitions, sets to defaults +set_default_fuses: FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m +set_default_fuses: fuses + +## Set the fuse byte for full-speed mode +## Note: can also be set in firmware for modern chips +set_fast_fuse: LFUSE = 0xE2 +set_fast_fuse: FUSE_STRING = -U lfuse:w:$(LFUSE):m +set_fast_fuse: fuses + +## Set the EESAVE fuse byte to preserve EEPROM across flashes +set_eeprom_save_fuse: HFUSE = 0xD7 +set_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +set_eeprom_save_fuse: fuses + +## Clear the EESAVE fuse byte +clear_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +clear_eeprom_save_fuse: fuses diff --git a/Make AVR Examples/Chapter05_Serial-IO/serialLoopback/serialLoopback.c b/Make AVR Examples/Chapter05_Serial-IO/serialLoopback/serialLoopback.c new file mode 100644 index 0000000..014cd96 --- /dev/null +++ b/Make AVR Examples/Chapter05_Serial-IO/serialLoopback/serialLoopback.c @@ -0,0 +1,31 @@ +/* +A simple test of serial-port functionality. +Takes in a character at a time and sends it right back out, + displaying the ASCII value on the LEDs. +*/ + +// ------- Preamble -------- // +#include +#include +#include "pinDefines.h" +#include "USART.h" + +int main(void) { + char serialCharacter; + + // -------- Inits --------- // + LED_DDR = 0xff; /* set up LEDs for output */ + initUSART(); + printString("Hello World!\r\n"); /* to test */ + + // ------ Event loop ------ // + while (1) { + + serialCharacter = receiveByte(); + transmitByte(serialCharacter); + LED_PORT = serialCharacter; + /* display ascii/numeric value of character */ + + } /* End event loop */ + return 0; +} diff --git a/Make AVR Examples/Chapter05_Serial-IO/serialOrgan/Makefile b/Make AVR Examples/Chapter05_Serial-IO/serialOrgan/Makefile new file mode 100644 index 0000000..3d9e544 --- /dev/null +++ b/Make AVR Examples/Chapter05_Serial-IO/serialOrgan/Makefile @@ -0,0 +1,196 @@ + +##########------------------------------------------------------########## +########## Project-specific Details ########## +########## Check these every time you start a new project ########## +##########------------------------------------------------------########## + +MCU = atmega168p +F_CPU = 1000000UL +BAUD = 9600UL +## Also try BAUD = 19200 or 38400 if you're feeling lucky. + +## A directory for common include files and the simple USART library. +## If you move either the current folder or the Library folder, you'll +## need to change this path to match. +LIBDIR = ../../AVR-Programming-Library + +##########------------------------------------------------------########## +########## Programmer Defaults ########## +########## Set up once, then forget about it ########## +########## (Can override. See bottom of file.) ########## +##########------------------------------------------------------########## + +PROGRAMMER_TYPE = usbtiny +# extra arguments to avrdude: baud rate, chip type, -F flag, etc. +PROGRAMMER_ARGS = + +##########------------------------------------------------------########## +########## Program Locations ########## +########## Won't need to change if they're in your PATH ########## +##########------------------------------------------------------########## + +CC = avr-gcc +OBJCOPY = avr-objcopy +OBJDUMP = avr-objdump +AVRSIZE = avr-size +AVRDUDE = avrdude + +##########------------------------------------------------------########## +########## Makefile Magic! ########## +########## Summary: ########## +########## We want a .hex file ########## +########## Compile source files into .elf ########## +########## Convert .elf file into .hex ########## +########## You shouldn't need to edit below. ########## +##########------------------------------------------------------########## + +## The name of your project (without the .c) +# TARGET = blinkLED +## Or name it automatically after the enclosing directory +TARGET = $(lastword $(subst /, ,$(CURDIR))) + +# Object files: will find all .c/.h files in current directory +# and in LIBDIR. If you have any other (sub-)directories with code, +# you can add them in to SOURCES below in the wildcard statement. +SOURCES=$(wildcard *.c $(LIBDIR)/*.c) +OBJECTS=$(SOURCES:.c=.o) +HEADERS=$(SOURCES:.c=.h) + +## Compilation options, type man avr-gcc if you're curious. +CPPFLAGS = -DF_CPU=$(F_CPU) -DBAUD=$(BAUD) -I. -I$(LIBDIR) +CFLAGS = -Os -g -std=gnu99 -Wall +## Use short (8-bit) data types +CFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums +## Splits up object files per function +CFLAGS += -ffunction-sections -fdata-sections +LDFLAGS = -Wl,-Map,$(TARGET).map +## Optional, but often ends up with smaller code +LDFLAGS += -Wl,--gc-sections +## Relax shrinks code even more, but makes disassembly messy +## LDFLAGS += -Wl,--relax +## LDFLAGS += -Wl,-u,vfprintf -lprintf_flt -lm ## for floating-point printf +## LDFLAGS += -Wl,-u,vfprintf -lprintf_min ## for smaller printf +TARGET_ARCH = -mmcu=$(MCU) + +## Explicit pattern rules: +## To make .o files from .c files +%.o: %.c $(HEADERS) Makefile + $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c -o $@ $<; + +$(TARGET).elf: $(OBJECTS) + $(CC) $(LDFLAGS) $(TARGET_ARCH) $^ $(LDLIBS) -o $@ + +%.hex: %.elf + $(OBJCOPY) -j .text -j .data -O ihex $< $@ + +%.eeprom: %.elf + $(OBJCOPY) -j .eeprom --change-section-lma .eeprom=0 -O ihex $< $@ + +%.lst: %.elf + $(OBJDUMP) -S $< > $@ + +## These targets don't have files named after them +.PHONY: all disassemble disasm eeprom size clean squeaky_clean flash fuses + +all: $(TARGET).hex + +debug: + @echo + @echo "Source files:" $(SOURCES) + @echo "MCU, F_CPU, BAUD:" $(MCU), $(F_CPU), $(BAUD) + @echo + +# Optionally create listing file from .elf +# This creates approximate assembly-language equivalent of your code. +# Useful for debugging time-sensitive bits, +# or making sure the compiler does what you want. +disassemble: $(TARGET).lst + +disasm: disassemble + +# Optionally show how big the resulting program is +size: $(TARGET).elf + $(AVRSIZE) -C --mcu=$(MCU) $(TARGET).elf + +clean: + rm -f $(TARGET).elf $(TARGET).hex $(TARGET).obj \ + $(TARGET).o $(TARGET).d $(TARGET).eep $(TARGET).lst \ + $(TARGET).lss $(TARGET).sym $(TARGET).map $(TARGET)~ \ + $(TARGET).eeprom + +squeaky_clean: + rm -f *.elf *.hex *.obj *.o *.d *.eep *.lst *.lss *.sym *.map *~ *.eeprom + +##########------------------------------------------------------########## +########## Programmer-specific details ########## +########## Flashing code to AVR using avrdude ########## +##########------------------------------------------------------########## + +flash: $(TARGET).hex + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U flash:w:$< + +## An alias +program: flash + +flash_eeprom: $(TARGET).eeprom + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U eeprom:w:$< + +avrdude_terminal: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nt + +## If you've got multiple programmers that you use, +## you can define them here so that it's easy to switch. +## To invoke, use something like `make flash_arduinoISP` +flash_usbtiny: PROGRAMMER_TYPE = usbtiny +flash_usbtiny: PROGRAMMER_ARGS = # USBTiny works with no further arguments +flash_usbtiny: flash + +flash_usbasp: PROGRAMMER_TYPE = usbasp +flash_usbasp: PROGRAMMER_ARGS = # USBasp works with no further arguments +flash_usbasp: flash + +flash_arduinoISP: PROGRAMMER_TYPE = avrisp +flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P /dev/ttyACM0 +## (for windows) flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P com5 +flash_arduinoISP: flash + +flash_109: PROGRAMMER_TYPE = avr109 +flash_109: PROGRAMMER_ARGS = -b 9600 -P /dev/ttyUSB0 +flash_109: flash + +##########------------------------------------------------------########## +########## Fuse settings and suitable defaults ########## +##########------------------------------------------------------########## + +## Mega 48, 88, 168, 328 default values +LFUSE = 0x62 +HFUSE = 0xdf +EFUSE = 0x00 + +## Generic +FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m + +fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) \ + $(PROGRAMMER_ARGS) $(FUSE_STRING) +show_fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nv + +## Called with no extra definitions, sets to defaults +set_default_fuses: FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m +set_default_fuses: fuses + +## Set the fuse byte for full-speed mode +## Note: can also be set in firmware for modern chips +set_fast_fuse: LFUSE = 0xE2 +set_fast_fuse: FUSE_STRING = -U lfuse:w:$(LFUSE):m +set_fast_fuse: fuses + +## Set the EESAVE fuse byte to preserve EEPROM across flashes +set_eeprom_save_fuse: HFUSE = 0xD7 +set_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +set_eeprom_save_fuse: fuses + +## Clear the EESAVE fuse byte +clear_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +clear_eeprom_save_fuse: fuses diff --git a/Make AVR Examples/Chapter05_Serial-IO/serialOrgan/autoPlay.py b/Make AVR Examples/Chapter05_Serial-IO/serialOrgan/autoPlay.py new file mode 100644 index 0000000..8b0cadd --- /dev/null +++ b/Make AVR Examples/Chapter05_Serial-IO/serialOrgan/autoPlay.py @@ -0,0 +1,50 @@ +## Scripting in python to drive the serial-port organ + +## So far, the "protocol" is simple. +## Python routine sends a note, waits for a return character, then sends next, etc. +## Organ listens for notes, when it gets one sends an 'N' to say it's ready + +import serial + +def playString(noteString, serialPort): + for letter in noteString: + print(letter) + serialPort.write(letter.encode()) + returnValue = serialPort.read(1) + +if __name__ == "__main__": + + import time + from urllib.request import urlopen + + ## Need to consider alternatives for Mac / Windows + ## list all serial ports being used: python -m serial.tools.list_ports + PORT = "/dev/ttyUSB0" # Change this to the current serial port being used + BAUD = 9600 + + s = serial.Serial(PORT, BAUD) + s.flush() + ## flush clears the buffer so that we're starting fresh + ## More on serial buffers later. + + ## An intentional example. You can use this for playing music on purpose. + playString("f g h j k l ; ]'[", s) + input("Press enter for next demo\n") + + ## A fun / stupid example. You can just type stuff and see what comes out. + playString("hello there, this is a random string turned into 'music'", s) + input("Press enter for next demo\n") + + ## Website no longer alive... skipping: + ## A really frivolous example. Play websites! + ## Bonus points for first person to tweet themselves a song. + #print ("Downloading song data from http://serialorgansongs.jottit.com/...") + #import re + #contentFilter = re.compile(r'

(.*?)

') + #songSite = urlopen("http://serialorgansongs.jottit.com/").read() + #songText = contentFilter.findall(songSite)[0] + #playString(songText, s) + + ## Or interactive + mySong = input("\nType in your own song: ") + playString(mySong, s) diff --git a/Make AVR Examples/Chapter05_Serial-IO/serialOrgan/organ.c b/Make AVR Examples/Chapter05_Serial-IO/serialOrgan/organ.c new file mode 100644 index 0000000..6041a5a --- /dev/null +++ b/Make AVR Examples/Chapter05_Serial-IO/serialOrgan/organ.c @@ -0,0 +1,26 @@ +/* +Simple routines to play notes out to a speaker +*/ + +#include +#include +#include "organ.h" +#include "pinDefines.h" + +void playNote(uint16_t period, uint16_t duration) { + uint16_t elapsed; + uint16_t i; + for (elapsed = 0; elapsed < duration; elapsed += period) { + /* For loop with variable delay selects the pitch */ + for (i = 0; i < period; i++) { + _delay_us(1); + } + SPEAKER_PORT ^= (1 << SPEAKER); + } +} + +void rest(uint16_t duration) { + do { + _delay_us(1); + } while (--duration); +} diff --git a/Make AVR Examples/Chapter05_Serial-IO/serialOrgan/organ.h b/Make AVR Examples/Chapter05_Serial-IO/serialOrgan/organ.h new file mode 100644 index 0000000..a9c853d --- /dev/null +++ b/Make AVR Examples/Chapter05_Serial-IO/serialOrgan/organ.h @@ -0,0 +1,9 @@ + +// ------------- Function prototypes -------------- // + +// Plays a note for the given duration. None of these times are +// calibrated to actual notes or tempi. It's all relative to TIMEBASE. +void playNote(uint16_t period, uint16_t duration); + +// Does nothing for a time equal to the passed duration. +void rest(uint16_t duration); diff --git a/Make AVR Examples/Chapter05_Serial-IO/serialOrgan/scale16.h b/Make AVR Examples/Chapter05_Serial-IO/serialOrgan/scale16.h new file mode 100644 index 0000000..e317746 --- /dev/null +++ b/Make AVR Examples/Chapter05_Serial-IO/serialOrgan/scale16.h @@ -0,0 +1,99 @@ +// Scale in the key of 25000 +// Automatically generated by scaleGenerator.py + +#define C0 25000 +#define Cx0 23597 +#define D0 22272 +#define Dx0 21022 +#define E0 19843 +#define F0 18729 +#define Fx0 17678 +#define G0 16685 +#define Gx0 15749 +#define A0 14865 +#define Ax0 14031 +#define B0 13243 +#define C1 12500 +#define Cx1 11798 +#define D1 11136 +#define Dx1 10511 +#define E1 9921 +#define F1 9364 +#define Fx1 8839 +#define G1 8343 +#define Gx1 7875 +#define A1 7433 +#define Ax1 7015 +#define B1 6622 +#define C2 6250 +#define Cx2 5899 +#define D2 5568 +#define Dx2 5256 +#define E2 4961 +#define F2 4682 +#define Fx2 4419 +#define G2 4171 +#define Gx2 3937 +#define A2 3716 +#define Ax2 3508 +#define B2 3311 +#define C3 3125 +#define Cx3 2950 +#define D3 2784 +#define Dx3 2628 +#define E3 2480 +#define F3 2341 +#define Fx3 2210 +#define G3 2086 +#define Gx3 1969 +#define A3 1858 +#define Ax3 1754 +#define B3 1655 +#define C4 1562 +#define Cx4 1474 +#define D4 1392 +#define Dx4 1313 +#define E4 1240 +#define F4 1170 +#define Fx4 1105 +#define G4 1043 +#define Gx4 984 +#define A4 929 +#define Ax4 877 +#define B4 827 +#define C5 781 +#define Cx5 737 +#define D5 696 +#define Dx5 657 +#define E5 620 +#define F5 585 +#define Fx5 552 +#define G5 521 +#define Gx5 492 +#define A5 464 +#define Ax5 438 +#define B5 414 +#define C6 390 +#define Cx6 368 +#define D6 347 +#define Dx6 328 +#define E6 310 +#define F6 292 +#define Fx6 276 +#define G6 260 +#define Gx6 246 +#define A6 232 +#define Ax6 219 +#define B6 207 +#define C7 195 +#define Cx7 184 +#define D7 174 +#define Dx7 164 +#define E7 155 +#define F7 146 +#define Fx7 138 +#define G7 130 +#define Gx7 123 +#define A7 116 +#define Ax7 109 +#define B7 103 diff --git a/Make AVR Examples/Chapter05_Serial-IO/serialOrgan/scaleGenerator.py b/Make AVR Examples/Chapter05_Serial-IO/serialOrgan/scaleGenerator.py new file mode 100644 index 0000000..f72a4da --- /dev/null +++ b/Make AVR Examples/Chapter05_Serial-IO/serialOrgan/scaleGenerator.py @@ -0,0 +1,46 @@ +# scaleGenerator.py +# Scales are in terms of times per cycle (period) rather +# than pitch. +# + +import math + +SCALE = ['C', 'Cx', 'D', 'Dx', 'E', 'F', 'Fx', 'G', 'Gx', 'A', 'Ax', 'B'] + +def calculateOctave(baseLength): + periods = [baseLength / math.exp(x*math.log(2)/12) for x in range(0, 12)] + periods = [int(round(x)) for x in periods] + return( zip(SCALE, periods) ) + +def makePitches(basePitch, numOctaves): + pitchList = [] + for octave in range(0, numOctaves): + for note, period in calculateOctave(basePitch / 2**octave): + if period < 65500: + noteString = note + str(octave) + pitchList.append((noteString,period)) + return(pitchList) + +def makeDefines(basePitch, numOctaves): + pitchList = makePitches(basePitch, numOctaves) + defineString = "// Scale in the key of {} \n".format(basePitch) + defineString += "// Automatically generated by scaleGenerator.py \n\n" + for (note, length) in pitchList: + defineString += "#define {:<5}{:>6}\n".format(note, length) + return(defineString) + +if __name__ == "__main__": + + ## Change these if you like + BASEPITCH = 25000 + OCTAVES = 8 + OUTFILE = "scale16.h" + + ## Write it out to a file + out = open(OUTFILE, "w") + out.write(makeDefines(BASEPITCH, OCTAVES)) + out.close() + + + + diff --git a/Make AVR Examples/Chapter05_Serial-IO/serialOrgan/serialOrgan.c b/Make AVR Examples/Chapter05_Serial-IO/serialOrgan/serialOrgan.c new file mode 100644 index 0000000..5dcb3b5 --- /dev/null +++ b/Make AVR Examples/Chapter05_Serial-IO/serialOrgan/serialOrgan.c @@ -0,0 +1,74 @@ +/* + +serialOrgan.c + +Reads a character in serial from the keyboard, plays a note. + +See organ.h for pin defines and other macros +See organ.c (and include it in the Makefile) for playNote() and rest() + +*/ + +// ------- Preamble -------- // +#include +#include +#include "organ.h" +#include "scale16.h" +#include "pinDefines.h" +#include "USART.h" + +#define NOTE_DURATION 0xF000 /* determines long note length */ + +int main(void) { + + // -------- Inits --------- // + SPEAKER_DDR |= (1 << SPEAKER); /* speaker for output */ + initUSART(); + printString("----- Serial Organ ------\r\n"); + + char fromCompy; /* used to store serial input */ + uint16_t currentNoteLength = NOTE_DURATION / 2; + const uint8_t keys[] = { 'a', 'w', 's', 'e', 'd', 'f', 't', + 'g', 'y', 'h', 'j', 'i', 'k', 'o', + 'l', 'p', ';', '\'' + }; + const uint16_t notes[] = { G4, Gx4, A4, Ax4, B4, C5, Cx5, + D5, Dx5, E5, F5, Fx5, G5, Gx5, + A5, Ax5, B5, C6 + }; + uint8_t isNote; + uint8_t i; + + // ------ Event loop ------ // + while (1) { + + /* Get Key */ + fromCompy = receiveByte(); /* waits here until there is input */ + transmitByte('N'); /* alert computer we're ready for next note */ + + /* Play Notes */ + isNote = 0; + for (i = 0; i < sizeof(keys); i++) { + if (fromCompy == keys[i]) { /* found match in lookup table */ + playNote(notes[i], currentNoteLength); + isNote = 1; /* record that we've found a note */ + break; /* drop out of for() loop */ + } + } + + /* Handle non-note keys: tempo changes and rests */ + if (!isNote) { + if (fromCompy == '[') { /* code for short note */ + currentNoteLength = NOTE_DURATION / 2; + } + else if (fromCompy == ']') { /* code for long note */ + currentNoteLength = NOTE_DURATION; + } + else { /* unrecognized, just rest */ + rest(currentNoteLength); + } + } + + } /* End event loop */ + return 0; +} diff --git a/Make AVR Examples/Chapter06_Digital-Input/avrMusicBox/Makefile b/Make AVR Examples/Chapter06_Digital-Input/avrMusicBox/Makefile new file mode 100644 index 0000000..3d9e544 --- /dev/null +++ b/Make AVR Examples/Chapter06_Digital-Input/avrMusicBox/Makefile @@ -0,0 +1,196 @@ + +##########------------------------------------------------------########## +########## Project-specific Details ########## +########## Check these every time you start a new project ########## +##########------------------------------------------------------########## + +MCU = atmega168p +F_CPU = 1000000UL +BAUD = 9600UL +## Also try BAUD = 19200 or 38400 if you're feeling lucky. + +## A directory for common include files and the simple USART library. +## If you move either the current folder or the Library folder, you'll +## need to change this path to match. +LIBDIR = ../../AVR-Programming-Library + +##########------------------------------------------------------########## +########## Programmer Defaults ########## +########## Set up once, then forget about it ########## +########## (Can override. See bottom of file.) ########## +##########------------------------------------------------------########## + +PROGRAMMER_TYPE = usbtiny +# extra arguments to avrdude: baud rate, chip type, -F flag, etc. +PROGRAMMER_ARGS = + +##########------------------------------------------------------########## +########## Program Locations ########## +########## Won't need to change if they're in your PATH ########## +##########------------------------------------------------------########## + +CC = avr-gcc +OBJCOPY = avr-objcopy +OBJDUMP = avr-objdump +AVRSIZE = avr-size +AVRDUDE = avrdude + +##########------------------------------------------------------########## +########## Makefile Magic! ########## +########## Summary: ########## +########## We want a .hex file ########## +########## Compile source files into .elf ########## +########## Convert .elf file into .hex ########## +########## You shouldn't need to edit below. ########## +##########------------------------------------------------------########## + +## The name of your project (without the .c) +# TARGET = blinkLED +## Or name it automatically after the enclosing directory +TARGET = $(lastword $(subst /, ,$(CURDIR))) + +# Object files: will find all .c/.h files in current directory +# and in LIBDIR. If you have any other (sub-)directories with code, +# you can add them in to SOURCES below in the wildcard statement. +SOURCES=$(wildcard *.c $(LIBDIR)/*.c) +OBJECTS=$(SOURCES:.c=.o) +HEADERS=$(SOURCES:.c=.h) + +## Compilation options, type man avr-gcc if you're curious. +CPPFLAGS = -DF_CPU=$(F_CPU) -DBAUD=$(BAUD) -I. -I$(LIBDIR) +CFLAGS = -Os -g -std=gnu99 -Wall +## Use short (8-bit) data types +CFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums +## Splits up object files per function +CFLAGS += -ffunction-sections -fdata-sections +LDFLAGS = -Wl,-Map,$(TARGET).map +## Optional, but often ends up with smaller code +LDFLAGS += -Wl,--gc-sections +## Relax shrinks code even more, but makes disassembly messy +## LDFLAGS += -Wl,--relax +## LDFLAGS += -Wl,-u,vfprintf -lprintf_flt -lm ## for floating-point printf +## LDFLAGS += -Wl,-u,vfprintf -lprintf_min ## for smaller printf +TARGET_ARCH = -mmcu=$(MCU) + +## Explicit pattern rules: +## To make .o files from .c files +%.o: %.c $(HEADERS) Makefile + $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c -o $@ $<; + +$(TARGET).elf: $(OBJECTS) + $(CC) $(LDFLAGS) $(TARGET_ARCH) $^ $(LDLIBS) -o $@ + +%.hex: %.elf + $(OBJCOPY) -j .text -j .data -O ihex $< $@ + +%.eeprom: %.elf + $(OBJCOPY) -j .eeprom --change-section-lma .eeprom=0 -O ihex $< $@ + +%.lst: %.elf + $(OBJDUMP) -S $< > $@ + +## These targets don't have files named after them +.PHONY: all disassemble disasm eeprom size clean squeaky_clean flash fuses + +all: $(TARGET).hex + +debug: + @echo + @echo "Source files:" $(SOURCES) + @echo "MCU, F_CPU, BAUD:" $(MCU), $(F_CPU), $(BAUD) + @echo + +# Optionally create listing file from .elf +# This creates approximate assembly-language equivalent of your code. +# Useful for debugging time-sensitive bits, +# or making sure the compiler does what you want. +disassemble: $(TARGET).lst + +disasm: disassemble + +# Optionally show how big the resulting program is +size: $(TARGET).elf + $(AVRSIZE) -C --mcu=$(MCU) $(TARGET).elf + +clean: + rm -f $(TARGET).elf $(TARGET).hex $(TARGET).obj \ + $(TARGET).o $(TARGET).d $(TARGET).eep $(TARGET).lst \ + $(TARGET).lss $(TARGET).sym $(TARGET).map $(TARGET)~ \ + $(TARGET).eeprom + +squeaky_clean: + rm -f *.elf *.hex *.obj *.o *.d *.eep *.lst *.lss *.sym *.map *~ *.eeprom + +##########------------------------------------------------------########## +########## Programmer-specific details ########## +########## Flashing code to AVR using avrdude ########## +##########------------------------------------------------------########## + +flash: $(TARGET).hex + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U flash:w:$< + +## An alias +program: flash + +flash_eeprom: $(TARGET).eeprom + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U eeprom:w:$< + +avrdude_terminal: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nt + +## If you've got multiple programmers that you use, +## you can define them here so that it's easy to switch. +## To invoke, use something like `make flash_arduinoISP` +flash_usbtiny: PROGRAMMER_TYPE = usbtiny +flash_usbtiny: PROGRAMMER_ARGS = # USBTiny works with no further arguments +flash_usbtiny: flash + +flash_usbasp: PROGRAMMER_TYPE = usbasp +flash_usbasp: PROGRAMMER_ARGS = # USBasp works with no further arguments +flash_usbasp: flash + +flash_arduinoISP: PROGRAMMER_TYPE = avrisp +flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P /dev/ttyACM0 +## (for windows) flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P com5 +flash_arduinoISP: flash + +flash_109: PROGRAMMER_TYPE = avr109 +flash_109: PROGRAMMER_ARGS = -b 9600 -P /dev/ttyUSB0 +flash_109: flash + +##########------------------------------------------------------########## +########## Fuse settings and suitable defaults ########## +##########------------------------------------------------------########## + +## Mega 48, 88, 168, 328 default values +LFUSE = 0x62 +HFUSE = 0xdf +EFUSE = 0x00 + +## Generic +FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m + +fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) \ + $(PROGRAMMER_ARGS) $(FUSE_STRING) +show_fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nv + +## Called with no extra definitions, sets to defaults +set_default_fuses: FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m +set_default_fuses: fuses + +## Set the fuse byte for full-speed mode +## Note: can also be set in firmware for modern chips +set_fast_fuse: LFUSE = 0xE2 +set_fast_fuse: FUSE_STRING = -U lfuse:w:$(LFUSE):m +set_fast_fuse: fuses + +## Set the EESAVE fuse byte to preserve EEPROM across flashes +set_eeprom_save_fuse: HFUSE = 0xD7 +set_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +set_eeprom_save_fuse: fuses + +## Clear the EESAVE fuse byte +clear_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +clear_eeprom_save_fuse: fuses diff --git a/Make AVR Examples/Chapter06_Digital-Input/avrMusicBox/avrMusicBox.c b/Make AVR Examples/Chapter06_Digital-Input/avrMusicBox/avrMusicBox.c new file mode 100644 index 0000000..2e1886d --- /dev/null +++ b/Make AVR Examples/Chapter06_Digital-Input/avrMusicBox/avrMusicBox.c @@ -0,0 +1,48 @@ +// Music Box Input Demo + +// ------- Preamble -------- // +#include +#include +#include "organ.h" +#include "scale16.h" +#include "pinDefines.h" + +#define SONG_LENGTH (sizeof(song) / sizeof(uint16_t)) + +int main(void) { + const uint16_t song[] = { + E6, E6, E6, C6, E6, G6, G5, + C6, G5, E5, A5, B5, Ax5, A5, + G5, E6, G6, A6, F6, G6, E6, C6, D6, B5, + C6, G5, E5, A5, B5, Ax5, A5, + G5, E6, G6, A6, F6, G6, E6, C6, D6, B5, + /* etc */ + }; + /* starting at end b/c routine starts by incrementing and then playing + this makes the song start at the beginning after reboot */ + uint8_t whichNote = SONG_LENGTH - 1; + uint8_t wasButtonPressed = 0; + + // -------- Inits --------- // + SPEAKER_DDR |= (1 << SPEAKER); /* speaker for output */ + BUTTON_PORT |= (1 << BUTTON); /* pullup on button */ + + // ------ Event loop ------ // + while (1) { + if (bit_is_clear(BUTTON_PIN, BUTTON)) { + if (!wasButtonPressed) { /* if it's a new press ... */ + whichNote++; /* advance to next note */ + /* but don't run over the end */ + if (whichNote == SONG_LENGTH) { + whichNote = 0; + } + wasButtonPressed = 1; + } + playNote(song[whichNote], 1600); + } + else { + wasButtonPressed = 0; + } + } /* End event loop */ + return 0; +} diff --git a/Make AVR Examples/Chapter06_Digital-Input/avrMusicBox/organ.c b/Make AVR Examples/Chapter06_Digital-Input/avrMusicBox/organ.c new file mode 100644 index 0000000..6041a5a --- /dev/null +++ b/Make AVR Examples/Chapter06_Digital-Input/avrMusicBox/organ.c @@ -0,0 +1,26 @@ +/* +Simple routines to play notes out to a speaker +*/ + +#include +#include +#include "organ.h" +#include "pinDefines.h" + +void playNote(uint16_t period, uint16_t duration) { + uint16_t elapsed; + uint16_t i; + for (elapsed = 0; elapsed < duration; elapsed += period) { + /* For loop with variable delay selects the pitch */ + for (i = 0; i < period; i++) { + _delay_us(1); + } + SPEAKER_PORT ^= (1 << SPEAKER); + } +} + +void rest(uint16_t duration) { + do { + _delay_us(1); + } while (--duration); +} diff --git a/Make AVR Examples/Chapter06_Digital-Input/avrMusicBox/organ.h b/Make AVR Examples/Chapter06_Digital-Input/avrMusicBox/organ.h new file mode 100644 index 0000000..a9c853d --- /dev/null +++ b/Make AVR Examples/Chapter06_Digital-Input/avrMusicBox/organ.h @@ -0,0 +1,9 @@ + +// ------------- Function prototypes -------------- // + +// Plays a note for the given duration. None of these times are +// calibrated to actual notes or tempi. It's all relative to TIMEBASE. +void playNote(uint16_t period, uint16_t duration); + +// Does nothing for a time equal to the passed duration. +void rest(uint16_t duration); diff --git a/Make AVR Examples/Chapter06_Digital-Input/avrMusicBox/scale16.h b/Make AVR Examples/Chapter06_Digital-Input/avrMusicBox/scale16.h new file mode 100644 index 0000000..c71928b --- /dev/null +++ b/Make AVR Examples/Chapter06_Digital-Input/avrMusicBox/scale16.h @@ -0,0 +1,99 @@ +// Scale in the key of 12000 +// Automatically generated by scaleGenerator.py + +#define C0 12000 +#define Cx0 11326 +#define D0 10691 +#define Dx0 10091 +#define E0 9524 +#define F0 8990 +#define Fx0 8485 +#define G0 8009 +#define Gx0 7560 +#define A0 7135 +#define Ax0 6735 +#define B0 6357 +#define C1 6000 +#define Cx1 5663 +#define D1 5345 +#define Dx1 5045 +#define E1 4762 +#define F1 4495 +#define Fx1 4243 +#define G1 4005 +#define Gx1 3780 +#define A1 3568 +#define Ax1 3367 +#define B1 3178 +#define C2 3000 +#define Cx2 2832 +#define D2 2673 +#define Dx2 2523 +#define E2 2381 +#define F2 2247 +#define Fx2 2121 +#define G2 2002 +#define Gx2 1890 +#define A2 1784 +#define Ax2 1684 +#define B2 1589 +#define C3 1500 +#define Cx3 1416 +#define D3 1336 +#define Dx3 1261 +#define E3 1191 +#define F3 1124 +#define Fx3 1061 +#define G3 1001 +#define Gx3 945 +#define A3 892 +#define Ax3 842 +#define B3 795 +#define C4 750 +#define Cx4 708 +#define D4 668 +#define Dx4 631 +#define E4 595 +#define F4 562 +#define Fx4 530 +#define G4 501 +#define Gx4 472 +#define A4 446 +#define Ax4 421 +#define B4 397 +#define C5 375 +#define Cx5 354 +#define D5 334 +#define Dx5 315 +#define E5 298 +#define F5 281 +#define Fx5 265 +#define G5 250 +#define Gx5 236 +#define A5 223 +#define Ax5 210 +#define B5 199 +#define C6 187 +#define Cx6 177 +#define D6 167 +#define Dx6 157 +#define E6 148 +#define F6 140 +#define Fx6 132 +#define G6 125 +#define Gx6 118 +#define A6 111 +#define Ax6 105 +#define B6 99 +#define C7 93 +#define Cx7 88 +#define D7 83 +#define Dx7 78 +#define E7 74 +#define F7 70 +#define Fx7 66 +#define G7 62 +#define Gx7 59 +#define A7 55 +#define Ax7 52 +#define B7 49 diff --git a/Make AVR Examples/Chapter06_Digital-Input/avrMusicBox/scaleGenerator.py b/Make AVR Examples/Chapter06_Digital-Input/avrMusicBox/scaleGenerator.py new file mode 100644 index 0000000..d4bd0cc --- /dev/null +++ b/Make AVR Examples/Chapter06_Digital-Input/avrMusicBox/scaleGenerator.py @@ -0,0 +1,46 @@ +# scaleGenerator.py +# Scales are in terms of times per cycle (period) rather +# than pitch. +# + +import math + +SCALE = ['C', 'Cx', 'D', 'Dx', 'E', 'F', 'Fx', 'G', 'Gx', 'A', 'Ax', 'B'] + +def calculateOctave(baseLength): + periods = [baseLength / math.exp(x*math.log(2)/12) for x in range(0, 12)] + periods = [int(round(x)) for x in periods] + return( zip(SCALE, periods) ) + +def makePitches(basePitch, numOctaves): + pitchList = [] + for octave in range(0, numOctaves): + for note, period in calculateOctave(basePitch / 2**octave): + if period < 65500: + noteString = note + str(octave) + pitchList.append((noteString,period)) + return(pitchList) + +def makeDefines(basePitch, numOctaves): + pitchList = makePitches(basePitch, numOctaves) + defineString = "// Scale in the key of {} \n".format(basePitch) + defineString += "// Automatically generated by scaleGenerator.py \n\n" + for (note, length) in pitchList: + defineString += "#define {:<5}{:>6}\n".format(note, length) + return(defineString) + +if __name__ == "__main__": + + ## Change these if you like + BASEPITCH = 10000 + OCTAVES = 8 + OUTFILE = "scale16.h" + + ## Write it out to a file + out = open(OUTFILE, "w") + out.write(makeDefines(BASEPITCH, OCTAVES)) + out.close() + + + + diff --git a/Make AVR Examples/Chapter06_Digital-Input/bossButton/Makefile b/Make AVR Examples/Chapter06_Digital-Input/bossButton/Makefile new file mode 100644 index 0000000..3d9e544 --- /dev/null +++ b/Make AVR Examples/Chapter06_Digital-Input/bossButton/Makefile @@ -0,0 +1,196 @@ + +##########------------------------------------------------------########## +########## Project-specific Details ########## +########## Check these every time you start a new project ########## +##########------------------------------------------------------########## + +MCU = atmega168p +F_CPU = 1000000UL +BAUD = 9600UL +## Also try BAUD = 19200 or 38400 if you're feeling lucky. + +## A directory for common include files and the simple USART library. +## If you move either the current folder or the Library folder, you'll +## need to change this path to match. +LIBDIR = ../../AVR-Programming-Library + +##########------------------------------------------------------########## +########## Programmer Defaults ########## +########## Set up once, then forget about it ########## +########## (Can override. See bottom of file.) ########## +##########------------------------------------------------------########## + +PROGRAMMER_TYPE = usbtiny +# extra arguments to avrdude: baud rate, chip type, -F flag, etc. +PROGRAMMER_ARGS = + +##########------------------------------------------------------########## +########## Program Locations ########## +########## Won't need to change if they're in your PATH ########## +##########------------------------------------------------------########## + +CC = avr-gcc +OBJCOPY = avr-objcopy +OBJDUMP = avr-objdump +AVRSIZE = avr-size +AVRDUDE = avrdude + +##########------------------------------------------------------########## +########## Makefile Magic! ########## +########## Summary: ########## +########## We want a .hex file ########## +########## Compile source files into .elf ########## +########## Convert .elf file into .hex ########## +########## You shouldn't need to edit below. ########## +##########------------------------------------------------------########## + +## The name of your project (without the .c) +# TARGET = blinkLED +## Or name it automatically after the enclosing directory +TARGET = $(lastword $(subst /, ,$(CURDIR))) + +# Object files: will find all .c/.h files in current directory +# and in LIBDIR. If you have any other (sub-)directories with code, +# you can add them in to SOURCES below in the wildcard statement. +SOURCES=$(wildcard *.c $(LIBDIR)/*.c) +OBJECTS=$(SOURCES:.c=.o) +HEADERS=$(SOURCES:.c=.h) + +## Compilation options, type man avr-gcc if you're curious. +CPPFLAGS = -DF_CPU=$(F_CPU) -DBAUD=$(BAUD) -I. -I$(LIBDIR) +CFLAGS = -Os -g -std=gnu99 -Wall +## Use short (8-bit) data types +CFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums +## Splits up object files per function +CFLAGS += -ffunction-sections -fdata-sections +LDFLAGS = -Wl,-Map,$(TARGET).map +## Optional, but often ends up with smaller code +LDFLAGS += -Wl,--gc-sections +## Relax shrinks code even more, but makes disassembly messy +## LDFLAGS += -Wl,--relax +## LDFLAGS += -Wl,-u,vfprintf -lprintf_flt -lm ## for floating-point printf +## LDFLAGS += -Wl,-u,vfprintf -lprintf_min ## for smaller printf +TARGET_ARCH = -mmcu=$(MCU) + +## Explicit pattern rules: +## To make .o files from .c files +%.o: %.c $(HEADERS) Makefile + $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c -o $@ $<; + +$(TARGET).elf: $(OBJECTS) + $(CC) $(LDFLAGS) $(TARGET_ARCH) $^ $(LDLIBS) -o $@ + +%.hex: %.elf + $(OBJCOPY) -j .text -j .data -O ihex $< $@ + +%.eeprom: %.elf + $(OBJCOPY) -j .eeprom --change-section-lma .eeprom=0 -O ihex $< $@ + +%.lst: %.elf + $(OBJDUMP) -S $< > $@ + +## These targets don't have files named after them +.PHONY: all disassemble disasm eeprom size clean squeaky_clean flash fuses + +all: $(TARGET).hex + +debug: + @echo + @echo "Source files:" $(SOURCES) + @echo "MCU, F_CPU, BAUD:" $(MCU), $(F_CPU), $(BAUD) + @echo + +# Optionally create listing file from .elf +# This creates approximate assembly-language equivalent of your code. +# Useful for debugging time-sensitive bits, +# or making sure the compiler does what you want. +disassemble: $(TARGET).lst + +disasm: disassemble + +# Optionally show how big the resulting program is +size: $(TARGET).elf + $(AVRSIZE) -C --mcu=$(MCU) $(TARGET).elf + +clean: + rm -f $(TARGET).elf $(TARGET).hex $(TARGET).obj \ + $(TARGET).o $(TARGET).d $(TARGET).eep $(TARGET).lst \ + $(TARGET).lss $(TARGET).sym $(TARGET).map $(TARGET)~ \ + $(TARGET).eeprom + +squeaky_clean: + rm -f *.elf *.hex *.obj *.o *.d *.eep *.lst *.lss *.sym *.map *~ *.eeprom + +##########------------------------------------------------------########## +########## Programmer-specific details ########## +########## Flashing code to AVR using avrdude ########## +##########------------------------------------------------------########## + +flash: $(TARGET).hex + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U flash:w:$< + +## An alias +program: flash + +flash_eeprom: $(TARGET).eeprom + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U eeprom:w:$< + +avrdude_terminal: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nt + +## If you've got multiple programmers that you use, +## you can define them here so that it's easy to switch. +## To invoke, use something like `make flash_arduinoISP` +flash_usbtiny: PROGRAMMER_TYPE = usbtiny +flash_usbtiny: PROGRAMMER_ARGS = # USBTiny works with no further arguments +flash_usbtiny: flash + +flash_usbasp: PROGRAMMER_TYPE = usbasp +flash_usbasp: PROGRAMMER_ARGS = # USBasp works with no further arguments +flash_usbasp: flash + +flash_arduinoISP: PROGRAMMER_TYPE = avrisp +flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P /dev/ttyACM0 +## (for windows) flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P com5 +flash_arduinoISP: flash + +flash_109: PROGRAMMER_TYPE = avr109 +flash_109: PROGRAMMER_ARGS = -b 9600 -P /dev/ttyUSB0 +flash_109: flash + +##########------------------------------------------------------########## +########## Fuse settings and suitable defaults ########## +##########------------------------------------------------------########## + +## Mega 48, 88, 168, 328 default values +LFUSE = 0x62 +HFUSE = 0xdf +EFUSE = 0x00 + +## Generic +FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m + +fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) \ + $(PROGRAMMER_ARGS) $(FUSE_STRING) +show_fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nv + +## Called with no extra definitions, sets to defaults +set_default_fuses: FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m +set_default_fuses: fuses + +## Set the fuse byte for full-speed mode +## Note: can also be set in firmware for modern chips +set_fast_fuse: LFUSE = 0xE2 +set_fast_fuse: FUSE_STRING = -U lfuse:w:$(LFUSE):m +set_fast_fuse: fuses + +## Set the EESAVE fuse byte to preserve EEPROM across flashes +set_eeprom_save_fuse: HFUSE = 0xD7 +set_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +set_eeprom_save_fuse: fuses + +## Clear the EESAVE fuse byte +clear_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +clear_eeprom_save_fuse: fuses diff --git a/Make AVR Examples/Chapter06_Digital-Input/bossButton/bossButton.c b/Make AVR Examples/Chapter06_Digital-Input/bossButton/bossButton.c new file mode 100644 index 0000000..654e9fb --- /dev/null +++ b/Make AVR Examples/Chapter06_Digital-Input/bossButton/bossButton.c @@ -0,0 +1,46 @@ +/* +bossButton.c + +As long as we've got a button wired up to the AVR, +might as well have some fun. + +Upload this code to your AVR, run bossButton.py. +Press button. + +*/ + +// ------- Preamble -------- // +#include +#include +#include "pinDefines.h" +#include "USART.h" + +static inline void blinkLED(void) { + LED_PORT = (1 << LED0); + _delay_ms(1000); + LED_PORT &= ~(1 << LED0); +} + + +int main(void) { + + // -------- Inits --------- // + BUTTON_PORT |= (1 << BUTTON); /* input mode, turn on pullup */ + + LED_DDR = (1 << LED0); + blinkLED(); + + initUSART(); + transmitByte('O'); + + // ------ Event loop ------ // + while (1) { + + if (bit_is_clear(BUTTON_PIN, BUTTON)) { + transmitByte('X'); + blinkLED(); + } + + } /* End event loop */ + return 0; +} diff --git a/Make AVR Examples/Chapter06_Digital-Input/bossButton/bossButton.py b/Make AVR Examples/Chapter06_Digital-Input/bossButton/bossButton.py new file mode 100644 index 0000000..c33409a --- /dev/null +++ b/Make AVR Examples/Chapter06_Digital-Input/bossButton/bossButton.py @@ -0,0 +1,31 @@ +## Simple demo +## Sits forever listening to serial port +## When you press button, opens website of your choosing. +## Extend this to many buttons and you'll have a physical +## web-launcher. + +BOSS_SITE = "http://www.cartalk.com/content/boss-redirect" +## or perhaps more topical... +XKCD = "http://xkcd.com/353/" + +SERIAL_PORT = "/dev/ttyUSB0" +BAUD_RATE = 9600 + +import serial +import webbrowser + +sp = serial.Serial(SERIAL_PORT, BAUD_RATE, timeout = 5) +sp.flush() +print ("Boss Button") + +while(1): # Sit and wait forever + response = sp.read(1) # get one byte + if response == "O": + print ("Got OK Byte. Waiting for button press.") + elif response == b"X": + print ("Got Boss Byte! Alarm!") + webbrowser.open(BOSS_SITE) + else: + print ("Got nothing. Still waiting.") + + diff --git a/Make AVR Examples/Chapter06_Digital-Input/debouncer/Makefile b/Make AVR Examples/Chapter06_Digital-Input/debouncer/Makefile new file mode 100644 index 0000000..3d9e544 --- /dev/null +++ b/Make AVR Examples/Chapter06_Digital-Input/debouncer/Makefile @@ -0,0 +1,196 @@ + +##########------------------------------------------------------########## +########## Project-specific Details ########## +########## Check these every time you start a new project ########## +##########------------------------------------------------------########## + +MCU = atmega168p +F_CPU = 1000000UL +BAUD = 9600UL +## Also try BAUD = 19200 or 38400 if you're feeling lucky. + +## A directory for common include files and the simple USART library. +## If you move either the current folder or the Library folder, you'll +## need to change this path to match. +LIBDIR = ../../AVR-Programming-Library + +##########------------------------------------------------------########## +########## Programmer Defaults ########## +########## Set up once, then forget about it ########## +########## (Can override. See bottom of file.) ########## +##########------------------------------------------------------########## + +PROGRAMMER_TYPE = usbtiny +# extra arguments to avrdude: baud rate, chip type, -F flag, etc. +PROGRAMMER_ARGS = + +##########------------------------------------------------------########## +########## Program Locations ########## +########## Won't need to change if they're in your PATH ########## +##########------------------------------------------------------########## + +CC = avr-gcc +OBJCOPY = avr-objcopy +OBJDUMP = avr-objdump +AVRSIZE = avr-size +AVRDUDE = avrdude + +##########------------------------------------------------------########## +########## Makefile Magic! ########## +########## Summary: ########## +########## We want a .hex file ########## +########## Compile source files into .elf ########## +########## Convert .elf file into .hex ########## +########## You shouldn't need to edit below. ########## +##########------------------------------------------------------########## + +## The name of your project (without the .c) +# TARGET = blinkLED +## Or name it automatically after the enclosing directory +TARGET = $(lastword $(subst /, ,$(CURDIR))) + +# Object files: will find all .c/.h files in current directory +# and in LIBDIR. If you have any other (sub-)directories with code, +# you can add them in to SOURCES below in the wildcard statement. +SOURCES=$(wildcard *.c $(LIBDIR)/*.c) +OBJECTS=$(SOURCES:.c=.o) +HEADERS=$(SOURCES:.c=.h) + +## Compilation options, type man avr-gcc if you're curious. +CPPFLAGS = -DF_CPU=$(F_CPU) -DBAUD=$(BAUD) -I. -I$(LIBDIR) +CFLAGS = -Os -g -std=gnu99 -Wall +## Use short (8-bit) data types +CFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums +## Splits up object files per function +CFLAGS += -ffunction-sections -fdata-sections +LDFLAGS = -Wl,-Map,$(TARGET).map +## Optional, but often ends up with smaller code +LDFLAGS += -Wl,--gc-sections +## Relax shrinks code even more, but makes disassembly messy +## LDFLAGS += -Wl,--relax +## LDFLAGS += -Wl,-u,vfprintf -lprintf_flt -lm ## for floating-point printf +## LDFLAGS += -Wl,-u,vfprintf -lprintf_min ## for smaller printf +TARGET_ARCH = -mmcu=$(MCU) + +## Explicit pattern rules: +## To make .o files from .c files +%.o: %.c $(HEADERS) Makefile + $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c -o $@ $<; + +$(TARGET).elf: $(OBJECTS) + $(CC) $(LDFLAGS) $(TARGET_ARCH) $^ $(LDLIBS) -o $@ + +%.hex: %.elf + $(OBJCOPY) -j .text -j .data -O ihex $< $@ + +%.eeprom: %.elf + $(OBJCOPY) -j .eeprom --change-section-lma .eeprom=0 -O ihex $< $@ + +%.lst: %.elf + $(OBJDUMP) -S $< > $@ + +## These targets don't have files named after them +.PHONY: all disassemble disasm eeprom size clean squeaky_clean flash fuses + +all: $(TARGET).hex + +debug: + @echo + @echo "Source files:" $(SOURCES) + @echo "MCU, F_CPU, BAUD:" $(MCU), $(F_CPU), $(BAUD) + @echo + +# Optionally create listing file from .elf +# This creates approximate assembly-language equivalent of your code. +# Useful for debugging time-sensitive bits, +# or making sure the compiler does what you want. +disassemble: $(TARGET).lst + +disasm: disassemble + +# Optionally show how big the resulting program is +size: $(TARGET).elf + $(AVRSIZE) -C --mcu=$(MCU) $(TARGET).elf + +clean: + rm -f $(TARGET).elf $(TARGET).hex $(TARGET).obj \ + $(TARGET).o $(TARGET).d $(TARGET).eep $(TARGET).lst \ + $(TARGET).lss $(TARGET).sym $(TARGET).map $(TARGET)~ \ + $(TARGET).eeprom + +squeaky_clean: + rm -f *.elf *.hex *.obj *.o *.d *.eep *.lst *.lss *.sym *.map *~ *.eeprom + +##########------------------------------------------------------########## +########## Programmer-specific details ########## +########## Flashing code to AVR using avrdude ########## +##########------------------------------------------------------########## + +flash: $(TARGET).hex + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U flash:w:$< + +## An alias +program: flash + +flash_eeprom: $(TARGET).eeprom + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U eeprom:w:$< + +avrdude_terminal: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nt + +## If you've got multiple programmers that you use, +## you can define them here so that it's easy to switch. +## To invoke, use something like `make flash_arduinoISP` +flash_usbtiny: PROGRAMMER_TYPE = usbtiny +flash_usbtiny: PROGRAMMER_ARGS = # USBTiny works with no further arguments +flash_usbtiny: flash + +flash_usbasp: PROGRAMMER_TYPE = usbasp +flash_usbasp: PROGRAMMER_ARGS = # USBasp works with no further arguments +flash_usbasp: flash + +flash_arduinoISP: PROGRAMMER_TYPE = avrisp +flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P /dev/ttyACM0 +## (for windows) flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P com5 +flash_arduinoISP: flash + +flash_109: PROGRAMMER_TYPE = avr109 +flash_109: PROGRAMMER_ARGS = -b 9600 -P /dev/ttyUSB0 +flash_109: flash + +##########------------------------------------------------------########## +########## Fuse settings and suitable defaults ########## +##########------------------------------------------------------########## + +## Mega 48, 88, 168, 328 default values +LFUSE = 0x62 +HFUSE = 0xdf +EFUSE = 0x00 + +## Generic +FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m + +fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) \ + $(PROGRAMMER_ARGS) $(FUSE_STRING) +show_fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nv + +## Called with no extra definitions, sets to defaults +set_default_fuses: FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m +set_default_fuses: fuses + +## Set the fuse byte for full-speed mode +## Note: can also be set in firmware for modern chips +set_fast_fuse: LFUSE = 0xE2 +set_fast_fuse: FUSE_STRING = -U lfuse:w:$(LFUSE):m +set_fast_fuse: fuses + +## Set the EESAVE fuse byte to preserve EEPROM across flashes +set_eeprom_save_fuse: HFUSE = 0xD7 +set_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +set_eeprom_save_fuse: fuses + +## Clear the EESAVE fuse byte +clear_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +clear_eeprom_save_fuse: fuses diff --git a/Make AVR Examples/Chapter06_Digital-Input/debouncer/debouncer.c b/Make AVR Examples/Chapter06_Digital-Input/debouncer/debouncer.c new file mode 100644 index 0000000..a03a9fa --- /dev/null +++ b/Make AVR Examples/Chapter06_Digital-Input/debouncer/debouncer.c @@ -0,0 +1,40 @@ + + +// ------- Preamble -------- // +#include +#include "pinDefines.h" + +#include +#define DEBOUNCE_TIME 1000 /* microseconds */ + +uint8_t debounce(void) { + if (bit_is_clear(BUTTON_PIN, BUTTON)) { /* button is pressed now */ + _delay_us(DEBOUNCE_TIME); + if (bit_is_clear(BUTTON_PIN, BUTTON)) { /* still pressed */ + return (1); + } + } + return 0; +} + +int main(void) { + // -------- Inits --------- // + uint8_t buttonWasPressed=0; /* state */ + BUTTON_PORT |= (1 << BUTTON); /* enable the pullup on the button */ + LED_DDR = (1 << LED0); /* set up LED for output */ + + // ------ Event loop ------ // + while (1) { + if (debounce()) { /* debounced button press */ + if (buttonWasPressed == 0) { /* but wasn't last time through */ + LED_PORT ^= (1 << LED0); /* do whatever */ + buttonWasPressed = 1; /* update the state */ + } + } + else { /* button is not pressed now */ + buttonWasPressed = 0; /* update the state */ + } + + } /* End event loop */ + return 0; /* This line is never reached */ +} diff --git a/Make AVR Examples/Chapter06_Digital-Input/simpleButton/Makefile b/Make AVR Examples/Chapter06_Digital-Input/simpleButton/Makefile new file mode 100644 index 0000000..3d9e544 --- /dev/null +++ b/Make AVR Examples/Chapter06_Digital-Input/simpleButton/Makefile @@ -0,0 +1,196 @@ + +##########------------------------------------------------------########## +########## Project-specific Details ########## +########## Check these every time you start a new project ########## +##########------------------------------------------------------########## + +MCU = atmega168p +F_CPU = 1000000UL +BAUD = 9600UL +## Also try BAUD = 19200 or 38400 if you're feeling lucky. + +## A directory for common include files and the simple USART library. +## If you move either the current folder or the Library folder, you'll +## need to change this path to match. +LIBDIR = ../../AVR-Programming-Library + +##########------------------------------------------------------########## +########## Programmer Defaults ########## +########## Set up once, then forget about it ########## +########## (Can override. See bottom of file.) ########## +##########------------------------------------------------------########## + +PROGRAMMER_TYPE = usbtiny +# extra arguments to avrdude: baud rate, chip type, -F flag, etc. +PROGRAMMER_ARGS = + +##########------------------------------------------------------########## +########## Program Locations ########## +########## Won't need to change if they're in your PATH ########## +##########------------------------------------------------------########## + +CC = avr-gcc +OBJCOPY = avr-objcopy +OBJDUMP = avr-objdump +AVRSIZE = avr-size +AVRDUDE = avrdude + +##########------------------------------------------------------########## +########## Makefile Magic! ########## +########## Summary: ########## +########## We want a .hex file ########## +########## Compile source files into .elf ########## +########## Convert .elf file into .hex ########## +########## You shouldn't need to edit below. ########## +##########------------------------------------------------------########## + +## The name of your project (without the .c) +# TARGET = blinkLED +## Or name it automatically after the enclosing directory +TARGET = $(lastword $(subst /, ,$(CURDIR))) + +# Object files: will find all .c/.h files in current directory +# and in LIBDIR. If you have any other (sub-)directories with code, +# you can add them in to SOURCES below in the wildcard statement. +SOURCES=$(wildcard *.c $(LIBDIR)/*.c) +OBJECTS=$(SOURCES:.c=.o) +HEADERS=$(SOURCES:.c=.h) + +## Compilation options, type man avr-gcc if you're curious. +CPPFLAGS = -DF_CPU=$(F_CPU) -DBAUD=$(BAUD) -I. -I$(LIBDIR) +CFLAGS = -Os -g -std=gnu99 -Wall +## Use short (8-bit) data types +CFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums +## Splits up object files per function +CFLAGS += -ffunction-sections -fdata-sections +LDFLAGS = -Wl,-Map,$(TARGET).map +## Optional, but often ends up with smaller code +LDFLAGS += -Wl,--gc-sections +## Relax shrinks code even more, but makes disassembly messy +## LDFLAGS += -Wl,--relax +## LDFLAGS += -Wl,-u,vfprintf -lprintf_flt -lm ## for floating-point printf +## LDFLAGS += -Wl,-u,vfprintf -lprintf_min ## for smaller printf +TARGET_ARCH = -mmcu=$(MCU) + +## Explicit pattern rules: +## To make .o files from .c files +%.o: %.c $(HEADERS) Makefile + $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c -o $@ $<; + +$(TARGET).elf: $(OBJECTS) + $(CC) $(LDFLAGS) $(TARGET_ARCH) $^ $(LDLIBS) -o $@ + +%.hex: %.elf + $(OBJCOPY) -j .text -j .data -O ihex $< $@ + +%.eeprom: %.elf + $(OBJCOPY) -j .eeprom --change-section-lma .eeprom=0 -O ihex $< $@ + +%.lst: %.elf + $(OBJDUMP) -S $< > $@ + +## These targets don't have files named after them +.PHONY: all disassemble disasm eeprom size clean squeaky_clean flash fuses + +all: $(TARGET).hex + +debug: + @echo + @echo "Source files:" $(SOURCES) + @echo "MCU, F_CPU, BAUD:" $(MCU), $(F_CPU), $(BAUD) + @echo + +# Optionally create listing file from .elf +# This creates approximate assembly-language equivalent of your code. +# Useful for debugging time-sensitive bits, +# or making sure the compiler does what you want. +disassemble: $(TARGET).lst + +disasm: disassemble + +# Optionally show how big the resulting program is +size: $(TARGET).elf + $(AVRSIZE) -C --mcu=$(MCU) $(TARGET).elf + +clean: + rm -f $(TARGET).elf $(TARGET).hex $(TARGET).obj \ + $(TARGET).o $(TARGET).d $(TARGET).eep $(TARGET).lst \ + $(TARGET).lss $(TARGET).sym $(TARGET).map $(TARGET)~ \ + $(TARGET).eeprom + +squeaky_clean: + rm -f *.elf *.hex *.obj *.o *.d *.eep *.lst *.lss *.sym *.map *~ *.eeprom + +##########------------------------------------------------------########## +########## Programmer-specific details ########## +########## Flashing code to AVR using avrdude ########## +##########------------------------------------------------------########## + +flash: $(TARGET).hex + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U flash:w:$< + +## An alias +program: flash + +flash_eeprom: $(TARGET).eeprom + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U eeprom:w:$< + +avrdude_terminal: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nt + +## If you've got multiple programmers that you use, +## you can define them here so that it's easy to switch. +## To invoke, use something like `make flash_arduinoISP` +flash_usbtiny: PROGRAMMER_TYPE = usbtiny +flash_usbtiny: PROGRAMMER_ARGS = # USBTiny works with no further arguments +flash_usbtiny: flash + +flash_usbasp: PROGRAMMER_TYPE = usbasp +flash_usbasp: PROGRAMMER_ARGS = # USBasp works with no further arguments +flash_usbasp: flash + +flash_arduinoISP: PROGRAMMER_TYPE = avrisp +flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P /dev/ttyACM0 +## (for windows) flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P com5 +flash_arduinoISP: flash + +flash_109: PROGRAMMER_TYPE = avr109 +flash_109: PROGRAMMER_ARGS = -b 9600 -P /dev/ttyUSB0 +flash_109: flash + +##########------------------------------------------------------########## +########## Fuse settings and suitable defaults ########## +##########------------------------------------------------------########## + +## Mega 48, 88, 168, 328 default values +LFUSE = 0x62 +HFUSE = 0xdf +EFUSE = 0x00 + +## Generic +FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m + +fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) \ + $(PROGRAMMER_ARGS) $(FUSE_STRING) +show_fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nv + +## Called with no extra definitions, sets to defaults +set_default_fuses: FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m +set_default_fuses: fuses + +## Set the fuse byte for full-speed mode +## Note: can also be set in firmware for modern chips +set_fast_fuse: LFUSE = 0xE2 +set_fast_fuse: FUSE_STRING = -U lfuse:w:$(LFUSE):m +set_fast_fuse: fuses + +## Set the EESAVE fuse byte to preserve EEPROM across flashes +set_eeprom_save_fuse: HFUSE = 0xD7 +set_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +set_eeprom_save_fuse: fuses + +## Clear the EESAVE fuse byte +clear_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +clear_eeprom_save_fuse: fuses diff --git a/Make AVR Examples/Chapter06_Digital-Input/simpleButton/simpleButton.c b/Make AVR Examples/Chapter06_Digital-Input/simpleButton/simpleButton.c new file mode 100644 index 0000000..aecbffe --- /dev/null +++ b/Make AVR Examples/Chapter06_Digital-Input/simpleButton/simpleButton.c @@ -0,0 +1,27 @@ +/* + Demo of the simplest on/off button code + Button connected to PD2 + LEDs connected to PB0..PB7 +*/ + +// ------- Preamble -------- // +#include +#include + +int main(void) { + // -------- Inits --------- // + PORTD |= (1 << PD2); /* initialize pullup resistor on our input pin */ + DDRB = 0xff; /* set up all LEDs for output */ + + // ------ Event loop ------ // + while (1) { + if (bit_is_clear(PIND, PD2)) { /* look for button press */ + /* equivalent to if ((PIND & (1 << PD2)) == 0 ){ */ + PORTB = 0b00111100; /* pressed */ + } + else { /* not pressed */ + PORTB = 0b11000011; + } + } /* End event loop */ + return 0; +} diff --git a/Make AVR Examples/Chapter06_Digital-Input/toggleButton/Makefile b/Make AVR Examples/Chapter06_Digital-Input/toggleButton/Makefile new file mode 100644 index 0000000..3d9e544 --- /dev/null +++ b/Make AVR Examples/Chapter06_Digital-Input/toggleButton/Makefile @@ -0,0 +1,196 @@ + +##########------------------------------------------------------########## +########## Project-specific Details ########## +########## Check these every time you start a new project ########## +##########------------------------------------------------------########## + +MCU = atmega168p +F_CPU = 1000000UL +BAUD = 9600UL +## Also try BAUD = 19200 or 38400 if you're feeling lucky. + +## A directory for common include files and the simple USART library. +## If you move either the current folder or the Library folder, you'll +## need to change this path to match. +LIBDIR = ../../AVR-Programming-Library + +##########------------------------------------------------------########## +########## Programmer Defaults ########## +########## Set up once, then forget about it ########## +########## (Can override. See bottom of file.) ########## +##########------------------------------------------------------########## + +PROGRAMMER_TYPE = usbtiny +# extra arguments to avrdude: baud rate, chip type, -F flag, etc. +PROGRAMMER_ARGS = + +##########------------------------------------------------------########## +########## Program Locations ########## +########## Won't need to change if they're in your PATH ########## +##########------------------------------------------------------########## + +CC = avr-gcc +OBJCOPY = avr-objcopy +OBJDUMP = avr-objdump +AVRSIZE = avr-size +AVRDUDE = avrdude + +##########------------------------------------------------------########## +########## Makefile Magic! ########## +########## Summary: ########## +########## We want a .hex file ########## +########## Compile source files into .elf ########## +########## Convert .elf file into .hex ########## +########## You shouldn't need to edit below. ########## +##########------------------------------------------------------########## + +## The name of your project (without the .c) +# TARGET = blinkLED +## Or name it automatically after the enclosing directory +TARGET = $(lastword $(subst /, ,$(CURDIR))) + +# Object files: will find all .c/.h files in current directory +# and in LIBDIR. If you have any other (sub-)directories with code, +# you can add them in to SOURCES below in the wildcard statement. +SOURCES=$(wildcard *.c $(LIBDIR)/*.c) +OBJECTS=$(SOURCES:.c=.o) +HEADERS=$(SOURCES:.c=.h) + +## Compilation options, type man avr-gcc if you're curious. +CPPFLAGS = -DF_CPU=$(F_CPU) -DBAUD=$(BAUD) -I. -I$(LIBDIR) +CFLAGS = -Os -g -std=gnu99 -Wall +## Use short (8-bit) data types +CFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums +## Splits up object files per function +CFLAGS += -ffunction-sections -fdata-sections +LDFLAGS = -Wl,-Map,$(TARGET).map +## Optional, but often ends up with smaller code +LDFLAGS += -Wl,--gc-sections +## Relax shrinks code even more, but makes disassembly messy +## LDFLAGS += -Wl,--relax +## LDFLAGS += -Wl,-u,vfprintf -lprintf_flt -lm ## for floating-point printf +## LDFLAGS += -Wl,-u,vfprintf -lprintf_min ## for smaller printf +TARGET_ARCH = -mmcu=$(MCU) + +## Explicit pattern rules: +## To make .o files from .c files +%.o: %.c $(HEADERS) Makefile + $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c -o $@ $<; + +$(TARGET).elf: $(OBJECTS) + $(CC) $(LDFLAGS) $(TARGET_ARCH) $^ $(LDLIBS) -o $@ + +%.hex: %.elf + $(OBJCOPY) -j .text -j .data -O ihex $< $@ + +%.eeprom: %.elf + $(OBJCOPY) -j .eeprom --change-section-lma .eeprom=0 -O ihex $< $@ + +%.lst: %.elf + $(OBJDUMP) -S $< > $@ + +## These targets don't have files named after them +.PHONY: all disassemble disasm eeprom size clean squeaky_clean flash fuses + +all: $(TARGET).hex + +debug: + @echo + @echo "Source files:" $(SOURCES) + @echo "MCU, F_CPU, BAUD:" $(MCU), $(F_CPU), $(BAUD) + @echo + +# Optionally create listing file from .elf +# This creates approximate assembly-language equivalent of your code. +# Useful for debugging time-sensitive bits, +# or making sure the compiler does what you want. +disassemble: $(TARGET).lst + +disasm: disassemble + +# Optionally show how big the resulting program is +size: $(TARGET).elf + $(AVRSIZE) -C --mcu=$(MCU) $(TARGET).elf + +clean: + rm -f $(TARGET).elf $(TARGET).hex $(TARGET).obj \ + $(TARGET).o $(TARGET).d $(TARGET).eep $(TARGET).lst \ + $(TARGET).lss $(TARGET).sym $(TARGET).map $(TARGET)~ \ + $(TARGET).eeprom + +squeaky_clean: + rm -f *.elf *.hex *.obj *.o *.d *.eep *.lst *.lss *.sym *.map *~ *.eeprom + +##########------------------------------------------------------########## +########## Programmer-specific details ########## +########## Flashing code to AVR using avrdude ########## +##########------------------------------------------------------########## + +flash: $(TARGET).hex + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U flash:w:$< + +## An alias +program: flash + +flash_eeprom: $(TARGET).eeprom + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U eeprom:w:$< + +avrdude_terminal: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nt + +## If you've got multiple programmers that you use, +## you can define them here so that it's easy to switch. +## To invoke, use something like `make flash_arduinoISP` +flash_usbtiny: PROGRAMMER_TYPE = usbtiny +flash_usbtiny: PROGRAMMER_ARGS = # USBTiny works with no further arguments +flash_usbtiny: flash + +flash_usbasp: PROGRAMMER_TYPE = usbasp +flash_usbasp: PROGRAMMER_ARGS = # USBasp works with no further arguments +flash_usbasp: flash + +flash_arduinoISP: PROGRAMMER_TYPE = avrisp +flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P /dev/ttyACM0 +## (for windows) flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P com5 +flash_arduinoISP: flash + +flash_109: PROGRAMMER_TYPE = avr109 +flash_109: PROGRAMMER_ARGS = -b 9600 -P /dev/ttyUSB0 +flash_109: flash + +##########------------------------------------------------------########## +########## Fuse settings and suitable defaults ########## +##########------------------------------------------------------########## + +## Mega 48, 88, 168, 328 default values +LFUSE = 0x62 +HFUSE = 0xdf +EFUSE = 0x00 + +## Generic +FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m + +fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) \ + $(PROGRAMMER_ARGS) $(FUSE_STRING) +show_fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nv + +## Called with no extra definitions, sets to defaults +set_default_fuses: FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m +set_default_fuses: fuses + +## Set the fuse byte for full-speed mode +## Note: can also be set in firmware for modern chips +set_fast_fuse: LFUSE = 0xE2 +set_fast_fuse: FUSE_STRING = -U lfuse:w:$(LFUSE):m +set_fast_fuse: fuses + +## Set the EESAVE fuse byte to preserve EEPROM across flashes +set_eeprom_save_fuse: HFUSE = 0xD7 +set_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +set_eeprom_save_fuse: fuses + +## Clear the EESAVE fuse byte +clear_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +clear_eeprom_save_fuse: fuses diff --git a/Make AVR Examples/Chapter06_Digital-Input/toggleButton/toggleButton.c b/Make AVR Examples/Chapter06_Digital-Input/toggleButton/toggleButton.c new file mode 100644 index 0000000..b9dbcd5 --- /dev/null +++ b/Make AVR Examples/Chapter06_Digital-Input/toggleButton/toggleButton.c @@ -0,0 +1,28 @@ +/* + Demonstrates using state to detect button presses +*/ + +// ------- Preamble -------- // +#include +#include "pinDefines.h" + +int main(void) { + // -------- Inits --------- // + uint8_t buttonWasPressed; /* state */ + BUTTON_PORT |= (1 << BUTTON); /* enable the pullup on the button */ + LED_DDR = (1 << LED0); /* set up LED for output */ + + // ------ Event loop ------ // + while (1) { + if (bit_is_clear(BUTTON_PIN, BUTTON)) { /* button is pressed now */ + if (buttonWasPressed == 0) { /* but wasn't last time through */ + LED_PORT ^= (1 << LED0); /* do whatever */ + buttonWasPressed = 1; /* update the state */ + } + } + else { /* button is not pressed now */ + buttonWasPressed = 0; /* update the state */ + } + } /* End event loop */ + return 0; /* This line is never reached */ +} diff --git a/Make AVR Examples/Chapter06_Digital-Input/toggleButton_debounced/Makefile b/Make AVR Examples/Chapter06_Digital-Input/toggleButton_debounced/Makefile new file mode 100644 index 0000000..3d9e544 --- /dev/null +++ b/Make AVR Examples/Chapter06_Digital-Input/toggleButton_debounced/Makefile @@ -0,0 +1,196 @@ + +##########------------------------------------------------------########## +########## Project-specific Details ########## +########## Check these every time you start a new project ########## +##########------------------------------------------------------########## + +MCU = atmega168p +F_CPU = 1000000UL +BAUD = 9600UL +## Also try BAUD = 19200 or 38400 if you're feeling lucky. + +## A directory for common include files and the simple USART library. +## If you move either the current folder or the Library folder, you'll +## need to change this path to match. +LIBDIR = ../../AVR-Programming-Library + +##########------------------------------------------------------########## +########## Programmer Defaults ########## +########## Set up once, then forget about it ########## +########## (Can override. See bottom of file.) ########## +##########------------------------------------------------------########## + +PROGRAMMER_TYPE = usbtiny +# extra arguments to avrdude: baud rate, chip type, -F flag, etc. +PROGRAMMER_ARGS = + +##########------------------------------------------------------########## +########## Program Locations ########## +########## Won't need to change if they're in your PATH ########## +##########------------------------------------------------------########## + +CC = avr-gcc +OBJCOPY = avr-objcopy +OBJDUMP = avr-objdump +AVRSIZE = avr-size +AVRDUDE = avrdude + +##########------------------------------------------------------########## +########## Makefile Magic! ########## +########## Summary: ########## +########## We want a .hex file ########## +########## Compile source files into .elf ########## +########## Convert .elf file into .hex ########## +########## You shouldn't need to edit below. ########## +##########------------------------------------------------------########## + +## The name of your project (without the .c) +# TARGET = blinkLED +## Or name it automatically after the enclosing directory +TARGET = $(lastword $(subst /, ,$(CURDIR))) + +# Object files: will find all .c/.h files in current directory +# and in LIBDIR. If you have any other (sub-)directories with code, +# you can add them in to SOURCES below in the wildcard statement. +SOURCES=$(wildcard *.c $(LIBDIR)/*.c) +OBJECTS=$(SOURCES:.c=.o) +HEADERS=$(SOURCES:.c=.h) + +## Compilation options, type man avr-gcc if you're curious. +CPPFLAGS = -DF_CPU=$(F_CPU) -DBAUD=$(BAUD) -I. -I$(LIBDIR) +CFLAGS = -Os -g -std=gnu99 -Wall +## Use short (8-bit) data types +CFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums +## Splits up object files per function +CFLAGS += -ffunction-sections -fdata-sections +LDFLAGS = -Wl,-Map,$(TARGET).map +## Optional, but often ends up with smaller code +LDFLAGS += -Wl,--gc-sections +## Relax shrinks code even more, but makes disassembly messy +## LDFLAGS += -Wl,--relax +## LDFLAGS += -Wl,-u,vfprintf -lprintf_flt -lm ## for floating-point printf +## LDFLAGS += -Wl,-u,vfprintf -lprintf_min ## for smaller printf +TARGET_ARCH = -mmcu=$(MCU) + +## Explicit pattern rules: +## To make .o files from .c files +%.o: %.c $(HEADERS) Makefile + $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c -o $@ $<; + +$(TARGET).elf: $(OBJECTS) + $(CC) $(LDFLAGS) $(TARGET_ARCH) $^ $(LDLIBS) -o $@ + +%.hex: %.elf + $(OBJCOPY) -j .text -j .data -O ihex $< $@ + +%.eeprom: %.elf + $(OBJCOPY) -j .eeprom --change-section-lma .eeprom=0 -O ihex $< $@ + +%.lst: %.elf + $(OBJDUMP) -S $< > $@ + +## These targets don't have files named after them +.PHONY: all disassemble disasm eeprom size clean squeaky_clean flash fuses + +all: $(TARGET).hex + +debug: + @echo + @echo "Source files:" $(SOURCES) + @echo "MCU, F_CPU, BAUD:" $(MCU), $(F_CPU), $(BAUD) + @echo + +# Optionally create listing file from .elf +# This creates approximate assembly-language equivalent of your code. +# Useful for debugging time-sensitive bits, +# or making sure the compiler does what you want. +disassemble: $(TARGET).lst + +disasm: disassemble + +# Optionally show how big the resulting program is +size: $(TARGET).elf + $(AVRSIZE) -C --mcu=$(MCU) $(TARGET).elf + +clean: + rm -f $(TARGET).elf $(TARGET).hex $(TARGET).obj \ + $(TARGET).o $(TARGET).d $(TARGET).eep $(TARGET).lst \ + $(TARGET).lss $(TARGET).sym $(TARGET).map $(TARGET)~ \ + $(TARGET).eeprom + +squeaky_clean: + rm -f *.elf *.hex *.obj *.o *.d *.eep *.lst *.lss *.sym *.map *~ *.eeprom + +##########------------------------------------------------------########## +########## Programmer-specific details ########## +########## Flashing code to AVR using avrdude ########## +##########------------------------------------------------------########## + +flash: $(TARGET).hex + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U flash:w:$< + +## An alias +program: flash + +flash_eeprom: $(TARGET).eeprom + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U eeprom:w:$< + +avrdude_terminal: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nt + +## If you've got multiple programmers that you use, +## you can define them here so that it's easy to switch. +## To invoke, use something like `make flash_arduinoISP` +flash_usbtiny: PROGRAMMER_TYPE = usbtiny +flash_usbtiny: PROGRAMMER_ARGS = # USBTiny works with no further arguments +flash_usbtiny: flash + +flash_usbasp: PROGRAMMER_TYPE = usbasp +flash_usbasp: PROGRAMMER_ARGS = # USBasp works with no further arguments +flash_usbasp: flash + +flash_arduinoISP: PROGRAMMER_TYPE = avrisp +flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P /dev/ttyACM0 +## (for windows) flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P com5 +flash_arduinoISP: flash + +flash_109: PROGRAMMER_TYPE = avr109 +flash_109: PROGRAMMER_ARGS = -b 9600 -P /dev/ttyUSB0 +flash_109: flash + +##########------------------------------------------------------########## +########## Fuse settings and suitable defaults ########## +##########------------------------------------------------------########## + +## Mega 48, 88, 168, 328 default values +LFUSE = 0x62 +HFUSE = 0xdf +EFUSE = 0x00 + +## Generic +FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m + +fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) \ + $(PROGRAMMER_ARGS) $(FUSE_STRING) +show_fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nv + +## Called with no extra definitions, sets to defaults +set_default_fuses: FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m +set_default_fuses: fuses + +## Set the fuse byte for full-speed mode +## Note: can also be set in firmware for modern chips +set_fast_fuse: LFUSE = 0xE2 +set_fast_fuse: FUSE_STRING = -U lfuse:w:$(LFUSE):m +set_fast_fuse: fuses + +## Set the EESAVE fuse byte to preserve EEPROM across flashes +set_eeprom_save_fuse: HFUSE = 0xD7 +set_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +set_eeprom_save_fuse: fuses + +## Clear the EESAVE fuse byte +clear_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +clear_eeprom_save_fuse: fuses diff --git a/Make AVR Examples/Chapter06_Digital-Input/toggleButton_debounced/toggleButton_debounced.c b/Make AVR Examples/Chapter06_Digital-Input/toggleButton_debounced/toggleButton_debounced.c new file mode 100644 index 0000000..d1b3d99 --- /dev/null +++ b/Make AVR Examples/Chapter06_Digital-Input/toggleButton_debounced/toggleButton_debounced.c @@ -0,0 +1,42 @@ +/* + Demonstrates using state to detect button presses +*/ + +// ------- Preamble -------- // +#include +#include "pinDefines.h" + +#include +#define DEBOUNCE_TIME 5 /* microseconds */ + +uint8_t debouncePress(void) { + if (bit_is_clear(BUTTON_PIN, BUTTON)) { /* button is pressed now */ + _delay_ms(DEBOUNCE_TIME); + if (bit_is_clear(BUTTON_PIN, BUTTON)) { /* still pressed */ + return (1); + } + } + return 0; +} + +int main(void) { + // -------- Inits --------- // + uint8_t buttonWasPressed=0; /* state */ + BUTTON_PORT |= (1 << BUTTON); /* enable the pullup on the button */ + LED_DDR = (1 << LED0); /* set up LED for output */ + + // ------ Event loop ------ // + while (1) { + if (debouncePress()) { + if (buttonWasPressed == 0) { /* but wasn't last time through */ + LED_PORT ^= (1 << LED0); /* do whatever */ + buttonWasPressed = 1; /* update the state */ + } + } + else { /* button is not pressed now */ + buttonWasPressed = 0; /* update the state */ + } + + } /* End event loop */ + return 0; /* This line is never reached */ +} diff --git a/Make AVR Examples/Chapter07_Analog-to-Digital-Conversion-I/lightSensor/.gitignore b/Make AVR Examples/Chapter07_Analog-to-Digital-Conversion-I/lightSensor/.gitignore new file mode 100644 index 0000000..33cb8f6 --- /dev/null +++ b/Make AVR Examples/Chapter07_Analog-to-Digital-Conversion-I/lightSensor/.gitignore @@ -0,0 +1 @@ +lightSensor_50Hz.c diff --git a/Make AVR Examples/Chapter07_Analog-to-Digital-Conversion-I/lightSensor/Makefile b/Make AVR Examples/Chapter07_Analog-to-Digital-Conversion-I/lightSensor/Makefile new file mode 100644 index 0000000..3d9e544 --- /dev/null +++ b/Make AVR Examples/Chapter07_Analog-to-Digital-Conversion-I/lightSensor/Makefile @@ -0,0 +1,196 @@ + +##########------------------------------------------------------########## +########## Project-specific Details ########## +########## Check these every time you start a new project ########## +##########------------------------------------------------------########## + +MCU = atmega168p +F_CPU = 1000000UL +BAUD = 9600UL +## Also try BAUD = 19200 or 38400 if you're feeling lucky. + +## A directory for common include files and the simple USART library. +## If you move either the current folder or the Library folder, you'll +## need to change this path to match. +LIBDIR = ../../AVR-Programming-Library + +##########------------------------------------------------------########## +########## Programmer Defaults ########## +########## Set up once, then forget about it ########## +########## (Can override. See bottom of file.) ########## +##########------------------------------------------------------########## + +PROGRAMMER_TYPE = usbtiny +# extra arguments to avrdude: baud rate, chip type, -F flag, etc. +PROGRAMMER_ARGS = + +##########------------------------------------------------------########## +########## Program Locations ########## +########## Won't need to change if they're in your PATH ########## +##########------------------------------------------------------########## + +CC = avr-gcc +OBJCOPY = avr-objcopy +OBJDUMP = avr-objdump +AVRSIZE = avr-size +AVRDUDE = avrdude + +##########------------------------------------------------------########## +########## Makefile Magic! ########## +########## Summary: ########## +########## We want a .hex file ########## +########## Compile source files into .elf ########## +########## Convert .elf file into .hex ########## +########## You shouldn't need to edit below. ########## +##########------------------------------------------------------########## + +## The name of your project (without the .c) +# TARGET = blinkLED +## Or name it automatically after the enclosing directory +TARGET = $(lastword $(subst /, ,$(CURDIR))) + +# Object files: will find all .c/.h files in current directory +# and in LIBDIR. If you have any other (sub-)directories with code, +# you can add them in to SOURCES below in the wildcard statement. +SOURCES=$(wildcard *.c $(LIBDIR)/*.c) +OBJECTS=$(SOURCES:.c=.o) +HEADERS=$(SOURCES:.c=.h) + +## Compilation options, type man avr-gcc if you're curious. +CPPFLAGS = -DF_CPU=$(F_CPU) -DBAUD=$(BAUD) -I. -I$(LIBDIR) +CFLAGS = -Os -g -std=gnu99 -Wall +## Use short (8-bit) data types +CFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums +## Splits up object files per function +CFLAGS += -ffunction-sections -fdata-sections +LDFLAGS = -Wl,-Map,$(TARGET).map +## Optional, but often ends up with smaller code +LDFLAGS += -Wl,--gc-sections +## Relax shrinks code even more, but makes disassembly messy +## LDFLAGS += -Wl,--relax +## LDFLAGS += -Wl,-u,vfprintf -lprintf_flt -lm ## for floating-point printf +## LDFLAGS += -Wl,-u,vfprintf -lprintf_min ## for smaller printf +TARGET_ARCH = -mmcu=$(MCU) + +## Explicit pattern rules: +## To make .o files from .c files +%.o: %.c $(HEADERS) Makefile + $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c -o $@ $<; + +$(TARGET).elf: $(OBJECTS) + $(CC) $(LDFLAGS) $(TARGET_ARCH) $^ $(LDLIBS) -o $@ + +%.hex: %.elf + $(OBJCOPY) -j .text -j .data -O ihex $< $@ + +%.eeprom: %.elf + $(OBJCOPY) -j .eeprom --change-section-lma .eeprom=0 -O ihex $< $@ + +%.lst: %.elf + $(OBJDUMP) -S $< > $@ + +## These targets don't have files named after them +.PHONY: all disassemble disasm eeprom size clean squeaky_clean flash fuses + +all: $(TARGET).hex + +debug: + @echo + @echo "Source files:" $(SOURCES) + @echo "MCU, F_CPU, BAUD:" $(MCU), $(F_CPU), $(BAUD) + @echo + +# Optionally create listing file from .elf +# This creates approximate assembly-language equivalent of your code. +# Useful for debugging time-sensitive bits, +# or making sure the compiler does what you want. +disassemble: $(TARGET).lst + +disasm: disassemble + +# Optionally show how big the resulting program is +size: $(TARGET).elf + $(AVRSIZE) -C --mcu=$(MCU) $(TARGET).elf + +clean: + rm -f $(TARGET).elf $(TARGET).hex $(TARGET).obj \ + $(TARGET).o $(TARGET).d $(TARGET).eep $(TARGET).lst \ + $(TARGET).lss $(TARGET).sym $(TARGET).map $(TARGET)~ \ + $(TARGET).eeprom + +squeaky_clean: + rm -f *.elf *.hex *.obj *.o *.d *.eep *.lst *.lss *.sym *.map *~ *.eeprom + +##########------------------------------------------------------########## +########## Programmer-specific details ########## +########## Flashing code to AVR using avrdude ########## +##########------------------------------------------------------########## + +flash: $(TARGET).hex + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U flash:w:$< + +## An alias +program: flash + +flash_eeprom: $(TARGET).eeprom + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U eeprom:w:$< + +avrdude_terminal: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nt + +## If you've got multiple programmers that you use, +## you can define them here so that it's easy to switch. +## To invoke, use something like `make flash_arduinoISP` +flash_usbtiny: PROGRAMMER_TYPE = usbtiny +flash_usbtiny: PROGRAMMER_ARGS = # USBTiny works with no further arguments +flash_usbtiny: flash + +flash_usbasp: PROGRAMMER_TYPE = usbasp +flash_usbasp: PROGRAMMER_ARGS = # USBasp works with no further arguments +flash_usbasp: flash + +flash_arduinoISP: PROGRAMMER_TYPE = avrisp +flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P /dev/ttyACM0 +## (for windows) flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P com5 +flash_arduinoISP: flash + +flash_109: PROGRAMMER_TYPE = avr109 +flash_109: PROGRAMMER_ARGS = -b 9600 -P /dev/ttyUSB0 +flash_109: flash + +##########------------------------------------------------------########## +########## Fuse settings and suitable defaults ########## +##########------------------------------------------------------########## + +## Mega 48, 88, 168, 328 default values +LFUSE = 0x62 +HFUSE = 0xdf +EFUSE = 0x00 + +## Generic +FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m + +fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) \ + $(PROGRAMMER_ARGS) $(FUSE_STRING) +show_fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nv + +## Called with no extra definitions, sets to defaults +set_default_fuses: FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m +set_default_fuses: fuses + +## Set the fuse byte for full-speed mode +## Note: can also be set in firmware for modern chips +set_fast_fuse: LFUSE = 0xE2 +set_fast_fuse: FUSE_STRING = -U lfuse:w:$(LFUSE):m +set_fast_fuse: fuses + +## Set the EESAVE fuse byte to preserve EEPROM across flashes +set_eeprom_save_fuse: HFUSE = 0xD7 +set_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +set_eeprom_save_fuse: fuses + +## Clear the EESAVE fuse byte +clear_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +clear_eeprom_save_fuse: fuses diff --git a/Make AVR Examples/Chapter07_Analog-to-Digital-Conversion-I/lightSensor/lightSensor.c b/Make AVR Examples/Chapter07_Analog-to-Digital-Conversion-I/lightSensor/lightSensor.c new file mode 100644 index 0000000..6136b1e --- /dev/null +++ b/Make AVR Examples/Chapter07_Analog-to-Digital-Conversion-I/lightSensor/lightSensor.c @@ -0,0 +1,41 @@ +// Quick Demo of light sensor + +// ------- Preamble -------- // +#include +#include +#include "pinDefines.h" + +// -------- Functions --------- // +static inline void initADC0(void) { + ADMUX |= (1 << REFS0); /* reference voltage on AVCC */ + ADCSRA |= (1 << ADPS2); /* ADC clock prescaler /16 */ + ADCSRA |= (1 << ADEN); /* enable ADC */ +} + +int main(void) { + + // -------- Inits --------- // + uint8_t ledValue; + uint16_t adcValue; + uint8_t i; + + initADC0(); + LED_DDR = 0xff; + + // ------ Event loop ------ // + while (1) { + + ADCSRA |= (1 << ADSC); /* start ADC conversion */ + loop_until_bit_is_clear(ADCSRA, ADSC); /* wait until done */ + adcValue = ADC; /* read ADC in */ + /* Have 10 bits, want 3 (eight LEDs after all) */ + ledValue = (adcValue >> 7); + /* Light up all LEDs up to ledValue */ + LED_PORT = 0; + for (i = 0; i <= ledValue; i++) { + LED_PORT |= (1 << i); + } + _delay_ms(50); + } /* End event loop */ + return 0; /* This line is never reached */ +} diff --git a/Make AVR Examples/Chapter07_Analog-to-Digital-Conversion-I/nightLight/Makefile b/Make AVR Examples/Chapter07_Analog-to-Digital-Conversion-I/nightLight/Makefile new file mode 100644 index 0000000..3d9e544 --- /dev/null +++ b/Make AVR Examples/Chapter07_Analog-to-Digital-Conversion-I/nightLight/Makefile @@ -0,0 +1,196 @@ + +##########------------------------------------------------------########## +########## Project-specific Details ########## +########## Check these every time you start a new project ########## +##########------------------------------------------------------########## + +MCU = atmega168p +F_CPU = 1000000UL +BAUD = 9600UL +## Also try BAUD = 19200 or 38400 if you're feeling lucky. + +## A directory for common include files and the simple USART library. +## If you move either the current folder or the Library folder, you'll +## need to change this path to match. +LIBDIR = ../../AVR-Programming-Library + +##########------------------------------------------------------########## +########## Programmer Defaults ########## +########## Set up once, then forget about it ########## +########## (Can override. See bottom of file.) ########## +##########------------------------------------------------------########## + +PROGRAMMER_TYPE = usbtiny +# extra arguments to avrdude: baud rate, chip type, -F flag, etc. +PROGRAMMER_ARGS = + +##########------------------------------------------------------########## +########## Program Locations ########## +########## Won't need to change if they're in your PATH ########## +##########------------------------------------------------------########## + +CC = avr-gcc +OBJCOPY = avr-objcopy +OBJDUMP = avr-objdump +AVRSIZE = avr-size +AVRDUDE = avrdude + +##########------------------------------------------------------########## +########## Makefile Magic! ########## +########## Summary: ########## +########## We want a .hex file ########## +########## Compile source files into .elf ########## +########## Convert .elf file into .hex ########## +########## You shouldn't need to edit below. ########## +##########------------------------------------------------------########## + +## The name of your project (without the .c) +# TARGET = blinkLED +## Or name it automatically after the enclosing directory +TARGET = $(lastword $(subst /, ,$(CURDIR))) + +# Object files: will find all .c/.h files in current directory +# and in LIBDIR. If you have any other (sub-)directories with code, +# you can add them in to SOURCES below in the wildcard statement. +SOURCES=$(wildcard *.c $(LIBDIR)/*.c) +OBJECTS=$(SOURCES:.c=.o) +HEADERS=$(SOURCES:.c=.h) + +## Compilation options, type man avr-gcc if you're curious. +CPPFLAGS = -DF_CPU=$(F_CPU) -DBAUD=$(BAUD) -I. -I$(LIBDIR) +CFLAGS = -Os -g -std=gnu99 -Wall +## Use short (8-bit) data types +CFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums +## Splits up object files per function +CFLAGS += -ffunction-sections -fdata-sections +LDFLAGS = -Wl,-Map,$(TARGET).map +## Optional, but often ends up with smaller code +LDFLAGS += -Wl,--gc-sections +## Relax shrinks code even more, but makes disassembly messy +## LDFLAGS += -Wl,--relax +## LDFLAGS += -Wl,-u,vfprintf -lprintf_flt -lm ## for floating-point printf +## LDFLAGS += -Wl,-u,vfprintf -lprintf_min ## for smaller printf +TARGET_ARCH = -mmcu=$(MCU) + +## Explicit pattern rules: +## To make .o files from .c files +%.o: %.c $(HEADERS) Makefile + $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c -o $@ $<; + +$(TARGET).elf: $(OBJECTS) + $(CC) $(LDFLAGS) $(TARGET_ARCH) $^ $(LDLIBS) -o $@ + +%.hex: %.elf + $(OBJCOPY) -j .text -j .data -O ihex $< $@ + +%.eeprom: %.elf + $(OBJCOPY) -j .eeprom --change-section-lma .eeprom=0 -O ihex $< $@ + +%.lst: %.elf + $(OBJDUMP) -S $< > $@ + +## These targets don't have files named after them +.PHONY: all disassemble disasm eeprom size clean squeaky_clean flash fuses + +all: $(TARGET).hex + +debug: + @echo + @echo "Source files:" $(SOURCES) + @echo "MCU, F_CPU, BAUD:" $(MCU), $(F_CPU), $(BAUD) + @echo + +# Optionally create listing file from .elf +# This creates approximate assembly-language equivalent of your code. +# Useful for debugging time-sensitive bits, +# or making sure the compiler does what you want. +disassemble: $(TARGET).lst + +disasm: disassemble + +# Optionally show how big the resulting program is +size: $(TARGET).elf + $(AVRSIZE) -C --mcu=$(MCU) $(TARGET).elf + +clean: + rm -f $(TARGET).elf $(TARGET).hex $(TARGET).obj \ + $(TARGET).o $(TARGET).d $(TARGET).eep $(TARGET).lst \ + $(TARGET).lss $(TARGET).sym $(TARGET).map $(TARGET)~ \ + $(TARGET).eeprom + +squeaky_clean: + rm -f *.elf *.hex *.obj *.o *.d *.eep *.lst *.lss *.sym *.map *~ *.eeprom + +##########------------------------------------------------------########## +########## Programmer-specific details ########## +########## Flashing code to AVR using avrdude ########## +##########------------------------------------------------------########## + +flash: $(TARGET).hex + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U flash:w:$< + +## An alias +program: flash + +flash_eeprom: $(TARGET).eeprom + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U eeprom:w:$< + +avrdude_terminal: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nt + +## If you've got multiple programmers that you use, +## you can define them here so that it's easy to switch. +## To invoke, use something like `make flash_arduinoISP` +flash_usbtiny: PROGRAMMER_TYPE = usbtiny +flash_usbtiny: PROGRAMMER_ARGS = # USBTiny works with no further arguments +flash_usbtiny: flash + +flash_usbasp: PROGRAMMER_TYPE = usbasp +flash_usbasp: PROGRAMMER_ARGS = # USBasp works with no further arguments +flash_usbasp: flash + +flash_arduinoISP: PROGRAMMER_TYPE = avrisp +flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P /dev/ttyACM0 +## (for windows) flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P com5 +flash_arduinoISP: flash + +flash_109: PROGRAMMER_TYPE = avr109 +flash_109: PROGRAMMER_ARGS = -b 9600 -P /dev/ttyUSB0 +flash_109: flash + +##########------------------------------------------------------########## +########## Fuse settings and suitable defaults ########## +##########------------------------------------------------------########## + +## Mega 48, 88, 168, 328 default values +LFUSE = 0x62 +HFUSE = 0xdf +EFUSE = 0x00 + +## Generic +FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m + +fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) \ + $(PROGRAMMER_ARGS) $(FUSE_STRING) +show_fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nv + +## Called with no extra definitions, sets to defaults +set_default_fuses: FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m +set_default_fuses: fuses + +## Set the fuse byte for full-speed mode +## Note: can also be set in firmware for modern chips +set_fast_fuse: LFUSE = 0xE2 +set_fast_fuse: FUSE_STRING = -U lfuse:w:$(LFUSE):m +set_fast_fuse: fuses + +## Set the EESAVE fuse byte to preserve EEPROM across flashes +set_eeprom_save_fuse: HFUSE = 0xD7 +set_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +set_eeprom_save_fuse: fuses + +## Clear the EESAVE fuse byte +clear_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +clear_eeprom_save_fuse: fuses diff --git a/Make AVR Examples/Chapter07_Analog-to-Digital-Conversion-I/nightLight/nightLight.c b/Make AVR Examples/Chapter07_Analog-to-Digital-Conversion-I/nightLight/nightLight.c new file mode 100644 index 0000000..d20f3b6 --- /dev/null +++ b/Make AVR Examples/Chapter07_Analog-to-Digital-Conversion-I/nightLight/nightLight.c @@ -0,0 +1,39 @@ +// Quick and dirty adjustable-threshold night-light. + +// ------- Preamble -------- // +#include +#include +#include "pinDefines.h" + +uint16_t readADC(uint8_t channel) { + ADMUX = (0xf0 & ADMUX) | channel; + ADCSRA |= (1 << ADSC); + loop_until_bit_is_clear(ADCSRA, ADSC); + return (ADC); +} + +int main(void) { + // -------- Inits --------- // + uint16_t lightThreshold; + uint16_t sensorValue; + // Set up ADC + ADMUX |= (1 << REFS0); /* reference voltage on AVCC */ + ADCSRA |= (1 << ADPS1) | (1 << ADPS0); /* ADC clock prescaler /8 */ + ADCSRA |= (1 << ADEN); /* enable ADC */ + + LED_DDR = 0xff; + // ------ Event loop ------ // + while (1) { + + lightThreshold = readADC(POT); + sensorValue = readADC(LIGHT_SENSOR); + + if (sensorValue < lightThreshold) { + LED_PORT = 0xff; + } + else { + LED_PORT = 0x00; + } + } /* End event loop */ + return 0; /* This line is never reached */ +} diff --git a/Make AVR Examples/Chapter07_Analog-to-Digital-Conversion-I/slowScope/Makefile b/Make AVR Examples/Chapter07_Analog-to-Digital-Conversion-I/slowScope/Makefile new file mode 100644 index 0000000..3d9e544 --- /dev/null +++ b/Make AVR Examples/Chapter07_Analog-to-Digital-Conversion-I/slowScope/Makefile @@ -0,0 +1,196 @@ + +##########------------------------------------------------------########## +########## Project-specific Details ########## +########## Check these every time you start a new project ########## +##########------------------------------------------------------########## + +MCU = atmega168p +F_CPU = 1000000UL +BAUD = 9600UL +## Also try BAUD = 19200 or 38400 if you're feeling lucky. + +## A directory for common include files and the simple USART library. +## If you move either the current folder or the Library folder, you'll +## need to change this path to match. +LIBDIR = ../../AVR-Programming-Library + +##########------------------------------------------------------########## +########## Programmer Defaults ########## +########## Set up once, then forget about it ########## +########## (Can override. See bottom of file.) ########## +##########------------------------------------------------------########## + +PROGRAMMER_TYPE = usbtiny +# extra arguments to avrdude: baud rate, chip type, -F flag, etc. +PROGRAMMER_ARGS = + +##########------------------------------------------------------########## +########## Program Locations ########## +########## Won't need to change if they're in your PATH ########## +##########------------------------------------------------------########## + +CC = avr-gcc +OBJCOPY = avr-objcopy +OBJDUMP = avr-objdump +AVRSIZE = avr-size +AVRDUDE = avrdude + +##########------------------------------------------------------########## +########## Makefile Magic! ########## +########## Summary: ########## +########## We want a .hex file ########## +########## Compile source files into .elf ########## +########## Convert .elf file into .hex ########## +########## You shouldn't need to edit below. ########## +##########------------------------------------------------------########## + +## The name of your project (without the .c) +# TARGET = blinkLED +## Or name it automatically after the enclosing directory +TARGET = $(lastword $(subst /, ,$(CURDIR))) + +# Object files: will find all .c/.h files in current directory +# and in LIBDIR. If you have any other (sub-)directories with code, +# you can add them in to SOURCES below in the wildcard statement. +SOURCES=$(wildcard *.c $(LIBDIR)/*.c) +OBJECTS=$(SOURCES:.c=.o) +HEADERS=$(SOURCES:.c=.h) + +## Compilation options, type man avr-gcc if you're curious. +CPPFLAGS = -DF_CPU=$(F_CPU) -DBAUD=$(BAUD) -I. -I$(LIBDIR) +CFLAGS = -Os -g -std=gnu99 -Wall +## Use short (8-bit) data types +CFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums +## Splits up object files per function +CFLAGS += -ffunction-sections -fdata-sections +LDFLAGS = -Wl,-Map,$(TARGET).map +## Optional, but often ends up with smaller code +LDFLAGS += -Wl,--gc-sections +## Relax shrinks code even more, but makes disassembly messy +## LDFLAGS += -Wl,--relax +## LDFLAGS += -Wl,-u,vfprintf -lprintf_flt -lm ## for floating-point printf +## LDFLAGS += -Wl,-u,vfprintf -lprintf_min ## for smaller printf +TARGET_ARCH = -mmcu=$(MCU) + +## Explicit pattern rules: +## To make .o files from .c files +%.o: %.c $(HEADERS) Makefile + $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c -o $@ $<; + +$(TARGET).elf: $(OBJECTS) + $(CC) $(LDFLAGS) $(TARGET_ARCH) $^ $(LDLIBS) -o $@ + +%.hex: %.elf + $(OBJCOPY) -j .text -j .data -O ihex $< $@ + +%.eeprom: %.elf + $(OBJCOPY) -j .eeprom --change-section-lma .eeprom=0 -O ihex $< $@ + +%.lst: %.elf + $(OBJDUMP) -S $< > $@ + +## These targets don't have files named after them +.PHONY: all disassemble disasm eeprom size clean squeaky_clean flash fuses + +all: $(TARGET).hex + +debug: + @echo + @echo "Source files:" $(SOURCES) + @echo "MCU, F_CPU, BAUD:" $(MCU), $(F_CPU), $(BAUD) + @echo + +# Optionally create listing file from .elf +# This creates approximate assembly-language equivalent of your code. +# Useful for debugging time-sensitive bits, +# or making sure the compiler does what you want. +disassemble: $(TARGET).lst + +disasm: disassemble + +# Optionally show how big the resulting program is +size: $(TARGET).elf + $(AVRSIZE) -C --mcu=$(MCU) $(TARGET).elf + +clean: + rm -f $(TARGET).elf $(TARGET).hex $(TARGET).obj \ + $(TARGET).o $(TARGET).d $(TARGET).eep $(TARGET).lst \ + $(TARGET).lss $(TARGET).sym $(TARGET).map $(TARGET)~ \ + $(TARGET).eeprom + +squeaky_clean: + rm -f *.elf *.hex *.obj *.o *.d *.eep *.lst *.lss *.sym *.map *~ *.eeprom + +##########------------------------------------------------------########## +########## Programmer-specific details ########## +########## Flashing code to AVR using avrdude ########## +##########------------------------------------------------------########## + +flash: $(TARGET).hex + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U flash:w:$< + +## An alias +program: flash + +flash_eeprom: $(TARGET).eeprom + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U eeprom:w:$< + +avrdude_terminal: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nt + +## If you've got multiple programmers that you use, +## you can define them here so that it's easy to switch. +## To invoke, use something like `make flash_arduinoISP` +flash_usbtiny: PROGRAMMER_TYPE = usbtiny +flash_usbtiny: PROGRAMMER_ARGS = # USBTiny works with no further arguments +flash_usbtiny: flash + +flash_usbasp: PROGRAMMER_TYPE = usbasp +flash_usbasp: PROGRAMMER_ARGS = # USBasp works with no further arguments +flash_usbasp: flash + +flash_arduinoISP: PROGRAMMER_TYPE = avrisp +flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P /dev/ttyACM0 +## (for windows) flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P com5 +flash_arduinoISP: flash + +flash_109: PROGRAMMER_TYPE = avr109 +flash_109: PROGRAMMER_ARGS = -b 9600 -P /dev/ttyUSB0 +flash_109: flash + +##########------------------------------------------------------########## +########## Fuse settings and suitable defaults ########## +##########------------------------------------------------------########## + +## Mega 48, 88, 168, 328 default values +LFUSE = 0x62 +HFUSE = 0xdf +EFUSE = 0x00 + +## Generic +FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m + +fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) \ + $(PROGRAMMER_ARGS) $(FUSE_STRING) +show_fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nv + +## Called with no extra definitions, sets to defaults +set_default_fuses: FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m +set_default_fuses: fuses + +## Set the fuse byte for full-speed mode +## Note: can also be set in firmware for modern chips +set_fast_fuse: LFUSE = 0xE2 +set_fast_fuse: FUSE_STRING = -U lfuse:w:$(LFUSE):m +set_fast_fuse: fuses + +## Set the EESAVE fuse byte to preserve EEPROM across flashes +set_eeprom_save_fuse: HFUSE = 0xD7 +set_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +set_eeprom_save_fuse: fuses + +## Clear the EESAVE fuse byte +clear_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +clear_eeprom_save_fuse: fuses diff --git a/Make AVR Examples/Chapter07_Analog-to-Digital-Conversion-I/slowScope/serialScope.py b/Make AVR Examples/Chapter07_Analog-to-Digital-Conversion-I/slowScope/serialScope.py new file mode 100644 index 0000000..3f8828b --- /dev/null +++ b/Make AVR Examples/Chapter07_Analog-to-Digital-Conversion-I/slowScope/serialScope.py @@ -0,0 +1,35 @@ +import serial + +def readValue(serialPort): + return(ord(serialPort.read(1))) + +def plotValue(value): + """ Displays the value on a scaled scrolling bargraph""" + leadingSpaces = "-" * int(value*(SCREEN_WIDTH-3) / 255) + print(f"{leadingSpaces} {value:03}") + +def cheapoScope(serialPort): + while(1): + newValue = readValue(serialPort) + plotValue(newValue) + + +if __name__ == "__main__": + ## list all serial ports being used: python -m serial.tools.list_ports + PORT = '/dev/ttyUSB0' # update to whatever port is listed in serial.tools.list_ports + BAUDRATE = 9600 + TIMEOUT = None + SCREEN_WIDTH = 80 + + ## Take command-line arguments to override defaults above + import sys + if len(sys.argv) == 3: + port = sys.argv[1] + baudrate = int(sys.argv[2]) + else: # nothing passed, use defaults + print ("Optional arguments port, baudrate set to defaults.") + port, baudrate = (PORT, BAUDRATE) + + serialPort = serial.Serial(port, baudrate, timeout=TIMEOUT) + serialPort.flush() + cheapoScope(serialPort) diff --git a/Make AVR Examples/Chapter07_Analog-to-Digital-Conversion-I/slowScope/slowScope.c b/Make AVR Examples/Chapter07_Analog-to-Digital-Conversion-I/slowScope/slowScope.c new file mode 100644 index 0000000..991892a --- /dev/null +++ b/Make AVR Examples/Chapter07_Analog-to-Digital-Conversion-I/slowScope/slowScope.c @@ -0,0 +1,33 @@ +// Slow-scope. A free-running AVR / ADC "oscilloscope" + +// ------- Preamble -------- // +#include +#include +#include "pinDefines.h" +#include "USART.h" + +#define SAMPLE_DELAY 20 /* ms, controls the scroll-speed of the scope */ + +// -------- Functions --------- // +static inline void initFreerunningADC(void) { + ADMUX |= (1 << REFS0); /* reference voltage on AVCC */ + ADCSRA |= (1 << ADPS1) | (1 << ADPS0); /* ADC clock prescaler /8 */ + + ADMUX |= (1 << ADLAR); /* left-adjust result, return only 8 bits */ + + ADCSRA |= (1 << ADEN); /* enable ADC */ + ADCSRA |= (1 << ADATE); /* auto-trigger enable */ + ADCSRA |= (1 << ADSC); /* start first conversion */ +} + +int main(void) { + // -------- Inits --------- // + initUSART(); + initFreerunningADC(); + // ------ Event loop ------ // + while (1) { + transmitByte(ADCH); /* transmit the high byte, left-adjusted */ + _delay_ms(SAMPLE_DELAY); + } /* End event loop */ + return 0; /* This line is never reached */ +} diff --git a/Make AVR Examples/Chapter08_Hardware-Interrupts/capSense/Makefile b/Make AVR Examples/Chapter08_Hardware-Interrupts/capSense/Makefile new file mode 100644 index 0000000..5c588dc --- /dev/null +++ b/Make AVR Examples/Chapter08_Hardware-Interrupts/capSense/Makefile @@ -0,0 +1,196 @@ + +##########------------------------------------------------------########## +########## Project-specific Details ########## +########## Check these every time you start a new project ########## +##########------------------------------------------------------########## + +MCU = atmega168p +F_CPU = 8000000UL +BAUD = 9600UL +## Also try BAUD = 19200 or 38400 if you're feeling lucky. + +## A directory for common include files and the simple USART library. +## If you move either the current folder or the Library folder, you'll +## need to change this path to match. +LIBDIR = ../../AVR-Programming-Library + +##########------------------------------------------------------########## +########## Programmer Defaults ########## +########## Set up once, then forget about it ########## +########## (Can override. See bottom of file.) ########## +##########------------------------------------------------------########## + +PROGRAMMER_TYPE = usbtiny +# extra arguments to avrdude: baud rate, chip type, -F flag, etc. +PROGRAMMER_ARGS = + +##########------------------------------------------------------########## +########## Program Locations ########## +########## Won't need to change if they're in your PATH ########## +##########------------------------------------------------------########## + +CC = avr-gcc +OBJCOPY = avr-objcopy +OBJDUMP = avr-objdump +AVRSIZE = avr-size +AVRDUDE = avrdude + +##########------------------------------------------------------########## +########## Makefile Magic! ########## +########## Summary: ########## +########## We want a .hex file ########## +########## Compile source files into .elf ########## +########## Convert .elf file into .hex ########## +########## You shouldn't need to edit below. ########## +##########------------------------------------------------------########## + +## The name of your project (without the .c) +# TARGET = blinkLED +## Or name it automatically after the enclosing directory +TARGET = $(lastword $(subst /, ,$(CURDIR))) + +# Object files: will find all .c/.h files in current directory +# and in LIBDIR. If you have any other (sub-)directories with code, +# you can add them in to SOURCES below in the wildcard statement. +SOURCES=$(wildcard *.c $(LIBDIR)/*.c) +OBJECTS=$(SOURCES:.c=.o) +HEADERS=$(SOURCES:.c=.h) + +## Compilation options, type man avr-gcc if you're curious. +CPPFLAGS = -DF_CPU=$(F_CPU) -DBAUD=$(BAUD) -I. -I$(LIBDIR) +CFLAGS = -Os -g -std=gnu99 -Wall +## Use short (8-bit) data types +CFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums +## Splits up object files per function +CFLAGS += -ffunction-sections -fdata-sections +LDFLAGS = -Wl,-Map,$(TARGET).map +## Optional, but often ends up with smaller code +LDFLAGS += -Wl,--gc-sections +## Relax shrinks code even more, but makes disassembly messy +## LDFLAGS += -Wl,--relax +## LDFLAGS += -Wl,-u,vfprintf -lprintf_flt -lm ## for floating-point printf +## LDFLAGS += -Wl,-u,vfprintf -lprintf_min ## for smaller printf +TARGET_ARCH = -mmcu=$(MCU) + +## Explicit pattern rules: +## To make .o files from .c files +%.o: %.c $(HEADERS) Makefile + $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c -o $@ $<; + +$(TARGET).elf: $(OBJECTS) + $(CC) $(LDFLAGS) $(TARGET_ARCH) $^ $(LDLIBS) -o $@ + +%.hex: %.elf + $(OBJCOPY) -j .text -j .data -O ihex $< $@ + +%.eeprom: %.elf + $(OBJCOPY) -j .eeprom --change-section-lma .eeprom=0 -O ihex $< $@ + +%.lst: %.elf + $(OBJDUMP) -S $< > $@ + +## These targets don't have files named after them +.PHONY: all disassemble disasm eeprom size clean squeaky_clean flash fuses + +all: $(TARGET).hex + +debug: + @echo + @echo "Source files:" $(SOURCES) + @echo "MCU, F_CPU, BAUD:" $(MCU), $(F_CPU), $(BAUD) + @echo + +# Optionally create listing file from .elf +# This creates approximate assembly-language equivalent of your code. +# Useful for debugging time-sensitive bits, +# or making sure the compiler does what you want. +disassemble: $(TARGET).lst + +disasm: disassemble + +# Optionally show how big the resulting program is +size: $(TARGET).elf + $(AVRSIZE) -C --mcu=$(MCU) $(TARGET).elf + +clean: + rm -f $(TARGET).elf $(TARGET).hex $(TARGET).obj \ + $(TARGET).o $(TARGET).d $(TARGET).eep $(TARGET).lst \ + $(TARGET).lss $(TARGET).sym $(TARGET).map $(TARGET)~ \ + $(TARGET).eeprom + +squeaky_clean: + rm -f *.elf *.hex *.obj *.o *.d *.eep *.lst *.lss *.sym *.map *~ *.eeprom + +##########------------------------------------------------------########## +########## Programmer-specific details ########## +########## Flashing code to AVR using avrdude ########## +##########------------------------------------------------------########## + +flash: $(TARGET).hex + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U flash:w:$< + +## An alias +program: flash + +flash_eeprom: $(TARGET).eeprom + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U eeprom:w:$< + +avrdude_terminal: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nt + +## If you've got multiple programmers that you use, +## you can define them here so that it's easy to switch. +## To invoke, use something like `make flash_arduinoISP` +flash_usbtiny: PROGRAMMER_TYPE = usbtiny +flash_usbtiny: PROGRAMMER_ARGS = # USBTiny works with no further arguments +flash_usbtiny: flash + +flash_usbasp: PROGRAMMER_TYPE = usbasp +flash_usbasp: PROGRAMMER_ARGS = # USBasp works with no further arguments +flash_usbasp: flash + +flash_arduinoISP: PROGRAMMER_TYPE = avrisp +flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P /dev/ttyACM0 +## (for windows) flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P com5 +flash_arduinoISP: flash + +flash_109: PROGRAMMER_TYPE = avr109 +flash_109: PROGRAMMER_ARGS = -b 9600 -P /dev/ttyUSB0 +flash_109: flash + +##########------------------------------------------------------########## +########## Fuse settings and suitable defaults ########## +##########------------------------------------------------------########## + +## Mega 48, 88, 168, 328 default values +LFUSE = 0x62 +HFUSE = 0xdf +EFUSE = 0x00 + +## Generic +FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m + +fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) \ + $(PROGRAMMER_ARGS) $(FUSE_STRING) +show_fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nv + +## Called with no extra definitions, sets to defaults +set_default_fuses: FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m +set_default_fuses: fuses + +## Set the fuse byte for full-speed mode +## Note: can also be set in firmware for modern chips +set_fast_fuse: LFUSE = 0xE2 +set_fast_fuse: FUSE_STRING = -U lfuse:w:$(LFUSE):m +set_fast_fuse: fuses + +## Set the EESAVE fuse byte to preserve EEPROM across flashes +set_eeprom_save_fuse: HFUSE = 0xD7 +set_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +set_eeprom_save_fuse: fuses + +## Clear the EESAVE fuse byte +clear_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +clear_eeprom_save_fuse: fuses diff --git a/Make AVR Examples/Chapter08_Hardware-Interrupts/capSense/capSense.c b/Make AVR Examples/Chapter08_Hardware-Interrupts/capSense/capSense.c new file mode 100644 index 0000000..c90f657 --- /dev/null +++ b/Make AVR Examples/Chapter08_Hardware-Interrupts/capSense/capSense.c @@ -0,0 +1,67 @@ +/* + Capacitive touch sensor demo +*/ + +#include +#include +#include +#include +#include "pinDefines.h" +#include "USART.h" + +#define SENSE_TIME 50 +#define THRESHOLD 12000 + +// ------- Global Variables ---------- // +volatile uint16_t chargeCycleCount; + +// ------- Functions -------- // + +void initPinChangeInterrupt(void) { + PCICR |= (1 << PCIE1); /* enable Pin-change interrupts 1 (bank C) */ + PCMSK1 |= (1 << PC1); /* enable specific interrupt for our pin PC1 */ +} + +ISR(PCINT1_vect) { + chargeCycleCount++; /* count this change */ + + CAP_SENSOR_DDR |= (1 << CAP_SENSOR); /* output mode */ + _delay_us(1); /* charging delay */ + + CAP_SENSOR_DDR &= ~(1 << CAP_SENSOR); /* set as input */ + PCIFR |= (1 << PCIF1); /* clear the pin-change interrupt */ +} + + +int main(void) { + // -------- Inits --------- // + clock_prescale_set(clock_div_1); /* full speed */ + initUSART(); + printString("==[ Cap Sensor ]==\r\n\r\n"); + + LED_DDR = 0xff; + MCUCR |= (1 << PUD); /* disable all pullups */ + CAP_SENSOR_PORT |= (1 << CAP_SENSOR); /* we can leave output high */ + + initPinChangeInterrupt(); + + // ------ Event loop ------ // + while (1) { + + chargeCycleCount = 0; /* reset counter */ + CAP_SENSOR_DDR |= (1 << CAP_SENSOR); /* start with cap charged */ + sei(); /* start up interrupts, counting */ + _delay_ms(SENSE_TIME); + cli(); /* done */ + if (chargeCycleCount < THRESHOLD) { + LED_PORT = 0xff; + } + else { + LED_PORT = 0; + } + printWord(chargeCycleCount); /* for fine tuning */ + printString("\r\n"); + + } /* End event loop */ + return 0; /* This line is never reached */ +} diff --git a/Make AVR Examples/Chapter08_Hardware-Interrupts/capSense/serialScope.py b/Make AVR Examples/Chapter08_Hardware-Interrupts/capSense/serialScope.py new file mode 100644 index 0000000..3f8828b --- /dev/null +++ b/Make AVR Examples/Chapter08_Hardware-Interrupts/capSense/serialScope.py @@ -0,0 +1,35 @@ +import serial + +def readValue(serialPort): + return(ord(serialPort.read(1))) + +def plotValue(value): + """ Displays the value on a scaled scrolling bargraph""" + leadingSpaces = "-" * int(value*(SCREEN_WIDTH-3) / 255) + print(f"{leadingSpaces} {value:03}") + +def cheapoScope(serialPort): + while(1): + newValue = readValue(serialPort) + plotValue(newValue) + + +if __name__ == "__main__": + ## list all serial ports being used: python -m serial.tools.list_ports + PORT = '/dev/ttyUSB0' # update to whatever port is listed in serial.tools.list_ports + BAUDRATE = 9600 + TIMEOUT = None + SCREEN_WIDTH = 80 + + ## Take command-line arguments to override defaults above + import sys + if len(sys.argv) == 3: + port = sys.argv[1] + baudrate = int(sys.argv[2]) + else: # nothing passed, use defaults + print ("Optional arguments port, baudrate set to defaults.") + port, baudrate = (PORT, BAUDRATE) + + serialPort = serial.Serial(port, baudrate, timeout=TIMEOUT) + serialPort.flush() + cheapoScope(serialPort) diff --git a/Make AVR Examples/Chapter08_Hardware-Interrupts/helloInterrupt/Makefile b/Make AVR Examples/Chapter08_Hardware-Interrupts/helloInterrupt/Makefile new file mode 100644 index 0000000..3d9e544 --- /dev/null +++ b/Make AVR Examples/Chapter08_Hardware-Interrupts/helloInterrupt/Makefile @@ -0,0 +1,196 @@ + +##########------------------------------------------------------########## +########## Project-specific Details ########## +########## Check these every time you start a new project ########## +##########------------------------------------------------------########## + +MCU = atmega168p +F_CPU = 1000000UL +BAUD = 9600UL +## Also try BAUD = 19200 or 38400 if you're feeling lucky. + +## A directory for common include files and the simple USART library. +## If you move either the current folder or the Library folder, you'll +## need to change this path to match. +LIBDIR = ../../AVR-Programming-Library + +##########------------------------------------------------------########## +########## Programmer Defaults ########## +########## Set up once, then forget about it ########## +########## (Can override. See bottom of file.) ########## +##########------------------------------------------------------########## + +PROGRAMMER_TYPE = usbtiny +# extra arguments to avrdude: baud rate, chip type, -F flag, etc. +PROGRAMMER_ARGS = + +##########------------------------------------------------------########## +########## Program Locations ########## +########## Won't need to change if they're in your PATH ########## +##########------------------------------------------------------########## + +CC = avr-gcc +OBJCOPY = avr-objcopy +OBJDUMP = avr-objdump +AVRSIZE = avr-size +AVRDUDE = avrdude + +##########------------------------------------------------------########## +########## Makefile Magic! ########## +########## Summary: ########## +########## We want a .hex file ########## +########## Compile source files into .elf ########## +########## Convert .elf file into .hex ########## +########## You shouldn't need to edit below. ########## +##########------------------------------------------------------########## + +## The name of your project (without the .c) +# TARGET = blinkLED +## Or name it automatically after the enclosing directory +TARGET = $(lastword $(subst /, ,$(CURDIR))) + +# Object files: will find all .c/.h files in current directory +# and in LIBDIR. If you have any other (sub-)directories with code, +# you can add them in to SOURCES below in the wildcard statement. +SOURCES=$(wildcard *.c $(LIBDIR)/*.c) +OBJECTS=$(SOURCES:.c=.o) +HEADERS=$(SOURCES:.c=.h) + +## Compilation options, type man avr-gcc if you're curious. +CPPFLAGS = -DF_CPU=$(F_CPU) -DBAUD=$(BAUD) -I. -I$(LIBDIR) +CFLAGS = -Os -g -std=gnu99 -Wall +## Use short (8-bit) data types +CFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums +## Splits up object files per function +CFLAGS += -ffunction-sections -fdata-sections +LDFLAGS = -Wl,-Map,$(TARGET).map +## Optional, but often ends up with smaller code +LDFLAGS += -Wl,--gc-sections +## Relax shrinks code even more, but makes disassembly messy +## LDFLAGS += -Wl,--relax +## LDFLAGS += -Wl,-u,vfprintf -lprintf_flt -lm ## for floating-point printf +## LDFLAGS += -Wl,-u,vfprintf -lprintf_min ## for smaller printf +TARGET_ARCH = -mmcu=$(MCU) + +## Explicit pattern rules: +## To make .o files from .c files +%.o: %.c $(HEADERS) Makefile + $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c -o $@ $<; + +$(TARGET).elf: $(OBJECTS) + $(CC) $(LDFLAGS) $(TARGET_ARCH) $^ $(LDLIBS) -o $@ + +%.hex: %.elf + $(OBJCOPY) -j .text -j .data -O ihex $< $@ + +%.eeprom: %.elf + $(OBJCOPY) -j .eeprom --change-section-lma .eeprom=0 -O ihex $< $@ + +%.lst: %.elf + $(OBJDUMP) -S $< > $@ + +## These targets don't have files named after them +.PHONY: all disassemble disasm eeprom size clean squeaky_clean flash fuses + +all: $(TARGET).hex + +debug: + @echo + @echo "Source files:" $(SOURCES) + @echo "MCU, F_CPU, BAUD:" $(MCU), $(F_CPU), $(BAUD) + @echo + +# Optionally create listing file from .elf +# This creates approximate assembly-language equivalent of your code. +# Useful for debugging time-sensitive bits, +# or making sure the compiler does what you want. +disassemble: $(TARGET).lst + +disasm: disassemble + +# Optionally show how big the resulting program is +size: $(TARGET).elf + $(AVRSIZE) -C --mcu=$(MCU) $(TARGET).elf + +clean: + rm -f $(TARGET).elf $(TARGET).hex $(TARGET).obj \ + $(TARGET).o $(TARGET).d $(TARGET).eep $(TARGET).lst \ + $(TARGET).lss $(TARGET).sym $(TARGET).map $(TARGET)~ \ + $(TARGET).eeprom + +squeaky_clean: + rm -f *.elf *.hex *.obj *.o *.d *.eep *.lst *.lss *.sym *.map *~ *.eeprom + +##########------------------------------------------------------########## +########## Programmer-specific details ########## +########## Flashing code to AVR using avrdude ########## +##########------------------------------------------------------########## + +flash: $(TARGET).hex + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U flash:w:$< + +## An alias +program: flash + +flash_eeprom: $(TARGET).eeprom + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U eeprom:w:$< + +avrdude_terminal: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nt + +## If you've got multiple programmers that you use, +## you can define them here so that it's easy to switch. +## To invoke, use something like `make flash_arduinoISP` +flash_usbtiny: PROGRAMMER_TYPE = usbtiny +flash_usbtiny: PROGRAMMER_ARGS = # USBTiny works with no further arguments +flash_usbtiny: flash + +flash_usbasp: PROGRAMMER_TYPE = usbasp +flash_usbasp: PROGRAMMER_ARGS = # USBasp works with no further arguments +flash_usbasp: flash + +flash_arduinoISP: PROGRAMMER_TYPE = avrisp +flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P /dev/ttyACM0 +## (for windows) flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P com5 +flash_arduinoISP: flash + +flash_109: PROGRAMMER_TYPE = avr109 +flash_109: PROGRAMMER_ARGS = -b 9600 -P /dev/ttyUSB0 +flash_109: flash + +##########------------------------------------------------------########## +########## Fuse settings and suitable defaults ########## +##########------------------------------------------------------########## + +## Mega 48, 88, 168, 328 default values +LFUSE = 0x62 +HFUSE = 0xdf +EFUSE = 0x00 + +## Generic +FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m + +fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) \ + $(PROGRAMMER_ARGS) $(FUSE_STRING) +show_fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nv + +## Called with no extra definitions, sets to defaults +set_default_fuses: FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m +set_default_fuses: fuses + +## Set the fuse byte for full-speed mode +## Note: can also be set in firmware for modern chips +set_fast_fuse: LFUSE = 0xE2 +set_fast_fuse: FUSE_STRING = -U lfuse:w:$(LFUSE):m +set_fast_fuse: fuses + +## Set the EESAVE fuse byte to preserve EEPROM across flashes +set_eeprom_save_fuse: HFUSE = 0xD7 +set_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +set_eeprom_save_fuse: fuses + +## Clear the EESAVE fuse byte +clear_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +clear_eeprom_save_fuse: fuses diff --git a/Make AVR Examples/Chapter08_Hardware-Interrupts/helloInterrupt/helloInterrupt.c b/Make AVR Examples/Chapter08_Hardware-Interrupts/helloInterrupt/helloInterrupt.c new file mode 100644 index 0000000..ab420c8 --- /dev/null +++ b/Make AVR Examples/Chapter08_Hardware-Interrupts/helloInterrupt/helloInterrupt.c @@ -0,0 +1,45 @@ +/* + +Demo of using interrupts for doing what they do best -- +two things at once. + +Flashes LED0 at a fixed rate, interrupting whenever button is pressed. + + */ + +// ------- Preamble -------- // +#include +#include +#include +#include "pinDefines.h" + +ISR(INT0_vect) { /* Run every time there is a change on button */ + if (bit_is_clear(BUTTON_PIN, BUTTON)) { + LED_PORT |= (1 << LED1); + } + else { + LED_PORT &= ~(1 << LED1); + } +} + +void initInterrupt0(void) { + EIMSK |= (1 << INT0); /* enable INT0 */ + EICRA |= (1 << ISC00); /* trigger when button changes */ + sei(); /* set (global) interrupt enable bit */ +} + +int main(void) { + // -------- Inits --------- // + LED_DDR = 0xff; /* all LEDs active */ + BUTTON_PORT |= (1 << BUTTON); /* pullup */ + initInterrupt0(); + + // ------ Event loop ------ // + while (1) { + + _delay_ms(200); + LED_PORT ^= (1 << LED0); + + } /* End event loop */ + return 0; /* This line is never reached */ +} diff --git a/Make AVR Examples/Chapter08_Hardware-Interrupts/helloPinChangeInterrupt/Makefile b/Make AVR Examples/Chapter08_Hardware-Interrupts/helloPinChangeInterrupt/Makefile new file mode 100644 index 0000000..3d9e544 --- /dev/null +++ b/Make AVR Examples/Chapter08_Hardware-Interrupts/helloPinChangeInterrupt/Makefile @@ -0,0 +1,196 @@ + +##########------------------------------------------------------########## +########## Project-specific Details ########## +########## Check these every time you start a new project ########## +##########------------------------------------------------------########## + +MCU = atmega168p +F_CPU = 1000000UL +BAUD = 9600UL +## Also try BAUD = 19200 or 38400 if you're feeling lucky. + +## A directory for common include files and the simple USART library. +## If you move either the current folder or the Library folder, you'll +## need to change this path to match. +LIBDIR = ../../AVR-Programming-Library + +##########------------------------------------------------------########## +########## Programmer Defaults ########## +########## Set up once, then forget about it ########## +########## (Can override. See bottom of file.) ########## +##########------------------------------------------------------########## + +PROGRAMMER_TYPE = usbtiny +# extra arguments to avrdude: baud rate, chip type, -F flag, etc. +PROGRAMMER_ARGS = + +##########------------------------------------------------------########## +########## Program Locations ########## +########## Won't need to change if they're in your PATH ########## +##########------------------------------------------------------########## + +CC = avr-gcc +OBJCOPY = avr-objcopy +OBJDUMP = avr-objdump +AVRSIZE = avr-size +AVRDUDE = avrdude + +##########------------------------------------------------------########## +########## Makefile Magic! ########## +########## Summary: ########## +########## We want a .hex file ########## +########## Compile source files into .elf ########## +########## Convert .elf file into .hex ########## +########## You shouldn't need to edit below. ########## +##########------------------------------------------------------########## + +## The name of your project (without the .c) +# TARGET = blinkLED +## Or name it automatically after the enclosing directory +TARGET = $(lastword $(subst /, ,$(CURDIR))) + +# Object files: will find all .c/.h files in current directory +# and in LIBDIR. If you have any other (sub-)directories with code, +# you can add them in to SOURCES below in the wildcard statement. +SOURCES=$(wildcard *.c $(LIBDIR)/*.c) +OBJECTS=$(SOURCES:.c=.o) +HEADERS=$(SOURCES:.c=.h) + +## Compilation options, type man avr-gcc if you're curious. +CPPFLAGS = -DF_CPU=$(F_CPU) -DBAUD=$(BAUD) -I. -I$(LIBDIR) +CFLAGS = -Os -g -std=gnu99 -Wall +## Use short (8-bit) data types +CFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums +## Splits up object files per function +CFLAGS += -ffunction-sections -fdata-sections +LDFLAGS = -Wl,-Map,$(TARGET).map +## Optional, but often ends up with smaller code +LDFLAGS += -Wl,--gc-sections +## Relax shrinks code even more, but makes disassembly messy +## LDFLAGS += -Wl,--relax +## LDFLAGS += -Wl,-u,vfprintf -lprintf_flt -lm ## for floating-point printf +## LDFLAGS += -Wl,-u,vfprintf -lprintf_min ## for smaller printf +TARGET_ARCH = -mmcu=$(MCU) + +## Explicit pattern rules: +## To make .o files from .c files +%.o: %.c $(HEADERS) Makefile + $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c -o $@ $<; + +$(TARGET).elf: $(OBJECTS) + $(CC) $(LDFLAGS) $(TARGET_ARCH) $^ $(LDLIBS) -o $@ + +%.hex: %.elf + $(OBJCOPY) -j .text -j .data -O ihex $< $@ + +%.eeprom: %.elf + $(OBJCOPY) -j .eeprom --change-section-lma .eeprom=0 -O ihex $< $@ + +%.lst: %.elf + $(OBJDUMP) -S $< > $@ + +## These targets don't have files named after them +.PHONY: all disassemble disasm eeprom size clean squeaky_clean flash fuses + +all: $(TARGET).hex + +debug: + @echo + @echo "Source files:" $(SOURCES) + @echo "MCU, F_CPU, BAUD:" $(MCU), $(F_CPU), $(BAUD) + @echo + +# Optionally create listing file from .elf +# This creates approximate assembly-language equivalent of your code. +# Useful for debugging time-sensitive bits, +# or making sure the compiler does what you want. +disassemble: $(TARGET).lst + +disasm: disassemble + +# Optionally show how big the resulting program is +size: $(TARGET).elf + $(AVRSIZE) -C --mcu=$(MCU) $(TARGET).elf + +clean: + rm -f $(TARGET).elf $(TARGET).hex $(TARGET).obj \ + $(TARGET).o $(TARGET).d $(TARGET).eep $(TARGET).lst \ + $(TARGET).lss $(TARGET).sym $(TARGET).map $(TARGET)~ \ + $(TARGET).eeprom + +squeaky_clean: + rm -f *.elf *.hex *.obj *.o *.d *.eep *.lst *.lss *.sym *.map *~ *.eeprom + +##########------------------------------------------------------########## +########## Programmer-specific details ########## +########## Flashing code to AVR using avrdude ########## +##########------------------------------------------------------########## + +flash: $(TARGET).hex + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U flash:w:$< + +## An alias +program: flash + +flash_eeprom: $(TARGET).eeprom + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U eeprom:w:$< + +avrdude_terminal: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nt + +## If you've got multiple programmers that you use, +## you can define them here so that it's easy to switch. +## To invoke, use something like `make flash_arduinoISP` +flash_usbtiny: PROGRAMMER_TYPE = usbtiny +flash_usbtiny: PROGRAMMER_ARGS = # USBTiny works with no further arguments +flash_usbtiny: flash + +flash_usbasp: PROGRAMMER_TYPE = usbasp +flash_usbasp: PROGRAMMER_ARGS = # USBasp works with no further arguments +flash_usbasp: flash + +flash_arduinoISP: PROGRAMMER_TYPE = avrisp +flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P /dev/ttyACM0 +## (for windows) flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P com5 +flash_arduinoISP: flash + +flash_109: PROGRAMMER_TYPE = avr109 +flash_109: PROGRAMMER_ARGS = -b 9600 -P /dev/ttyUSB0 +flash_109: flash + +##########------------------------------------------------------########## +########## Fuse settings and suitable defaults ########## +##########------------------------------------------------------########## + +## Mega 48, 88, 168, 328 default values +LFUSE = 0x62 +HFUSE = 0xdf +EFUSE = 0x00 + +## Generic +FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m + +fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) \ + $(PROGRAMMER_ARGS) $(FUSE_STRING) +show_fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nv + +## Called with no extra definitions, sets to defaults +set_default_fuses: FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m +set_default_fuses: fuses + +## Set the fuse byte for full-speed mode +## Note: can also be set in firmware for modern chips +set_fast_fuse: LFUSE = 0xE2 +set_fast_fuse: FUSE_STRING = -U lfuse:w:$(LFUSE):m +set_fast_fuse: fuses + +## Set the EESAVE fuse byte to preserve EEPROM across flashes +set_eeprom_save_fuse: HFUSE = 0xD7 +set_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +set_eeprom_save_fuse: fuses + +## Clear the EESAVE fuse byte +clear_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +clear_eeprom_save_fuse: fuses diff --git a/Make AVR Examples/Chapter08_Hardware-Interrupts/helloPinChangeInterrupt/helloPinChangeInterrupt.c b/Make AVR Examples/Chapter08_Hardware-Interrupts/helloPinChangeInterrupt/helloPinChangeInterrupt.c new file mode 100644 index 0000000..16951a5 --- /dev/null +++ b/Make AVR Examples/Chapter08_Hardware-Interrupts/helloPinChangeInterrupt/helloPinChangeInterrupt.c @@ -0,0 +1,39 @@ + /* Demo using pin-change interrupts and in-ISR debouncing routine */ + +// ------- Preamble -------- // +#include +#include +#include +#include "pinDefines.h" + + +ISR(PCINT2_vect) { /* Run every time button state changes */ + if (bit_is_clear(BUTTON_PIN, BUTTON)) { + LED_PORT |= (1 << LED1); + } + else { + LED_PORT &= ~(1 << LED1); + } +} + +void initPinChangeInterrupt18(void) { + PCICR |= (1 << PCIE2); /* set pin-change interrupt for D pins */ + PCMSK2 |= (1 << PCINT18); /* set mask to look for PCINT18 / PD2 */ + sei(); /* set (global) interrupt enable bit */ +} + +int main(void) { + // -------- Inits --------- // + LED_DDR = 0xff; /* all LEDs active */ + BUTTON_PORT |= (1 << BUTTON); /* pullup */ + initPinChangeInterrupt18(); + + // ------ Event loop ------ // + while (1) { + + _delay_ms(200); + LED_PORT ^= (1 << LED0); + + } /* End event loop */ + return 0; /* This line is never reached */ +} diff --git a/Make AVR Examples/Chapter09_Introduction-to-Timer-Counter-Hardware/amRadio/Makefile b/Make AVR Examples/Chapter09_Introduction-to-Timer-Counter-Hardware/amRadio/Makefile new file mode 100644 index 0000000..5c588dc --- /dev/null +++ b/Make AVR Examples/Chapter09_Introduction-to-Timer-Counter-Hardware/amRadio/Makefile @@ -0,0 +1,196 @@ + +##########------------------------------------------------------########## +########## Project-specific Details ########## +########## Check these every time you start a new project ########## +##########------------------------------------------------------########## + +MCU = atmega168p +F_CPU = 8000000UL +BAUD = 9600UL +## Also try BAUD = 19200 or 38400 if you're feeling lucky. + +## A directory for common include files and the simple USART library. +## If you move either the current folder or the Library folder, you'll +## need to change this path to match. +LIBDIR = ../../AVR-Programming-Library + +##########------------------------------------------------------########## +########## Programmer Defaults ########## +########## Set up once, then forget about it ########## +########## (Can override. See bottom of file.) ########## +##########------------------------------------------------------########## + +PROGRAMMER_TYPE = usbtiny +# extra arguments to avrdude: baud rate, chip type, -F flag, etc. +PROGRAMMER_ARGS = + +##########------------------------------------------------------########## +########## Program Locations ########## +########## Won't need to change if they're in your PATH ########## +##########------------------------------------------------------########## + +CC = avr-gcc +OBJCOPY = avr-objcopy +OBJDUMP = avr-objdump +AVRSIZE = avr-size +AVRDUDE = avrdude + +##########------------------------------------------------------########## +########## Makefile Magic! ########## +########## Summary: ########## +########## We want a .hex file ########## +########## Compile source files into .elf ########## +########## Convert .elf file into .hex ########## +########## You shouldn't need to edit below. ########## +##########------------------------------------------------------########## + +## The name of your project (without the .c) +# TARGET = blinkLED +## Or name it automatically after the enclosing directory +TARGET = $(lastword $(subst /, ,$(CURDIR))) + +# Object files: will find all .c/.h files in current directory +# and in LIBDIR. If you have any other (sub-)directories with code, +# you can add them in to SOURCES below in the wildcard statement. +SOURCES=$(wildcard *.c $(LIBDIR)/*.c) +OBJECTS=$(SOURCES:.c=.o) +HEADERS=$(SOURCES:.c=.h) + +## Compilation options, type man avr-gcc if you're curious. +CPPFLAGS = -DF_CPU=$(F_CPU) -DBAUD=$(BAUD) -I. -I$(LIBDIR) +CFLAGS = -Os -g -std=gnu99 -Wall +## Use short (8-bit) data types +CFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums +## Splits up object files per function +CFLAGS += -ffunction-sections -fdata-sections +LDFLAGS = -Wl,-Map,$(TARGET).map +## Optional, but often ends up with smaller code +LDFLAGS += -Wl,--gc-sections +## Relax shrinks code even more, but makes disassembly messy +## LDFLAGS += -Wl,--relax +## LDFLAGS += -Wl,-u,vfprintf -lprintf_flt -lm ## for floating-point printf +## LDFLAGS += -Wl,-u,vfprintf -lprintf_min ## for smaller printf +TARGET_ARCH = -mmcu=$(MCU) + +## Explicit pattern rules: +## To make .o files from .c files +%.o: %.c $(HEADERS) Makefile + $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c -o $@ $<; + +$(TARGET).elf: $(OBJECTS) + $(CC) $(LDFLAGS) $(TARGET_ARCH) $^ $(LDLIBS) -o $@ + +%.hex: %.elf + $(OBJCOPY) -j .text -j .data -O ihex $< $@ + +%.eeprom: %.elf + $(OBJCOPY) -j .eeprom --change-section-lma .eeprom=0 -O ihex $< $@ + +%.lst: %.elf + $(OBJDUMP) -S $< > $@ + +## These targets don't have files named after them +.PHONY: all disassemble disasm eeprom size clean squeaky_clean flash fuses + +all: $(TARGET).hex + +debug: + @echo + @echo "Source files:" $(SOURCES) + @echo "MCU, F_CPU, BAUD:" $(MCU), $(F_CPU), $(BAUD) + @echo + +# Optionally create listing file from .elf +# This creates approximate assembly-language equivalent of your code. +# Useful for debugging time-sensitive bits, +# or making sure the compiler does what you want. +disassemble: $(TARGET).lst + +disasm: disassemble + +# Optionally show how big the resulting program is +size: $(TARGET).elf + $(AVRSIZE) -C --mcu=$(MCU) $(TARGET).elf + +clean: + rm -f $(TARGET).elf $(TARGET).hex $(TARGET).obj \ + $(TARGET).o $(TARGET).d $(TARGET).eep $(TARGET).lst \ + $(TARGET).lss $(TARGET).sym $(TARGET).map $(TARGET)~ \ + $(TARGET).eeprom + +squeaky_clean: + rm -f *.elf *.hex *.obj *.o *.d *.eep *.lst *.lss *.sym *.map *~ *.eeprom + +##########------------------------------------------------------########## +########## Programmer-specific details ########## +########## Flashing code to AVR using avrdude ########## +##########------------------------------------------------------########## + +flash: $(TARGET).hex + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U flash:w:$< + +## An alias +program: flash + +flash_eeprom: $(TARGET).eeprom + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U eeprom:w:$< + +avrdude_terminal: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nt + +## If you've got multiple programmers that you use, +## you can define them here so that it's easy to switch. +## To invoke, use something like `make flash_arduinoISP` +flash_usbtiny: PROGRAMMER_TYPE = usbtiny +flash_usbtiny: PROGRAMMER_ARGS = # USBTiny works with no further arguments +flash_usbtiny: flash + +flash_usbasp: PROGRAMMER_TYPE = usbasp +flash_usbasp: PROGRAMMER_ARGS = # USBasp works with no further arguments +flash_usbasp: flash + +flash_arduinoISP: PROGRAMMER_TYPE = avrisp +flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P /dev/ttyACM0 +## (for windows) flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P com5 +flash_arduinoISP: flash + +flash_109: PROGRAMMER_TYPE = avr109 +flash_109: PROGRAMMER_ARGS = -b 9600 -P /dev/ttyUSB0 +flash_109: flash + +##########------------------------------------------------------########## +########## Fuse settings and suitable defaults ########## +##########------------------------------------------------------########## + +## Mega 48, 88, 168, 328 default values +LFUSE = 0x62 +HFUSE = 0xdf +EFUSE = 0x00 + +## Generic +FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m + +fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) \ + $(PROGRAMMER_ARGS) $(FUSE_STRING) +show_fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nv + +## Called with no extra definitions, sets to defaults +set_default_fuses: FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m +set_default_fuses: fuses + +## Set the fuse byte for full-speed mode +## Note: can also be set in firmware for modern chips +set_fast_fuse: LFUSE = 0xE2 +set_fast_fuse: FUSE_STRING = -U lfuse:w:$(LFUSE):m +set_fast_fuse: fuses + +## Set the EESAVE fuse byte to preserve EEPROM across flashes +set_eeprom_save_fuse: HFUSE = 0xD7 +set_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +set_eeprom_save_fuse: fuses + +## Clear the EESAVE fuse byte +clear_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +clear_eeprom_save_fuse: fuses diff --git a/Make AVR Examples/Chapter09_Introduction-to-Timer-Counter-Hardware/amRadio/amRadio.c b/Make AVR Examples/Chapter09_Introduction-to-Timer-Counter-Hardware/amRadio/amRadio.c new file mode 100644 index 0000000..f3f341d --- /dev/null +++ b/Make AVR Examples/Chapter09_Introduction-to-Timer-Counter-Hardware/amRadio/amRadio.c @@ -0,0 +1,81 @@ +/* +Plays a simple tune, broadcasts it in the AM radio band. +*/ + +// ------- Preamble -------- // +#include /* Defines pins, ports, etc */ +#include /* Functions to waste time */ +#include +#include +#include "pinDefines.h" +#include "scale16.h" + +#define COUNTER_VALUE 3 /* determines carrier frequency */ + +// From f = f_cpu / ( 2* N* (1 + OCRnx) ) +// Good values for the AM band from 2 to 6: pick one that's clear +// Divide by two b/c we're toggling on or off each loop; +// a full cycle of the carrier takes two loops. +// 8Mhz / (2 * 1 * (1+2)) = 1333 kHz +// 8Mhz / (2 * 1 * (1+3)) = 1000 kHz +// 8Mhz / (2 * 1 * (1+4)) = 800 kHz +// 8Mhz / (2 * 1 * (1+5)) = 670 kHz +// 8Mhz / (2 * 1 * (1+6)) = 570 kHz +// 8Mhz / (2 * 1 * (1+7)) = 500 kHz + +static inline void initTimer0(void) { + TCCR0A |= (1 << WGM01); /* CTC mode */ + TCCR0A |= (1 << COM0B0); /* Toggles pin each time through */ + TCCR0B |= (1 << CS00); /* Clock at CPU frequency, ~8MHz */ + OCR0A = COUNTER_VALUE; /* carrier frequency */ +} + +static inline void initTimer1(void) { + TCCR1B |= (1 << WGM12); /* CTC mode */ + TCCR1B |= (1 << CS11); /* Clock at CPU/8 frequency, ~1MHz */ + TIMSK1 |= (1 << OCIE1A); /* enable output compare interrupt */ +} + +ISR(TIMER1_COMPA_vect) { /* ISR for audio-rate Timer 1 */ + ANTENNA_DDR ^= (1 << ANTENNA); /* toggle carrier on and off */ +} + +static inline void transmitBeep(uint16_t pitch, uint16_t duration) { + OCR1A = pitch; /* set pitch for timer1 */ + sei(); /* turn on interrupts */ + do { + _delay_ms(1); /* delay for pitch cycles */ + duration--; + } while (duration > 0); + cli(); /* and disable ISR so that it stops toggling */ + ANTENNA_DDR |= (1 << ANTENNA); /* back on full carrier */ +} + +int main(void) { + // -------- Inits --------- // + + clock_prescale_set(clock_div_1); /* CPU clock 8 MHz */ + initTimer0(); + initTimer1(); + + // ------ Event loop ------ // + while (1) { + + transmitBeep(E3, 200); + _delay_ms(100); + transmitBeep(E3, 200); + _delay_ms(200); + transmitBeep(E3, 200); + _delay_ms(200); + transmitBeep(C3, 200); + transmitBeep(E3, 200); + _delay_ms(200); + transmitBeep(G3, 400); + _delay_ms(500); + transmitBeep(G2, 400); + + _delay_ms(2500); + + } /* End event loop */ + return 0; /* This line is never reached */ +} diff --git a/Make AVR Examples/Chapter09_Introduction-to-Timer-Counter-Hardware/amRadio/scale16.h b/Make AVR Examples/Chapter09_Introduction-to-Timer-Counter-Hardware/amRadio/scale16.h new file mode 100644 index 0000000..73d968c --- /dev/null +++ b/Make AVR Examples/Chapter09_Introduction-to-Timer-Counter-Hardware/amRadio/scale16.h @@ -0,0 +1,78 @@ +/* Scale in the key of 1/10000 */ + +/* + These are periods -- if you delay this long, + then toggle the speaker pin, you'll get approximate + pitches. + + This is the 16-bit version. The pitches get less accurate + as they get higher, but not as bad as the 8-bit one. + + "x" denotes sharp. + + Can be generated by Python: + + import math + scale = ['C', 'Cx', 'D', 'Dx', 'E', 'F', 'Fx', 'G', 'Gx', 'A', 'Ax', 'B'] + + def octave(baseLength): + periods = [baseLength / math.exp(x*math.log(2)/12) for x in range(0, 12)] + periods = [int(round(x)) for x in periods] + return( zip(scale, periods) ) + + for i in range(0,4): + for note, period in octave(10000 / 2**i): + if period < 65500: + noteString = note + str(i) + print "#define {:<5}{:>6}".format(noteString, period) +*/ + + +#define C0 10000 +#define Cx0 9439 +#define D0 8909 +#define Dx0 8409 +#define E0 7937 +#define F0 7492 +#define Fx0 7071 +#define G0 6674 +#define Gx0 6300 +#define A0 5946 +#define Ax0 5612 +#define B0 5297 +#define C1 5000 +#define Cx1 4719 +#define D1 4454 +#define Dx1 4204 +#define E1 3969 +#define F1 3746 +#define Fx1 3536 +#define G1 3337 +#define Gx1 3150 +#define A1 2973 +#define Ax1 2806 +#define B1 2649 +#define C2 2500 +#define Cx2 2360 +#define D2 2227 +#define Dx2 2102 +#define E2 1984 +#define F2 1873 +#define Fx2 1768 +#define G2 1669 +#define Gx2 1575 +#define A2 1487 +#define Ax2 1403 +#define B2 1324 +#define C3 1250 +#define Cx3 1180 +#define D3 1114 +#define Dx3 1051 +#define E3 992 +#define F3 936 +#define Fx3 884 +#define G3 834 +#define Gx3 787 +#define A3 743 +#define Ax3 702 +#define B3 662 diff --git a/Make AVR Examples/Chapter09_Introduction-to-Timer-Counter-Hardware/reactionTimer/Makefile b/Make AVR Examples/Chapter09_Introduction-to-Timer-Counter-Hardware/reactionTimer/Makefile new file mode 100644 index 0000000..3d9e544 --- /dev/null +++ b/Make AVR Examples/Chapter09_Introduction-to-Timer-Counter-Hardware/reactionTimer/Makefile @@ -0,0 +1,196 @@ + +##########------------------------------------------------------########## +########## Project-specific Details ########## +########## Check these every time you start a new project ########## +##########------------------------------------------------------########## + +MCU = atmega168p +F_CPU = 1000000UL +BAUD = 9600UL +## Also try BAUD = 19200 or 38400 if you're feeling lucky. + +## A directory for common include files and the simple USART library. +## If you move either the current folder or the Library folder, you'll +## need to change this path to match. +LIBDIR = ../../AVR-Programming-Library + +##########------------------------------------------------------########## +########## Programmer Defaults ########## +########## Set up once, then forget about it ########## +########## (Can override. See bottom of file.) ########## +##########------------------------------------------------------########## + +PROGRAMMER_TYPE = usbtiny +# extra arguments to avrdude: baud rate, chip type, -F flag, etc. +PROGRAMMER_ARGS = + +##########------------------------------------------------------########## +########## Program Locations ########## +########## Won't need to change if they're in your PATH ########## +##########------------------------------------------------------########## + +CC = avr-gcc +OBJCOPY = avr-objcopy +OBJDUMP = avr-objdump +AVRSIZE = avr-size +AVRDUDE = avrdude + +##########------------------------------------------------------########## +########## Makefile Magic! ########## +########## Summary: ########## +########## We want a .hex file ########## +########## Compile source files into .elf ########## +########## Convert .elf file into .hex ########## +########## You shouldn't need to edit below. ########## +##########------------------------------------------------------########## + +## The name of your project (without the .c) +# TARGET = blinkLED +## Or name it automatically after the enclosing directory +TARGET = $(lastword $(subst /, ,$(CURDIR))) + +# Object files: will find all .c/.h files in current directory +# and in LIBDIR. If you have any other (sub-)directories with code, +# you can add them in to SOURCES below in the wildcard statement. +SOURCES=$(wildcard *.c $(LIBDIR)/*.c) +OBJECTS=$(SOURCES:.c=.o) +HEADERS=$(SOURCES:.c=.h) + +## Compilation options, type man avr-gcc if you're curious. +CPPFLAGS = -DF_CPU=$(F_CPU) -DBAUD=$(BAUD) -I. -I$(LIBDIR) +CFLAGS = -Os -g -std=gnu99 -Wall +## Use short (8-bit) data types +CFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums +## Splits up object files per function +CFLAGS += -ffunction-sections -fdata-sections +LDFLAGS = -Wl,-Map,$(TARGET).map +## Optional, but often ends up with smaller code +LDFLAGS += -Wl,--gc-sections +## Relax shrinks code even more, but makes disassembly messy +## LDFLAGS += -Wl,--relax +## LDFLAGS += -Wl,-u,vfprintf -lprintf_flt -lm ## for floating-point printf +## LDFLAGS += -Wl,-u,vfprintf -lprintf_min ## for smaller printf +TARGET_ARCH = -mmcu=$(MCU) + +## Explicit pattern rules: +## To make .o files from .c files +%.o: %.c $(HEADERS) Makefile + $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c -o $@ $<; + +$(TARGET).elf: $(OBJECTS) + $(CC) $(LDFLAGS) $(TARGET_ARCH) $^ $(LDLIBS) -o $@ + +%.hex: %.elf + $(OBJCOPY) -j .text -j .data -O ihex $< $@ + +%.eeprom: %.elf + $(OBJCOPY) -j .eeprom --change-section-lma .eeprom=0 -O ihex $< $@ + +%.lst: %.elf + $(OBJDUMP) -S $< > $@ + +## These targets don't have files named after them +.PHONY: all disassemble disasm eeprom size clean squeaky_clean flash fuses + +all: $(TARGET).hex + +debug: + @echo + @echo "Source files:" $(SOURCES) + @echo "MCU, F_CPU, BAUD:" $(MCU), $(F_CPU), $(BAUD) + @echo + +# Optionally create listing file from .elf +# This creates approximate assembly-language equivalent of your code. +# Useful for debugging time-sensitive bits, +# or making sure the compiler does what you want. +disassemble: $(TARGET).lst + +disasm: disassemble + +# Optionally show how big the resulting program is +size: $(TARGET).elf + $(AVRSIZE) -C --mcu=$(MCU) $(TARGET).elf + +clean: + rm -f $(TARGET).elf $(TARGET).hex $(TARGET).obj \ + $(TARGET).o $(TARGET).d $(TARGET).eep $(TARGET).lst \ + $(TARGET).lss $(TARGET).sym $(TARGET).map $(TARGET)~ \ + $(TARGET).eeprom + +squeaky_clean: + rm -f *.elf *.hex *.obj *.o *.d *.eep *.lst *.lss *.sym *.map *~ *.eeprom + +##########------------------------------------------------------########## +########## Programmer-specific details ########## +########## Flashing code to AVR using avrdude ########## +##########------------------------------------------------------########## + +flash: $(TARGET).hex + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U flash:w:$< + +## An alias +program: flash + +flash_eeprom: $(TARGET).eeprom + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U eeprom:w:$< + +avrdude_terminal: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nt + +## If you've got multiple programmers that you use, +## you can define them here so that it's easy to switch. +## To invoke, use something like `make flash_arduinoISP` +flash_usbtiny: PROGRAMMER_TYPE = usbtiny +flash_usbtiny: PROGRAMMER_ARGS = # USBTiny works with no further arguments +flash_usbtiny: flash + +flash_usbasp: PROGRAMMER_TYPE = usbasp +flash_usbasp: PROGRAMMER_ARGS = # USBasp works with no further arguments +flash_usbasp: flash + +flash_arduinoISP: PROGRAMMER_TYPE = avrisp +flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P /dev/ttyACM0 +## (for windows) flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P com5 +flash_arduinoISP: flash + +flash_109: PROGRAMMER_TYPE = avr109 +flash_109: PROGRAMMER_ARGS = -b 9600 -P /dev/ttyUSB0 +flash_109: flash + +##########------------------------------------------------------########## +########## Fuse settings and suitable defaults ########## +##########------------------------------------------------------########## + +## Mega 48, 88, 168, 328 default values +LFUSE = 0x62 +HFUSE = 0xdf +EFUSE = 0x00 + +## Generic +FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m + +fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) \ + $(PROGRAMMER_ARGS) $(FUSE_STRING) +show_fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nv + +## Called with no extra definitions, sets to defaults +set_default_fuses: FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m +set_default_fuses: fuses + +## Set the fuse byte for full-speed mode +## Note: can also be set in firmware for modern chips +set_fast_fuse: LFUSE = 0xE2 +set_fast_fuse: FUSE_STRING = -U lfuse:w:$(LFUSE):m +set_fast_fuse: fuses + +## Set the EESAVE fuse byte to preserve EEPROM across flashes +set_eeprom_save_fuse: HFUSE = 0xD7 +set_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +set_eeprom_save_fuse: fuses + +## Clear the EESAVE fuse byte +clear_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +clear_eeprom_save_fuse: fuses diff --git a/Make AVR Examples/Chapter09_Introduction-to-Timer-Counter-Hardware/reactionTimer/reactionTimer.c b/Make AVR Examples/Chapter09_Introduction-to-Timer-Counter-Hardware/reactionTimer/reactionTimer.c new file mode 100644 index 0000000..c611b28 --- /dev/null +++ b/Make AVR Examples/Chapter09_Introduction-to-Timer-Counter-Hardware/reactionTimer/reactionTimer.c @@ -0,0 +1,68 @@ +/* + Press the button as quickly as you can after the LEDs light up. + Your time is printed out over the serial port. +*/ + +// ------- Preamble -------- // +#include +#include +#include +#include "pinDefines.h" +#include "USART.h" + +#include "support.h" + +static inline void initTimer1(void) { + /* Normal mode (default), just counting */ + TCCR1B |= (1 << CS11) | (1 << CS10); + /* Clock speed: 1 MHz / 64, + each tick is 64 microseconds ~= 15.6 per ms */ + /* No special output modes */ +} + +int main(void) { + uint16_t timerValue; + + // -------- Inits --------- // + + initUSART(); + initTimer1(); + LED_DDR = 0xff; /* all LEDs for output */ + BUTTON_PORT |= (1 << BUTTON); /* enable internal pull-up */ + + printString("\r\nReaction Timer:\r\n"); + printString("---------------\r\n"); + printString("Press any key to start.\r\n"); + + // ------ Event loop ------ // + while (1) { + + receiveByte(); /* press any key */ + printString("\r\nGet ready..."); + randomDelay(); + + printString("\r\nGo!\r\n"); + LED_PORT = 0xff; /* light LEDs */ + TCNT1 = 0; /* reset counter */ + + if (bit_is_clear(BUTTON_PIN, BUTTON)) { + /* Button pressed _exactly_ as LEDs light up. Suspicious. */ + printString("You're only cheating yourself.\r\n"); + } + else { + // Wait until button pressed, save timer value. + loop_until_bit_is_clear(BUTTON_PIN, BUTTON); + timerValue = TCNT1 >> 4; + /* each tick is approx 1/16 milliseconds, so we bit-shift divide */ + + printMilliseconds(timerValue); + printComments(timerValue); + } + + // Clear LEDs and start again. + LED_PORT = 0x00; + printString("Press any key to try again.\r\n"); + + } /* End event loop */ + return 0; /* This line is never reached */ +} diff --git a/Make AVR Examples/Chapter09_Introduction-to-Timer-Counter-Hardware/reactionTimer/support.c b/Make AVR Examples/Chapter09_Introduction-to-Timer-Counter-Hardware/reactionTimer/support.c new file mode 100644 index 0000000..822601f --- /dev/null +++ b/Make AVR Examples/Chapter09_Introduction-to-Timer-Counter-Hardware/reactionTimer/support.c @@ -0,0 +1,92 @@ + +#include "support.h" + +void printMilliseconds(uint16_t value) { + /* Given a value in milliseconds, prints out how many seconds + you took over the serial port. Does ascii conversion, prints + decimal point, and drops extra leading zeros. + */ + uint8_t digit; + + printString("\r\nYou took "); + /* add up ten-thousands */ + digit = 0; + while (value >= 10000) { + digit++; + value -= 10000; + } + if (digit) { + transmitByte('0' + digit); + } + /* add up thousands */ + digit = 0; + while (value >= 1000) { + digit++; + value -= 1000; + } + transmitByte('0' + digit); + + /* decimal point here b/c dividing by 1000 */ + transmitByte('.'); + + /* add up hundreds */ + digit = 0; + while (value >= 100) { + digit++; + value -= 100; + } + transmitByte('0' + digit); + /* add up tens */ + digit = 0; + while (value >= 10) { + digit++; + value -= 10; + } + transmitByte('0' + digit); + + // Ones digit is easy. + transmitByte('0' + value); + + printString(" seconds.\r\n"); +} + +void printComments(uint16_t value) { + /* Given a value in milliseconds, rates your reaction time */ + if (value > 2000) { + printString("----> Ummm...this is a reaction timer...\r\n"); + } + else if (value > 1000) { + printString("----> Hello?\r\n"); + } + else if (value > 500) { + printString("----> Slow.\r\n"); + } + else if (value > 250) { + printString("----> Have another cup of coffee.\r\n"); + } + else if (value > 200) { + printString("----> Respectable.\r\n"); + } + else if (value >= 150) { + printString("----> Fast.\r\n"); + } + else if (value < 150) { + printString("----> Amazing!\r\n"); + } +} + +void randomDelay(void) { + /* Waits for a "random" delay from 1 - 3.5 sec */ + /* Requires timer 1 initialized and running */ + /* It's not really random, but very hard to control -- + like coin-flipping. */ + uint8_t randomTime; + + _delay_ms(1000); /* wait at least 1 sec */ + randomTime = (uint8_t) TCNT1; + /* type-casting the 16-bit TCNT1 as an 8-bit number keeps + only the 8 least-significant (fastest-changing) bits */ + while (--randomTime) { + _delay_ms(10); /* max value is 255 ~= 2.5 sec */ + } +} diff --git a/Make AVR Examples/Chapter09_Introduction-to-Timer-Counter-Hardware/reactionTimer/support.h b/Make AVR Examples/Chapter09_Introduction-to-Timer-Counter-Hardware/reactionTimer/support.h new file mode 100644 index 0000000..5ec669b --- /dev/null +++ b/Make AVR Examples/Chapter09_Introduction-to-Timer-Counter-Hardware/reactionTimer/support.h @@ -0,0 +1,24 @@ + + /* Support functions that otherwise make the main code more readable */ + + /* Includes */ +#include +#include +#include "USART.h" + + /* Function Prototypes in support.c */ + +void printMilliseconds(uint16_t value); + /* Given a value in milliseconds, prints out how many seconds + you took over the serial port. Does ascii conversion, prints + decimal point, and drops extra leading zeros. + */ + +void printComments(uint16_t value); + /* Given a value in milliseconds, rates your reaction time */ + +void randomDelay(void); + /* Waits for a "random" delay from 1 - 3.5 sec */ + /* Requires timer 1 initialized and running */ + /* It's not really random, but very hard to control + like coin-flipping. */ diff --git a/Make AVR Examples/Chapter09_Introduction-to-Timer-Counter-Hardware/timerAudio/Makefile b/Make AVR Examples/Chapter09_Introduction-to-Timer-Counter-Hardware/timerAudio/Makefile new file mode 100644 index 0000000..3d9e544 --- /dev/null +++ b/Make AVR Examples/Chapter09_Introduction-to-Timer-Counter-Hardware/timerAudio/Makefile @@ -0,0 +1,196 @@ + +##########------------------------------------------------------########## +########## Project-specific Details ########## +########## Check these every time you start a new project ########## +##########------------------------------------------------------########## + +MCU = atmega168p +F_CPU = 1000000UL +BAUD = 9600UL +## Also try BAUD = 19200 or 38400 if you're feeling lucky. + +## A directory for common include files and the simple USART library. +## If you move either the current folder or the Library folder, you'll +## need to change this path to match. +LIBDIR = ../../AVR-Programming-Library + +##########------------------------------------------------------########## +########## Programmer Defaults ########## +########## Set up once, then forget about it ########## +########## (Can override. See bottom of file.) ########## +##########------------------------------------------------------########## + +PROGRAMMER_TYPE = usbtiny +# extra arguments to avrdude: baud rate, chip type, -F flag, etc. +PROGRAMMER_ARGS = + +##########------------------------------------------------------########## +########## Program Locations ########## +########## Won't need to change if they're in your PATH ########## +##########------------------------------------------------------########## + +CC = avr-gcc +OBJCOPY = avr-objcopy +OBJDUMP = avr-objdump +AVRSIZE = avr-size +AVRDUDE = avrdude + +##########------------------------------------------------------########## +########## Makefile Magic! ########## +########## Summary: ########## +########## We want a .hex file ########## +########## Compile source files into .elf ########## +########## Convert .elf file into .hex ########## +########## You shouldn't need to edit below. ########## +##########------------------------------------------------------########## + +## The name of your project (without the .c) +# TARGET = blinkLED +## Or name it automatically after the enclosing directory +TARGET = $(lastword $(subst /, ,$(CURDIR))) + +# Object files: will find all .c/.h files in current directory +# and in LIBDIR. If you have any other (sub-)directories with code, +# you can add them in to SOURCES below in the wildcard statement. +SOURCES=$(wildcard *.c $(LIBDIR)/*.c) +OBJECTS=$(SOURCES:.c=.o) +HEADERS=$(SOURCES:.c=.h) + +## Compilation options, type man avr-gcc if you're curious. +CPPFLAGS = -DF_CPU=$(F_CPU) -DBAUD=$(BAUD) -I. -I$(LIBDIR) +CFLAGS = -Os -g -std=gnu99 -Wall +## Use short (8-bit) data types +CFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums +## Splits up object files per function +CFLAGS += -ffunction-sections -fdata-sections +LDFLAGS = -Wl,-Map,$(TARGET).map +## Optional, but often ends up with smaller code +LDFLAGS += -Wl,--gc-sections +## Relax shrinks code even more, but makes disassembly messy +## LDFLAGS += -Wl,--relax +## LDFLAGS += -Wl,-u,vfprintf -lprintf_flt -lm ## for floating-point printf +## LDFLAGS += -Wl,-u,vfprintf -lprintf_min ## for smaller printf +TARGET_ARCH = -mmcu=$(MCU) + +## Explicit pattern rules: +## To make .o files from .c files +%.o: %.c $(HEADERS) Makefile + $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c -o $@ $<; + +$(TARGET).elf: $(OBJECTS) + $(CC) $(LDFLAGS) $(TARGET_ARCH) $^ $(LDLIBS) -o $@ + +%.hex: %.elf + $(OBJCOPY) -j .text -j .data -O ihex $< $@ + +%.eeprom: %.elf + $(OBJCOPY) -j .eeprom --change-section-lma .eeprom=0 -O ihex $< $@ + +%.lst: %.elf + $(OBJDUMP) -S $< > $@ + +## These targets don't have files named after them +.PHONY: all disassemble disasm eeprom size clean squeaky_clean flash fuses + +all: $(TARGET).hex + +debug: + @echo + @echo "Source files:" $(SOURCES) + @echo "MCU, F_CPU, BAUD:" $(MCU), $(F_CPU), $(BAUD) + @echo + +# Optionally create listing file from .elf +# This creates approximate assembly-language equivalent of your code. +# Useful for debugging time-sensitive bits, +# or making sure the compiler does what you want. +disassemble: $(TARGET).lst + +disasm: disassemble + +# Optionally show how big the resulting program is +size: $(TARGET).elf + $(AVRSIZE) -C --mcu=$(MCU) $(TARGET).elf + +clean: + rm -f $(TARGET).elf $(TARGET).hex $(TARGET).obj \ + $(TARGET).o $(TARGET).d $(TARGET).eep $(TARGET).lst \ + $(TARGET).lss $(TARGET).sym $(TARGET).map $(TARGET)~ \ + $(TARGET).eeprom + +squeaky_clean: + rm -f *.elf *.hex *.obj *.o *.d *.eep *.lst *.lss *.sym *.map *~ *.eeprom + +##########------------------------------------------------------########## +########## Programmer-specific details ########## +########## Flashing code to AVR using avrdude ########## +##########------------------------------------------------------########## + +flash: $(TARGET).hex + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U flash:w:$< + +## An alias +program: flash + +flash_eeprom: $(TARGET).eeprom + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U eeprom:w:$< + +avrdude_terminal: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nt + +## If you've got multiple programmers that you use, +## you can define them here so that it's easy to switch. +## To invoke, use something like `make flash_arduinoISP` +flash_usbtiny: PROGRAMMER_TYPE = usbtiny +flash_usbtiny: PROGRAMMER_ARGS = # USBTiny works with no further arguments +flash_usbtiny: flash + +flash_usbasp: PROGRAMMER_TYPE = usbasp +flash_usbasp: PROGRAMMER_ARGS = # USBasp works with no further arguments +flash_usbasp: flash + +flash_arduinoISP: PROGRAMMER_TYPE = avrisp +flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P /dev/ttyACM0 +## (for windows) flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P com5 +flash_arduinoISP: flash + +flash_109: PROGRAMMER_TYPE = avr109 +flash_109: PROGRAMMER_ARGS = -b 9600 -P /dev/ttyUSB0 +flash_109: flash + +##########------------------------------------------------------########## +########## Fuse settings and suitable defaults ########## +##########------------------------------------------------------########## + +## Mega 48, 88, 168, 328 default values +LFUSE = 0x62 +HFUSE = 0xdf +EFUSE = 0x00 + +## Generic +FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m + +fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) \ + $(PROGRAMMER_ARGS) $(FUSE_STRING) +show_fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nv + +## Called with no extra definitions, sets to defaults +set_default_fuses: FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m +set_default_fuses: fuses + +## Set the fuse byte for full-speed mode +## Note: can also be set in firmware for modern chips +set_fast_fuse: LFUSE = 0xE2 +set_fast_fuse: FUSE_STRING = -U lfuse:w:$(LFUSE):m +set_fast_fuse: fuses + +## Set the EESAVE fuse byte to preserve EEPROM across flashes +set_eeprom_save_fuse: HFUSE = 0xD7 +set_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +set_eeprom_save_fuse: fuses + +## Clear the EESAVE fuse byte +clear_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +clear_eeprom_save_fuse: fuses diff --git a/Make AVR Examples/Chapter09_Introduction-to-Timer-Counter-Hardware/timerAudio/scale8.h b/Make AVR Examples/Chapter09_Introduction-to-Timer-Counter-Hardware/timerAudio/scale8.h new file mode 100644 index 0000000..f6c1b3b --- /dev/null +++ b/Make AVR Examples/Chapter09_Introduction-to-Timer-Counter-Hardware/timerAudio/scale8.h @@ -0,0 +1,48 @@ + /* Scale in the key of 1/200 */ + +/* + These are periods -- if you delay this long, + then toggle the speaker pin, you'll get approximate + pitches. + + This is the 8-bit version. The pitches get less accurate + as they get higher. + +*/ + +#define Gx0 252 +#define A0 238 +#define Ax0 224 +#define B0 212 +#define C1 200 +#define Cx0 189 +#define D1 178 +#define Dx0 168 +#define E1 159 +#define F1 150 +#define Fx1 141 +#define G1 133 +#define Gx1 126 +#define A1 119 +#define Ax1 112 +#define B1 106 +#define C2 100 +#define Cx2 94 +#define D2 89 +#define Dx2 84 +#define E2 79 +#define F2 75 +#define Fx2 71 +#define G2 67 +#define Gx2 63 +#define A2 59 +#define Ax2 56 +#define B2 53 +#define C3 50 +#define Cx3 47 +#define D3 44 +#define Dx3 42 +#define E3 40 +#define F3 37 +#define Fx3 35 +#define G3 33 diff --git a/Make AVR Examples/Chapter09_Introduction-to-Timer-Counter-Hardware/timerAudio/timerAudio.c b/Make AVR Examples/Chapter09_Introduction-to-Timer-Counter-Hardware/timerAudio/timerAudio.c new file mode 100644 index 0000000..f348d59 --- /dev/null +++ b/Make AVR Examples/Chapter09_Introduction-to-Timer-Counter-Hardware/timerAudio/timerAudio.c @@ -0,0 +1,49 @@ +/* + +Quick audio demo using Timer 0 to generate audio frequencies directly. + +*/ + +// ------- Preamble -------- // +#include /* Defines pins, ports, etc */ +#include /* Functions to waste time */ +#include "pinDefines.h" +#include "scale8.h" /* 8-bit scale */ + +static inline void initTimer(void) { + TCCR0A |= (1 << WGM01); /* CTC mode */ + TCCR0A |= (1 << COM0A0); /* Toggles pin each cycle through */ + TCCR0B |= (1 << CS00) | (1 << CS01); /* CPU clock / 64 */ +} + +static inline void playNote(uint8_t period, uint16_t duration) { + + TCNT0 = 0; /* reset the counter */ + OCR0A = period; /* set pitch */ + SPEAKER_DDR |= (1 << SPEAKER); /* enable output on speaker */ + + while (duration) { /* Variable delay */ + _delay_ms(1); + duration--; + } + SPEAKER_DDR &= ~(1 << SPEAKER); /* turn speaker off */ +} + +int main(void) { + // -------- Inits --------- // + initTimer(); + // ------ Event loop ------ // + while (1) { + /* Play some notes */ + playNote(C2, 200); + playNote(E2, 200); + playNote(G2, 200); + playNote(C3, 400); + + _delay_ms(1000); + _delay_ms(1000); + _delay_ms(1000); + + } /* End event loop */ + return 0; /* This line is never reached */ +} diff --git a/Make AVR Examples/Chapter10_Pulse-Width-Modulation/bruteForcePWM/Makefile b/Make AVR Examples/Chapter10_Pulse-Width-Modulation/bruteForcePWM/Makefile new file mode 100644 index 0000000..3d9e544 --- /dev/null +++ b/Make AVR Examples/Chapter10_Pulse-Width-Modulation/bruteForcePWM/Makefile @@ -0,0 +1,196 @@ + +##########------------------------------------------------------########## +########## Project-specific Details ########## +########## Check these every time you start a new project ########## +##########------------------------------------------------------########## + +MCU = atmega168p +F_CPU = 1000000UL +BAUD = 9600UL +## Also try BAUD = 19200 or 38400 if you're feeling lucky. + +## A directory for common include files and the simple USART library. +## If you move either the current folder or the Library folder, you'll +## need to change this path to match. +LIBDIR = ../../AVR-Programming-Library + +##########------------------------------------------------------########## +########## Programmer Defaults ########## +########## Set up once, then forget about it ########## +########## (Can override. See bottom of file.) ########## +##########------------------------------------------------------########## + +PROGRAMMER_TYPE = usbtiny +# extra arguments to avrdude: baud rate, chip type, -F flag, etc. +PROGRAMMER_ARGS = + +##########------------------------------------------------------########## +########## Program Locations ########## +########## Won't need to change if they're in your PATH ########## +##########------------------------------------------------------########## + +CC = avr-gcc +OBJCOPY = avr-objcopy +OBJDUMP = avr-objdump +AVRSIZE = avr-size +AVRDUDE = avrdude + +##########------------------------------------------------------########## +########## Makefile Magic! ########## +########## Summary: ########## +########## We want a .hex file ########## +########## Compile source files into .elf ########## +########## Convert .elf file into .hex ########## +########## You shouldn't need to edit below. ########## +##########------------------------------------------------------########## + +## The name of your project (without the .c) +# TARGET = blinkLED +## Or name it automatically after the enclosing directory +TARGET = $(lastword $(subst /, ,$(CURDIR))) + +# Object files: will find all .c/.h files in current directory +# and in LIBDIR. If you have any other (sub-)directories with code, +# you can add them in to SOURCES below in the wildcard statement. +SOURCES=$(wildcard *.c $(LIBDIR)/*.c) +OBJECTS=$(SOURCES:.c=.o) +HEADERS=$(SOURCES:.c=.h) + +## Compilation options, type man avr-gcc if you're curious. +CPPFLAGS = -DF_CPU=$(F_CPU) -DBAUD=$(BAUD) -I. -I$(LIBDIR) +CFLAGS = -Os -g -std=gnu99 -Wall +## Use short (8-bit) data types +CFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums +## Splits up object files per function +CFLAGS += -ffunction-sections -fdata-sections +LDFLAGS = -Wl,-Map,$(TARGET).map +## Optional, but often ends up with smaller code +LDFLAGS += -Wl,--gc-sections +## Relax shrinks code even more, but makes disassembly messy +## LDFLAGS += -Wl,--relax +## LDFLAGS += -Wl,-u,vfprintf -lprintf_flt -lm ## for floating-point printf +## LDFLAGS += -Wl,-u,vfprintf -lprintf_min ## for smaller printf +TARGET_ARCH = -mmcu=$(MCU) + +## Explicit pattern rules: +## To make .o files from .c files +%.o: %.c $(HEADERS) Makefile + $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c -o $@ $<; + +$(TARGET).elf: $(OBJECTS) + $(CC) $(LDFLAGS) $(TARGET_ARCH) $^ $(LDLIBS) -o $@ + +%.hex: %.elf + $(OBJCOPY) -j .text -j .data -O ihex $< $@ + +%.eeprom: %.elf + $(OBJCOPY) -j .eeprom --change-section-lma .eeprom=0 -O ihex $< $@ + +%.lst: %.elf + $(OBJDUMP) -S $< > $@ + +## These targets don't have files named after them +.PHONY: all disassemble disasm eeprom size clean squeaky_clean flash fuses + +all: $(TARGET).hex + +debug: + @echo + @echo "Source files:" $(SOURCES) + @echo "MCU, F_CPU, BAUD:" $(MCU), $(F_CPU), $(BAUD) + @echo + +# Optionally create listing file from .elf +# This creates approximate assembly-language equivalent of your code. +# Useful for debugging time-sensitive bits, +# or making sure the compiler does what you want. +disassemble: $(TARGET).lst + +disasm: disassemble + +# Optionally show how big the resulting program is +size: $(TARGET).elf + $(AVRSIZE) -C --mcu=$(MCU) $(TARGET).elf + +clean: + rm -f $(TARGET).elf $(TARGET).hex $(TARGET).obj \ + $(TARGET).o $(TARGET).d $(TARGET).eep $(TARGET).lst \ + $(TARGET).lss $(TARGET).sym $(TARGET).map $(TARGET)~ \ + $(TARGET).eeprom + +squeaky_clean: + rm -f *.elf *.hex *.obj *.o *.d *.eep *.lst *.lss *.sym *.map *~ *.eeprom + +##########------------------------------------------------------########## +########## Programmer-specific details ########## +########## Flashing code to AVR using avrdude ########## +##########------------------------------------------------------########## + +flash: $(TARGET).hex + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U flash:w:$< + +## An alias +program: flash + +flash_eeprom: $(TARGET).eeprom + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U eeprom:w:$< + +avrdude_terminal: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nt + +## If you've got multiple programmers that you use, +## you can define them here so that it's easy to switch. +## To invoke, use something like `make flash_arduinoISP` +flash_usbtiny: PROGRAMMER_TYPE = usbtiny +flash_usbtiny: PROGRAMMER_ARGS = # USBTiny works with no further arguments +flash_usbtiny: flash + +flash_usbasp: PROGRAMMER_TYPE = usbasp +flash_usbasp: PROGRAMMER_ARGS = # USBasp works with no further arguments +flash_usbasp: flash + +flash_arduinoISP: PROGRAMMER_TYPE = avrisp +flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P /dev/ttyACM0 +## (for windows) flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P com5 +flash_arduinoISP: flash + +flash_109: PROGRAMMER_TYPE = avr109 +flash_109: PROGRAMMER_ARGS = -b 9600 -P /dev/ttyUSB0 +flash_109: flash + +##########------------------------------------------------------########## +########## Fuse settings and suitable defaults ########## +##########------------------------------------------------------########## + +## Mega 48, 88, 168, 328 default values +LFUSE = 0x62 +HFUSE = 0xdf +EFUSE = 0x00 + +## Generic +FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m + +fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) \ + $(PROGRAMMER_ARGS) $(FUSE_STRING) +show_fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nv + +## Called with no extra definitions, sets to defaults +set_default_fuses: FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m +set_default_fuses: fuses + +## Set the fuse byte for full-speed mode +## Note: can also be set in firmware for modern chips +set_fast_fuse: LFUSE = 0xE2 +set_fast_fuse: FUSE_STRING = -U lfuse:w:$(LFUSE):m +set_fast_fuse: fuses + +## Set the EESAVE fuse byte to preserve EEPROM across flashes +set_eeprom_save_fuse: HFUSE = 0xD7 +set_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +set_eeprom_save_fuse: fuses + +## Clear the EESAVE fuse byte +clear_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +clear_eeprom_save_fuse: fuses diff --git a/Make AVR Examples/Chapter10_Pulse-Width-Modulation/bruteForcePWM/pwm.c b/Make AVR Examples/Chapter10_Pulse-Width-Modulation/bruteForcePWM/pwm.c new file mode 100644 index 0000000..1031dcd --- /dev/null +++ b/Make AVR Examples/Chapter10_Pulse-Width-Modulation/bruteForcePWM/pwm.c @@ -0,0 +1,47 @@ +/* + * Quick and dirty PWM Demo + */ + +// ------- Preamble -------- // +#include /* Defines pins, ports, etc */ +#include /* Functions to waste time */ +#include "pinDefines.h" + +#define LED_DELAY 2 + +int main(void) { + + uint8_t brightness = 0; + int8_t direction = 1; + uint8_t i; + + // -------- Inits --------- // + + LED_DDR = 0xff; /* Init all LEDs */ + + // ------ Event loop ------ // + while (1) { + + // PWM + for (i = 0; i < 255; i++) { + if (i < brightness) { + LED_PORT = 0xff; /* turn on */ + } + else { + LED_PORT = 0; /* turn off */ + } + _delay_us(LED_DELAY); + } + + // Brighten and dim + if (brightness == 0) { + direction = 1; + } + if (brightness == 255) { + direction = -1; + } + brightness += direction; + + } /* End event loop */ + return 0; /* This line is never reached */ +} diff --git a/Make AVR Examples/Chapter10_Pulse-Width-Modulation/pwm/Makefile b/Make AVR Examples/Chapter10_Pulse-Width-Modulation/pwm/Makefile new file mode 100644 index 0000000..3d9e544 --- /dev/null +++ b/Make AVR Examples/Chapter10_Pulse-Width-Modulation/pwm/Makefile @@ -0,0 +1,196 @@ + +##########------------------------------------------------------########## +########## Project-specific Details ########## +########## Check these every time you start a new project ########## +##########------------------------------------------------------########## + +MCU = atmega168p +F_CPU = 1000000UL +BAUD = 9600UL +## Also try BAUD = 19200 or 38400 if you're feeling lucky. + +## A directory for common include files and the simple USART library. +## If you move either the current folder or the Library folder, you'll +## need to change this path to match. +LIBDIR = ../../AVR-Programming-Library + +##########------------------------------------------------------########## +########## Programmer Defaults ########## +########## Set up once, then forget about it ########## +########## (Can override. See bottom of file.) ########## +##########------------------------------------------------------########## + +PROGRAMMER_TYPE = usbtiny +# extra arguments to avrdude: baud rate, chip type, -F flag, etc. +PROGRAMMER_ARGS = + +##########------------------------------------------------------########## +########## Program Locations ########## +########## Won't need to change if they're in your PATH ########## +##########------------------------------------------------------########## + +CC = avr-gcc +OBJCOPY = avr-objcopy +OBJDUMP = avr-objdump +AVRSIZE = avr-size +AVRDUDE = avrdude + +##########------------------------------------------------------########## +########## Makefile Magic! ########## +########## Summary: ########## +########## We want a .hex file ########## +########## Compile source files into .elf ########## +########## Convert .elf file into .hex ########## +########## You shouldn't need to edit below. ########## +##########------------------------------------------------------########## + +## The name of your project (without the .c) +# TARGET = blinkLED +## Or name it automatically after the enclosing directory +TARGET = $(lastword $(subst /, ,$(CURDIR))) + +# Object files: will find all .c/.h files in current directory +# and in LIBDIR. If you have any other (sub-)directories with code, +# you can add them in to SOURCES below in the wildcard statement. +SOURCES=$(wildcard *.c $(LIBDIR)/*.c) +OBJECTS=$(SOURCES:.c=.o) +HEADERS=$(SOURCES:.c=.h) + +## Compilation options, type man avr-gcc if you're curious. +CPPFLAGS = -DF_CPU=$(F_CPU) -DBAUD=$(BAUD) -I. -I$(LIBDIR) +CFLAGS = -Os -g -std=gnu99 -Wall +## Use short (8-bit) data types +CFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums +## Splits up object files per function +CFLAGS += -ffunction-sections -fdata-sections +LDFLAGS = -Wl,-Map,$(TARGET).map +## Optional, but often ends up with smaller code +LDFLAGS += -Wl,--gc-sections +## Relax shrinks code even more, but makes disassembly messy +## LDFLAGS += -Wl,--relax +## LDFLAGS += -Wl,-u,vfprintf -lprintf_flt -lm ## for floating-point printf +## LDFLAGS += -Wl,-u,vfprintf -lprintf_min ## for smaller printf +TARGET_ARCH = -mmcu=$(MCU) + +## Explicit pattern rules: +## To make .o files from .c files +%.o: %.c $(HEADERS) Makefile + $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c -o $@ $<; + +$(TARGET).elf: $(OBJECTS) + $(CC) $(LDFLAGS) $(TARGET_ARCH) $^ $(LDLIBS) -o $@ + +%.hex: %.elf + $(OBJCOPY) -j .text -j .data -O ihex $< $@ + +%.eeprom: %.elf + $(OBJCOPY) -j .eeprom --change-section-lma .eeprom=0 -O ihex $< $@ + +%.lst: %.elf + $(OBJDUMP) -S $< > $@ + +## These targets don't have files named after them +.PHONY: all disassemble disasm eeprom size clean squeaky_clean flash fuses + +all: $(TARGET).hex + +debug: + @echo + @echo "Source files:" $(SOURCES) + @echo "MCU, F_CPU, BAUD:" $(MCU), $(F_CPU), $(BAUD) + @echo + +# Optionally create listing file from .elf +# This creates approximate assembly-language equivalent of your code. +# Useful for debugging time-sensitive bits, +# or making sure the compiler does what you want. +disassemble: $(TARGET).lst + +disasm: disassemble + +# Optionally show how big the resulting program is +size: $(TARGET).elf + $(AVRSIZE) -C --mcu=$(MCU) $(TARGET).elf + +clean: + rm -f $(TARGET).elf $(TARGET).hex $(TARGET).obj \ + $(TARGET).o $(TARGET).d $(TARGET).eep $(TARGET).lst \ + $(TARGET).lss $(TARGET).sym $(TARGET).map $(TARGET)~ \ + $(TARGET).eeprom + +squeaky_clean: + rm -f *.elf *.hex *.obj *.o *.d *.eep *.lst *.lss *.sym *.map *~ *.eeprom + +##########------------------------------------------------------########## +########## Programmer-specific details ########## +########## Flashing code to AVR using avrdude ########## +##########------------------------------------------------------########## + +flash: $(TARGET).hex + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U flash:w:$< + +## An alias +program: flash + +flash_eeprom: $(TARGET).eeprom + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U eeprom:w:$< + +avrdude_terminal: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nt + +## If you've got multiple programmers that you use, +## you can define them here so that it's easy to switch. +## To invoke, use something like `make flash_arduinoISP` +flash_usbtiny: PROGRAMMER_TYPE = usbtiny +flash_usbtiny: PROGRAMMER_ARGS = # USBTiny works with no further arguments +flash_usbtiny: flash + +flash_usbasp: PROGRAMMER_TYPE = usbasp +flash_usbasp: PROGRAMMER_ARGS = # USBasp works with no further arguments +flash_usbasp: flash + +flash_arduinoISP: PROGRAMMER_TYPE = avrisp +flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P /dev/ttyACM0 +## (for windows) flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P com5 +flash_arduinoISP: flash + +flash_109: PROGRAMMER_TYPE = avr109 +flash_109: PROGRAMMER_ARGS = -b 9600 -P /dev/ttyUSB0 +flash_109: flash + +##########------------------------------------------------------########## +########## Fuse settings and suitable defaults ########## +##########------------------------------------------------------########## + +## Mega 48, 88, 168, 328 default values +LFUSE = 0x62 +HFUSE = 0xdf +EFUSE = 0x00 + +## Generic +FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m + +fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) \ + $(PROGRAMMER_ARGS) $(FUSE_STRING) +show_fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nv + +## Called with no extra definitions, sets to defaults +set_default_fuses: FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m +set_default_fuses: fuses + +## Set the fuse byte for full-speed mode +## Note: can also be set in firmware for modern chips +set_fast_fuse: LFUSE = 0xE2 +set_fast_fuse: FUSE_STRING = -U lfuse:w:$(LFUSE):m +set_fast_fuse: fuses + +## Set the EESAVE fuse byte to preserve EEPROM across flashes +set_eeprom_save_fuse: HFUSE = 0xD7 +set_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +set_eeprom_save_fuse: fuses + +## Clear the EESAVE fuse byte +clear_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +clear_eeprom_save_fuse: fuses diff --git a/Make AVR Examples/Chapter10_Pulse-Width-Modulation/pwm/pinDefines.h b/Make AVR Examples/Chapter10_Pulse-Width-Modulation/pwm/pinDefines.h new file mode 100644 index 0000000..19eb378 --- /dev/null +++ b/Make AVR Examples/Chapter10_Pulse-Width-Modulation/pwm/pinDefines.h @@ -0,0 +1,93 @@ +// --------------- +// Pin Defines +// --------------- + +#define LED_PORT PORTB +#define LED_PIN PINB +#define LED_DDR DDRB + +#define LED0 PB0 +#define LED1 PB1 +#define LED2 PB2 +#define LED3 PB3 +#define LED4 PB4 +#define LED5 PB5 +#define LED6 PB6 +#define LED7 PB7 + +#define BUTTON PD2 +#define BUTTON_PORT PORTD +#define BUTTON_PIN PIND +#define BUTTON_DDR DDRD + +#define BUTTON2 PD3 +#define BUTTON_PORT PORTD +#define BUTTON_PIN PIND +#define BUTTON_DDR DDRD + +#define BUTTON3 PD4 +#define BUTTON_PORT PORTD +#define BUTTON_PIN PIND +#define BUTTON_DDR DDRD + +#define SPEAKER PD6 /* OC0A */ +#define SPEAKER_PORT PORTD +#define SPEAKER_PIN PIND +#define SPEAKER_DDR DDRD + +#define ANTENNA PD5 /* OC0B */ +#define ANTENNA_PORT PORTD +#define ANTENNA_PIN PIND +#define ANTENNA_DDR DDRD + +#define MODULATION PD3 /* OC2B */ +#define MODULATION_PORT PORTD +#define MODULATION_PIN PIND +#define MODULATION_DDR DDRD + +#define LIGHT_SENSOR PC0 /* ADC0 */ +#define LIGHT_SENSOR_PORT PORTC +#define LIGHT_SENSOR_PIN PINC +#define LIGHT_SENSOR_DDR DDRC + +#define CAP_SENSOR PC1 /* ADC1 */ +#define CAP_SENSOR_PORT PORTC +#define CAP_SENSOR_PIN PINC +#define CAP_SENSOR_DDR DDRC + +#define PIEZO PC2 /* ADC2 */ +#define PIEZO_PORT PORTC +#define PIEZO_PIN PINC +#define PIEZO_DDR DDRC + +// SPI and I2C serial mode defines + +#define SPI_SS PB2 +#define SPI_SS_PORT PORTB +#define SPI_SS_PIN PINB +#define SPI_SS_DDR DDRB + +#define SPI_MOSI PB3 +#define SPI_MOSI_PORT PORTB +#define SPI_MOSI_PIN PINB +#define SPI_MOSI_DDR DDRB + +#define SPI_MISO PB4 +#define SPI_MISO_PORT PORTB +#define SPI_MISO_PIN PINB +#define SPI_MISO_DDR DDRB + +#define SPI_SCK PB5 +#define SPI_SCK_PORT PORTB +#define SPI_SCK_PIN PINB +#define SPI_SCK_DDR DDRB + +#define I2C_SDA PC4 +#define I2C_SDA_PORT PORTC +#define I2C_SDA_PIN PINC +#define I2C_SDA_DDR DDRC + +#define I2C_SCL PC5 +#define I2C_SCL_PORT PORTC +#define I2C_SCL_PIN PINC +#define I2C_SCL_DDR DDRC diff --git a/Make AVR Examples/Chapter10_Pulse-Width-Modulation/pwm/pwm.c b/Make AVR Examples/Chapter10_Pulse-Width-Modulation/pwm/pwm.c new file mode 100644 index 0000000..04edd15 --- /dev/null +++ b/Make AVR Examples/Chapter10_Pulse-Width-Modulation/pwm/pwm.c @@ -0,0 +1,45 @@ + /* Quick and dirty PWM Demo */ + +// ------- Preamble -------- // +#include /* Defines pins, ports, etc */ +#include /* Functions to waste time */ +#include "pinDefines.h" + +#define LED_DELAY 20 /* microseconds */ + +void pwmAllPins(uint8_t brightness) { + uint8_t i; + LED_PORT = 0xff; /* turn on */ + for (i = 0; i < 255; i++) { + if (i >= brightness) { /* once it's been on long enough */ + LED_PORT = 0; /* turn off */ + } + _delay_us(LED_DELAY); + } +} + +int main(void) { + + uint8_t brightness = 0; + int8_t direction = 1; + + // -------- Inits --------- // + + // Init all LEDs + LED_DDR = 0xff; + // ------ Event loop ------ // + while (1) { + // Brighten and dim + if (brightness == 0) { + direction = 1; + } + if (brightness == 255) { + direction = -1; + } + brightness += direction; + pwmAllPins(brightness); + + + } /* End event loop */ + return 0; /* This line is never reached */ +} diff --git a/Make AVR Examples/Chapter10_Pulse-Width-Modulation/pwmOnAnyPin/Makefile b/Make AVR Examples/Chapter10_Pulse-Width-Modulation/pwmOnAnyPin/Makefile new file mode 100644 index 0000000..3d9e544 --- /dev/null +++ b/Make AVR Examples/Chapter10_Pulse-Width-Modulation/pwmOnAnyPin/Makefile @@ -0,0 +1,196 @@ + +##########------------------------------------------------------########## +########## Project-specific Details ########## +########## Check these every time you start a new project ########## +##########------------------------------------------------------########## + +MCU = atmega168p +F_CPU = 1000000UL +BAUD = 9600UL +## Also try BAUD = 19200 or 38400 if you're feeling lucky. + +## A directory for common include files and the simple USART library. +## If you move either the current folder or the Library folder, you'll +## need to change this path to match. +LIBDIR = ../../AVR-Programming-Library + +##########------------------------------------------------------########## +########## Programmer Defaults ########## +########## Set up once, then forget about it ########## +########## (Can override. See bottom of file.) ########## +##########------------------------------------------------------########## + +PROGRAMMER_TYPE = usbtiny +# extra arguments to avrdude: baud rate, chip type, -F flag, etc. +PROGRAMMER_ARGS = + +##########------------------------------------------------------########## +########## Program Locations ########## +########## Won't need to change if they're in your PATH ########## +##########------------------------------------------------------########## + +CC = avr-gcc +OBJCOPY = avr-objcopy +OBJDUMP = avr-objdump +AVRSIZE = avr-size +AVRDUDE = avrdude + +##########------------------------------------------------------########## +########## Makefile Magic! ########## +########## Summary: ########## +########## We want a .hex file ########## +########## Compile source files into .elf ########## +########## Convert .elf file into .hex ########## +########## You shouldn't need to edit below. ########## +##########------------------------------------------------------########## + +## The name of your project (without the .c) +# TARGET = blinkLED +## Or name it automatically after the enclosing directory +TARGET = $(lastword $(subst /, ,$(CURDIR))) + +# Object files: will find all .c/.h files in current directory +# and in LIBDIR. If you have any other (sub-)directories with code, +# you can add them in to SOURCES below in the wildcard statement. +SOURCES=$(wildcard *.c $(LIBDIR)/*.c) +OBJECTS=$(SOURCES:.c=.o) +HEADERS=$(SOURCES:.c=.h) + +## Compilation options, type man avr-gcc if you're curious. +CPPFLAGS = -DF_CPU=$(F_CPU) -DBAUD=$(BAUD) -I. -I$(LIBDIR) +CFLAGS = -Os -g -std=gnu99 -Wall +## Use short (8-bit) data types +CFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums +## Splits up object files per function +CFLAGS += -ffunction-sections -fdata-sections +LDFLAGS = -Wl,-Map,$(TARGET).map +## Optional, but often ends up with smaller code +LDFLAGS += -Wl,--gc-sections +## Relax shrinks code even more, but makes disassembly messy +## LDFLAGS += -Wl,--relax +## LDFLAGS += -Wl,-u,vfprintf -lprintf_flt -lm ## for floating-point printf +## LDFLAGS += -Wl,-u,vfprintf -lprintf_min ## for smaller printf +TARGET_ARCH = -mmcu=$(MCU) + +## Explicit pattern rules: +## To make .o files from .c files +%.o: %.c $(HEADERS) Makefile + $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c -o $@ $<; + +$(TARGET).elf: $(OBJECTS) + $(CC) $(LDFLAGS) $(TARGET_ARCH) $^ $(LDLIBS) -o $@ + +%.hex: %.elf + $(OBJCOPY) -j .text -j .data -O ihex $< $@ + +%.eeprom: %.elf + $(OBJCOPY) -j .eeprom --change-section-lma .eeprom=0 -O ihex $< $@ + +%.lst: %.elf + $(OBJDUMP) -S $< > $@ + +## These targets don't have files named after them +.PHONY: all disassemble disasm eeprom size clean squeaky_clean flash fuses + +all: $(TARGET).hex + +debug: + @echo + @echo "Source files:" $(SOURCES) + @echo "MCU, F_CPU, BAUD:" $(MCU), $(F_CPU), $(BAUD) + @echo + +# Optionally create listing file from .elf +# This creates approximate assembly-language equivalent of your code. +# Useful for debugging time-sensitive bits, +# or making sure the compiler does what you want. +disassemble: $(TARGET).lst + +disasm: disassemble + +# Optionally show how big the resulting program is +size: $(TARGET).elf + $(AVRSIZE) -C --mcu=$(MCU) $(TARGET).elf + +clean: + rm -f $(TARGET).elf $(TARGET).hex $(TARGET).obj \ + $(TARGET).o $(TARGET).d $(TARGET).eep $(TARGET).lst \ + $(TARGET).lss $(TARGET).sym $(TARGET).map $(TARGET)~ \ + $(TARGET).eeprom + +squeaky_clean: + rm -f *.elf *.hex *.obj *.o *.d *.eep *.lst *.lss *.sym *.map *~ *.eeprom + +##########------------------------------------------------------########## +########## Programmer-specific details ########## +########## Flashing code to AVR using avrdude ########## +##########------------------------------------------------------########## + +flash: $(TARGET).hex + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U flash:w:$< + +## An alias +program: flash + +flash_eeprom: $(TARGET).eeprom + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U eeprom:w:$< + +avrdude_terminal: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nt + +## If you've got multiple programmers that you use, +## you can define them here so that it's easy to switch. +## To invoke, use something like `make flash_arduinoISP` +flash_usbtiny: PROGRAMMER_TYPE = usbtiny +flash_usbtiny: PROGRAMMER_ARGS = # USBTiny works with no further arguments +flash_usbtiny: flash + +flash_usbasp: PROGRAMMER_TYPE = usbasp +flash_usbasp: PROGRAMMER_ARGS = # USBasp works with no further arguments +flash_usbasp: flash + +flash_arduinoISP: PROGRAMMER_TYPE = avrisp +flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P /dev/ttyACM0 +## (for windows) flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P com5 +flash_arduinoISP: flash + +flash_109: PROGRAMMER_TYPE = avr109 +flash_109: PROGRAMMER_ARGS = -b 9600 -P /dev/ttyUSB0 +flash_109: flash + +##########------------------------------------------------------########## +########## Fuse settings and suitable defaults ########## +##########------------------------------------------------------########## + +## Mega 48, 88, 168, 328 default values +LFUSE = 0x62 +HFUSE = 0xdf +EFUSE = 0x00 + +## Generic +FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m + +fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) \ + $(PROGRAMMER_ARGS) $(FUSE_STRING) +show_fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nv + +## Called with no extra definitions, sets to defaults +set_default_fuses: FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m +set_default_fuses: fuses + +## Set the fuse byte for full-speed mode +## Note: can also be set in firmware for modern chips +set_fast_fuse: LFUSE = 0xE2 +set_fast_fuse: FUSE_STRING = -U lfuse:w:$(LFUSE):m +set_fast_fuse: fuses + +## Set the EESAVE fuse byte to preserve EEPROM across flashes +set_eeprom_save_fuse: HFUSE = 0xD7 +set_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +set_eeprom_save_fuse: fuses + +## Clear the EESAVE fuse byte +clear_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +clear_eeprom_save_fuse: fuses diff --git a/Make AVR Examples/Chapter10_Pulse-Width-Modulation/pwmOnAnyPin/pwmOnAnyPin.c b/Make AVR Examples/Chapter10_Pulse-Width-Modulation/pwmOnAnyPin/pwmOnAnyPin.c new file mode 100644 index 0000000..729f506 --- /dev/null +++ b/Make AVR Examples/Chapter10_Pulse-Width-Modulation/pwmOnAnyPin/pwmOnAnyPin.c @@ -0,0 +1,59 @@ +// Quick and dirty demo of how to get PWM on any pin with interrupts +// ------- Preamble -------- // +#include +#include +#include +#include "pinDefines.h" + +#define DELAY 3 + +volatile uint8_t brightnessA; +volatile uint8_t brightnessB; + +// -------- Functions --------- // +static inline void initTimer0(void) { + /* must be /64 or more for ISR timing */ + TCCR0B |= (1 << CS01) | (1 << CS00); + /* both output compare interrupts */ + TIMSK0 |= ((1 << OCIE0A) | (1 << OCIE1B)); + TIMSK0 |= (1 << TOIE0); /* overflow interrupt enable */ + sei(); +} + +ISR(TIMER0_OVF_vect) { + LED_PORT = 0xff; + OCR0A = brightnessA; + OCR0B = brightnessB; +} +ISR(TIMER0_COMPA_vect) { + LED_PORT &= 0b11110000; /* turn off low four LEDs */ +} +ISR(TIMER0_COMPB_vect) { + LED_PORT &= 0b00001111; /* turn off high four LEDs */ +} + +int main(void) { + // -------- Inits --------- // + + uint8_t i; + LED_DDR = 0xff; + initTimer0(); + + // ------ Event loop ------ // + while (1) { + + for (i = 0; i < 255; i++) { + _delay_ms(DELAY); + brightnessA = i; + brightnessB = 255 - i; + } + + for (i = 254; i > 0; i--) { + _delay_ms(DELAY); + brightnessA = i; + brightnessB = 255 - i; + } + + } /* End event loop */ + return 0; /* This line is never reached */ +} diff --git a/Make AVR Examples/Chapter10_Pulse-Width-Modulation/pwmTimers/Makefile b/Make AVR Examples/Chapter10_Pulse-Width-Modulation/pwmTimers/Makefile new file mode 100644 index 0000000..3d9e544 --- /dev/null +++ b/Make AVR Examples/Chapter10_Pulse-Width-Modulation/pwmTimers/Makefile @@ -0,0 +1,196 @@ + +##########------------------------------------------------------########## +########## Project-specific Details ########## +########## Check these every time you start a new project ########## +##########------------------------------------------------------########## + +MCU = atmega168p +F_CPU = 1000000UL +BAUD = 9600UL +## Also try BAUD = 19200 or 38400 if you're feeling lucky. + +## A directory for common include files and the simple USART library. +## If you move either the current folder or the Library folder, you'll +## need to change this path to match. +LIBDIR = ../../AVR-Programming-Library + +##########------------------------------------------------------########## +########## Programmer Defaults ########## +########## Set up once, then forget about it ########## +########## (Can override. See bottom of file.) ########## +##########------------------------------------------------------########## + +PROGRAMMER_TYPE = usbtiny +# extra arguments to avrdude: baud rate, chip type, -F flag, etc. +PROGRAMMER_ARGS = + +##########------------------------------------------------------########## +########## Program Locations ########## +########## Won't need to change if they're in your PATH ########## +##########------------------------------------------------------########## + +CC = avr-gcc +OBJCOPY = avr-objcopy +OBJDUMP = avr-objdump +AVRSIZE = avr-size +AVRDUDE = avrdude + +##########------------------------------------------------------########## +########## Makefile Magic! ########## +########## Summary: ########## +########## We want a .hex file ########## +########## Compile source files into .elf ########## +########## Convert .elf file into .hex ########## +########## You shouldn't need to edit below. ########## +##########------------------------------------------------------########## + +## The name of your project (without the .c) +# TARGET = blinkLED +## Or name it automatically after the enclosing directory +TARGET = $(lastword $(subst /, ,$(CURDIR))) + +# Object files: will find all .c/.h files in current directory +# and in LIBDIR. If you have any other (sub-)directories with code, +# you can add them in to SOURCES below in the wildcard statement. +SOURCES=$(wildcard *.c $(LIBDIR)/*.c) +OBJECTS=$(SOURCES:.c=.o) +HEADERS=$(SOURCES:.c=.h) + +## Compilation options, type man avr-gcc if you're curious. +CPPFLAGS = -DF_CPU=$(F_CPU) -DBAUD=$(BAUD) -I. -I$(LIBDIR) +CFLAGS = -Os -g -std=gnu99 -Wall +## Use short (8-bit) data types +CFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums +## Splits up object files per function +CFLAGS += -ffunction-sections -fdata-sections +LDFLAGS = -Wl,-Map,$(TARGET).map +## Optional, but often ends up with smaller code +LDFLAGS += -Wl,--gc-sections +## Relax shrinks code even more, but makes disassembly messy +## LDFLAGS += -Wl,--relax +## LDFLAGS += -Wl,-u,vfprintf -lprintf_flt -lm ## for floating-point printf +## LDFLAGS += -Wl,-u,vfprintf -lprintf_min ## for smaller printf +TARGET_ARCH = -mmcu=$(MCU) + +## Explicit pattern rules: +## To make .o files from .c files +%.o: %.c $(HEADERS) Makefile + $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c -o $@ $<; + +$(TARGET).elf: $(OBJECTS) + $(CC) $(LDFLAGS) $(TARGET_ARCH) $^ $(LDLIBS) -o $@ + +%.hex: %.elf + $(OBJCOPY) -j .text -j .data -O ihex $< $@ + +%.eeprom: %.elf + $(OBJCOPY) -j .eeprom --change-section-lma .eeprom=0 -O ihex $< $@ + +%.lst: %.elf + $(OBJDUMP) -S $< > $@ + +## These targets don't have files named after them +.PHONY: all disassemble disasm eeprom size clean squeaky_clean flash fuses + +all: $(TARGET).hex + +debug: + @echo + @echo "Source files:" $(SOURCES) + @echo "MCU, F_CPU, BAUD:" $(MCU), $(F_CPU), $(BAUD) + @echo + +# Optionally create listing file from .elf +# This creates approximate assembly-language equivalent of your code. +# Useful for debugging time-sensitive bits, +# or making sure the compiler does what you want. +disassemble: $(TARGET).lst + +disasm: disassemble + +# Optionally show how big the resulting program is +size: $(TARGET).elf + $(AVRSIZE) -C --mcu=$(MCU) $(TARGET).elf + +clean: + rm -f $(TARGET).elf $(TARGET).hex $(TARGET).obj \ + $(TARGET).o $(TARGET).d $(TARGET).eep $(TARGET).lst \ + $(TARGET).lss $(TARGET).sym $(TARGET).map $(TARGET)~ \ + $(TARGET).eeprom + +squeaky_clean: + rm -f *.elf *.hex *.obj *.o *.d *.eep *.lst *.lss *.sym *.map *~ *.eeprom + +##########------------------------------------------------------########## +########## Programmer-specific details ########## +########## Flashing code to AVR using avrdude ########## +##########------------------------------------------------------########## + +flash: $(TARGET).hex + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U flash:w:$< + +## An alias +program: flash + +flash_eeprom: $(TARGET).eeprom + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U eeprom:w:$< + +avrdude_terminal: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nt + +## If you've got multiple programmers that you use, +## you can define them here so that it's easy to switch. +## To invoke, use something like `make flash_arduinoISP` +flash_usbtiny: PROGRAMMER_TYPE = usbtiny +flash_usbtiny: PROGRAMMER_ARGS = # USBTiny works with no further arguments +flash_usbtiny: flash + +flash_usbasp: PROGRAMMER_TYPE = usbasp +flash_usbasp: PROGRAMMER_ARGS = # USBasp works with no further arguments +flash_usbasp: flash + +flash_arduinoISP: PROGRAMMER_TYPE = avrisp +flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P /dev/ttyACM0 +## (for windows) flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P com5 +flash_arduinoISP: flash + +flash_109: PROGRAMMER_TYPE = avr109 +flash_109: PROGRAMMER_ARGS = -b 9600 -P /dev/ttyUSB0 +flash_109: flash + +##########------------------------------------------------------########## +########## Fuse settings and suitable defaults ########## +##########------------------------------------------------------########## + +## Mega 48, 88, 168, 328 default values +LFUSE = 0x62 +HFUSE = 0xdf +EFUSE = 0x00 + +## Generic +FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m + +fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) \ + $(PROGRAMMER_ARGS) $(FUSE_STRING) +show_fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nv + +## Called with no extra definitions, sets to defaults +set_default_fuses: FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m +set_default_fuses: fuses + +## Set the fuse byte for full-speed mode +## Note: can also be set in firmware for modern chips +set_fast_fuse: LFUSE = 0xE2 +set_fast_fuse: FUSE_STRING = -U lfuse:w:$(LFUSE):m +set_fast_fuse: fuses + +## Set the EESAVE fuse byte to preserve EEPROM across flashes +set_eeprom_save_fuse: HFUSE = 0xD7 +set_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +set_eeprom_save_fuse: fuses + +## Clear the EESAVE fuse byte +clear_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +clear_eeprom_save_fuse: fuses diff --git a/Make AVR Examples/Chapter10_Pulse-Width-Modulation/pwmTimers/pwmTimers.c b/Make AVR Examples/Chapter10_Pulse-Width-Modulation/pwmTimers/pwmTimers.c new file mode 100644 index 0000000..4c18946 --- /dev/null +++ b/Make AVR Examples/Chapter10_Pulse-Width-Modulation/pwmTimers/pwmTimers.c @@ -0,0 +1,50 @@ + /* PWM Demo with serial control over three LEDs */ + +// ------- Preamble -------- // +#include /* Defines pins, ports, etc */ +#include /* Functions to waste time */ +#include "pinDefines.h" +#include "USART.h" + +static inline void initTimers(void) { + // Timer 1 A,B + TCCR1A |= (1 << WGM10); /* Fast PWM mode, 8-bit */ + TCCR1B |= (1 << WGM12); /* Fast PWM mode, pt.2 */ + TCCR1B |= (1 << CS11); /* PWM Freq = F_CPU/8/256 */ + TCCR1A |= (1 << COM1A1); /* PWM output on OCR1A */ + TCCR1A |= (1 << COM1B1); /* PWM output on OCR1B */ + + // Timer 2 + TCCR2A |= (1 << WGM20); /* Fast PWM mode */ + TCCR2A |= (1 << WGM21); /* Fast PWM mode, pt.2 */ + TCCR2B |= (1 << CS21); /* PWM Freq = F_CPU/8/256 */ + TCCR2A |= (1 << COM2A1); /* PWM output on OCR2A */ +} + +int main(void) { + + uint8_t brightness; + + // -------- Inits --------- // + + initTimers(); + initUSART(); + printString("-- LED PWM Demo --\r\n"); + + /* enable output on LED pins, triggered by PWM hardware */ + LED_DDR |= (1 << LED1); + LED_DDR |= (1 << LED2); + LED_DDR |= (1 << LED3); + + // ------ Event loop ------ // + while (1) { + + printString("\r\nEnter (0-255) for PWM duty cycle: "); + brightness = getNumber(); + OCR2A = OCR1B; + OCR1B = OCR1A; + OCR1A = brightness; + + } /* End event loop */ + return 0; /* This line is never reached */ +} diff --git a/Make AVR Examples/Chapter10_Pulse-Width-Modulation/pwm_cross-fading_cylons/Makefile b/Make AVR Examples/Chapter10_Pulse-Width-Modulation/pwm_cross-fading_cylons/Makefile new file mode 100644 index 0000000..3d9e544 --- /dev/null +++ b/Make AVR Examples/Chapter10_Pulse-Width-Modulation/pwm_cross-fading_cylons/Makefile @@ -0,0 +1,196 @@ + +##########------------------------------------------------------########## +########## Project-specific Details ########## +########## Check these every time you start a new project ########## +##########------------------------------------------------------########## + +MCU = atmega168p +F_CPU = 1000000UL +BAUD = 9600UL +## Also try BAUD = 19200 or 38400 if you're feeling lucky. + +## A directory for common include files and the simple USART library. +## If you move either the current folder or the Library folder, you'll +## need to change this path to match. +LIBDIR = ../../AVR-Programming-Library + +##########------------------------------------------------------########## +########## Programmer Defaults ########## +########## Set up once, then forget about it ########## +########## (Can override. See bottom of file.) ########## +##########------------------------------------------------------########## + +PROGRAMMER_TYPE = usbtiny +# extra arguments to avrdude: baud rate, chip type, -F flag, etc. +PROGRAMMER_ARGS = + +##########------------------------------------------------------########## +########## Program Locations ########## +########## Won't need to change if they're in your PATH ########## +##########------------------------------------------------------########## + +CC = avr-gcc +OBJCOPY = avr-objcopy +OBJDUMP = avr-objdump +AVRSIZE = avr-size +AVRDUDE = avrdude + +##########------------------------------------------------------########## +########## Makefile Magic! ########## +########## Summary: ########## +########## We want a .hex file ########## +########## Compile source files into .elf ########## +########## Convert .elf file into .hex ########## +########## You shouldn't need to edit below. ########## +##########------------------------------------------------------########## + +## The name of your project (without the .c) +# TARGET = blinkLED +## Or name it automatically after the enclosing directory +TARGET = $(lastword $(subst /, ,$(CURDIR))) + +# Object files: will find all .c/.h files in current directory +# and in LIBDIR. If you have any other (sub-)directories with code, +# you can add them in to SOURCES below in the wildcard statement. +SOURCES=$(wildcard *.c $(LIBDIR)/*.c) +OBJECTS=$(SOURCES:.c=.o) +HEADERS=$(SOURCES:.c=.h) + +## Compilation options, type man avr-gcc if you're curious. +CPPFLAGS = -DF_CPU=$(F_CPU) -DBAUD=$(BAUD) -I. -I$(LIBDIR) +CFLAGS = -Os -g -std=gnu99 -Wall +## Use short (8-bit) data types +CFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums +## Splits up object files per function +CFLAGS += -ffunction-sections -fdata-sections +LDFLAGS = -Wl,-Map,$(TARGET).map +## Optional, but often ends up with smaller code +LDFLAGS += -Wl,--gc-sections +## Relax shrinks code even more, but makes disassembly messy +## LDFLAGS += -Wl,--relax +## LDFLAGS += -Wl,-u,vfprintf -lprintf_flt -lm ## for floating-point printf +## LDFLAGS += -Wl,-u,vfprintf -lprintf_min ## for smaller printf +TARGET_ARCH = -mmcu=$(MCU) + +## Explicit pattern rules: +## To make .o files from .c files +%.o: %.c $(HEADERS) Makefile + $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c -o $@ $<; + +$(TARGET).elf: $(OBJECTS) + $(CC) $(LDFLAGS) $(TARGET_ARCH) $^ $(LDLIBS) -o $@ + +%.hex: %.elf + $(OBJCOPY) -j .text -j .data -O ihex $< $@ + +%.eeprom: %.elf + $(OBJCOPY) -j .eeprom --change-section-lma .eeprom=0 -O ihex $< $@ + +%.lst: %.elf + $(OBJDUMP) -S $< > $@ + +## These targets don't have files named after them +.PHONY: all disassemble disasm eeprom size clean squeaky_clean flash fuses + +all: $(TARGET).hex + +debug: + @echo + @echo "Source files:" $(SOURCES) + @echo "MCU, F_CPU, BAUD:" $(MCU), $(F_CPU), $(BAUD) + @echo + +# Optionally create listing file from .elf +# This creates approximate assembly-language equivalent of your code. +# Useful for debugging time-sensitive bits, +# or making sure the compiler does what you want. +disassemble: $(TARGET).lst + +disasm: disassemble + +# Optionally show how big the resulting program is +size: $(TARGET).elf + $(AVRSIZE) -C --mcu=$(MCU) $(TARGET).elf + +clean: + rm -f $(TARGET).elf $(TARGET).hex $(TARGET).obj \ + $(TARGET).o $(TARGET).d $(TARGET).eep $(TARGET).lst \ + $(TARGET).lss $(TARGET).sym $(TARGET).map $(TARGET)~ \ + $(TARGET).eeprom + +squeaky_clean: + rm -f *.elf *.hex *.obj *.o *.d *.eep *.lst *.lss *.sym *.map *~ *.eeprom + +##########------------------------------------------------------########## +########## Programmer-specific details ########## +########## Flashing code to AVR using avrdude ########## +##########------------------------------------------------------########## + +flash: $(TARGET).hex + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U flash:w:$< + +## An alias +program: flash + +flash_eeprom: $(TARGET).eeprom + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U eeprom:w:$< + +avrdude_terminal: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nt + +## If you've got multiple programmers that you use, +## you can define them here so that it's easy to switch. +## To invoke, use something like `make flash_arduinoISP` +flash_usbtiny: PROGRAMMER_TYPE = usbtiny +flash_usbtiny: PROGRAMMER_ARGS = # USBTiny works with no further arguments +flash_usbtiny: flash + +flash_usbasp: PROGRAMMER_TYPE = usbasp +flash_usbasp: PROGRAMMER_ARGS = # USBasp works with no further arguments +flash_usbasp: flash + +flash_arduinoISP: PROGRAMMER_TYPE = avrisp +flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P /dev/ttyACM0 +## (for windows) flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P com5 +flash_arduinoISP: flash + +flash_109: PROGRAMMER_TYPE = avr109 +flash_109: PROGRAMMER_ARGS = -b 9600 -P /dev/ttyUSB0 +flash_109: flash + +##########------------------------------------------------------########## +########## Fuse settings and suitable defaults ########## +##########------------------------------------------------------########## + +## Mega 48, 88, 168, 328 default values +LFUSE = 0x62 +HFUSE = 0xdf +EFUSE = 0x00 + +## Generic +FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m + +fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) \ + $(PROGRAMMER_ARGS) $(FUSE_STRING) +show_fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nv + +## Called with no extra definitions, sets to defaults +set_default_fuses: FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m +set_default_fuses: fuses + +## Set the fuse byte for full-speed mode +## Note: can also be set in firmware for modern chips +set_fast_fuse: LFUSE = 0xE2 +set_fast_fuse: FUSE_STRING = -U lfuse:w:$(LFUSE):m +set_fast_fuse: fuses + +## Set the EESAVE fuse byte to preserve EEPROM across flashes +set_eeprom_save_fuse: HFUSE = 0xD7 +set_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +set_eeprom_save_fuse: fuses + +## Clear the EESAVE fuse byte +clear_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +clear_eeprom_save_fuse: fuses diff --git a/Make AVR Examples/Chapter10_Pulse-Width-Modulation/pwm_cross-fading_cylons/cross-fading_cylons.c b/Make AVR Examples/Chapter10_Pulse-Width-Modulation/pwm_cross-fading_cylons/cross-fading_cylons.c new file mode 100644 index 0000000..439873e --- /dev/null +++ b/Make AVR Examples/Chapter10_Pulse-Width-Modulation/pwm_cross-fading_cylons/cross-fading_cylons.c @@ -0,0 +1,60 @@ +/* + +Cross-fading Cylon Eyes +A PWM demo + +*/ + +// ------- Preamble -------- // +#include /* Defines pins, ports, etc */ +#include /* Functions to waste time */ +#include "pinDefines.h" + + +int main(void) { + + uint8_t thisEye = 0; + uint8_t nextEye = 1; + uint8_t brightness = 0; + int8_t direction = 1; + uint8_t i; + + // -------- Inits --------- // + + // Init all LEDs + LED_DDR = 0xff; + SPEAKER_DDR |= (1 << SPEAKER); + // ------ Event loop ------ // + while (1) { + + // PWM + for (brightness = 0; brightness < 255; brightness++) { + for (i = 0; i < 255; i++) { + if (i < brightness) { + LED_PORT &= ~(1 << thisEye); /* dimming */ + LED_PORT |= (1 << nextEye); /* getting brighter */ + } + else { + LED_PORT |= (1 << thisEye); + LED_PORT &= ~(1 << nextEye); + } + LED_PORT &= ~(1 << thisEye); /* make sure it's off */ + } + } + + // Cylon Scan + thisEye += direction; /* move on to next eye */ + + if (thisEye == 0) { + direction = 1; + } + if (thisEye == 7) { + direction = -1; + } + + nextEye = thisEye + direction; + + + } /* End event loop */ + return 0; /* This line is never reached */ +} diff --git a/Make AVR Examples/Chapter11_Driving-Servo-Motors/servoSundial/Makefile b/Make AVR Examples/Chapter11_Driving-Servo-Motors/servoSundial/Makefile new file mode 100644 index 0000000..5c588dc --- /dev/null +++ b/Make AVR Examples/Chapter11_Driving-Servo-Motors/servoSundial/Makefile @@ -0,0 +1,196 @@ + +##########------------------------------------------------------########## +########## Project-specific Details ########## +########## Check these every time you start a new project ########## +##########------------------------------------------------------########## + +MCU = atmega168p +F_CPU = 8000000UL +BAUD = 9600UL +## Also try BAUD = 19200 or 38400 if you're feeling lucky. + +## A directory for common include files and the simple USART library. +## If you move either the current folder or the Library folder, you'll +## need to change this path to match. +LIBDIR = ../../AVR-Programming-Library + +##########------------------------------------------------------########## +########## Programmer Defaults ########## +########## Set up once, then forget about it ########## +########## (Can override. See bottom of file.) ########## +##########------------------------------------------------------########## + +PROGRAMMER_TYPE = usbtiny +# extra arguments to avrdude: baud rate, chip type, -F flag, etc. +PROGRAMMER_ARGS = + +##########------------------------------------------------------########## +########## Program Locations ########## +########## Won't need to change if they're in your PATH ########## +##########------------------------------------------------------########## + +CC = avr-gcc +OBJCOPY = avr-objcopy +OBJDUMP = avr-objdump +AVRSIZE = avr-size +AVRDUDE = avrdude + +##########------------------------------------------------------########## +########## Makefile Magic! ########## +########## Summary: ########## +########## We want a .hex file ########## +########## Compile source files into .elf ########## +########## Convert .elf file into .hex ########## +########## You shouldn't need to edit below. ########## +##########------------------------------------------------------########## + +## The name of your project (without the .c) +# TARGET = blinkLED +## Or name it automatically after the enclosing directory +TARGET = $(lastword $(subst /, ,$(CURDIR))) + +# Object files: will find all .c/.h files in current directory +# and in LIBDIR. If you have any other (sub-)directories with code, +# you can add them in to SOURCES below in the wildcard statement. +SOURCES=$(wildcard *.c $(LIBDIR)/*.c) +OBJECTS=$(SOURCES:.c=.o) +HEADERS=$(SOURCES:.c=.h) + +## Compilation options, type man avr-gcc if you're curious. +CPPFLAGS = -DF_CPU=$(F_CPU) -DBAUD=$(BAUD) -I. -I$(LIBDIR) +CFLAGS = -Os -g -std=gnu99 -Wall +## Use short (8-bit) data types +CFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums +## Splits up object files per function +CFLAGS += -ffunction-sections -fdata-sections +LDFLAGS = -Wl,-Map,$(TARGET).map +## Optional, but often ends up with smaller code +LDFLAGS += -Wl,--gc-sections +## Relax shrinks code even more, but makes disassembly messy +## LDFLAGS += -Wl,--relax +## LDFLAGS += -Wl,-u,vfprintf -lprintf_flt -lm ## for floating-point printf +## LDFLAGS += -Wl,-u,vfprintf -lprintf_min ## for smaller printf +TARGET_ARCH = -mmcu=$(MCU) + +## Explicit pattern rules: +## To make .o files from .c files +%.o: %.c $(HEADERS) Makefile + $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c -o $@ $<; + +$(TARGET).elf: $(OBJECTS) + $(CC) $(LDFLAGS) $(TARGET_ARCH) $^ $(LDLIBS) -o $@ + +%.hex: %.elf + $(OBJCOPY) -j .text -j .data -O ihex $< $@ + +%.eeprom: %.elf + $(OBJCOPY) -j .eeprom --change-section-lma .eeprom=0 -O ihex $< $@ + +%.lst: %.elf + $(OBJDUMP) -S $< > $@ + +## These targets don't have files named after them +.PHONY: all disassemble disasm eeprom size clean squeaky_clean flash fuses + +all: $(TARGET).hex + +debug: + @echo + @echo "Source files:" $(SOURCES) + @echo "MCU, F_CPU, BAUD:" $(MCU), $(F_CPU), $(BAUD) + @echo + +# Optionally create listing file from .elf +# This creates approximate assembly-language equivalent of your code. +# Useful for debugging time-sensitive bits, +# or making sure the compiler does what you want. +disassemble: $(TARGET).lst + +disasm: disassemble + +# Optionally show how big the resulting program is +size: $(TARGET).elf + $(AVRSIZE) -C --mcu=$(MCU) $(TARGET).elf + +clean: + rm -f $(TARGET).elf $(TARGET).hex $(TARGET).obj \ + $(TARGET).o $(TARGET).d $(TARGET).eep $(TARGET).lst \ + $(TARGET).lss $(TARGET).sym $(TARGET).map $(TARGET)~ \ + $(TARGET).eeprom + +squeaky_clean: + rm -f *.elf *.hex *.obj *.o *.d *.eep *.lst *.lss *.sym *.map *~ *.eeprom + +##########------------------------------------------------------########## +########## Programmer-specific details ########## +########## Flashing code to AVR using avrdude ########## +##########------------------------------------------------------########## + +flash: $(TARGET).hex + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U flash:w:$< + +## An alias +program: flash + +flash_eeprom: $(TARGET).eeprom + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U eeprom:w:$< + +avrdude_terminal: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nt + +## If you've got multiple programmers that you use, +## you can define them here so that it's easy to switch. +## To invoke, use something like `make flash_arduinoISP` +flash_usbtiny: PROGRAMMER_TYPE = usbtiny +flash_usbtiny: PROGRAMMER_ARGS = # USBTiny works with no further arguments +flash_usbtiny: flash + +flash_usbasp: PROGRAMMER_TYPE = usbasp +flash_usbasp: PROGRAMMER_ARGS = # USBasp works with no further arguments +flash_usbasp: flash + +flash_arduinoISP: PROGRAMMER_TYPE = avrisp +flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P /dev/ttyACM0 +## (for windows) flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P com5 +flash_arduinoISP: flash + +flash_109: PROGRAMMER_TYPE = avr109 +flash_109: PROGRAMMER_ARGS = -b 9600 -P /dev/ttyUSB0 +flash_109: flash + +##########------------------------------------------------------########## +########## Fuse settings and suitable defaults ########## +##########------------------------------------------------------########## + +## Mega 48, 88, 168, 328 default values +LFUSE = 0x62 +HFUSE = 0xdf +EFUSE = 0x00 + +## Generic +FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m + +fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) \ + $(PROGRAMMER_ARGS) $(FUSE_STRING) +show_fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nv + +## Called with no extra definitions, sets to defaults +set_default_fuses: FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m +set_default_fuses: fuses + +## Set the fuse byte for full-speed mode +## Note: can also be set in firmware for modern chips +set_fast_fuse: LFUSE = 0xE2 +set_fast_fuse: FUSE_STRING = -U lfuse:w:$(LFUSE):m +set_fast_fuse: fuses + +## Set the EESAVE fuse byte to preserve EEPROM across flashes +set_eeprom_save_fuse: HFUSE = 0xD7 +set_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +set_eeprom_save_fuse: fuses + +## Clear the EESAVE fuse byte +clear_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +clear_eeprom_save_fuse: fuses diff --git a/Make AVR Examples/Chapter11_Driving-Servo-Motors/servoSundial/_servoClockFunctions.c b/Make AVR Examples/Chapter11_Driving-Servo-Motors/servoSundial/_servoClockFunctions.c new file mode 100644 index 0000000..632bd46 --- /dev/null +++ b/Make AVR Examples/Chapter11_Driving-Servo-Motors/servoSundial/_servoClockFunctions.c @@ -0,0 +1,45 @@ +#include "_servoClockFunctions.h" + +// Realtime-clock handling functions +void initTimer0_Clock(void) { + /* Normal mode, just used for the overflow interrupt */ + TCCR0B |= (1 << CS00); /* 8 MHz clock = ~31250 overflows per second */ + TIMSK0 |= (1 << TOIE0); /* timer overflow interrupt enable */ +} + +void everySecond(void) { + seconds++; + if (seconds > 59) { + seconds = 0; + everyMinute(); + } + LED_PORT ^= (1 << LED0); /* blink */ + printTime(hours, minutes, seconds); /* serial output */ + /* Turn off servo motor after three seconds into new minute */ + if (seconds == 3) { + disableServo(); + } +} +void everyMinute(void) { + minutes++; + if (minutes > 59) { + minutes = 0; + everyHour(); + } + // If during business hours, set servo to new minute + // Otherwise, don't need to move motor when laser is off + if ((hours >= START_TIME) && (hours < STOP_TIME)) { + setServoPosition(); + enableServo(); + LASER_PORT |= (1 << LASER); /* make sure laser is on */ + } + else { /* make sure laser is off */ + LASER_PORT &= ~(1 << LASER); + } +} +void everyHour(void) { + hours++; + if (hours > 23) { /* loop around at end of day */ + hours = 0; + } +} diff --git a/Make AVR Examples/Chapter11_Driving-Servo-Motors/servoSundial/_servoClockFunctions.h b/Make AVR Examples/Chapter11_Driving-Servo-Motors/servoSundial/_servoClockFunctions.h new file mode 100644 index 0000000..3581829 --- /dev/null +++ b/Make AVR Examples/Chapter11_Driving-Servo-Motors/servoSundial/_servoClockFunctions.h @@ -0,0 +1,18 @@ + + +#include "servoSundial.h" +// Note: Global variables (ticks, seconds, minutes, hours) +// are declared in servoSundial.h +// and defined in servoSundial.c + +// Realtime-clock handling functions + +// This sets up the interrupt clock +void initTimer0_Clock(void); + +// These functions are called periodically +// to update the global time variables +// They cascade when needed (second -> minute) +void everySecond(void); +void everyMinute(void); +void everyHour(void); diff --git a/Make AVR Examples/Chapter11_Driving-Servo-Motors/servoSundial/_servoSerialHelpers.c b/Make AVR Examples/Chapter11_Driving-Servo-Motors/servoSundial/_servoSerialHelpers.c new file mode 100644 index 0000000..8760cf4 --- /dev/null +++ b/Make AVR Examples/Chapter11_Driving-Servo-Motors/servoSundial/_servoSerialHelpers.c @@ -0,0 +1,34 @@ + /* Functions for serial port output formatting and input */ +#include "_servoSerialHelpers.h" + +void printTime(uint8_t hours, uint8_t minutes, uint8_t seconds) { + printByte(hours); + transmitByte(':'); + printByte(minutes); + transmitByte(':'); + printByte(seconds); + transmitByte('\r'); + transmitByte('\n'); +} + +void pollSerial(void) { + /* Poll for serial input -- to set the time. */ + char input; + if (bit_is_set(UCSR0A, RXC0)) { + input = UDR0; + if (input == 'S') { /* enter set-time mode */ + printString("Setting time...\r\n"); + printString("Hour: "); + hours = getNumber(); + printString("\r\nMinutes: "); + minutes = getNumber(); + printString("\r\nSeconds: "); + seconds = getNumber(); + printString("\r\n"); + ticks = 0; + if ((hours >= START_TIME) && (hours < STOP_TIME)) { + setServoPosition(); + } + } + } +} diff --git a/Make AVR Examples/Chapter11_Driving-Servo-Motors/servoSundial/_servoSerialHelpers.h b/Make AVR Examples/Chapter11_Driving-Servo-Motors/servoSundial/_servoSerialHelpers.h new file mode 100644 index 0000000..5b86999 --- /dev/null +++ b/Make AVR Examples/Chapter11_Driving-Servo-Motors/servoSundial/_servoSerialHelpers.h @@ -0,0 +1,8 @@ + /* Functions for serial port output formatting and input */ + +#include "servoSundial.h" +// Prints out the time, nicely formatted +void printTime(uint8_t hours, uint8_t minutes, uint8_t seconds); +// Polls for serial input +// sets the time if receives an "S" +void pollSerial(void); diff --git a/Make AVR Examples/Chapter11_Driving-Servo-Motors/servoSundial/calibrateTime.py b/Make AVR Examples/Chapter11_Driving-Servo-Motors/servoSundial/calibrateTime.py new file mode 100644 index 0000000..216207a --- /dev/null +++ b/Make AVR Examples/Chapter11_Driving-Servo-Motors/servoSundial/calibrateTime.py @@ -0,0 +1,86 @@ + + +import time +import serial + +def readTime(serialPort): + '''Reads the time from the AVR over the serial port''' + serialPort.flushInput() + character = "" + while(not character == "\n"): # loop until see end of line + character = serialPort.read(1) + ## The time string looks something like '011:045:023\r\n' + timeString = serialPort.read(13) + hms = timeString.split(":") + hms = [int(x) for x in hms] # make hour, minute, second numeric + return(hms) + +def setTime(serialPort, hours, minutes, seconds): + '''Sends the time over the serial port''' + serialPort.flushOutput() + serialPort.write("S") + time.sleep(0.1) # delay while AVR sends + serialPort.write(str(hours) + "\r") + time.sleep(0.2) # delay while AVR sends + serialPort.write(str(minutes) + "\r") + time.sleep(0.2) # delay while AVR sends + serialPort.write(str(seconds) + "\r") + +def setTimeNow(serialPort): + '''Sets the AVR clock to the current time''' + hours, minutes, seconds = time.localtime()[3:6] + setTime(serialPort, hours, minutes, seconds) + return(time.time()) + +def calculateTimeDelay(serialPort): + '''Gets AVR time and subtracts off actual (computer) time''' + avrHMS = readTime(serialPort) + hms = time.localtime()[3:6] + hmsDifference = [x - y for x,y in zip(avrHMS, hms)] + out = "AVR is fast by: {x[0]} hours, {x[1]} minutes, and {x[2]} seconds" + print out.format(x=hmsDifference) + return(hmsDifference) + +def calculateTimeDrift(serialPort, startTime): + '''Calculates the ratio to multiply OVERFLOWS_PER_SECOND + given a start time and current error''' + h, m, s = calculateTimeDelay(serialPort) + driftSeconds = 60*60*h + 60*m + s + elapsed = time.time() - startTime + print "After {:.0f} seconds, ".format(elapsed) + return (driftSeconds / elapsed + 1) + + +if __name__ == "__main__": + + ## Set time automatically, recording start time, + ## then periodically calculate multiplication factor + OVERFLOWS_PER_SECOND = 31250 # set this to equal the value in your code + + SLEEP_TIME = 10 + ratioLog = [] + + s = serial.Serial("/dev/ttyUSB0", 9600, timeout=5) + print "Setting time to current time...." + ratio = 0 + while not ratio == 1: # make sure starting time is right on + startTime = setTimeNow(s) + ratio = calculateTimeDrift(s, startTime) + + ## Note: you can either leave this running or + ## you can re-run calculateTimeDrift() at any time in the future, + ## as long as you don't overwrite the original startTime + while(True): + ratio = calculateTimeDrift(s, startTime) + ratioLog.append([time.time()-startTime, ratio]) + newOverflow = int(OVERFLOWS_PER_SECOND * ratio) + print "OVERFLOWS_PER_SECOND should be {}\n\n".format(newOverflow) + time.sleep(SLEEP_TIME) + + ## As you leave this routine running, you should see it bounce + ## around a lot in the beginning and then settle down after + ## running a few hours. Ironically, it'll converge to a good + ## number faster if it's initially very out of sync. (If it + ## drifts faster, you can figure out the drift rate sooner.) + ## Leave it running for 24 hours and you'll get one-second-per-day + ## accuracy. diff --git a/Make AVR Examples/Chapter11_Driving-Servo-Motors/servoSundial/justSetTime.py b/Make AVR Examples/Chapter11_Driving-Servo-Motors/servoSundial/justSetTime.py new file mode 100644 index 0000000..f57be49 --- /dev/null +++ b/Make AVR Examples/Chapter11_Driving-Servo-Motors/servoSundial/justSetTime.py @@ -0,0 +1,6 @@ +import serial +import calibrateTime + +s = serial.Serial("/dev/ttyUSB0", 9600, timeout=5) +calibrateTime.setTimeNow(s) +s.close() diff --git a/Make AVR Examples/Chapter11_Driving-Servo-Motors/servoSundial/servoSundial.c b/Make AVR Examples/Chapter11_Driving-Servo-Motors/servoSundial/servoSundial.c new file mode 100644 index 0000000..8c5f26f --- /dev/null +++ b/Make AVR Examples/Chapter11_Driving-Servo-Motors/servoSundial/servoSundial.c @@ -0,0 +1,81 @@ + /* Quasi-realtime-clock with servo sundial. */ + +// ------- Includes -------- // +#include "servoSundial.h" +#include "_servoSerialHelpers.h" +#include "_servoClockFunctions.h" + +// -------- Global Variables --------- // +volatile uint16_t ticks; +volatile uint8_t hours = 15; /* arbitrary default time */ +volatile uint8_t minutes = 42; +volatile uint8_t seconds = 57; + +ISR(TIMER0_OVF_vect) { + /* This is going off very frequently, so we should make it speedy */ + ticks++; +} + +// -------- Functions --------- // +// Servo setup and utility functions +void initTimer1_Servo(void) { + /* Set up Timer1 (16bit) to give a pulse every 20ms */ + TCCR1A |= (1 << WGM11); /* Using Fast PWM mode */ + TCCR1B |= (1 << WGM12); /* counter max in ICR1 */ + TCCR1B |= (1 << WGM13); + TCCR1B |= (1 << CS11); /* /8 prescaling -- microsecond steps */ + TCCR1A |= (1 << COM1A1); /* set output on PB1 / OC1A for servo */ + ICR1 = 20000; /* TOP value = 20ms */ +} + +void enableServo(void) { + while (TCNT1 < PULSE_OVER) {; + } /* delay until pulse part of cycle done */ + SERVO_DDR |= (1 << SERVO); /* enable servo pulses */ +} + +void disableServo(void) { + while (TCNT1 < PULSE_OVER) {; + } /* delay until pulse part of cycle done */ + SERVO_DDR &= ~(1 << SERVO); /* disable servo pulses */ +} + +void setServoPosition(void) { + uint32_t elapsedMinutes; +/* using 32 bits b/c elapsedMinutes * PULSE_RANGE will overflow 16 bits */ + + + + elapsedMinutes = (hours - START_TIME) * 60 + minutes; + OCR1A = PULSE_MIN + elapsedMinutes * PULSE_RANGE / (HOURS_RANGE * 60); + enableServo(); +} + +int main(void) { + + // -------- Inits --------- // + clock_prescale_set(clock_div_1); /* CPU clock 8 MHz */ + initUSART(); + printString("\r\nWelcome to the Servo Sundial.\r\n"); + printString("Type S to set time.\r\n"); + + initTimer0_Clock(); + initTimer1_Servo(); + sei(); /* set enable interrupt bit */ + LED_DDR |= (1 << LED0); /* blinky output */ + LASER_DDR |= (1 << LASER); /* enable laser output */ + + // ------ Event loop ------ // + while (1) { + + /* Poll clock routine */ + if (ticks == OVERFLOWS_PER_SECOND) { + ticks = 0; + everySecond(); + } + + pollSerial(); + + } /* End event loop */ + return 0; /* This line is never reached */ +} diff --git a/Make AVR Examples/Chapter11_Driving-Servo-Motors/servoSundial/servoSundial.h b/Make AVR Examples/Chapter11_Driving-Servo-Motors/servoSundial/servoSundial.h new file mode 100644 index 0000000..72d568c --- /dev/null +++ b/Make AVR Examples/Chapter11_Driving-Servo-Motors/servoSundial/servoSundial.h @@ -0,0 +1,53 @@ + /* Quasi-realtime-clock with servo sundial. */ + +// ------- Includes -------- // +#include +#include +#include +#include +#include "pinDefines.h" +#include "USART.h" + +// Global variables that take care of clock +extern volatile uint16_t ticks; +extern volatile uint8_t hours; /* arbitrary default time */ +extern volatile uint8_t minutes; +extern volatile uint8_t seconds; + +// ------- Defines -------- // +#define PULSE_MIN 1000 /* experiment with these values */ +#define PULSE_MAX 2000 /* to match your own servo */ +#define PULSE_RANGE (PULSE_MAX - PULSE_MIN) +#define PULSE_OVER 3000 /* Must be larger than PULSE_MAX */ + +#define START_TIME 10 /* 10 am */ +#define STOP_TIME 22 /* 10 pm */ +#define HOURS_RANGE (STOP_TIME - START_TIME - 1) + +#define LASER PB2 +#define LASER_PORT PORTB +#define LASER_DDR DDRB + +#define SERVO PB1 +#define SERVO_PORT PORTB +#define SERVO_DDR DDRB + +#define OVERFLOWS_PER_SECOND 31250 /* nominal, should calibrate */ + + +// Serial input and output functions +void pollSerial(void); +void printTime(uint8_t hours, uint8_t minutes, uint8_t seconds); + +// Servo setup and utility functions +void initTimer1_Servo(void); +void enableServo(void); +void disableServo(void); +void setServoPosition(void); + +// Realtime-clock handling functions +// Use the globals ticks, hours, minutes, seconds +void initTimer0_Clock(void); +void everyHour(void); +void everyMinute(void); +void everySecond(void); diff --git a/Make AVR Examples/Chapter11_Driving-Servo-Motors/servoSundial/stepHours.py b/Make AVR Examples/Chapter11_Driving-Servo-Motors/servoSundial/stepHours.py new file mode 100644 index 0000000..5c72e9e --- /dev/null +++ b/Make AVR Examples/Chapter11_Driving-Servo-Motors/servoSundial/stepHours.py @@ -0,0 +1,17 @@ +import serial +import calibrateTime +import time + +s = serial.Serial("/dev/ttyUSB0", 9600, timeout=5) + +for hour in range(11,25): + print "Moving to {}.".format(hour) + calibrateTime.setTime(s, hour-2, 59, 59) + time.sleep(2) + for i in range(0, 60, 5): + calibrateTime.setTime(s, hour-1, i, 00) + time.sleep(0.5) + calibrateTime.setTime(s, hour, 0, 0) + discardThisInput = raw_input("\tpress return to continue\n") + +s.close() diff --git a/Make AVR Examples/Chapter11_Driving-Servo-Motors/servoWorkout/Makefile b/Make AVR Examples/Chapter11_Driving-Servo-Motors/servoWorkout/Makefile new file mode 100644 index 0000000..3d9e544 --- /dev/null +++ b/Make AVR Examples/Chapter11_Driving-Servo-Motors/servoWorkout/Makefile @@ -0,0 +1,196 @@ + +##########------------------------------------------------------########## +########## Project-specific Details ########## +########## Check these every time you start a new project ########## +##########------------------------------------------------------########## + +MCU = atmega168p +F_CPU = 1000000UL +BAUD = 9600UL +## Also try BAUD = 19200 or 38400 if you're feeling lucky. + +## A directory for common include files and the simple USART library. +## If you move either the current folder or the Library folder, you'll +## need to change this path to match. +LIBDIR = ../../AVR-Programming-Library + +##########------------------------------------------------------########## +########## Programmer Defaults ########## +########## Set up once, then forget about it ########## +########## (Can override. See bottom of file.) ########## +##########------------------------------------------------------########## + +PROGRAMMER_TYPE = usbtiny +# extra arguments to avrdude: baud rate, chip type, -F flag, etc. +PROGRAMMER_ARGS = + +##########------------------------------------------------------########## +########## Program Locations ########## +########## Won't need to change if they're in your PATH ########## +##########------------------------------------------------------########## + +CC = avr-gcc +OBJCOPY = avr-objcopy +OBJDUMP = avr-objdump +AVRSIZE = avr-size +AVRDUDE = avrdude + +##########------------------------------------------------------########## +########## Makefile Magic! ########## +########## Summary: ########## +########## We want a .hex file ########## +########## Compile source files into .elf ########## +########## Convert .elf file into .hex ########## +########## You shouldn't need to edit below. ########## +##########------------------------------------------------------########## + +## The name of your project (without the .c) +# TARGET = blinkLED +## Or name it automatically after the enclosing directory +TARGET = $(lastword $(subst /, ,$(CURDIR))) + +# Object files: will find all .c/.h files in current directory +# and in LIBDIR. If you have any other (sub-)directories with code, +# you can add them in to SOURCES below in the wildcard statement. +SOURCES=$(wildcard *.c $(LIBDIR)/*.c) +OBJECTS=$(SOURCES:.c=.o) +HEADERS=$(SOURCES:.c=.h) + +## Compilation options, type man avr-gcc if you're curious. +CPPFLAGS = -DF_CPU=$(F_CPU) -DBAUD=$(BAUD) -I. -I$(LIBDIR) +CFLAGS = -Os -g -std=gnu99 -Wall +## Use short (8-bit) data types +CFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums +## Splits up object files per function +CFLAGS += -ffunction-sections -fdata-sections +LDFLAGS = -Wl,-Map,$(TARGET).map +## Optional, but often ends up with smaller code +LDFLAGS += -Wl,--gc-sections +## Relax shrinks code even more, but makes disassembly messy +## LDFLAGS += -Wl,--relax +## LDFLAGS += -Wl,-u,vfprintf -lprintf_flt -lm ## for floating-point printf +## LDFLAGS += -Wl,-u,vfprintf -lprintf_min ## for smaller printf +TARGET_ARCH = -mmcu=$(MCU) + +## Explicit pattern rules: +## To make .o files from .c files +%.o: %.c $(HEADERS) Makefile + $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c -o $@ $<; + +$(TARGET).elf: $(OBJECTS) + $(CC) $(LDFLAGS) $(TARGET_ARCH) $^ $(LDLIBS) -o $@ + +%.hex: %.elf + $(OBJCOPY) -j .text -j .data -O ihex $< $@ + +%.eeprom: %.elf + $(OBJCOPY) -j .eeprom --change-section-lma .eeprom=0 -O ihex $< $@ + +%.lst: %.elf + $(OBJDUMP) -S $< > $@ + +## These targets don't have files named after them +.PHONY: all disassemble disasm eeprom size clean squeaky_clean flash fuses + +all: $(TARGET).hex + +debug: + @echo + @echo "Source files:" $(SOURCES) + @echo "MCU, F_CPU, BAUD:" $(MCU), $(F_CPU), $(BAUD) + @echo + +# Optionally create listing file from .elf +# This creates approximate assembly-language equivalent of your code. +# Useful for debugging time-sensitive bits, +# or making sure the compiler does what you want. +disassemble: $(TARGET).lst + +disasm: disassemble + +# Optionally show how big the resulting program is +size: $(TARGET).elf + $(AVRSIZE) -C --mcu=$(MCU) $(TARGET).elf + +clean: + rm -f $(TARGET).elf $(TARGET).hex $(TARGET).obj \ + $(TARGET).o $(TARGET).d $(TARGET).eep $(TARGET).lst \ + $(TARGET).lss $(TARGET).sym $(TARGET).map $(TARGET)~ \ + $(TARGET).eeprom + +squeaky_clean: + rm -f *.elf *.hex *.obj *.o *.d *.eep *.lst *.lss *.sym *.map *~ *.eeprom + +##########------------------------------------------------------########## +########## Programmer-specific details ########## +########## Flashing code to AVR using avrdude ########## +##########------------------------------------------------------########## + +flash: $(TARGET).hex + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U flash:w:$< + +## An alias +program: flash + +flash_eeprom: $(TARGET).eeprom + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U eeprom:w:$< + +avrdude_terminal: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nt + +## If you've got multiple programmers that you use, +## you can define them here so that it's easy to switch. +## To invoke, use something like `make flash_arduinoISP` +flash_usbtiny: PROGRAMMER_TYPE = usbtiny +flash_usbtiny: PROGRAMMER_ARGS = # USBTiny works with no further arguments +flash_usbtiny: flash + +flash_usbasp: PROGRAMMER_TYPE = usbasp +flash_usbasp: PROGRAMMER_ARGS = # USBasp works with no further arguments +flash_usbasp: flash + +flash_arduinoISP: PROGRAMMER_TYPE = avrisp +flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P /dev/ttyACM0 +## (for windows) flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P com5 +flash_arduinoISP: flash + +flash_109: PROGRAMMER_TYPE = avr109 +flash_109: PROGRAMMER_ARGS = -b 9600 -P /dev/ttyUSB0 +flash_109: flash + +##########------------------------------------------------------########## +########## Fuse settings and suitable defaults ########## +##########------------------------------------------------------########## + +## Mega 48, 88, 168, 328 default values +LFUSE = 0x62 +HFUSE = 0xdf +EFUSE = 0x00 + +## Generic +FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m + +fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) \ + $(PROGRAMMER_ARGS) $(FUSE_STRING) +show_fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nv + +## Called with no extra definitions, sets to defaults +set_default_fuses: FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m +set_default_fuses: fuses + +## Set the fuse byte for full-speed mode +## Note: can also be set in firmware for modern chips +set_fast_fuse: LFUSE = 0xE2 +set_fast_fuse: FUSE_STRING = -U lfuse:w:$(LFUSE):m +set_fast_fuse: fuses + +## Set the EESAVE fuse byte to preserve EEPROM across flashes +set_eeprom_save_fuse: HFUSE = 0xD7 +set_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +set_eeprom_save_fuse: fuses + +## Clear the EESAVE fuse byte +clear_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +clear_eeprom_save_fuse: fuses diff --git a/Make AVR Examples/Chapter11_Driving-Servo-Motors/servoWorkout/servoWorkout.c b/Make AVR Examples/Chapter11_Driving-Servo-Motors/servoWorkout/servoWorkout.c new file mode 100644 index 0000000..c6d7161 --- /dev/null +++ b/Make AVR Examples/Chapter11_Driving-Servo-Motors/servoWorkout/servoWorkout.c @@ -0,0 +1,94 @@ + /* Quick interactive demo running servo with Timer 1 */ + +// ------- Preamble -------- // +#include +#include +#include + +#include "pinDefines.h" +#include "USART.h" + +#define PULSE_MIN 1000 /* experiment with these values */ +#define PULSE_MAX 2000 /* to match your own servo */ +#define PULSE_MID 1500 + +static inline uint16_t getNumber16(void); + +static inline void initTimer1Servo(void) { + /* Set up Timer1 (16bit) to give a pulse every 20ms */ + /* Use Fast PWM mode, counter max in ICR1 */ + TCCR1A |= (1 << WGM11); + TCCR1B |= (1 << WGM12) | (1 << WGM13); + TCCR1B |= (1 << CS10); /* /1 prescaling -- counting in microseconds */ + ICR1 = 20000; /* TOP value = 20ms */ + TCCR1A |= (1 << COM1A1); /* Direct output on PB1 / OC1A */ + DDRB |= (1 << PB1); /* set pin for output */ +} + +static inline void showOff(void) { + printString("Center\r\n"); + OCR1A = PULSE_MID; + _delay_ms(1500); + printString("Clockwise Max\r\n"); + OCR1A = PULSE_MIN; + _delay_ms(1500); + printString("Counterclockwise Max\r\n"); + OCR1A = PULSE_MAX; + _delay_ms(1500); + printString("Center\r\n"); + OCR1A = PULSE_MID; + _delay_ms(1500); +} + +int main(void) { + + // -------- Inits --------- // + uint16_t servoPulseLength; + OCR1A = PULSE_MID; /* set it to middle position initially */ + initTimer1Servo(); + initUSART(); + printString("\r\nWelcome to the Servo Demo\r\n"); + showOff(); + + // ------ Event loop ------ // + while (1) { + + printString("\r\nEnter a four-digit pulse length:\r\n"); + servoPulseLength = getNumber16(); + + printString("On my way....\r\n"); + OCR1A = servoPulseLength; + DDRB |= (1 << PB1); /* re-enable output pin */ + + _delay_ms(1000); + printString("Releasing...\r\n"); + while (TCNT1 < 3000) {; + } /* delay until pulse part of cycle done */ + DDRB &= ~(1 << PB1); /* disable output pin */ + + } /* End event loop */ + return 0; /* This line is never reached */ +} + +static inline uint16_t getNumber16(void) { + // Gets a PWM value from the serial port. + // Reads in characters, turns them into a number + char thousands = '0'; + char hundreds = '0'; + char tens = '0'; + char ones = '0'; + char thisChar = '0'; + + do { + thousands = hundreds; /* shift numbers over */ + hundreds = tens; + tens = ones; + ones = thisChar; + thisChar = receiveByte(); /* get a new character */ + transmitByte(thisChar); /* echo */ + } while (thisChar != '\r'); + + transmitByte('\n'); /* newline */ + return (1000 * (thousands - '0') + 100 * (hundreds - '0') + + 10 * (tens - '0') + ones - '0'); +} diff --git a/Make AVR Examples/Chapter12_Analog-to-Digital-Conversion-II/footstepDetector/Makefile b/Make AVR Examples/Chapter12_Analog-to-Digital-Conversion-II/footstepDetector/Makefile new file mode 100644 index 0000000..3d9e544 --- /dev/null +++ b/Make AVR Examples/Chapter12_Analog-to-Digital-Conversion-II/footstepDetector/Makefile @@ -0,0 +1,196 @@ + +##########------------------------------------------------------########## +########## Project-specific Details ########## +########## Check these every time you start a new project ########## +##########------------------------------------------------------########## + +MCU = atmega168p +F_CPU = 1000000UL +BAUD = 9600UL +## Also try BAUD = 19200 or 38400 if you're feeling lucky. + +## A directory for common include files and the simple USART library. +## If you move either the current folder or the Library folder, you'll +## need to change this path to match. +LIBDIR = ../../AVR-Programming-Library + +##########------------------------------------------------------########## +########## Programmer Defaults ########## +########## Set up once, then forget about it ########## +########## (Can override. See bottom of file.) ########## +##########------------------------------------------------------########## + +PROGRAMMER_TYPE = usbtiny +# extra arguments to avrdude: baud rate, chip type, -F flag, etc. +PROGRAMMER_ARGS = + +##########------------------------------------------------------########## +########## Program Locations ########## +########## Won't need to change if they're in your PATH ########## +##########------------------------------------------------------########## + +CC = avr-gcc +OBJCOPY = avr-objcopy +OBJDUMP = avr-objdump +AVRSIZE = avr-size +AVRDUDE = avrdude + +##########------------------------------------------------------########## +########## Makefile Magic! ########## +########## Summary: ########## +########## We want a .hex file ########## +########## Compile source files into .elf ########## +########## Convert .elf file into .hex ########## +########## You shouldn't need to edit below. ########## +##########------------------------------------------------------########## + +## The name of your project (without the .c) +# TARGET = blinkLED +## Or name it automatically after the enclosing directory +TARGET = $(lastword $(subst /, ,$(CURDIR))) + +# Object files: will find all .c/.h files in current directory +# and in LIBDIR. If you have any other (sub-)directories with code, +# you can add them in to SOURCES below in the wildcard statement. +SOURCES=$(wildcard *.c $(LIBDIR)/*.c) +OBJECTS=$(SOURCES:.c=.o) +HEADERS=$(SOURCES:.c=.h) + +## Compilation options, type man avr-gcc if you're curious. +CPPFLAGS = -DF_CPU=$(F_CPU) -DBAUD=$(BAUD) -I. -I$(LIBDIR) +CFLAGS = -Os -g -std=gnu99 -Wall +## Use short (8-bit) data types +CFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums +## Splits up object files per function +CFLAGS += -ffunction-sections -fdata-sections +LDFLAGS = -Wl,-Map,$(TARGET).map +## Optional, but often ends up with smaller code +LDFLAGS += -Wl,--gc-sections +## Relax shrinks code even more, but makes disassembly messy +## LDFLAGS += -Wl,--relax +## LDFLAGS += -Wl,-u,vfprintf -lprintf_flt -lm ## for floating-point printf +## LDFLAGS += -Wl,-u,vfprintf -lprintf_min ## for smaller printf +TARGET_ARCH = -mmcu=$(MCU) + +## Explicit pattern rules: +## To make .o files from .c files +%.o: %.c $(HEADERS) Makefile + $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c -o $@ $<; + +$(TARGET).elf: $(OBJECTS) + $(CC) $(LDFLAGS) $(TARGET_ARCH) $^ $(LDLIBS) -o $@ + +%.hex: %.elf + $(OBJCOPY) -j .text -j .data -O ihex $< $@ + +%.eeprom: %.elf + $(OBJCOPY) -j .eeprom --change-section-lma .eeprom=0 -O ihex $< $@ + +%.lst: %.elf + $(OBJDUMP) -S $< > $@ + +## These targets don't have files named after them +.PHONY: all disassemble disasm eeprom size clean squeaky_clean flash fuses + +all: $(TARGET).hex + +debug: + @echo + @echo "Source files:" $(SOURCES) + @echo "MCU, F_CPU, BAUD:" $(MCU), $(F_CPU), $(BAUD) + @echo + +# Optionally create listing file from .elf +# This creates approximate assembly-language equivalent of your code. +# Useful for debugging time-sensitive bits, +# or making sure the compiler does what you want. +disassemble: $(TARGET).lst + +disasm: disassemble + +# Optionally show how big the resulting program is +size: $(TARGET).elf + $(AVRSIZE) -C --mcu=$(MCU) $(TARGET).elf + +clean: + rm -f $(TARGET).elf $(TARGET).hex $(TARGET).obj \ + $(TARGET).o $(TARGET).d $(TARGET).eep $(TARGET).lst \ + $(TARGET).lss $(TARGET).sym $(TARGET).map $(TARGET)~ \ + $(TARGET).eeprom + +squeaky_clean: + rm -f *.elf *.hex *.obj *.o *.d *.eep *.lst *.lss *.sym *.map *~ *.eeprom + +##########------------------------------------------------------########## +########## Programmer-specific details ########## +########## Flashing code to AVR using avrdude ########## +##########------------------------------------------------------########## + +flash: $(TARGET).hex + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U flash:w:$< + +## An alias +program: flash + +flash_eeprom: $(TARGET).eeprom + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U eeprom:w:$< + +avrdude_terminal: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nt + +## If you've got multiple programmers that you use, +## you can define them here so that it's easy to switch. +## To invoke, use something like `make flash_arduinoISP` +flash_usbtiny: PROGRAMMER_TYPE = usbtiny +flash_usbtiny: PROGRAMMER_ARGS = # USBTiny works with no further arguments +flash_usbtiny: flash + +flash_usbasp: PROGRAMMER_TYPE = usbasp +flash_usbasp: PROGRAMMER_ARGS = # USBasp works with no further arguments +flash_usbasp: flash + +flash_arduinoISP: PROGRAMMER_TYPE = avrisp +flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P /dev/ttyACM0 +## (for windows) flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P com5 +flash_arduinoISP: flash + +flash_109: PROGRAMMER_TYPE = avr109 +flash_109: PROGRAMMER_ARGS = -b 9600 -P /dev/ttyUSB0 +flash_109: flash + +##########------------------------------------------------------########## +########## Fuse settings and suitable defaults ########## +##########------------------------------------------------------########## + +## Mega 48, 88, 168, 328 default values +LFUSE = 0x62 +HFUSE = 0xdf +EFUSE = 0x00 + +## Generic +FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m + +fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) \ + $(PROGRAMMER_ARGS) $(FUSE_STRING) +show_fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nv + +## Called with no extra definitions, sets to defaults +set_default_fuses: FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m +set_default_fuses: fuses + +## Set the fuse byte for full-speed mode +## Note: can also be set in firmware for modern chips +set_fast_fuse: LFUSE = 0xE2 +set_fast_fuse: FUSE_STRING = -U lfuse:w:$(LFUSE):m +set_fast_fuse: fuses + +## Set the EESAVE fuse byte to preserve EEPROM across flashes +set_eeprom_save_fuse: HFUSE = 0xD7 +set_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +set_eeprom_save_fuse: fuses + +## Clear the EESAVE fuse byte +clear_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +clear_eeprom_save_fuse: fuses diff --git a/Make AVR Examples/Chapter12_Analog-to-Digital-Conversion-II/footstepDetector/footstepDetector.c b/Make AVR Examples/Chapter12_Analog-to-Digital-Conversion-II/footstepDetector/footstepDetector.c new file mode 100644 index 0000000..270bb36 --- /dev/null +++ b/Make AVR Examples/Chapter12_Analog-to-Digital-Conversion-II/footstepDetector/footstepDetector.c @@ -0,0 +1,98 @@ +/* + * Sensitive footstep-detector and EWMA demo + */ + +// ------- Preamble -------- // +#include +#include +#include +#include "pinDefines.h" +#include "USART.h" + +#define ON_TIME 2000 /* milliseconds */ +#define CYCLE_DELAY 10 /* milliseconds */ +#define INITIAL_PADDING 16 /* higher is less sensitive */ + +#define SWITCH PB7 /* Attach LED or switch relay here */ + +#define USE_POT 0 /* define to 1 if using potentiometer */ +#if USE_POT +#define POT PC5 /* optional padding pot */ +#endif + +// -------- Functions --------- // +void initADC(void) { + ADMUX |= (1 << REFS0); /* reference voltage to AVCC */ + ADCSRA |= (1 << ADPS1) | (1 << ADPS2); /* ADC clock prescaler /64 */ + ADCSRA |= (1 << ADEN); /* enable ADC */ +} + +uint16_t readADC(uint8_t channel) { + ADMUX = (0b11110000 & ADMUX) | channel; + ADCSRA |= (1 << ADSC); + loop_until_bit_is_clear(ADCSRA, ADSC); + return (ADC); +} + +int main(void) { + // -------- Inits --------- // + uint16_t lightsOutTimer = 0; /* timer for the switch */ + uint16_t adcValue; + uint16_t middleValue = 511; + uint16_t highValue = 520; + uint16_t lowValue = 500; + uint16_t noiseVolume = 0; + uint8_t padding = INITIAL_PADDING; + + LED_DDR = ((1 << LED0) | (1 << LED1) | (1 << SWITCH)); + initADC(); + initUSART(); + + // ------ Event loop ------ // + while (1) { + adcValue = readADC(PIEZO); + + /* moving average -- tracks sensor's bias voltage */ + middleValue = adcValue + middleValue - ((middleValue - 8) >> 4); + /* moving averages for positive and negative parts of signal */ + if (adcValue > (middleValue >> 4)) { + highValue = adcValue + highValue - ((highValue - 8) >> 4); + } + if (adcValue < (middleValue >> 4)) { + lowValue = adcValue + lowValue - ((lowValue - 8) >> 4); + } + /* "padding" provides a minimum value for the noise volume */ + noiseVolume = highValue - lowValue + padding; + + /* Now check to see if ADC value above or below thresholds */ + /* Comparison with >> 4 b/c EWMA is on different scale */ + if (adcValue < ((middleValue - noiseVolume) >> 4)) { + LED_PORT = (1 << LED0) | (1 << SWITCH); /* one LED, switch */ + lightsOutTimer = ON_TIME / CYCLE_DELAY; /* reset timer */ + } + else if (adcValue > ((middleValue + noiseVolume) >> 4)) { + LED_PORT = (1 << LED1) | (1 << SWITCH); /* other LED, switch */ + lightsOutTimer = ON_TIME / CYCLE_DELAY; /* reset timer */ + } + else { /* Nothing seen, turn off lights */ + LED_PORT &= ~(1 << LED0); + LED_PORT &= ~(1 << LED1); /* Both off */ + if (lightsOutTimer > 0) { /* time left on timer */ + lightsOutTimer--; + } + else { /* time's up */ + LED_PORT &= ~(1 << SWITCH); /* turn switch off */ + } + } +#if USE_POT /* optional padding potentiometer */ + padding = readADC(POT) >> 4; /* scale down to useful range */ +#endif + /* Serial output and delay */ + /* ADC is 10-bits, recenter around 127 for display purposes */ + transmitByte(adcValue - 512 + 127); + transmitByte((lowValue >> 4) - 512 + 127); + transmitByte((highValue >> 4) - 512 + 127); + _delay_ms(CYCLE_DELAY); + } /* End event loop */ + return 0; /* This line is never reached */ +} diff --git a/Make AVR Examples/Chapter12_Analog-to-Digital-Conversion-II/voltmeter/Makefile b/Make AVR Examples/Chapter12_Analog-to-Digital-Conversion-II/voltmeter/Makefile new file mode 100644 index 0000000..3d9e544 --- /dev/null +++ b/Make AVR Examples/Chapter12_Analog-to-Digital-Conversion-II/voltmeter/Makefile @@ -0,0 +1,196 @@ + +##########------------------------------------------------------########## +########## Project-specific Details ########## +########## Check these every time you start a new project ########## +##########------------------------------------------------------########## + +MCU = atmega168p +F_CPU = 1000000UL +BAUD = 9600UL +## Also try BAUD = 19200 or 38400 if you're feeling lucky. + +## A directory for common include files and the simple USART library. +## If you move either the current folder or the Library folder, you'll +## need to change this path to match. +LIBDIR = ../../AVR-Programming-Library + +##########------------------------------------------------------########## +########## Programmer Defaults ########## +########## Set up once, then forget about it ########## +########## (Can override. See bottom of file.) ########## +##########------------------------------------------------------########## + +PROGRAMMER_TYPE = usbtiny +# extra arguments to avrdude: baud rate, chip type, -F flag, etc. +PROGRAMMER_ARGS = + +##########------------------------------------------------------########## +########## Program Locations ########## +########## Won't need to change if they're in your PATH ########## +##########------------------------------------------------------########## + +CC = avr-gcc +OBJCOPY = avr-objcopy +OBJDUMP = avr-objdump +AVRSIZE = avr-size +AVRDUDE = avrdude + +##########------------------------------------------------------########## +########## Makefile Magic! ########## +########## Summary: ########## +########## We want a .hex file ########## +########## Compile source files into .elf ########## +########## Convert .elf file into .hex ########## +########## You shouldn't need to edit below. ########## +##########------------------------------------------------------########## + +## The name of your project (without the .c) +# TARGET = blinkLED +## Or name it automatically after the enclosing directory +TARGET = $(lastword $(subst /, ,$(CURDIR))) + +# Object files: will find all .c/.h files in current directory +# and in LIBDIR. If you have any other (sub-)directories with code, +# you can add them in to SOURCES below in the wildcard statement. +SOURCES=$(wildcard *.c $(LIBDIR)/*.c) +OBJECTS=$(SOURCES:.c=.o) +HEADERS=$(SOURCES:.c=.h) + +## Compilation options, type man avr-gcc if you're curious. +CPPFLAGS = -DF_CPU=$(F_CPU) -DBAUD=$(BAUD) -I. -I$(LIBDIR) +CFLAGS = -Os -g -std=gnu99 -Wall +## Use short (8-bit) data types +CFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums +## Splits up object files per function +CFLAGS += -ffunction-sections -fdata-sections +LDFLAGS = -Wl,-Map,$(TARGET).map +## Optional, but often ends up with smaller code +LDFLAGS += -Wl,--gc-sections +## Relax shrinks code even more, but makes disassembly messy +## LDFLAGS += -Wl,--relax +## LDFLAGS += -Wl,-u,vfprintf -lprintf_flt -lm ## for floating-point printf +## LDFLAGS += -Wl,-u,vfprintf -lprintf_min ## for smaller printf +TARGET_ARCH = -mmcu=$(MCU) + +## Explicit pattern rules: +## To make .o files from .c files +%.o: %.c $(HEADERS) Makefile + $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c -o $@ $<; + +$(TARGET).elf: $(OBJECTS) + $(CC) $(LDFLAGS) $(TARGET_ARCH) $^ $(LDLIBS) -o $@ + +%.hex: %.elf + $(OBJCOPY) -j .text -j .data -O ihex $< $@ + +%.eeprom: %.elf + $(OBJCOPY) -j .eeprom --change-section-lma .eeprom=0 -O ihex $< $@ + +%.lst: %.elf + $(OBJDUMP) -S $< > $@ + +## These targets don't have files named after them +.PHONY: all disassemble disasm eeprom size clean squeaky_clean flash fuses + +all: $(TARGET).hex + +debug: + @echo + @echo "Source files:" $(SOURCES) + @echo "MCU, F_CPU, BAUD:" $(MCU), $(F_CPU), $(BAUD) + @echo + +# Optionally create listing file from .elf +# This creates approximate assembly-language equivalent of your code. +# Useful for debugging time-sensitive bits, +# or making sure the compiler does what you want. +disassemble: $(TARGET).lst + +disasm: disassemble + +# Optionally show how big the resulting program is +size: $(TARGET).elf + $(AVRSIZE) -C --mcu=$(MCU) $(TARGET).elf + +clean: + rm -f $(TARGET).elf $(TARGET).hex $(TARGET).obj \ + $(TARGET).o $(TARGET).d $(TARGET).eep $(TARGET).lst \ + $(TARGET).lss $(TARGET).sym $(TARGET).map $(TARGET)~ \ + $(TARGET).eeprom + +squeaky_clean: + rm -f *.elf *.hex *.obj *.o *.d *.eep *.lst *.lss *.sym *.map *~ *.eeprom + +##########------------------------------------------------------########## +########## Programmer-specific details ########## +########## Flashing code to AVR using avrdude ########## +##########------------------------------------------------------########## + +flash: $(TARGET).hex + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U flash:w:$< + +## An alias +program: flash + +flash_eeprom: $(TARGET).eeprom + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U eeprom:w:$< + +avrdude_terminal: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nt + +## If you've got multiple programmers that you use, +## you can define them here so that it's easy to switch. +## To invoke, use something like `make flash_arduinoISP` +flash_usbtiny: PROGRAMMER_TYPE = usbtiny +flash_usbtiny: PROGRAMMER_ARGS = # USBTiny works with no further arguments +flash_usbtiny: flash + +flash_usbasp: PROGRAMMER_TYPE = usbasp +flash_usbasp: PROGRAMMER_ARGS = # USBasp works with no further arguments +flash_usbasp: flash + +flash_arduinoISP: PROGRAMMER_TYPE = avrisp +flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P /dev/ttyACM0 +## (for windows) flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P com5 +flash_arduinoISP: flash + +flash_109: PROGRAMMER_TYPE = avr109 +flash_109: PROGRAMMER_ARGS = -b 9600 -P /dev/ttyUSB0 +flash_109: flash + +##########------------------------------------------------------########## +########## Fuse settings and suitable defaults ########## +##########------------------------------------------------------########## + +## Mega 48, 88, 168, 328 default values +LFUSE = 0x62 +HFUSE = 0xdf +EFUSE = 0x00 + +## Generic +FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m + +fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) \ + $(PROGRAMMER_ARGS) $(FUSE_STRING) +show_fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nv + +## Called with no extra definitions, sets to defaults +set_default_fuses: FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m +set_default_fuses: fuses + +## Set the fuse byte for full-speed mode +## Note: can also be set in firmware for modern chips +set_fast_fuse: LFUSE = 0xE2 +set_fast_fuse: FUSE_STRING = -U lfuse:w:$(LFUSE):m +set_fast_fuse: fuses + +## Set the EESAVE fuse byte to preserve EEPROM across flashes +set_eeprom_save_fuse: HFUSE = 0xD7 +set_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +set_eeprom_save_fuse: fuses + +## Clear the EESAVE fuse byte +clear_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +clear_eeprom_save_fuse: fuses diff --git a/Make AVR Examples/Chapter12_Analog-to-Digital-Conversion-II/voltmeter/voltmeter.c b/Make AVR Examples/Chapter12_Analog-to-Digital-Conversion-II/voltmeter/voltmeter.c new file mode 100644 index 0000000..810ad9a --- /dev/null +++ b/Make AVR Examples/Chapter12_Analog-to-Digital-Conversion-II/voltmeter/voltmeter.c @@ -0,0 +1,85 @@ +/* ADC Voltmeter + * Continuously outputs voltage over the serial line. + */ + +// ------- Preamble -------- // +#include +#include +#include +#include /* for ADC sleep mode */ +#include /* for round() and floor() */ + +#include "pinDefines.h" +#include "USART.h" + +/* Note: This voltmeter is only as accurate as your reference voltage. + * If you want four digits of accuracy, need to measure your AVCC well. + * Measure either AVCC of the voltage on AREF and enter it here. +*/ +#define REF_VCC 5.053 + /* measured division by voltage divider */ +#define VOLTAGE_DIV_FACTOR 3.114 + + +// -------- Functions --------- // +void initADC(void) { + ADMUX |= (0b00001111 & PC5); /* set mux to ADC5 */ + ADMUX |= (1 << REFS0); /* reference voltage on AVCC */ + ADCSRA |= (1 << ADPS1) | (1 << ADPS2); /* ADC clock prescaler /64 */ + ADCSRA |= (1 << ADEN); /* enable ADC */ +} + +void setupADCSleepmode(void) { + set_sleep_mode(SLEEP_MODE_ADC); /* defined in avr/sleep.h */ + ADCSRA |= (1 << ADIE); /* enable ADC interrupt */ + sei(); /* enable global interrupts */ +} + +EMPTY_INTERRUPT(ADC_vect); + +uint16_t oversample16x(void) { + uint16_t oversampledValue = 0; + uint8_t i; + for (i = 0; i < 16; i++) { + sleep_mode(); /* chip to sleep, takes ADC sample */ + oversampledValue += ADC; /* add them up 16x */ + } + return (oversampledValue >> 2); /* divide back down by four */ +} + +void printFloat(float number) { + number = round(number * 100) / 100; /* round off to 2 decimal places */ + transmitByte('0' + number / 10); /* tens place */ + transmitByte('0' + number - 10 * floor(number / 10)); /* ones */ + transmitByte('.'); + transmitByte('0' + (number * 10) - floor(number) * 10); /* tenths */ + /* hundredths place */ + transmitByte('0' + (number * 100) - floor(number * 10) * 10); + printString("\r\n"); +} + +int main(void) { + + float voltage; + + // -------- Inits --------- // + initUSART(); + printString("\r\nDigital Voltmeter\r\n\r\n"); + initADC(); + setupADCSleepmode(); + + // ------ Event loop ------ // + + while (1) { + + voltage = oversample16x() * VOLTAGE_DIV_FACTOR * REF_VCC / 4096; + printFloat(voltage); + /* alternatively, just print it out: + * printWord(voltage*100); + * but then you have to remember the decimal place + */ + _delay_ms(500); + + } /* End event loop */ + return 0; /* This line is never reached */ +} diff --git a/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/adsr/Makefile b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/adsr/Makefile new file mode 100644 index 0000000..5c588dc --- /dev/null +++ b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/adsr/Makefile @@ -0,0 +1,196 @@ + +##########------------------------------------------------------########## +########## Project-specific Details ########## +########## Check these every time you start a new project ########## +##########------------------------------------------------------########## + +MCU = atmega168p +F_CPU = 8000000UL +BAUD = 9600UL +## Also try BAUD = 19200 or 38400 if you're feeling lucky. + +## A directory for common include files and the simple USART library. +## If you move either the current folder or the Library folder, you'll +## need to change this path to match. +LIBDIR = ../../AVR-Programming-Library + +##########------------------------------------------------------########## +########## Programmer Defaults ########## +########## Set up once, then forget about it ########## +########## (Can override. See bottom of file.) ########## +##########------------------------------------------------------########## + +PROGRAMMER_TYPE = usbtiny +# extra arguments to avrdude: baud rate, chip type, -F flag, etc. +PROGRAMMER_ARGS = + +##########------------------------------------------------------########## +########## Program Locations ########## +########## Won't need to change if they're in your PATH ########## +##########------------------------------------------------------########## + +CC = avr-gcc +OBJCOPY = avr-objcopy +OBJDUMP = avr-objdump +AVRSIZE = avr-size +AVRDUDE = avrdude + +##########------------------------------------------------------########## +########## Makefile Magic! ########## +########## Summary: ########## +########## We want a .hex file ########## +########## Compile source files into .elf ########## +########## Convert .elf file into .hex ########## +########## You shouldn't need to edit below. ########## +##########------------------------------------------------------########## + +## The name of your project (without the .c) +# TARGET = blinkLED +## Or name it automatically after the enclosing directory +TARGET = $(lastword $(subst /, ,$(CURDIR))) + +# Object files: will find all .c/.h files in current directory +# and in LIBDIR. If you have any other (sub-)directories with code, +# you can add them in to SOURCES below in the wildcard statement. +SOURCES=$(wildcard *.c $(LIBDIR)/*.c) +OBJECTS=$(SOURCES:.c=.o) +HEADERS=$(SOURCES:.c=.h) + +## Compilation options, type man avr-gcc if you're curious. +CPPFLAGS = -DF_CPU=$(F_CPU) -DBAUD=$(BAUD) -I. -I$(LIBDIR) +CFLAGS = -Os -g -std=gnu99 -Wall +## Use short (8-bit) data types +CFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums +## Splits up object files per function +CFLAGS += -ffunction-sections -fdata-sections +LDFLAGS = -Wl,-Map,$(TARGET).map +## Optional, but often ends up with smaller code +LDFLAGS += -Wl,--gc-sections +## Relax shrinks code even more, but makes disassembly messy +## LDFLAGS += -Wl,--relax +## LDFLAGS += -Wl,-u,vfprintf -lprintf_flt -lm ## for floating-point printf +## LDFLAGS += -Wl,-u,vfprintf -lprintf_min ## for smaller printf +TARGET_ARCH = -mmcu=$(MCU) + +## Explicit pattern rules: +## To make .o files from .c files +%.o: %.c $(HEADERS) Makefile + $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c -o $@ $<; + +$(TARGET).elf: $(OBJECTS) + $(CC) $(LDFLAGS) $(TARGET_ARCH) $^ $(LDLIBS) -o $@ + +%.hex: %.elf + $(OBJCOPY) -j .text -j .data -O ihex $< $@ + +%.eeprom: %.elf + $(OBJCOPY) -j .eeprom --change-section-lma .eeprom=0 -O ihex $< $@ + +%.lst: %.elf + $(OBJDUMP) -S $< > $@ + +## These targets don't have files named after them +.PHONY: all disassemble disasm eeprom size clean squeaky_clean flash fuses + +all: $(TARGET).hex + +debug: + @echo + @echo "Source files:" $(SOURCES) + @echo "MCU, F_CPU, BAUD:" $(MCU), $(F_CPU), $(BAUD) + @echo + +# Optionally create listing file from .elf +# This creates approximate assembly-language equivalent of your code. +# Useful for debugging time-sensitive bits, +# or making sure the compiler does what you want. +disassemble: $(TARGET).lst + +disasm: disassemble + +# Optionally show how big the resulting program is +size: $(TARGET).elf + $(AVRSIZE) -C --mcu=$(MCU) $(TARGET).elf + +clean: + rm -f $(TARGET).elf $(TARGET).hex $(TARGET).obj \ + $(TARGET).o $(TARGET).d $(TARGET).eep $(TARGET).lst \ + $(TARGET).lss $(TARGET).sym $(TARGET).map $(TARGET)~ \ + $(TARGET).eeprom + +squeaky_clean: + rm -f *.elf *.hex *.obj *.o *.d *.eep *.lst *.lss *.sym *.map *~ *.eeprom + +##########------------------------------------------------------########## +########## Programmer-specific details ########## +########## Flashing code to AVR using avrdude ########## +##########------------------------------------------------------########## + +flash: $(TARGET).hex + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U flash:w:$< + +## An alias +program: flash + +flash_eeprom: $(TARGET).eeprom + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U eeprom:w:$< + +avrdude_terminal: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nt + +## If you've got multiple programmers that you use, +## you can define them here so that it's easy to switch. +## To invoke, use something like `make flash_arduinoISP` +flash_usbtiny: PROGRAMMER_TYPE = usbtiny +flash_usbtiny: PROGRAMMER_ARGS = # USBTiny works with no further arguments +flash_usbtiny: flash + +flash_usbasp: PROGRAMMER_TYPE = usbasp +flash_usbasp: PROGRAMMER_ARGS = # USBasp works with no further arguments +flash_usbasp: flash + +flash_arduinoISP: PROGRAMMER_TYPE = avrisp +flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P /dev/ttyACM0 +## (for windows) flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P com5 +flash_arduinoISP: flash + +flash_109: PROGRAMMER_TYPE = avr109 +flash_109: PROGRAMMER_ARGS = -b 9600 -P /dev/ttyUSB0 +flash_109: flash + +##########------------------------------------------------------########## +########## Fuse settings and suitable defaults ########## +##########------------------------------------------------------########## + +## Mega 48, 88, 168, 328 default values +LFUSE = 0x62 +HFUSE = 0xdf +EFUSE = 0x00 + +## Generic +FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m + +fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) \ + $(PROGRAMMER_ARGS) $(FUSE_STRING) +show_fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nv + +## Called with no extra definitions, sets to defaults +set_default_fuses: FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m +set_default_fuses: fuses + +## Set the fuse byte for full-speed mode +## Note: can also be set in firmware for modern chips +set_fast_fuse: LFUSE = 0xE2 +set_fast_fuse: FUSE_STRING = -U lfuse:w:$(LFUSE):m +set_fast_fuse: fuses + +## Set the EESAVE fuse byte to preserve EEPROM across flashes +set_eeprom_save_fuse: HFUSE = 0xD7 +set_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +set_eeprom_save_fuse: fuses + +## Clear the EESAVE fuse byte +clear_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +clear_eeprom_save_fuse: fuses diff --git a/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/adsr/adsr.c b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/adsr/adsr.c new file mode 100644 index 0000000..946adc2 --- /dev/null +++ b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/adsr/adsr.c @@ -0,0 +1,86 @@ +/* + Direct-digital synthesis + ADSR Dynamic Volume Envelope Demo +*/ + +// ------- Preamble -------- // +#include "adsr.h" /* Defines, includes, and init functions */ + +int main(void) { + + // -------- Inits --------- // + + uint16_t accumulator = 0; + uint8_t volume = 0; + uint16_t noteClock = 0; + uint16_t tuningWord = C1; + + uint8_t waveStep; + int16_t mixer=0; + char serialInput; + + clock_prescale_set(clock_div_1); /* CPU clock 8 MHz */ + initTimer0(); + initUSART(); + printString(" Serial Synth\r\n"); + printString("Notes: asdfghjkl;'\r\n"); + + SPEAKER_DDR |= (1 << SPEAKER); /* speaker output */ + + // ------ Event loop ------ // + while (1) { + + // Set PWM output + loop_until_bit_is_set(TIFR0, TOV0); /* wait for timer0 overflow */ + OCR0A = 128 + (uint8_t) mixer; + TIFR0 |= (1 << TOV0); /* reset the overflow bit */ + + // Update the DDS + accumulator += tuningWord; + waveStep = accumulator >> 8; + mixer = fullTriangle[waveStep] * volume; + mixer = mixer >> 5; + + /* Input processed here: check USART */ + if (bit_is_set(UCSR0A, RXC0)) { + serialInput = UDR0; /* read in from USART */ + tuningWord = lookupPitch(serialInput); + noteClock = 1; + } + + /* Dynamic Volume stuff here */ + if (noteClock) { /* if noteClock already running */ + noteClock++; + if (noteClock < ATTACK_TIME) { /* attack */ + /* wait until time to increase next step */ + if (noteClock > ATTACK_RATE * volume) { + if (volume < 31) { + volume++; + } + } + } + else if (noteClock < DECAY_TIME) { /* decay */ + if ((noteClock - ATTACK_TIME) > + (FULL_VOLUME - volume) * DECAY_RATE) { + if (volume > SUSTAIN_LEVEL) { + volume--; + } + } + } + else if (noteClock > RELEASE_TIME) { /* release */ + if ((noteClock - RELEASE_TIME) > + (SUSTAIN_LEVEL - volume) * RELEASE_RATE) { + if (volume > 0) { + volume--; + } + else { + noteClock = 0; + } + } + } + } + + + } /* End event loop */ + return 0; /* This line is never reached */ +} diff --git a/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/adsr/adsr.h b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/adsr/adsr.h new file mode 100644 index 0000000..24701ca --- /dev/null +++ b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/adsr/adsr.h @@ -0,0 +1,81 @@ + +/*Include file for ADSR synth project. */ + +#include /* Defines pins, ports, etc */ +#include /* Functions to waste time */ +#include +#include +#include "pinDefines.h" +#include "macros.h" +#include "scale.h" +#include "fullSaw7.h" /* a 7-harmonic bandlimited sawtooth */ + /* see generateWavetables.py if you're interested */ +#include "fullTriangle.h" +#include "USART.h" + +#define FULL_VOLUME 31 /* 5-bit volumes */ + +// Default envelope values (slightly percussive) +// Play around with these! +#define ATTACK_RATE 8 /* 0-255 */ +#define DECAY_RATE 120 /* 0-255 */ +#define SUSTAIN_LEVEL 25 /* 0-255 */ +#define SUSTAIN_TIME 4000 /* 0-65535 */ +#define RELEASE_RATE 200 /* 0-65535 */ + +// Compute these constants +#define ATTACK_TIME ATTACK_RATE * FULL_VOLUME +#define DECAY_TIME (ATTACK_TIME + (FULL_VOLUME-SUSTAIN_LEVEL) * DECAY_RATE) +#define RELEASE_TIME DECAY_TIME + SUSTAIN_TIME + +// -------------- Init Routines --------------- // + +static inline void initTimer0(void){ + set_bit(TCCR0A, COM0A1); /* PWM output on OCR0A */ + set_bit(SPEAKER_DDR, SPEAKER); /* enable output on pin */ + + set_bit(TCCR0A, WGM00); /* Fast PWM mode */ + set_bit(TCCR0A, WGM01); /* Fast PWM mode, pt.2 */ + + set_bit(TCCR0B, CS00); /* Clock with /1 prescaler */ +} + +static inline void initLEDs(void){ + uint8_t i; + LED_DDR = 0xff; /* All LEDs for diagnostics */ + for (i=0; i<8; i++){ + set_bit(LED_PORT, i); + _delay_ms(100); + clear_bit(LED_PORT, i); + } +} + +static inline uint16_t lookupPitch(char i){ + switch(i){ + case 'a': + return(G1); + case 's': + return(A1); + case 'd': + return(B1); + case 'f': + return(C2); + case 'g': + return(D2); + case 'h': + return(E2); + case 'j': + return(F2); + case 'k': + return(G2); + case 'l': + return(A2); + case ';': + return(B2); + case '\'': + return(C3); + } + // Default value -- if press some other key + return(C1); +} + diff --git a/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/adsr/fullSaw15.h b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/adsr/fullSaw15.h new file mode 100644 index 0000000..69e64a3 --- /dev/null +++ b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/adsr/fullSaw15.h @@ -0,0 +1,34 @@ +int8_t fullSaw15[256] = { + 0, 1, 3, 4, 5, 6, 7, 7, + 7, 7, 7, 7, 8, 9, 10, 12, + 13, 15, 17, 18, 20, 21, 21, 22, + 22, 22, 22, 22, 22, 23, 24, 25, + 27, 29, 31, 33, 34, 35, 36, 36, + 36, 36, 36, 36, 36, 37, 38, 39, + 41, 43, 45, 47, 48, 50, 51, 51, + 51, 51, 51, 51, 51, 51, 52, 53, + 54, 56, 58, 61, 63, 64, 66, 66, + 67, 66, 66, 65, 65, 65, 65, 66, + 68, 70, 72, 75, 77, 79, 81, 82, + 82, 82, 81, 80, 79, 78, 78, 78, + 80, 82, 85, 88, 92, 95, 97, 99, + 100, 99, 98, 95, 93, 90, 88, 88, + 89, 91, 96, 101, 108, 115, 121, 125, + 127, 125, 119, 108, 93, 74, 51, 26, + 0, -27, -52, -75, -94, -109, -120, -126, + -128, -126, -122, -116, -109, -102, -97, -92, + -90, -89, -89, -91, -94, -96, -99, -100, + -101, -100, -98, -96, -93, -89, -86, -83, + -81, -79, -79, -79, -80, -81, -82, -83, + -83, -83, -82, -80, -78, -76, -73, -71, + -69, -67, -66, -66, -66, -66, -67, -67, + -68, -67, -67, -65, -64, -62, -59, -57, + -55, -54, -53, -52, -52, -52, -52, -52, + -52, -52, -52, -51, -49, -48, -46, -44, + -42, -40, -39, -38, -37, -37, -37, -37, + -37, -37, -37, -36, -35, -34, -32, -30, + -28, -26, -25, -24, -23, -23, -23, -23, + -23, -23, -22, -22, -21, -19, -18, -16, + -14, -13, -11, -10, -9, -8, -8, -8, + -8, -8, -8, -7, -6, -5, -4, -2 +}; diff --git a/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/adsr/fullSaw3.h b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/adsr/fullSaw3.h new file mode 100644 index 0000000..c0c1877 --- /dev/null +++ b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/adsr/fullSaw3.h @@ -0,0 +1,34 @@ +int8_t fullSaw3[256] = { + 0, 2, 4, 6, 8, 10, 12, 14, + 16, 18, 20, 22, 23, 25, 27, 28, + 29, 31, 32, 33, 34, 35, 35, 36, + 37, 37, 38, 38, 38, 38, 39, 39, + 39, 39, 39, 38, 38, 38, 38, 38, + 38, 38, 38, 38, 38, 38, 38, 38, + 39, 39, 40, 40, 41, 42, 43, 44, + 45, 46, 47, 49, 51, 52, 54, 56, + 58, 61, 63, 65, 68, 70, 73, 76, + 79, 81, 84, 87, 90, 93, 96, 98, + 101, 104, 106, 109, 111, 114, 116, 118, + 120, 121, 123, 124, 125, 126, 126, 127, + 127, 127, 126, 126, 125, 124, 122, 120, + 118, 116, 113, 110, 107, 104, 100, 96, + 92, 87, 83, 78, 72, 67, 62, 56, + 50, 44, 38, 32, 25, 19, 12, 6, + 0, -7, -13, -20, -26, -33, -39, -45, + -51, -57, -63, -68, -73, -79, -84, -88, + -93, -97, -101, -105, -108, -111, -114, -117, + -119, -121, -123, -125, -126, -127, -127, -128, + -128, -128, -127, -127, -126, -125, -124, -122, + -121, -119, -117, -115, -112, -110, -107, -105, + -102, -99, -97, -94, -91, -88, -85, -82, + -80, -77, -74, -71, -69, -66, -64, -62, + -59, -57, -55, -53, -52, -50, -48, -47, + -46, -45, -44, -43, -42, -41, -41, -40, + -40, -39, -39, -39, -39, -39, -39, -39, + -39, -39, -39, -39, -39, -39, -40, -40, + -40, -40, -40, -39, -39, -39, -39, -38, + -38, -37, -36, -36, -35, -34, -33, -32, + -30, -29, -28, -26, -24, -23, -21, -19, + -17, -15, -13, -11, -9, -7, -5, -3 +}; diff --git a/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/adsr/fullSaw7.h b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/adsr/fullSaw7.h new file mode 100644 index 0000000..ef38b9e --- /dev/null +++ b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/adsr/fullSaw7.h @@ -0,0 +1,34 @@ +int8_t fullSaw7[256] = { + 0, 1, 3, 5, 7, 8, 10, 11, + 12, 13, 14, 15, 15, 15, 15, 16, + 16, 16, 16, 16, 16, 16, 16, 17, + 17, 18, 19, 20, 21, 23, 24, 26, + 28, 30, 32, 34, 36, 38, 39, 41, + 43, 44, 45, 46, 47, 47, 48, 48, + 48, 48, 48, 48, 48, 47, 47, 47, + 47, 47, 48, 49, 50, 51, 52, 54, + 55, 57, 60, 62, 64, 66, 69, 71, + 73, 75, 77, 79, 80, 81, 82, 82, + 82, 82, 82, 81, 80, 80, 79, 78, + 77, 76, 75, 75, 75, 76, 76, 78, + 79, 81, 84, 87, 90, 94, 98, 102, + 106, 110, 114, 117, 121, 123, 125, 127, + 127, 127, 125, 122, 119, 114, 108, 101, + 93, 84, 74, 63, 51, 39, 26, 13, + 0, -14, -27, -40, -52, -64, -75, -85, + -94, -102, -109, -115, -120, -123, -126, -128, + -128, -128, -126, -124, -122, -118, -115, -111, + -107, -103, -99, -95, -91, -88, -85, -82, + -80, -79, -77, -77, -76, -76, -76, -77, + -78, -79, -80, -81, -81, -82, -83, -83, + -83, -83, -83, -82, -81, -80, -78, -76, + -74, -72, -70, -67, -65, -63, -61, -58, + -56, -55, -53, -52, -51, -50, -49, -48, + -48, -48, -48, -48, -49, -49, -49, -49, + -49, -49, -49, -48, -48, -47, -46, -45, + -44, -42, -40, -39, -37, -35, -33, -31, + -29, -27, -25, -24, -22, -21, -20, -19, + -18, -18, -17, -17, -17, -17, -17, -17, + -17, -17, -16, -16, -16, -16, -15, -14, + -13, -12, -11, -9, -8, -6, -4, -2 +}; diff --git a/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/adsr/fullTri15.h b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/adsr/fullTri15.h new file mode 100644 index 0000000..e227e64 --- /dev/null +++ b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/adsr/fullTri15.h @@ -0,0 +1,34 @@ +int8_t fullTri15[256] = { + 0, 1, 3, 4, 5, 6, 7, 7, + 7, 7, 7, 7, 8, 9, 10, 12, + 13, 15, 17, 18, 20, 21, 21, 22, + 22, 22, 22, 22, 22, 23, 24, 25, + 27, 29, 31, 33, 34, 35, 36, 36, + 36, 36, 36, 36, 36, 37, 38, 39, + 41, 43, 45, 47, 48, 50, 51, 51, + 51, 51, 51, 51, 51, 51, 52, 53, + 54, 56, 58, 61, 63, 64, 66, 66, + 67, 66, 66, 65, 65, 65, 65, 66, + 68, 70, 72, 75, 77, 79, 81, 82, + 82, 82, 81, 80, 79, 78, 78, 78, + 80, 82, 85, 88, 92, 95, 97, 99, + 100, 99, 98, 95, 93, 90, 88, 88, + 89, 91, 96, 101, 108, 115, 121, 125, + 127, 125, 119, 108, 93, 74, 51, 26, + 0, -27, -52, -75, -94, -109, -120, -126, + -128, -126, -122, -116, -109, -102, -97, -92, + -90, -89, -89, -91, -94, -96, -99, -100, + -101, -100, -98, -96, -93, -89, -86, -83, + -81, -79, -79, -79, -80, -81, -82, -83, + -83, -83, -82, -80, -78, -76, -73, -71, + -69, -67, -66, -66, -66, -66, -67, -67, + -68, -67, -67, -65, -64, -62, -59, -57, + -55, -54, -53, -52, -52, -52, -52, -52, + -52, -52, -52, -51, -49, -48, -46, -44, + -42, -40, -39, -38, -37, -37, -37, -37, + -37, -37, -37, -36, -35, -34, -32, -30, + -28, -26, -25, -24, -23, -23, -23, -23, + -23, -23, -22, -22, -21, -19, -18, -16, + -14, -13, -11, -10, -9, -8, -8, -8, + -8, -8, -8, -7, -6, -5, -4, -2 +}; diff --git a/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/adsr/fullTri3.h b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/adsr/fullTri3.h new file mode 100644 index 0000000..236e937 --- /dev/null +++ b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/adsr/fullTri3.h @@ -0,0 +1,34 @@ +int8_t fullTri3[256] = { + 0, 2, 4, 6, 8, 10, 12, 14, + 16, 18, 20, 22, 23, 25, 27, 28, + 29, 31, 32, 33, 34, 35, 35, 36, + 37, 37, 38, 38, 38, 38, 39, 39, + 39, 39, 39, 38, 38, 38, 38, 38, + 38, 38, 38, 38, 38, 38, 38, 38, + 39, 39, 40, 40, 41, 42, 43, 44, + 45, 46, 47, 49, 51, 52, 54, 56, + 58, 61, 63, 65, 68, 70, 73, 76, + 79, 81, 84, 87, 90, 93, 96, 98, + 101, 104, 106, 109, 111, 114, 116, 118, + 120, 121, 123, 124, 125, 126, 126, 127, + 127, 127, 126, 126, 125, 124, 122, 120, + 118, 116, 113, 110, 107, 104, 100, 96, + 92, 87, 83, 78, 72, 67, 62, 56, + 50, 44, 38, 32, 25, 19, 12, 6, + 0, -7, -13, -20, -26, -33, -39, -45, + -51, -57, -63, -68, -73, -79, -84, -88, + -93, -97, -101, -105, -108, -111, -114, -117, + -119, -121, -123, -125, -126, -127, -127, -128, + -128, -128, -127, -127, -126, -125, -124, -122, + -121, -119, -117, -115, -112, -110, -107, -105, + -102, -99, -97, -94, -91, -88, -85, -82, + -80, -77, -74, -71, -69, -66, -64, -62, + -59, -57, -55, -53, -52, -50, -48, -47, + -46, -45, -44, -43, -42, -41, -41, -40, + -40, -39, -39, -39, -39, -39, -39, -39, + -39, -39, -39, -39, -39, -39, -40, -40, + -40, -40, -40, -39, -39, -39, -39, -38, + -38, -37, -36, -36, -35, -34, -33, -32, + -30, -29, -28, -26, -24, -23, -21, -19, + -17, -15, -13, -11, -9, -7, -5, -3 +}; diff --git a/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/adsr/fullTri7.h b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/adsr/fullTri7.h new file mode 100644 index 0000000..ed0af55 --- /dev/null +++ b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/adsr/fullTri7.h @@ -0,0 +1,34 @@ +int8_t fullTri7[256] = { + 0, 1, 3, 5, 7, 8, 10, 11, + 12, 13, 14, 15, 15, 15, 15, 16, + 16, 16, 16, 16, 16, 16, 16, 17, + 17, 18, 19, 20, 21, 23, 24, 26, + 28, 30, 32, 34, 36, 38, 39, 41, + 43, 44, 45, 46, 47, 47, 48, 48, + 48, 48, 48, 48, 48, 47, 47, 47, + 47, 47, 48, 49, 50, 51, 52, 54, + 55, 57, 60, 62, 64, 66, 69, 71, + 73, 75, 77, 79, 80, 81, 82, 82, + 82, 82, 82, 81, 80, 80, 79, 78, + 77, 76, 75, 75, 75, 76, 76, 78, + 79, 81, 84, 87, 90, 94, 98, 102, + 106, 110, 114, 117, 121, 123, 125, 127, + 127, 127, 125, 122, 119, 114, 108, 101, + 93, 84, 74, 63, 51, 39, 26, 13, + 0, -14, -27, -40, -52, -64, -75, -85, + -94, -102, -109, -115, -120, -123, -126, -128, + -128, -128, -126, -124, -122, -118, -115, -111, + -107, -103, -99, -95, -91, -88, -85, -82, + -80, -79, -77, -77, -76, -76, -76, -77, + -78, -79, -80, -81, -81, -82, -83, -83, + -83, -83, -83, -82, -81, -80, -78, -76, + -74, -72, -70, -67, -65, -63, -61, -58, + -56, -55, -53, -52, -51, -50, -49, -48, + -48, -48, -48, -48, -49, -49, -49, -49, + -49, -49, -49, -48, -48, -47, -46, -45, + -44, -42, -40, -39, -37, -35, -33, -31, + -29, -27, -25, -24, -22, -21, -20, -19, + -18, -18, -17, -17, -17, -17, -17, -17, + -17, -17, -16, -16, -16, -16, -15, -14, + -13, -12, -11, -9, -8, -6, -4, -2 +}; diff --git a/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/adsr/fullTriangle.h b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/adsr/fullTriangle.h new file mode 100644 index 0000000..04cb022 --- /dev/null +++ b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/adsr/fullTriangle.h @@ -0,0 +1,34 @@ +int8_t fullTriangle[256] = { + 0, 1, 3, 5, 7, 9, 11, 13, + 15, 17, 19, 21, 23, 25, 27, 29, + 31, 33, 35, 37, 39, 41, 43, 45, + 47, 49, 51, 53, 55, 57, 59, 61, + 63, 65, 67, 69, 71, 73, 75, 77, + 79, 81, 83, 85, 87, 89, 91, 93, + 95, 97, 99, 101, 103, 105, 107, 109, + 111, 113, 115, 117, 119, 121, 123, 125, + 127, 125, 123, 121, 119, 117, 115, 113, + 111, 109, 107, 105, 103, 101, 99, 97, + 95, 93, 91, 89, 87, 85, 83, 81, + 79, 77, 75, 73, 71, 69, 67, 65, + 63, 61, 59, 57, 55, 53, 51, 49, + 47, 45, 43, 41, 39, 37, 35, 33, + 31, 29, 27, 25, 23, 21, 19, 17, + 15, 13, 11, 9, 7, 5, 3, 1, + 0, -2, -4, -6, -8, -10, -12, -14, + -16, -18, -20, -22, -24, -26, -28, -30, + -32, -34, -36, -38, -40, -42, -44, -46, + -48, -50, -52, -54, -56, -58, -60, -62, + -64, -66, -68, -70, -72, -74, -76, -78, + -80, -82, -84, -86, -88, -90, -92, -94, + -96, -98, -100, -102, -104, -106, -108, -110, + -112, -114, -116, -118, -120, -122, -124, -126, + -128, -126, -124, -122, -120, -118, -116, -114, + -112, -110, -108, -106, -104, -102, -100, -98, + -96, -94, -92, -90, -88, -86, -84, -82, + -80, -78, -76, -74, -72, -70, -68, -66, + -64, -62, -60, -58, -56, -54, -52, -50, + -48, -46, -44, -42, -40, -38, -36, -34, + -32, -30, -28, -26, -24, -22, -20, -18, + -16, -14, -12, -10, -8, -6, -4, -2 +}; diff --git a/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/adsr/generateScale.py b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/adsr/generateScale.py new file mode 100644 index 0000000..8e7dc3a --- /dev/null +++ b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/adsr/generateScale.py @@ -0,0 +1,44 @@ + +## File to generate equal-tempered scale for use with DDS + + +import math # because music is math + +scale = ['C', 'Cx', 'D', 'Dx', 'E', 'F', 'Fx', 'G', 'Gx', 'A', 'Ax', 'B'] + +def octave(baseLength): + pitches = [baseLength * math.exp(x*math.log(2)/12) for x in range(0, 12)] + pitches = [int(round(x)) for x in pitches] + return( zip(scale, pitches) ) + + +def writeScaleHeader(basePitch, octaves, filename="scale.h"): + outfile = open(filename, "w") + outfile.write('''/* + + Scales for use with DDS synthesis. + + Aimed roughly at having A2 be at 440Hz, + when the chip is clocked at 8MHz and + using 8-bit resolution on the PWM. + + Tune it by tweaking basePitch. + + */ + + ''') + for i in range(0, octaves): + for note, pitch in octave(basePitch * 2**i): + if pitch < 30000: + noteString = note + str(i) + print("#define {:<5}{:>6}").format(noteString, pitch) + outfile.write("#define {:<5}{:>6}\n".format(noteString, pitch)) + outfile.close() + +###################################################################### + +if __name__ == "__main__": + + writeScaleHeader(basePitch=130, octaves=5) + + diff --git a/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/adsr/generateWavetables.py b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/adsr/generateWavetables.py new file mode 100644 index 0000000..905593f --- /dev/null +++ b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/adsr/generateWavetables.py @@ -0,0 +1,101 @@ +## This file generates headers with lookup tables for various waveforms +## Add your own. + +import math + +def phaseSteps(maxPhase, length=256): + steps = range(0, length) + steps = [1.0*x/length * 2.0*math.pi * (maxPhase/360.0) for x in steps] + return(steps) + +def scaleAndRound(data, scale=255, signedInt=True): + data = [0.0+x-min(data) for x in data] + data = [1.0*x/max(data)*scale for x in data] + data = [int(round(x)) for x in data] + if signedInt: + data = [x-(scale+1)/2 for x in data] + return(data) + +def makeSin(maxPhase, length=256): + sinus = [math.sin(x) for x in phaseSteps(maxPhase, length)] + return(sinus) + +def prettyPrint(data, perLine = 8): + outString = "" + for i in range(len(data) / perLine): + strings = [str(x) for x in data[perLine*i:(perLine*i+perLine)]] + outString += "\t" + ", ".join(strings) + ",\n" + outString = outString[:-2] + "\n" # drop the final comma + return(outString) + +def writeHeader(fileName, dataName, data, signedInt=True): + outfile = open(fileName, "w") + if signedInt: + outfile.write("int8_t {}[{:d}] = {{ \n".format(dataName, len(data))) + else: + outfile.write("uint8_t {}[{:d}] = {{ \n".format(dataName, len(data))) + outfile.write(prettyPrint(data)) + outfile.write("};\n") + outfile.close() + +def bandlimitedSawtooth(maxPhase, numberPartials, length=256): + wave = [0]*length + sign = 1.0 + for k in range(1, numberPartials+1): + phases = phaseSteps(maxPhase*k, length) + for i in range(length): + wave[i] += sign * math.sin(phases[i]) / k + sign = sign * -1 + return(wave) + +def bandlimitedSquare(maxPhase, numberPartials, length=256): + wave = [0]*length + for k in range(1, numberPartials*2, 2): + phases = phaseSteps(maxPhase*k, length) + for i in range(length): + wave[i] += math.sin(phases[i]) / k + return(wave) + +def bandlimitedTriangle(maxPhase, numberPartials, length=256): + wave = [0]*length + sign = 1.0 + for k in range(1, numberPartials*2, 2): + phases = phaseSteps(maxPhase*k, length) + for i in range(length): + wave[i] += sign * math.sin(phases[i]) / k**2 + sign = sign * -1 + return(wave) + + + +if __name__ == "__main__": + + ## Full-waves, full 256 bytes, 0-255 range + writeHeader("fullSine.h", 'fullSine', scaleAndRound(makeSin(360))) + + triangleWave = range(0,64) + triangleWave.extend(range(64, -64, -1)) + triangleWave.extend(range(-64, 0, 1)) + triangleWave = scaleAndRound(triangleWave) + writeHeader("fullTriangle.h", 'fullTriangle', triangleWave) + + for numberFrequencies in [3,7,15]: + saw = scaleAndRound(bandlimitedSawtooth(360, numberFrequencies)) + writeHeader("fullSaw{}.h".format(numberFrequencies), + 'fullSaw{}'.format(numberFrequencies), saw) + tri = scaleAndRound(bandlimitedTriangle(360, numberFrequencies)) + writeHeader("fullTri{}.h".format(numberFrequencies), + 'fullTri{}'.format(numberFrequencies), tri) + square = scaleAndRound(bandlimitedSquare(360, numberFrequencies)) + writeHeader("fullSquare{}.h".format(numberFrequencies), + 'fullSquare{}'.format(numberFrequencies), square) + + ## Note that if you define / use too many different waveforms, + ## and you don't store them in PROGMEM in your AVR C routines, + ## you might run the chip out of RAM, which causes strange and + ## nearly impossible-to-diagnose glitches. + + ## So here we're breaking each waveform up into its own include file. + ## There are ways of storing them all in program memory, and we'll + ## see examples of that in later chapters. + diff --git a/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/adsr/scale.h b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/adsr/scale.h new file mode 100644 index 0000000..6b12c73 --- /dev/null +++ b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/adsr/scale.h @@ -0,0 +1,72 @@ +/* + +Scales for use with DDS synthesis. + +Aimed roughly at having A2 be at 440Hz, +when the chip is clocked at 8MHz and +using 8-bit resolution on the PWM. + +Tune it if you'd like. + +*/ + +#define C0 130 +#define Cx0 138 +#define D0 146 +#define Dx0 155 +#define E0 164 +#define F0 174 +#define Fx0 184 +#define G0 195 +#define Gx0 206 +#define A0 219 +#define Ax0 232 +#define B0 245 +#define C1 260 +#define Cx1 275 +#define D1 292 +#define Dx1 309 +#define E1 328 +#define F1 347 +#define Fx1 368 +#define G1 390 +#define Gx1 413 +#define A1 437 +#define Ax1 463 +#define B1 491 +#define C2 520 +#define Cx2 551 +#define D2 584 +#define Dx2 618 +#define E2 655 +#define F2 694 +#define Fx2 735 +#define G2 779 +#define Gx2 825 +#define A2 875 +#define Ax2 927 +#define B2 982 +#define C3 1040 +#define Cx3 1102 +#define D3 1167 +#define Dx3 1237 +#define E3 1310 +#define F3 1388 +#define Fx3 1471 +#define G3 1558 +#define Gx3 1651 +#define A3 1749 +#define Ax3 1853 +#define B3 1963 +#define C4 2080 +#define Cx4 2204 +#define D4 2335 +#define Dx4 2474 +#define E4 2621 +#define F4 2776 +#define Fx4 2942 +#define G4 3116 +#define Gx4 3302 +#define A4 3498 +#define Ax4 3706 +#define B4 3927 diff --git a/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/arpeggiator/Makefile b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/arpeggiator/Makefile new file mode 100644 index 0000000..5c588dc --- /dev/null +++ b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/arpeggiator/Makefile @@ -0,0 +1,196 @@ + +##########------------------------------------------------------########## +########## Project-specific Details ########## +########## Check these every time you start a new project ########## +##########------------------------------------------------------########## + +MCU = atmega168p +F_CPU = 8000000UL +BAUD = 9600UL +## Also try BAUD = 19200 or 38400 if you're feeling lucky. + +## A directory for common include files and the simple USART library. +## If you move either the current folder or the Library folder, you'll +## need to change this path to match. +LIBDIR = ../../AVR-Programming-Library + +##########------------------------------------------------------########## +########## Programmer Defaults ########## +########## Set up once, then forget about it ########## +########## (Can override. See bottom of file.) ########## +##########------------------------------------------------------########## + +PROGRAMMER_TYPE = usbtiny +# extra arguments to avrdude: baud rate, chip type, -F flag, etc. +PROGRAMMER_ARGS = + +##########------------------------------------------------------########## +########## Program Locations ########## +########## Won't need to change if they're in your PATH ########## +##########------------------------------------------------------########## + +CC = avr-gcc +OBJCOPY = avr-objcopy +OBJDUMP = avr-objdump +AVRSIZE = avr-size +AVRDUDE = avrdude + +##########------------------------------------------------------########## +########## Makefile Magic! ########## +########## Summary: ########## +########## We want a .hex file ########## +########## Compile source files into .elf ########## +########## Convert .elf file into .hex ########## +########## You shouldn't need to edit below. ########## +##########------------------------------------------------------########## + +## The name of your project (without the .c) +# TARGET = blinkLED +## Or name it automatically after the enclosing directory +TARGET = $(lastword $(subst /, ,$(CURDIR))) + +# Object files: will find all .c/.h files in current directory +# and in LIBDIR. If you have any other (sub-)directories with code, +# you can add them in to SOURCES below in the wildcard statement. +SOURCES=$(wildcard *.c $(LIBDIR)/*.c) +OBJECTS=$(SOURCES:.c=.o) +HEADERS=$(SOURCES:.c=.h) + +## Compilation options, type man avr-gcc if you're curious. +CPPFLAGS = -DF_CPU=$(F_CPU) -DBAUD=$(BAUD) -I. -I$(LIBDIR) +CFLAGS = -Os -g -std=gnu99 -Wall +## Use short (8-bit) data types +CFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums +## Splits up object files per function +CFLAGS += -ffunction-sections -fdata-sections +LDFLAGS = -Wl,-Map,$(TARGET).map +## Optional, but often ends up with smaller code +LDFLAGS += -Wl,--gc-sections +## Relax shrinks code even more, but makes disassembly messy +## LDFLAGS += -Wl,--relax +## LDFLAGS += -Wl,-u,vfprintf -lprintf_flt -lm ## for floating-point printf +## LDFLAGS += -Wl,-u,vfprintf -lprintf_min ## for smaller printf +TARGET_ARCH = -mmcu=$(MCU) + +## Explicit pattern rules: +## To make .o files from .c files +%.o: %.c $(HEADERS) Makefile + $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c -o $@ $<; + +$(TARGET).elf: $(OBJECTS) + $(CC) $(LDFLAGS) $(TARGET_ARCH) $^ $(LDLIBS) -o $@ + +%.hex: %.elf + $(OBJCOPY) -j .text -j .data -O ihex $< $@ + +%.eeprom: %.elf + $(OBJCOPY) -j .eeprom --change-section-lma .eeprom=0 -O ihex $< $@ + +%.lst: %.elf + $(OBJDUMP) -S $< > $@ + +## These targets don't have files named after them +.PHONY: all disassemble disasm eeprom size clean squeaky_clean flash fuses + +all: $(TARGET).hex + +debug: + @echo + @echo "Source files:" $(SOURCES) + @echo "MCU, F_CPU, BAUD:" $(MCU), $(F_CPU), $(BAUD) + @echo + +# Optionally create listing file from .elf +# This creates approximate assembly-language equivalent of your code. +# Useful for debugging time-sensitive bits, +# or making sure the compiler does what you want. +disassemble: $(TARGET).lst + +disasm: disassemble + +# Optionally show how big the resulting program is +size: $(TARGET).elf + $(AVRSIZE) -C --mcu=$(MCU) $(TARGET).elf + +clean: + rm -f $(TARGET).elf $(TARGET).hex $(TARGET).obj \ + $(TARGET).o $(TARGET).d $(TARGET).eep $(TARGET).lst \ + $(TARGET).lss $(TARGET).sym $(TARGET).map $(TARGET)~ \ + $(TARGET).eeprom + +squeaky_clean: + rm -f *.elf *.hex *.obj *.o *.d *.eep *.lst *.lss *.sym *.map *~ *.eeprom + +##########------------------------------------------------------########## +########## Programmer-specific details ########## +########## Flashing code to AVR using avrdude ########## +##########------------------------------------------------------########## + +flash: $(TARGET).hex + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U flash:w:$< + +## An alias +program: flash + +flash_eeprom: $(TARGET).eeprom + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U eeprom:w:$< + +avrdude_terminal: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nt + +## If you've got multiple programmers that you use, +## you can define them here so that it's easy to switch. +## To invoke, use something like `make flash_arduinoISP` +flash_usbtiny: PROGRAMMER_TYPE = usbtiny +flash_usbtiny: PROGRAMMER_ARGS = # USBTiny works with no further arguments +flash_usbtiny: flash + +flash_usbasp: PROGRAMMER_TYPE = usbasp +flash_usbasp: PROGRAMMER_ARGS = # USBasp works with no further arguments +flash_usbasp: flash + +flash_arduinoISP: PROGRAMMER_TYPE = avrisp +flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P /dev/ttyACM0 +## (for windows) flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P com5 +flash_arduinoISP: flash + +flash_109: PROGRAMMER_TYPE = avr109 +flash_109: PROGRAMMER_ARGS = -b 9600 -P /dev/ttyUSB0 +flash_109: flash + +##########------------------------------------------------------########## +########## Fuse settings and suitable defaults ########## +##########------------------------------------------------------########## + +## Mega 48, 88, 168, 328 default values +LFUSE = 0x62 +HFUSE = 0xdf +EFUSE = 0x00 + +## Generic +FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m + +fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) \ + $(PROGRAMMER_ARGS) $(FUSE_STRING) +show_fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nv + +## Called with no extra definitions, sets to defaults +set_default_fuses: FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m +set_default_fuses: fuses + +## Set the fuse byte for full-speed mode +## Note: can also be set in firmware for modern chips +set_fast_fuse: LFUSE = 0xE2 +set_fast_fuse: FUSE_STRING = -U lfuse:w:$(LFUSE):m +set_fast_fuse: fuses + +## Set the EESAVE fuse byte to preserve EEPROM across flashes +set_eeprom_save_fuse: HFUSE = 0xD7 +set_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +set_eeprom_save_fuse: fuses + +## Clear the EESAVE fuse byte +clear_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +clear_eeprom_save_fuse: fuses diff --git a/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/arpeggiator/arpeggiator.c b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/arpeggiator/arpeggiator.c new file mode 100644 index 0000000..d714194 --- /dev/null +++ b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/arpeggiator/arpeggiator.c @@ -0,0 +1,78 @@ +/* + * "Algorithmic Symphonies" + * When you combine modula arithmetic with a counter variable, + * you can get sequences that sound like 4-bit chiptunes. + * Note that we're just outputting numerical values + * directly as a voltage. + * Play around with these formulas defined here, or see others + * in the attached file "music_formula_collection.txt". + * */ + +// ------- Preamble -------- // +#include /* Defines pins, ports, etc */ +#include /* Functions to waste time */ +#include +#include "pinDefines.h" +#include "macros.h" + +static inline void initTimer0(void){ + + set_bit(TCCR0A, COM0A1); /* PWM output on OCR0A */ + set_bit(SPEAKER_DDR, SPEAKER); /* enable output on pin */ + set_bit(TCCR0A, WGM00); /* Fast PWM mode */ + set_bit(TCCR0A, WGM01); /* Fast PWM mode, pt.2 */ + set_bit(TCCR0B, CS00); /* Clock with /1 prescaler */ +} + +static inline void pollButton(void){ + if (bit_is_clear(BUTTON_PIN, BUTTON)) { + set_bit(SPEAKER_DDR, SPEAKER); /* enable output on pin */ + clear_bit(LED_PORT, LED0); + } + else { + clear_bit(SPEAKER_DDR, SPEAKER); /* disable output on pin */ + set_bit(LED_PORT, LED0); + } +} + +int main(void){ + uint16_t t=0; + + // -------- Inits --------- // + clock_prescale_set(clock_div_1); /* CPU clock 8 MHz */ + initTimer0(); + + set_bit(BUTTON_PORT, BUTTON); /* pullup on button */ + + set_bit(LED_DDR, LED0); /* LED on for diagnostics */ + set_bit(LED_PORT, LED0); + _delay_ms(100); + clear_bit(LED_PORT, LED0); + + set_bit(SPEAKER_DDR, SPEAKER); + OCR0A = 210; + // ------ Event loop ------ // + while(1){ + + t++; + OCR0A = (uint8_t) ((t<<1)^((t<<1)+(t>>7)&t>>12))|t>>(4-(1^7&(t>>19)))|t>>7; /* "crowd" */ + // OCR0A = (uint8_t) t; /* sawtooth */ + // OCR0A = (uint8_t) t * (t >> 8); /* rising pitch + aliases all over */ + // OCR0A = (uint8_t) t & (t >> 8); /* arpeggios */ + // OCR0A = (uint8_t) t*( 42 & t >> 10 ); + // OCR0A = (uint8_t) t*(t>>((t>>9)|(t>>8))&(63&(t>>4))); /* space invaders vs pong */ + // OCR0A = (uint8_t) t*(t>>8*((t>>15)|(t>>8))&(20|(t>>19)*5>>t|(t>>3))); + // OCR0A = (uint8_t) (t*5&t>>7)|(t*3&t>>10); + // OCR0A = (uint8_t) (t*9 & t>>4 | t* 5 & t>> 7 | t * 3 & t/1024)-1; + // OCR0A = (uint8_t) (t>>5)|(t>>4)|((t%42)*(t>>4)|(0x15483113)-(t>>4))/(t>>16)^(t|(t>>4)); + // OCR0A = (uint8_t) t*(( (t>>12) | (t>>8)) & (63 & (t>>4)) ); /* glitchy */ + pollButton(); + _delay_us(124); /* Aiming for 8kHz sample rate */ + + } /* End event loop */ + return 0; /* This line is never reached */ +} + + + + diff --git a/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/arpeggiator/music_formula_collection.txt b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/arpeggiator/music_formula_collection.txt new file mode 100644 index 0000000..a5aa852 --- /dev/null +++ b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/arpeggiator/music_formula_collection.txt @@ -0,0 +1,320 @@ +Collection of oneliner music formulas. Version 2011-10-18 + +I've tried to collect all the formulas in the related threads etc. +(excluding those that clearly sound like random first experiments or total +crap; when several variants are available, i've chosen the shortest one) + +If you think I've missed something that should be here, please let me know. + +====== 1ST ITERATION ====== + +// viznut 2011-09-18 http://www.youtube.com/watch?v=GtQdIYUtAHg +t*(((t>>12)|(t>>8))&(63&(t>>4))) + +// tejeez 2011-09-18 http://www.youtube.com/watch?v=GtQdIYUtAHg +(t*(t>>5|t>>8))>>(t>>16) + +// visy 2011-09-18 http://www.youtube.com/watch?v=GtQdIYUtAHg +t*(((t>>9)|(t>>13))&(25&(t>>6))) + +// tejeez 2011-09-18 http://www.youtube.com/watch?v=GtQdIYUtAHg +t*(((t>>11)&(t>>8))&(123&(t>>3))) + +// visy 2011-09-18 http://www.youtube.com/watch?v=GtQdIYUtAHg +t*(t>>8*((t>>15)|(t>>8))&(20|(t>>19)*5>>t|(t>>3))) + +// tejeez 2011-09-18 http://www.youtube.com/watch?v=GtQdIYUtAHg +(-t&4095)*(255&t*(t&(t>>13)))>>12)+(127&t*(234&t>>8&t>>3)>>(3&t>>14)) + +// visy 2011-09-18 http://www.youtube.com/watch?v=GtQdIYUtAHg "Space Invaders vs Pong" +t*(t>>((t>>9)|(t>>8))&(63&(t>>4))) + +====== 2ND ITERATION ====== + +// viznut 2011-09-30 http://www.youtube.com/watch?v=qlrs2Vorw2Y +(t>>6|t|t>>(t>>16))*10+((t>>11)&7) + +// pyryp 2011-09-30 http://www.youtube.com/watch?v=qlrs2Vorw2Y +v=(v>>1)+(v>>4)+t*(((t>>16)|(t>>6))&(69&(t>>9))) + +// red- 2011-09-30 http://www.youtube.com/watch?v=qlrs2Vorw2Y +(t|(t>>9|t>>7))*t&(t>>11|t>>9) + +// miiro 2011-09-30 http://www.youtube.com/watch?v=qlrs2Vorw2Y +t*5&(t>>7)|t*3&(t*4>>10) + +// viznut 2011-09-30 http://www.youtube.com/watch?v=qlrs2Vorw2Y (xpansive+varjohukka) +(t>>7|t|t>>6)*10+4*(t&t>>13|t>>6) + +// skurk+raer 2011-09-30 http://www.youtube.com/watch?v=qlrs2Vorw2Y +((t&4096)?((t*(t^t%255)|(t>>4))>>1):(t>>3)|((t&8192)?t<<2:t)) + +// xpansive 2011-09-29 http://pouet.net/topic.php?which=8357&page=2 "Lost in Space" +((t*(t>>8|t>>9)&46&t>>8))^(t&t>>13|t>>6) + +====== 3RD ITERATION ====== + +// viznut 2011-10-10 http://www.youtube.com/watch?v=tCRPUv8V22o +(t*5&t>>7)|(t*3&t>>10) + +// bst 2011-10-10 http://www.youtube.com/watch?v=tCRPUv8V22o +(int)(t/1e7*t*t+t)%127|t>>4|t>>5|t%127+(t>>16)|t + +// kb 2011-10-04 http://pouet.net/topic.php?which=8357&page=8 44kHz +((t/2*(15&(0x234568a0>>(t>>8&28))))|t/2>>(t>>11)^t>>12)+(t/16&t&24) + +// viznut 2011-10-10 http://www.youtube.com/watch?v=tCRPUv8V22o +(t&t%255)-(t*3&t>>13&t>>6) + +// droid 2011-10-10 http://www.youtube.com/watch?v=tCRPUv8V22o +t>>4|t&((t>>5)/(t>>7-(t>>15)&-t>>7-(t>>15))) + +// ryg 2011-10-10 http://www.youtube.com/watch?v=tCRPUv8V22o 44.1 kHz +((t*("36364689"[t>>13&7]&15))/12&128)+(((((t>>12)^(t>>12)-2)%11*t)/4|t>>13)&127) + +// stephth 2011-10-03 http://news.ycombinator.com/item?id=3063359 +(t*9&t>>4|t*5&t>>7|t*3&t/1024)-1 + +// viznut+oasiz 2011-10-10 http://www.youtube.com/watch?v=tCRPUv8V22o "Dante's Inferno" short version +((t*(t>>12)&(201*t/100)&(199*t/100))&(t*(t>>14)&(t*301/100)&(t*399/100)))+((t*(t>>16)&(t*202/100)&(t*198/100))-(t*(t>>17)&(t*302/100)&(t*298/100))) + +// viznut+oasiz 2011-10-10 http://www.youtube.com/watch?v=tCRPUv8V22o "Dante's Inferno" long version +((t*(t>>12)&(201*t/100)&(199*t/100))&(t*(t>>14)&(t*301/100)&(t*399/100)))+((t*(t>>16)&(t*202/100)&(t*198/100))-(t*(t>>18)&(t*302/100)&(t*298/100))) + +// mu6k 2011-10-10 http://www.youtube.com/watch?v=tCRPUv8V22o "Long-line Theory", Chaos Theory cover, optimized by ryg, p01 et al., JS-only +w=t>>9,k=32,m=2048,a=1-t/m%1,d=(14*t*t^t)%m*a,y=[3,3,4.7,2][p=w/k&3]*t/4,h="IQNNNN!!]]!Q!IW]WQNN??!!W]WQNNN?".charCodeAt(w/2&15|p/3<<4)/33*t-t,s=y*.98%80+y%80+(w>>7&&a*((5*t%m*a&128)*(0x53232323>>w/4&1)+(d&127)*(0xa444c444>>w/4&1)*1.5+(d*w&1)+(h%k+h*1.99%k+h*.49%k+h*.97%k-64)*(4-a-a))),s*s>>14?127:s + +// 216 2011-10-10 http://www.youtube.com/watch?v=tCRPUv8V22o +t*(t^t+(t>>15|1)^(t-1280^t)>>10) + +// mu6k http://www.youtube.com/watch?v=tCRPUv8V22o 32.0 kHz +(3e3/(y=t&16383)&1)*35 +(x=t*"6689"[t>>16&3]/24&127)*y/4e4 +((t>>8^t>>10|t>>14|x)&63) + +====== 0XA VIDEOS ====== + +// harism 2011-10-09 http://0xa.kuri.mu/2011/10/09/bitop-videos/ +((t>>1%128)+20)*3*t>>14*t>>18 + +// tangent128 2011-10-09 http://0xa.kuri.mu/2011/10/09/bitop-videos/ +t*(((t>>9)&10)|((t>>11)&24)^((t>>10)&15&(t>>15))) + +// ultrageranium 2011-10-12 http://0xa.kuri.mu/2011/10/09/bitop-videos/ +(t*t/256)&(t>>((t/1024)%16))^t%64*(0xC0D3DE4D69>>(t>>9&30)&t%32)*t>>18 + +====== ALL COLLECTED FORMULAS (length order) ====== + +// trivial minimum: plain sawtooth +t + +// minimal sierpinski harmony +t&t>>8 + +// "the 42 melody", separately discovered by several people on irc etc +t*(42&t>>10) + +// danharaj 2011-10-03 http://www.reddit.com/r/programming/comments/kyj77/algorithmic_symphonies_from_one_line_of_code_how/ "fractal trees", 216's version +t|t%255|t%257 + +// droid 2011-10-05 http://pouet.net/topic.php?which=8357&page=10 +t>>6&1?t>>5:-t>>4 + +// Niklas_Roy 2011-10-14 http://countercomplex.blogspot.com/2011/10/algorithmic-symphonies-from-one-line-of.html +t*(t>>9|t>>13)&16 + +// krcko 2011-10-04 http://rafforum.rs/index.php/topic,123.0.html +(t&t>>12)*(t>>4|t>>8) + +// viznut 2011-10-10 http://www.youtube.com/watch?v=tCRPUv8V22o +(t*5&t>>7)|(t*3&t>>10) + +// tejeez 2011-09-18 http://www.youtube.com/watch?v=GtQdIYUtAHg +(t*(t>>5|t>>8))>>(t>>16) + +// miiro 2011-09-30 http://www.youtube.com/watch?v=qlrs2Vorw2Y +t*5&(t>>7)|t*3&(t*4>>10) + +// robert 2011-10-11 http://countercomplex.blogspot.com/2011/10/algorithmic-symphonies-from-one-line-of.html +(t>>13|t%24)&(t>>7|t%19) + +// Niklas_Roy 2011-10-14 http://countercomplex.blogspot.com/2011/10/algorithmic-symphonies-from-one-line-of.html +(t*((t>>9|t>>13)&15))&129 + +// viznut 2011-10-10 http://www.youtube.com/watch?v=tCRPUv8V22o +(t&t%255)-(t*3&t>>13&t>>6) + +// krcko 2011-10-04 http://rafforum.rs/index.php/topic,123.0.html +(t&t>>12)*(t>>4|t>>8)^t>>6 + +// blueberry 2011-10-05 http://pouet.net/topic.php?which=8357&page=12 11kHz +t*(((t>>9)^((t>>9)-1)^1)%13) + +// rrola 2011-10-04 http://pouet.net/topic.php?which=8357&page=9 optimized by ryg +t*(0xCA98>>(t>>9&14)&15)|t>>8 + +// tonic 2011-10-01 http://pouet.net/topic.php?which=8357&page=5 "mr. arpeggiator playing a solo" +(t/8)>>(t>>9)*t/((t>>14&3)+4) + +// FreeFull 2011-10-12 http://countercomplex.blogspot.com/2011/10/algorithmic-symphonies-from-one-line-of.html +(~t/100|(t*3))^(t*3&(t>>5))&t + +// red- 2011-09-30 http://www.youtube.com/watch?v=qlrs2Vorw2Y +(t|(t>>9|t>>7))*t&(t>>11|t>>9) + +// harism 2011-10-09 http://0xa.kuri.mu/2011/10/09/bitop-videos/ +((t>>1%128)+20)*3*t>>14*t>>18 + +// droid 2011-10-04 http://pouet.net/topic.php?which=8357&page=9 +t&(sin(t&t&3)*t>>5)/(t>>3&t>>6) + +// viznut 2011-09-18 http://www.youtube.com/watch?v=GtQdIYUtAHg +t*(((t>>12)|(t>>8))&(63&(t>>4))) + +// visy 2011-09-18 http://www.youtube.com/watch?v=GtQdIYUtAHg +t*(((t>>9)|(t>>13))&(25&(t>>6))) + +// 216 2011-10-10 http://www.youtube.com/watch?v=tCRPUv8V22o +t*(t^t+(t>>15|1)^(t-1280^t)>>10) + +// tejeez 2011-09-18 http://www.youtube.com/watch?v=GtQdIYUtAHg +t*(((t>>11)&(t>>8))&(123&(t>>3))) + +// viznut 2011-09-30 http://www.youtube.com/watch?v=qlrs2Vorw2Y (xpansive+varjohukka) +(t>>7|t|t>>6)*10+4*(t&t>>13|t>>6) + +// stephth 2011-10-03 http://news.ycombinator.com/item?id=3063359 +(t*9&t>>4|t*5&t>>7|t*3&t/1024)-1 + +// visy 2011-09-18 http://www.youtube.com/watch?v=GtQdIYUtAHg "Space Invaders vs Pong" +t*(t>>((t>>9)|(t>>8))&(63&(t>>4))) + +// viznut 2011-09-30 http://www.youtube.com/watch?v=qlrs2Vorw2Y +(t>>6|t|t>>(t>>16))*10+((t>>11)&7) + +// yumeji 2011-10-04 http://pouet.net/topic.php?which=8357&page=9 +(t>>1)*(0xbad2dea1>>(t>>13)&3)|t>>5 + +// ryg 2011-10-04 http://pouet.net/topic.php?which=8357&page=8 +(t>>4)*(13&(0x8898a989>>(t>>11&30))) + +// marmakoide 2011-10-04 http://pouet.net/topic.php?which=8357&page=8 +(t>>(t&7))|(t<<(t&42))|(t>>7)|(t<<5) + +// robert 2011-10-11 http://countercomplex.blogspot.com/2011/10/algorithmic-symphonies-from-one-line-of.html +(t>>7|t%45)&(t>>8|t%35)&(t>>11|t%20) + +// lucasvb 2011-10-03 http://www.reddit.com/r/programming/comments/kyj77/algorithmic_symphonies_from_one_line_of_code_how/ +(t>>6|t<<1)+(t>>5|t<<3|t>>3)|t>>2|t<<1 + +// bear @ celephais +t+(t&t^t>>6)-t*((t>>9)&(t%16?2:6)&t>>9) + +// xpansive 2011-09-29 http://pouet.net/topic.php?which=8357&page=2 "Lost in Space" +((t*(t>>8|t>>9)&46&t>>8))^(t&t>>13|t>>6) + +// rez 2011-10-05 http://pouet.net/topic.php?which=8357&page=11 js-only optimized by ryg +t*(1+"4451"[t>>13&3]/10)&t>>9+(t*0.003&3) + +// marmakoide 2011-10-03 http://pouet.net/topic.php?which=8357&page=7 "Lemmings March" +(t>>5)|(t<<4)|((t&1023)^1981)|((t-67)>>4) + +// droid 2011-10-04 http://pouet.net/topic.php?which=8357&page=9 +t>>4|t&(t>>5)/(t>>7-(t>>15)&-t>>7-(t>>15)) + +// rez 2011-10-03 http://pouet.net/topic.php?which=8357&page=7 +t*(t/256)-t*(t/255)+t*(t>>5|t>>6|t<<2&t>>1) + +// viznut 2011-10-06 #countercomplex "moon scanner generalization", based on jaffa's formula +((t>>5&t)-(t>>5)+(t>>5&t))+(t*((t>>14)&14)) + +// viznut 2011-10-04 http://pouet.net/topic.php?which=8357&page=9 +(t*((3+(1^t>>10&5))*(5+(3&t>>14))))>>(t>>8&3) + +// droid 2011-10-10 http://www.youtube.com/watch?v=tCRPUv8V22o +t>>4|t&DIV((t>>5),(t>>7-(t>>15)&-t>>7-(t>>15))) + +// pyryp 2011-09-30 http://www.youtube.com/watch?v=qlrs2Vorw2Y +v=(v>>1)+(v>>4)+t*(((t>>16)|(t>>6))&(69&(t>>9))) + +// bst 2011-10-10 http://www.youtube.com/watch?v=tCRPUv8V22o +(int)(t/1e7*t*t+t)%127|t>>4|t>>5|t%127+(t>>16)|t + +// tangent128 2011-10-09 http://0xa.kuri.mu/2011/10/09/bitop-videos/ +t*(((t>>9)&10)|((t>>11)&24)^((t>>10)&15&(t>>15))) + +// tejeez 2011-10-05 #countercomplex +(~t>>2)*((127&t*(7&t>>10))<(245&t*(2+(5&t>>14)))) + +// lokori 2011-10-04 #suomiscene +(t+(t>>2)|(t>>5))+(t>>3)|((t>>13)|(t>>7)|(t>>11)) + +// visy 2011-09-18 http://www.youtube.com/watch?v=GtQdIYUtAHg +t*(t>>8*((t>>15)|(t>>8))&(20|(t>>19)*5>>t|(t>>3))) + +// Aaron_Krister_Johnson 2011-10-14 http://countercomplex.blogspot.com/2011/10/algorithmic-symphonies-from-one-line-of.html +(t>>4)|(t%10)|(((t%101)|(t>>14))&((t>>7)|(t*t%17))) + +// jounim 2011-10-04 #suomiscene +((t&((t>>5)))+(t|((t>>7))))&(t>>6)|(t>>5)&(t*(t>>7)) + +// spikey 2011-10-04 #suomiscene based on jounim's formula +((t&((t>>23)))+(t|(t>>2)))&(t>>3)|(t>>5)&(t*(t>>7)) + +// akx 2011-10-05 http://twitter.com/#!/akx +(((((t*((t>>9|t>>13)&15))&255/15)*9)%(1<<7))<<2)%6<<4 + +// bst 2011-10-05 http://pouet.net/topic.php?which=8357&page=10 +((t%42)*(t>>4)|(0x15483113)-(t>>4))/(t>>16)^(t|(t>>4)) + +// skurk 2011-10-04 http://pouet.net/topic.php?which=8357&page=8 +t*(t>>((t&4096)?((t*t)/4096):(t/4096)))|(t<<(t/256))|(t>>4) + +// skurk+raer 2011-09-30 http://www.youtube.com/watch?v=qlrs2Vorw2Y +((t&4096)?((t*(t^t%255)|(t>>4))>>1):(t>>3)|((t&8192)?t<<2:t)) + +// yumeji 2011-10-06 http://pouet.net/topic.php?which=8357&page=12 "badbeats & safe" +t*((0xbadbea75>>((t>>12)&30)&3)*0.25*(0x5afe5>>((t>>16)&28)&3)) + +// bst 2011-10-11 http://pouet.net/topic.php?which=8357&page=18 +t>>16|((t>>4)%16)|((t>>4)%192)|(t*t%64)|(t*t%96)|(t>>16)*(t|t>>5) + +// bear @ celephais +t>>6^t&37|t+(t^t>>11)-t*((t%24?2:6)&t>>11)^t<<1&(t&598?t>>4:t>>10) + +// kb 2011-10-04 http://pouet.net/topic.php?which=8357&page=8 44kHz +((t/2*(15&(0x234568a0>>(t>>8&28))))|t/2>>(t>>11)^t>>12)+(t/16&t&24) + +// bst 2011-10-05 http://pouet.net/topic.php?which=8357&page=12 +(t>>5)|(t>>4)|((t%42)*(t>>4)|(0x15483113)-(t>>4))/(t>>16)^(t|(t>>4)) + +// tejeez 2011-09-18 http://www.youtube.com/watch?v=GtQdIYUtAHg +(-t&4095)*(255&t*(t&(t>>13)))>>12)+(127&t*(234&t>>8&t>>3)>>(3&t>>14)) + +// ultrageranium 2011-10-12 http://0xa.kuri.mu/2011/10/09/bitop-videos/ +(t*t/256)&(t>>((t/1024)%16))^t%64*(0xC0D3DE4D69>>(t>>9&30)&t%32)*t>>18 + +// visy 2011-10-06 http://pouet.net/topic.php?which=8357&page=13 +(t%25-(t>>2|t*15|t%227)-t>>3)|((t>>5)&(t<<5)*1663|(t>>3)%1544)/(t%17|t%2048) + +// ryg 2011-10-10 http://www.youtube.com/watch?v=tCRPUv8V22o 44.1 kHz +((t*("36364689"[t>>13&7]&15))/12&128)+(((((t>>12)^(t>>12)-2)%11*t)/4|t>>13)&127) + +// mu6k http://www.youtube.com/watch?v=tCRPUv8V22o 32.0 kHz +(3e3/(y=t&16383)&1)*35 +(x=t*"6689"[t>>16&3]/24&127)*y/4e4 +((t>>8^t>>10|t>>14|x)&63) + +// Ola 2011-10-11 http://countercomplex.blogspot.com/2011/10/algorithmic-symphonies-from-one-line-of.html +((1-(((t+10)>>((t>>9)&((t>>14))))&(t>>4&-2)))*2)*(((t>>10)^((t+((t>>6)&127))>>10))&1)*32+128 + +// raer 2011-10-07 http://pouet.net/topic.php?which=8357&page=16 stereo 11kHz +L: ((t&4096)?((t*(t^t%255)|(t>>4))>>1):(t>>3)|((t&8192)?t<<2:t)) R: t*(((t>>9)^((t>>9)-1)^1)%13) + +// ryg 2011-10-04 http://pouet.net/topic.php?which=8357&page=8 +((t>>4)*(13&(0x8898a989>>(t>>11&30)))&255)+((((t>>9|(t>>2)|t>>8)*10+4*((t>>2)&t>>15|t>>8))&255)>>1) + +// gasman 2011-10-05 http://pouet.net/topic.php?which=8357&page=12 js-only +(t<<3)*[8/9,1,9/8,6/5,4/3,3/2,0][[0xd2d2c8,0xce4088,0xca32c8,0x8e4009][t>>14&3]>>(0x3dbe4688>>((t>>10&15)>9?18:t>>10&15)*3&7)*3&7] + +// a1k0n http://news.ycombinator.com/item?id=3063359 js-only +SS=function(s,o,r,p){var c=s.charCodeAt((t>>r)%p);return c==32?0:31&t*Math.pow(2,c/12-o)},SS("0 0 7 7 037:<<",6,10,32) + (t&4096?SS("037",4,8,3)*(4096-(t&4095))>>12 : 0) + +// mu6k 2011-10-10 http://www.youtube.com/watch?v=tCRPUv8V22o "Long-line Theory", Chaos Theory cover, optimized by ryg, p01 et al., JS-only +w=t>>9,k=32,m=2048,a=1-t/m%1,d=(14*t*t^t)%m*a,y=[3,3,4.7,2][p=w/k&3]*t/4,h="IQNNNN!!]]!Q!IW]WQNN??!!W]WQNNN?".charCodeAt(w/2&15|p/3<<4)/33*t-t,s=y*.98%80+y%80+(w>>7&&a*((5*t%m*a&128)*(0x53232323>>w/4&1)+(d&127)*(0xa444c444>>w/4&1)*1.5+(d*w&1)+(h%k+h*1.99%k+h*.49%k+h*.97%k-64)*(4-a-a))),s*s>>14?127:s diff --git a/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds/Makefile b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds/Makefile new file mode 100644 index 0000000..5c588dc --- /dev/null +++ b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds/Makefile @@ -0,0 +1,196 @@ + +##########------------------------------------------------------########## +########## Project-specific Details ########## +########## Check these every time you start a new project ########## +##########------------------------------------------------------########## + +MCU = atmega168p +F_CPU = 8000000UL +BAUD = 9600UL +## Also try BAUD = 19200 or 38400 if you're feeling lucky. + +## A directory for common include files and the simple USART library. +## If you move either the current folder or the Library folder, you'll +## need to change this path to match. +LIBDIR = ../../AVR-Programming-Library + +##########------------------------------------------------------########## +########## Programmer Defaults ########## +########## Set up once, then forget about it ########## +########## (Can override. See bottom of file.) ########## +##########------------------------------------------------------########## + +PROGRAMMER_TYPE = usbtiny +# extra arguments to avrdude: baud rate, chip type, -F flag, etc. +PROGRAMMER_ARGS = + +##########------------------------------------------------------########## +########## Program Locations ########## +########## Won't need to change if they're in your PATH ########## +##########------------------------------------------------------########## + +CC = avr-gcc +OBJCOPY = avr-objcopy +OBJDUMP = avr-objdump +AVRSIZE = avr-size +AVRDUDE = avrdude + +##########------------------------------------------------------########## +########## Makefile Magic! ########## +########## Summary: ########## +########## We want a .hex file ########## +########## Compile source files into .elf ########## +########## Convert .elf file into .hex ########## +########## You shouldn't need to edit below. ########## +##########------------------------------------------------------########## + +## The name of your project (without the .c) +# TARGET = blinkLED +## Or name it automatically after the enclosing directory +TARGET = $(lastword $(subst /, ,$(CURDIR))) + +# Object files: will find all .c/.h files in current directory +# and in LIBDIR. If you have any other (sub-)directories with code, +# you can add them in to SOURCES below in the wildcard statement. +SOURCES=$(wildcard *.c $(LIBDIR)/*.c) +OBJECTS=$(SOURCES:.c=.o) +HEADERS=$(SOURCES:.c=.h) + +## Compilation options, type man avr-gcc if you're curious. +CPPFLAGS = -DF_CPU=$(F_CPU) -DBAUD=$(BAUD) -I. -I$(LIBDIR) +CFLAGS = -Os -g -std=gnu99 -Wall +## Use short (8-bit) data types +CFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums +## Splits up object files per function +CFLAGS += -ffunction-sections -fdata-sections +LDFLAGS = -Wl,-Map,$(TARGET).map +## Optional, but often ends up with smaller code +LDFLAGS += -Wl,--gc-sections +## Relax shrinks code even more, but makes disassembly messy +## LDFLAGS += -Wl,--relax +## LDFLAGS += -Wl,-u,vfprintf -lprintf_flt -lm ## for floating-point printf +## LDFLAGS += -Wl,-u,vfprintf -lprintf_min ## for smaller printf +TARGET_ARCH = -mmcu=$(MCU) + +## Explicit pattern rules: +## To make .o files from .c files +%.o: %.c $(HEADERS) Makefile + $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c -o $@ $<; + +$(TARGET).elf: $(OBJECTS) + $(CC) $(LDFLAGS) $(TARGET_ARCH) $^ $(LDLIBS) -o $@ + +%.hex: %.elf + $(OBJCOPY) -j .text -j .data -O ihex $< $@ + +%.eeprom: %.elf + $(OBJCOPY) -j .eeprom --change-section-lma .eeprom=0 -O ihex $< $@ + +%.lst: %.elf + $(OBJDUMP) -S $< > $@ + +## These targets don't have files named after them +.PHONY: all disassemble disasm eeprom size clean squeaky_clean flash fuses + +all: $(TARGET).hex + +debug: + @echo + @echo "Source files:" $(SOURCES) + @echo "MCU, F_CPU, BAUD:" $(MCU), $(F_CPU), $(BAUD) + @echo + +# Optionally create listing file from .elf +# This creates approximate assembly-language equivalent of your code. +# Useful for debugging time-sensitive bits, +# or making sure the compiler does what you want. +disassemble: $(TARGET).lst + +disasm: disassemble + +# Optionally show how big the resulting program is +size: $(TARGET).elf + $(AVRSIZE) -C --mcu=$(MCU) $(TARGET).elf + +clean: + rm -f $(TARGET).elf $(TARGET).hex $(TARGET).obj \ + $(TARGET).o $(TARGET).d $(TARGET).eep $(TARGET).lst \ + $(TARGET).lss $(TARGET).sym $(TARGET).map $(TARGET)~ \ + $(TARGET).eeprom + +squeaky_clean: + rm -f *.elf *.hex *.obj *.o *.d *.eep *.lst *.lss *.sym *.map *~ *.eeprom + +##########------------------------------------------------------########## +########## Programmer-specific details ########## +########## Flashing code to AVR using avrdude ########## +##########------------------------------------------------------########## + +flash: $(TARGET).hex + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U flash:w:$< + +## An alias +program: flash + +flash_eeprom: $(TARGET).eeprom + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U eeprom:w:$< + +avrdude_terminal: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nt + +## If you've got multiple programmers that you use, +## you can define them here so that it's easy to switch. +## To invoke, use something like `make flash_arduinoISP` +flash_usbtiny: PROGRAMMER_TYPE = usbtiny +flash_usbtiny: PROGRAMMER_ARGS = # USBTiny works with no further arguments +flash_usbtiny: flash + +flash_usbasp: PROGRAMMER_TYPE = usbasp +flash_usbasp: PROGRAMMER_ARGS = # USBasp works with no further arguments +flash_usbasp: flash + +flash_arduinoISP: PROGRAMMER_TYPE = avrisp +flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P /dev/ttyACM0 +## (for windows) flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P com5 +flash_arduinoISP: flash + +flash_109: PROGRAMMER_TYPE = avr109 +flash_109: PROGRAMMER_ARGS = -b 9600 -P /dev/ttyUSB0 +flash_109: flash + +##########------------------------------------------------------########## +########## Fuse settings and suitable defaults ########## +##########------------------------------------------------------########## + +## Mega 48, 88, 168, 328 default values +LFUSE = 0x62 +HFUSE = 0xdf +EFUSE = 0x00 + +## Generic +FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m + +fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) \ + $(PROGRAMMER_ARGS) $(FUSE_STRING) +show_fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nv + +## Called with no extra definitions, sets to defaults +set_default_fuses: FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m +set_default_fuses: fuses + +## Set the fuse byte for full-speed mode +## Note: can also be set in firmware for modern chips +set_fast_fuse: LFUSE = 0xE2 +set_fast_fuse: FUSE_STRING = -U lfuse:w:$(LFUSE):m +set_fast_fuse: fuses + +## Set the EESAVE fuse byte to preserve EEPROM across flashes +set_eeprom_save_fuse: HFUSE = 0xD7 +set_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +set_eeprom_save_fuse: fuses + +## Clear the EESAVE fuse byte +clear_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +clear_eeprom_save_fuse: fuses diff --git a/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds/dds.c b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds/dds.c new file mode 100644 index 0000000..1a8ea58 --- /dev/null +++ b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds/dds.c @@ -0,0 +1,56 @@ + /* Direct-digital synthesis */ + +// ------- Preamble -------- // +#include /* Defines pins, ports, etc */ +#include /* Functions to waste time */ +#include + +#include "pinDefines.h" + +#include "fullSine.h" + +static inline void initTimer0(void) { + TCCR0A |= (1 << COM0A1); /* PWM output on OCR0A */ + SPEAKER_DDR |= (1 << SPEAKER); /* enable output on pin */ + + TCCR0A |= (1 << WGM00); /* Fast PWM mode */ + TCCR0A |= (1 << WGM01); /* Fast PWM mode, pt.2 */ + + TCCR0B |= (1 << CS00); /* Clock with /1 prescaler */ +} + +int main(void) { + + uint16_t accumulator = 0; + uint16_t accumulatorSteps = 880; /* approx 440 Hz */ + uint8_t waveStep; + int8_t pwmValue; + + // -------- Inits --------- // + + clock_prescale_set(clock_div_1); /* CPU clock 8 MHz */ + initTimer0(); + BUTTON_PORT |= (1 << BUTTON); /* pullup on button */ + + // ------ Event loop ------ // + while (1) { + + if (bit_is_clear(BUTTON_PIN, BUTTON)) { + + SPEAKER_DDR |= (1 << SPEAKER); /* enable speaker */ + accumulator += accumulatorSteps; /* advance accumulator */ + waveStep = accumulator >> 8; /* which entry in lookup? */ + pwmValue = fullSine[waveStep]; /* lookup voltage */ + + loop_until_bit_is_set(TIFR0, TOV0); /* wait for PWM cycle */ + OCR0A = 128 + pwmValue; /* set new PWM value */ + TIFR0 |= (1 << TOV0); /* reset PWM overflow bit */ + } + + else { /* button not pressed */ + SPEAKER_DDR &= ~(1 << SPEAKER); /* disable speaker */ + } + + } /* End event loop */ + return 0; /* This line is never reached */ +} diff --git a/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds/fullSaw15.h b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds/fullSaw15.h new file mode 100644 index 0000000..69e64a3 --- /dev/null +++ b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds/fullSaw15.h @@ -0,0 +1,34 @@ +int8_t fullSaw15[256] = { + 0, 1, 3, 4, 5, 6, 7, 7, + 7, 7, 7, 7, 8, 9, 10, 12, + 13, 15, 17, 18, 20, 21, 21, 22, + 22, 22, 22, 22, 22, 23, 24, 25, + 27, 29, 31, 33, 34, 35, 36, 36, + 36, 36, 36, 36, 36, 37, 38, 39, + 41, 43, 45, 47, 48, 50, 51, 51, + 51, 51, 51, 51, 51, 51, 52, 53, + 54, 56, 58, 61, 63, 64, 66, 66, + 67, 66, 66, 65, 65, 65, 65, 66, + 68, 70, 72, 75, 77, 79, 81, 82, + 82, 82, 81, 80, 79, 78, 78, 78, + 80, 82, 85, 88, 92, 95, 97, 99, + 100, 99, 98, 95, 93, 90, 88, 88, + 89, 91, 96, 101, 108, 115, 121, 125, + 127, 125, 119, 108, 93, 74, 51, 26, + 0, -27, -52, -75, -94, -109, -120, -126, + -128, -126, -122, -116, -109, -102, -97, -92, + -90, -89, -89, -91, -94, -96, -99, -100, + -101, -100, -98, -96, -93, -89, -86, -83, + -81, -79, -79, -79, -80, -81, -82, -83, + -83, -83, -82, -80, -78, -76, -73, -71, + -69, -67, -66, -66, -66, -66, -67, -67, + -68, -67, -67, -65, -64, -62, -59, -57, + -55, -54, -53, -52, -52, -52, -52, -52, + -52, -52, -52, -51, -49, -48, -46, -44, + -42, -40, -39, -38, -37, -37, -37, -37, + -37, -37, -37, -36, -35, -34, -32, -30, + -28, -26, -25, -24, -23, -23, -23, -23, + -23, -23, -22, -22, -21, -19, -18, -16, + -14, -13, -11, -10, -9, -8, -8, -8, + -8, -8, -8, -7, -6, -5, -4, -2 +}; diff --git a/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds/fullSaw3.h b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds/fullSaw3.h new file mode 100644 index 0000000..c0c1877 --- /dev/null +++ b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds/fullSaw3.h @@ -0,0 +1,34 @@ +int8_t fullSaw3[256] = { + 0, 2, 4, 6, 8, 10, 12, 14, + 16, 18, 20, 22, 23, 25, 27, 28, + 29, 31, 32, 33, 34, 35, 35, 36, + 37, 37, 38, 38, 38, 38, 39, 39, + 39, 39, 39, 38, 38, 38, 38, 38, + 38, 38, 38, 38, 38, 38, 38, 38, + 39, 39, 40, 40, 41, 42, 43, 44, + 45, 46, 47, 49, 51, 52, 54, 56, + 58, 61, 63, 65, 68, 70, 73, 76, + 79, 81, 84, 87, 90, 93, 96, 98, + 101, 104, 106, 109, 111, 114, 116, 118, + 120, 121, 123, 124, 125, 126, 126, 127, + 127, 127, 126, 126, 125, 124, 122, 120, + 118, 116, 113, 110, 107, 104, 100, 96, + 92, 87, 83, 78, 72, 67, 62, 56, + 50, 44, 38, 32, 25, 19, 12, 6, + 0, -7, -13, -20, -26, -33, -39, -45, + -51, -57, -63, -68, -73, -79, -84, -88, + -93, -97, -101, -105, -108, -111, -114, -117, + -119, -121, -123, -125, -126, -127, -127, -128, + -128, -128, -127, -127, -126, -125, -124, -122, + -121, -119, -117, -115, -112, -110, -107, -105, + -102, -99, -97, -94, -91, -88, -85, -82, + -80, -77, -74, -71, -69, -66, -64, -62, + -59, -57, -55, -53, -52, -50, -48, -47, + -46, -45, -44, -43, -42, -41, -41, -40, + -40, -39, -39, -39, -39, -39, -39, -39, + -39, -39, -39, -39, -39, -39, -40, -40, + -40, -40, -40, -39, -39, -39, -39, -38, + -38, -37, -36, -36, -35, -34, -33, -32, + -30, -29, -28, -26, -24, -23, -21, -19, + -17, -15, -13, -11, -9, -7, -5, -3 +}; diff --git a/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds/fullSaw7.h b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds/fullSaw7.h new file mode 100644 index 0000000..ef38b9e --- /dev/null +++ b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds/fullSaw7.h @@ -0,0 +1,34 @@ +int8_t fullSaw7[256] = { + 0, 1, 3, 5, 7, 8, 10, 11, + 12, 13, 14, 15, 15, 15, 15, 16, + 16, 16, 16, 16, 16, 16, 16, 17, + 17, 18, 19, 20, 21, 23, 24, 26, + 28, 30, 32, 34, 36, 38, 39, 41, + 43, 44, 45, 46, 47, 47, 48, 48, + 48, 48, 48, 48, 48, 47, 47, 47, + 47, 47, 48, 49, 50, 51, 52, 54, + 55, 57, 60, 62, 64, 66, 69, 71, + 73, 75, 77, 79, 80, 81, 82, 82, + 82, 82, 82, 81, 80, 80, 79, 78, + 77, 76, 75, 75, 75, 76, 76, 78, + 79, 81, 84, 87, 90, 94, 98, 102, + 106, 110, 114, 117, 121, 123, 125, 127, + 127, 127, 125, 122, 119, 114, 108, 101, + 93, 84, 74, 63, 51, 39, 26, 13, + 0, -14, -27, -40, -52, -64, -75, -85, + -94, -102, -109, -115, -120, -123, -126, -128, + -128, -128, -126, -124, -122, -118, -115, -111, + -107, -103, -99, -95, -91, -88, -85, -82, + -80, -79, -77, -77, -76, -76, -76, -77, + -78, -79, -80, -81, -81, -82, -83, -83, + -83, -83, -83, -82, -81, -80, -78, -76, + -74, -72, -70, -67, -65, -63, -61, -58, + -56, -55, -53, -52, -51, -50, -49, -48, + -48, -48, -48, -48, -49, -49, -49, -49, + -49, -49, -49, -48, -48, -47, -46, -45, + -44, -42, -40, -39, -37, -35, -33, -31, + -29, -27, -25, -24, -22, -21, -20, -19, + -18, -18, -17, -17, -17, -17, -17, -17, + -17, -17, -16, -16, -16, -16, -15, -14, + -13, -12, -11, -9, -8, -6, -4, -2 +}; diff --git a/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds/fullSine.h b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds/fullSine.h new file mode 100644 index 0000000..430d305 --- /dev/null +++ b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds/fullSine.h @@ -0,0 +1,34 @@ +int8_t fullSine[256] = { + 0, 3, 6, 9, 12, 15, 18, 21, + 24, 27, 30, 34, 37, 39, 42, 45, + 48, 51, 54, 57, 60, 62, 65, 68, + 70, 73, 75, 78, 80, 83, 85, 87, + 90, 92, 94, 96, 98, 100, 102, 104, + 106, 107, 109, 110, 112, 113, 115, 116, + 117, 118, 120, 121, 122, 122, 123, 124, + 125, 125, 126, 126, 126, 127, 127, 127, + 127, 127, 127, 127, 126, 126, 126, 125, + 125, 124, 123, 122, 122, 121, 120, 118, + 117, 116, 115, 113, 112, 110, 109, 107, + 106, 104, 102, 100, 98, 96, 94, 92, + 90, 87, 85, 83, 80, 78, 75, 73, + 70, 68, 65, 62, 60, 57, 54, 51, + 48, 45, 42, 39, 37, 34, 30, 27, + 24, 21, 18, 15, 12, 9, 6, 3, + 0, -4, -7, -10, -13, -16, -19, -22, + -25, -28, -31, -35, -38, -40, -43, -46, + -49, -52, -55, -58, -61, -63, -66, -69, + -71, -74, -76, -79, -81, -84, -86, -88, + -91, -93, -95, -97, -99, -101, -103, -105, + -107, -108, -110, -111, -113, -114, -116, -117, + -118, -119, -121, -122, -123, -123, -124, -125, + -126, -126, -127, -127, -127, -128, -128, -128, + -128, -128, -128, -128, -127, -127, -127, -126, + -126, -125, -124, -123, -123, -122, -121, -119, + -118, -117, -116, -114, -113, -111, -110, -108, + -107, -105, -103, -101, -99, -97, -95, -93, + -91, -88, -86, -84, -81, -79, -76, -74, + -71, -69, -66, -63, -61, -58, -55, -52, + -49, -46, -43, -40, -38, -35, -31, -28, + -25, -22, -19, -16, -13, -10, -7, -4 +}; diff --git a/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds/fullSquare15.h b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds/fullSquare15.h new file mode 100644 index 0000000..94a3515 --- /dev/null +++ b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds/fullSquare15.h @@ -0,0 +1,34 @@ +int8_t fullSquare15[256] = { + 0, 1, 3, 4, 5, 6, 7, 7, + 7, 7, 7, 7, 8, 9, 10, 12, + 13, 15, 17, 18, 20, 21, 21, 22, + 22, 22, 22, 22, 22, 23, 24, 25, + 27, 29, 31, 33, 34, 35, 36, 36, + 36, 36, 36, 36, 36, 37, 38, 39, + 41, 43, 45, 47, 48, 50, 51, 51, + 51, 51, 51, 51, 51, 51, 52, 53, + 54, 56, 58, 61, 63, 64, 66, 66, + 67, 66, 66, 65, 65, 65, 65, 66, + 68, 70, 72, 75, 77, 79, 81, 82, + 82, 82, 81, 80, 79, 78, 78, 78, + 80, 82, 85, 88, 92, 95, 97, 99, + 100, 99, 98, 95, 93, 90, 88, 88, + 89, 91, 96, 101, 108, 115, 121, 125, + 127, 125, 119, 108, 93, 74, 51, 26, + 0, -27, -52, -75, -94, -109, -120, -126, + -128, -126, -122, -116, -109, -102, -97, -92, + -90, -89, -89, -91, -94, -96, -99, -100, + -101, -100, -98, -96, -93, -89, -86, -83, + -81, -79, -79, -79, -80, -81, -82, -83, + -83, -83, -82, -80, -78, -76, -73, -71, + -69, -67, -66, -66, -66, -66, -67, -67, + -68, -67, -67, -65, -64, -62, -59, -57, + -55, -54, -53, -52, -52, -52, -52, -52, + -52, -52, -52, -51, -49, -48, -46, -44, + -42, -40, -39, -38, -37, -37, -37, -37, + -37, -37, -37, -36, -35, -34, -32, -30, + -28, -26, -25, -24, -23, -23, -23, -23, + -23, -23, -22, -22, -21, -19, -18, -16, + -14, -13, -11, -10, -9, -8, -8, -8, + -8, -8, -8, -7, -6, -5, -4, -2 +}; diff --git a/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds/fullSquare3.h b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds/fullSquare3.h new file mode 100644 index 0000000..c20fa0a --- /dev/null +++ b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds/fullSquare3.h @@ -0,0 +1,34 @@ +int8_t fullSquare3[256] = { + 0, 2, 4, 6, 8, 10, 12, 14, + 16, 18, 20, 22, 23, 25, 27, 28, + 29, 31, 32, 33, 34, 35, 35, 36, + 37, 37, 38, 38, 38, 38, 39, 39, + 39, 39, 39, 38, 38, 38, 38, 38, + 38, 38, 38, 38, 38, 38, 38, 38, + 39, 39, 40, 40, 41, 42, 43, 44, + 45, 46, 47, 49, 51, 52, 54, 56, + 58, 61, 63, 65, 68, 70, 73, 76, + 79, 81, 84, 87, 90, 93, 96, 98, + 101, 104, 106, 109, 111, 114, 116, 118, + 120, 121, 123, 124, 125, 126, 126, 127, + 127, 127, 126, 126, 125, 124, 122, 120, + 118, 116, 113, 110, 107, 104, 100, 96, + 92, 87, 83, 78, 72, 67, 62, 56, + 50, 44, 38, 32, 25, 19, 12, 6, + 0, -7, -13, -20, -26, -33, -39, -45, + -51, -57, -63, -68, -73, -79, -84, -88, + -93, -97, -101, -105, -108, -111, -114, -117, + -119, -121, -123, -125, -126, -127, -127, -128, + -128, -128, -127, -127, -126, -125, -124, -122, + -121, -119, -117, -115, -112, -110, -107, -105, + -102, -99, -97, -94, -91, -88, -85, -82, + -80, -77, -74, -71, -69, -66, -64, -62, + -59, -57, -55, -53, -52, -50, -48, -47, + -46, -45, -44, -43, -42, -41, -41, -40, + -40, -39, -39, -39, -39, -39, -39, -39, + -39, -39, -39, -39, -39, -39, -40, -40, + -40, -40, -40, -39, -39, -39, -39, -38, + -38, -37, -36, -36, -35, -34, -33, -32, + -30, -29, -28, -26, -24, -23, -21, -19, + -17, -15, -13, -11, -9, -7, -5, -3 +}; diff --git a/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds/fullSquare7.h b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds/fullSquare7.h new file mode 100644 index 0000000..43a679e --- /dev/null +++ b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds/fullSquare7.h @@ -0,0 +1,34 @@ +int8_t fullSquare7[256] = { + 0, 1, 3, 5, 7, 8, 10, 11, + 12, 13, 14, 15, 15, 15, 15, 16, + 16, 16, 16, 16, 16, 16, 16, 17, + 17, 18, 19, 20, 21, 23, 24, 26, + 28, 30, 32, 34, 36, 38, 39, 41, + 43, 44, 45, 46, 47, 47, 48, 48, + 48, 48, 48, 48, 48, 47, 47, 47, + 47, 47, 48, 49, 50, 51, 52, 54, + 55, 57, 60, 62, 64, 66, 69, 71, + 73, 75, 77, 79, 80, 81, 82, 82, + 82, 82, 82, 81, 80, 80, 79, 78, + 77, 76, 75, 75, 75, 76, 76, 78, + 79, 81, 84, 87, 90, 94, 98, 102, + 106, 110, 114, 117, 121, 123, 125, 127, + 127, 127, 125, 122, 119, 114, 108, 101, + 93, 84, 74, 63, 51, 39, 26, 13, + 0, -14, -27, -40, -52, -64, -75, -85, + -94, -102, -109, -115, -120, -123, -126, -128, + -128, -128, -126, -124, -122, -118, -115, -111, + -107, -103, -99, -95, -91, -88, -85, -82, + -80, -79, -77, -77, -76, -76, -76, -77, + -78, -79, -80, -81, -81, -82, -83, -83, + -83, -83, -83, -82, -81, -80, -78, -76, + -74, -72, -70, -67, -65, -63, -61, -58, + -56, -55, -53, -52, -51, -50, -49, -48, + -48, -48, -48, -48, -49, -49, -49, -49, + -49, -49, -49, -48, -48, -47, -46, -45, + -44, -42, -40, -39, -37, -35, -33, -31, + -29, -27, -25, -24, -22, -21, -20, -19, + -18, -18, -17, -17, -17, -17, -17, -17, + -17, -17, -16, -16, -16, -16, -15, -14, + -13, -12, -11, -9, -8, -6, -4, -2 +}; diff --git a/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds/fullTri15.h b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds/fullTri15.h new file mode 100644 index 0000000..e227e64 --- /dev/null +++ b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds/fullTri15.h @@ -0,0 +1,34 @@ +int8_t fullTri15[256] = { + 0, 1, 3, 4, 5, 6, 7, 7, + 7, 7, 7, 7, 8, 9, 10, 12, + 13, 15, 17, 18, 20, 21, 21, 22, + 22, 22, 22, 22, 22, 23, 24, 25, + 27, 29, 31, 33, 34, 35, 36, 36, + 36, 36, 36, 36, 36, 37, 38, 39, + 41, 43, 45, 47, 48, 50, 51, 51, + 51, 51, 51, 51, 51, 51, 52, 53, + 54, 56, 58, 61, 63, 64, 66, 66, + 67, 66, 66, 65, 65, 65, 65, 66, + 68, 70, 72, 75, 77, 79, 81, 82, + 82, 82, 81, 80, 79, 78, 78, 78, + 80, 82, 85, 88, 92, 95, 97, 99, + 100, 99, 98, 95, 93, 90, 88, 88, + 89, 91, 96, 101, 108, 115, 121, 125, + 127, 125, 119, 108, 93, 74, 51, 26, + 0, -27, -52, -75, -94, -109, -120, -126, + -128, -126, -122, -116, -109, -102, -97, -92, + -90, -89, -89, -91, -94, -96, -99, -100, + -101, -100, -98, -96, -93, -89, -86, -83, + -81, -79, -79, -79, -80, -81, -82, -83, + -83, -83, -82, -80, -78, -76, -73, -71, + -69, -67, -66, -66, -66, -66, -67, -67, + -68, -67, -67, -65, -64, -62, -59, -57, + -55, -54, -53, -52, -52, -52, -52, -52, + -52, -52, -52, -51, -49, -48, -46, -44, + -42, -40, -39, -38, -37, -37, -37, -37, + -37, -37, -37, -36, -35, -34, -32, -30, + -28, -26, -25, -24, -23, -23, -23, -23, + -23, -23, -22, -22, -21, -19, -18, -16, + -14, -13, -11, -10, -9, -8, -8, -8, + -8, -8, -8, -7, -6, -5, -4, -2 +}; diff --git a/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds/fullTri3.h b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds/fullTri3.h new file mode 100644 index 0000000..236e937 --- /dev/null +++ b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds/fullTri3.h @@ -0,0 +1,34 @@ +int8_t fullTri3[256] = { + 0, 2, 4, 6, 8, 10, 12, 14, + 16, 18, 20, 22, 23, 25, 27, 28, + 29, 31, 32, 33, 34, 35, 35, 36, + 37, 37, 38, 38, 38, 38, 39, 39, + 39, 39, 39, 38, 38, 38, 38, 38, + 38, 38, 38, 38, 38, 38, 38, 38, + 39, 39, 40, 40, 41, 42, 43, 44, + 45, 46, 47, 49, 51, 52, 54, 56, + 58, 61, 63, 65, 68, 70, 73, 76, + 79, 81, 84, 87, 90, 93, 96, 98, + 101, 104, 106, 109, 111, 114, 116, 118, + 120, 121, 123, 124, 125, 126, 126, 127, + 127, 127, 126, 126, 125, 124, 122, 120, + 118, 116, 113, 110, 107, 104, 100, 96, + 92, 87, 83, 78, 72, 67, 62, 56, + 50, 44, 38, 32, 25, 19, 12, 6, + 0, -7, -13, -20, -26, -33, -39, -45, + -51, -57, -63, -68, -73, -79, -84, -88, + -93, -97, -101, -105, -108, -111, -114, -117, + -119, -121, -123, -125, -126, -127, -127, -128, + -128, -128, -127, -127, -126, -125, -124, -122, + -121, -119, -117, -115, -112, -110, -107, -105, + -102, -99, -97, -94, -91, -88, -85, -82, + -80, -77, -74, -71, -69, -66, -64, -62, + -59, -57, -55, -53, -52, -50, -48, -47, + -46, -45, -44, -43, -42, -41, -41, -40, + -40, -39, -39, -39, -39, -39, -39, -39, + -39, -39, -39, -39, -39, -39, -40, -40, + -40, -40, -40, -39, -39, -39, -39, -38, + -38, -37, -36, -36, -35, -34, -33, -32, + -30, -29, -28, -26, -24, -23, -21, -19, + -17, -15, -13, -11, -9, -7, -5, -3 +}; diff --git a/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds/fullTri7.h b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds/fullTri7.h new file mode 100644 index 0000000..ed0af55 --- /dev/null +++ b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds/fullTri7.h @@ -0,0 +1,34 @@ +int8_t fullTri7[256] = { + 0, 1, 3, 5, 7, 8, 10, 11, + 12, 13, 14, 15, 15, 15, 15, 16, + 16, 16, 16, 16, 16, 16, 16, 17, + 17, 18, 19, 20, 21, 23, 24, 26, + 28, 30, 32, 34, 36, 38, 39, 41, + 43, 44, 45, 46, 47, 47, 48, 48, + 48, 48, 48, 48, 48, 47, 47, 47, + 47, 47, 48, 49, 50, 51, 52, 54, + 55, 57, 60, 62, 64, 66, 69, 71, + 73, 75, 77, 79, 80, 81, 82, 82, + 82, 82, 82, 81, 80, 80, 79, 78, + 77, 76, 75, 75, 75, 76, 76, 78, + 79, 81, 84, 87, 90, 94, 98, 102, + 106, 110, 114, 117, 121, 123, 125, 127, + 127, 127, 125, 122, 119, 114, 108, 101, + 93, 84, 74, 63, 51, 39, 26, 13, + 0, -14, -27, -40, -52, -64, -75, -85, + -94, -102, -109, -115, -120, -123, -126, -128, + -128, -128, -126, -124, -122, -118, -115, -111, + -107, -103, -99, -95, -91, -88, -85, -82, + -80, -79, -77, -77, -76, -76, -76, -77, + -78, -79, -80, -81, -81, -82, -83, -83, + -83, -83, -83, -82, -81, -80, -78, -76, + -74, -72, -70, -67, -65, -63, -61, -58, + -56, -55, -53, -52, -51, -50, -49, -48, + -48, -48, -48, -48, -49, -49, -49, -49, + -49, -49, -49, -48, -48, -47, -46, -45, + -44, -42, -40, -39, -37, -35, -33, -31, + -29, -27, -25, -24, -22, -21, -20, -19, + -18, -18, -17, -17, -17, -17, -17, -17, + -17, -17, -16, -16, -16, -16, -15, -14, + -13, -12, -11, -9, -8, -6, -4, -2 +}; diff --git a/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds/fullTriangle.h b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds/fullTriangle.h new file mode 100644 index 0000000..04cb022 --- /dev/null +++ b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds/fullTriangle.h @@ -0,0 +1,34 @@ +int8_t fullTriangle[256] = { + 0, 1, 3, 5, 7, 9, 11, 13, + 15, 17, 19, 21, 23, 25, 27, 29, + 31, 33, 35, 37, 39, 41, 43, 45, + 47, 49, 51, 53, 55, 57, 59, 61, + 63, 65, 67, 69, 71, 73, 75, 77, + 79, 81, 83, 85, 87, 89, 91, 93, + 95, 97, 99, 101, 103, 105, 107, 109, + 111, 113, 115, 117, 119, 121, 123, 125, + 127, 125, 123, 121, 119, 117, 115, 113, + 111, 109, 107, 105, 103, 101, 99, 97, + 95, 93, 91, 89, 87, 85, 83, 81, + 79, 77, 75, 73, 71, 69, 67, 65, + 63, 61, 59, 57, 55, 53, 51, 49, + 47, 45, 43, 41, 39, 37, 35, 33, + 31, 29, 27, 25, 23, 21, 19, 17, + 15, 13, 11, 9, 7, 5, 3, 1, + 0, -2, -4, -6, -8, -10, -12, -14, + -16, -18, -20, -22, -24, -26, -28, -30, + -32, -34, -36, -38, -40, -42, -44, -46, + -48, -50, -52, -54, -56, -58, -60, -62, + -64, -66, -68, -70, -72, -74, -76, -78, + -80, -82, -84, -86, -88, -90, -92, -94, + -96, -98, -100, -102, -104, -106, -108, -110, + -112, -114, -116, -118, -120, -122, -124, -126, + -128, -126, -124, -122, -120, -118, -116, -114, + -112, -110, -108, -106, -104, -102, -100, -98, + -96, -94, -92, -90, -88, -86, -84, -82, + -80, -78, -76, -74, -72, -70, -68, -66, + -64, -62, -60, -58, -56, -54, -52, -50, + -48, -46, -44, -42, -40, -38, -36, -34, + -32, -30, -28, -26, -24, -22, -20, -18, + -16, -14, -12, -10, -8, -6, -4, -2 +}; diff --git a/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds/generateWavetables.py b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds/generateWavetables.py new file mode 100644 index 0000000..905593f --- /dev/null +++ b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds/generateWavetables.py @@ -0,0 +1,101 @@ +## This file generates headers with lookup tables for various waveforms +## Add your own. + +import math + +def phaseSteps(maxPhase, length=256): + steps = range(0, length) + steps = [1.0*x/length * 2.0*math.pi * (maxPhase/360.0) for x in steps] + return(steps) + +def scaleAndRound(data, scale=255, signedInt=True): + data = [0.0+x-min(data) for x in data] + data = [1.0*x/max(data)*scale for x in data] + data = [int(round(x)) for x in data] + if signedInt: + data = [x-(scale+1)/2 for x in data] + return(data) + +def makeSin(maxPhase, length=256): + sinus = [math.sin(x) for x in phaseSteps(maxPhase, length)] + return(sinus) + +def prettyPrint(data, perLine = 8): + outString = "" + for i in range(len(data) / perLine): + strings = [str(x) for x in data[perLine*i:(perLine*i+perLine)]] + outString += "\t" + ", ".join(strings) + ",\n" + outString = outString[:-2] + "\n" # drop the final comma + return(outString) + +def writeHeader(fileName, dataName, data, signedInt=True): + outfile = open(fileName, "w") + if signedInt: + outfile.write("int8_t {}[{:d}] = {{ \n".format(dataName, len(data))) + else: + outfile.write("uint8_t {}[{:d}] = {{ \n".format(dataName, len(data))) + outfile.write(prettyPrint(data)) + outfile.write("};\n") + outfile.close() + +def bandlimitedSawtooth(maxPhase, numberPartials, length=256): + wave = [0]*length + sign = 1.0 + for k in range(1, numberPartials+1): + phases = phaseSteps(maxPhase*k, length) + for i in range(length): + wave[i] += sign * math.sin(phases[i]) / k + sign = sign * -1 + return(wave) + +def bandlimitedSquare(maxPhase, numberPartials, length=256): + wave = [0]*length + for k in range(1, numberPartials*2, 2): + phases = phaseSteps(maxPhase*k, length) + for i in range(length): + wave[i] += math.sin(phases[i]) / k + return(wave) + +def bandlimitedTriangle(maxPhase, numberPartials, length=256): + wave = [0]*length + sign = 1.0 + for k in range(1, numberPartials*2, 2): + phases = phaseSteps(maxPhase*k, length) + for i in range(length): + wave[i] += sign * math.sin(phases[i]) / k**2 + sign = sign * -1 + return(wave) + + + +if __name__ == "__main__": + + ## Full-waves, full 256 bytes, 0-255 range + writeHeader("fullSine.h", 'fullSine', scaleAndRound(makeSin(360))) + + triangleWave = range(0,64) + triangleWave.extend(range(64, -64, -1)) + triangleWave.extend(range(-64, 0, 1)) + triangleWave = scaleAndRound(triangleWave) + writeHeader("fullTriangle.h", 'fullTriangle', triangleWave) + + for numberFrequencies in [3,7,15]: + saw = scaleAndRound(bandlimitedSawtooth(360, numberFrequencies)) + writeHeader("fullSaw{}.h".format(numberFrequencies), + 'fullSaw{}'.format(numberFrequencies), saw) + tri = scaleAndRound(bandlimitedTriangle(360, numberFrequencies)) + writeHeader("fullTri{}.h".format(numberFrequencies), + 'fullTri{}'.format(numberFrequencies), tri) + square = scaleAndRound(bandlimitedSquare(360, numberFrequencies)) + writeHeader("fullSquare{}.h".format(numberFrequencies), + 'fullSquare{}'.format(numberFrequencies), square) + + ## Note that if you define / use too many different waveforms, + ## and you don't store them in PROGMEM in your AVR C routines, + ## you might run the chip out of RAM, which causes strange and + ## nearly impossible-to-diagnose glitches. + + ## So here we're breaking each waveform up into its own include file. + ## There are ways of storing them all in program memory, and we'll + ## see examples of that in later chapters. + diff --git a/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds_interrupts/Makefile b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds_interrupts/Makefile new file mode 100644 index 0000000..5c588dc --- /dev/null +++ b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds_interrupts/Makefile @@ -0,0 +1,196 @@ + +##########------------------------------------------------------########## +########## Project-specific Details ########## +########## Check these every time you start a new project ########## +##########------------------------------------------------------########## + +MCU = atmega168p +F_CPU = 8000000UL +BAUD = 9600UL +## Also try BAUD = 19200 or 38400 if you're feeling lucky. + +## A directory for common include files and the simple USART library. +## If you move either the current folder or the Library folder, you'll +## need to change this path to match. +LIBDIR = ../../AVR-Programming-Library + +##########------------------------------------------------------########## +########## Programmer Defaults ########## +########## Set up once, then forget about it ########## +########## (Can override. See bottom of file.) ########## +##########------------------------------------------------------########## + +PROGRAMMER_TYPE = usbtiny +# extra arguments to avrdude: baud rate, chip type, -F flag, etc. +PROGRAMMER_ARGS = + +##########------------------------------------------------------########## +########## Program Locations ########## +########## Won't need to change if they're in your PATH ########## +##########------------------------------------------------------########## + +CC = avr-gcc +OBJCOPY = avr-objcopy +OBJDUMP = avr-objdump +AVRSIZE = avr-size +AVRDUDE = avrdude + +##########------------------------------------------------------########## +########## Makefile Magic! ########## +########## Summary: ########## +########## We want a .hex file ########## +########## Compile source files into .elf ########## +########## Convert .elf file into .hex ########## +########## You shouldn't need to edit below. ########## +##########------------------------------------------------------########## + +## The name of your project (without the .c) +# TARGET = blinkLED +## Or name it automatically after the enclosing directory +TARGET = $(lastword $(subst /, ,$(CURDIR))) + +# Object files: will find all .c/.h files in current directory +# and in LIBDIR. If you have any other (sub-)directories with code, +# you can add them in to SOURCES below in the wildcard statement. +SOURCES=$(wildcard *.c $(LIBDIR)/*.c) +OBJECTS=$(SOURCES:.c=.o) +HEADERS=$(SOURCES:.c=.h) + +## Compilation options, type man avr-gcc if you're curious. +CPPFLAGS = -DF_CPU=$(F_CPU) -DBAUD=$(BAUD) -I. -I$(LIBDIR) +CFLAGS = -Os -g -std=gnu99 -Wall +## Use short (8-bit) data types +CFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums +## Splits up object files per function +CFLAGS += -ffunction-sections -fdata-sections +LDFLAGS = -Wl,-Map,$(TARGET).map +## Optional, but often ends up with smaller code +LDFLAGS += -Wl,--gc-sections +## Relax shrinks code even more, but makes disassembly messy +## LDFLAGS += -Wl,--relax +## LDFLAGS += -Wl,-u,vfprintf -lprintf_flt -lm ## for floating-point printf +## LDFLAGS += -Wl,-u,vfprintf -lprintf_min ## for smaller printf +TARGET_ARCH = -mmcu=$(MCU) + +## Explicit pattern rules: +## To make .o files from .c files +%.o: %.c $(HEADERS) Makefile + $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c -o $@ $<; + +$(TARGET).elf: $(OBJECTS) + $(CC) $(LDFLAGS) $(TARGET_ARCH) $^ $(LDLIBS) -o $@ + +%.hex: %.elf + $(OBJCOPY) -j .text -j .data -O ihex $< $@ + +%.eeprom: %.elf + $(OBJCOPY) -j .eeprom --change-section-lma .eeprom=0 -O ihex $< $@ + +%.lst: %.elf + $(OBJDUMP) -S $< > $@ + +## These targets don't have files named after them +.PHONY: all disassemble disasm eeprom size clean squeaky_clean flash fuses + +all: $(TARGET).hex + +debug: + @echo + @echo "Source files:" $(SOURCES) + @echo "MCU, F_CPU, BAUD:" $(MCU), $(F_CPU), $(BAUD) + @echo + +# Optionally create listing file from .elf +# This creates approximate assembly-language equivalent of your code. +# Useful for debugging time-sensitive bits, +# or making sure the compiler does what you want. +disassemble: $(TARGET).lst + +disasm: disassemble + +# Optionally show how big the resulting program is +size: $(TARGET).elf + $(AVRSIZE) -C --mcu=$(MCU) $(TARGET).elf + +clean: + rm -f $(TARGET).elf $(TARGET).hex $(TARGET).obj \ + $(TARGET).o $(TARGET).d $(TARGET).eep $(TARGET).lst \ + $(TARGET).lss $(TARGET).sym $(TARGET).map $(TARGET)~ \ + $(TARGET).eeprom + +squeaky_clean: + rm -f *.elf *.hex *.obj *.o *.d *.eep *.lst *.lss *.sym *.map *~ *.eeprom + +##########------------------------------------------------------########## +########## Programmer-specific details ########## +########## Flashing code to AVR using avrdude ########## +##########------------------------------------------------------########## + +flash: $(TARGET).hex + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U flash:w:$< + +## An alias +program: flash + +flash_eeprom: $(TARGET).eeprom + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U eeprom:w:$< + +avrdude_terminal: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nt + +## If you've got multiple programmers that you use, +## you can define them here so that it's easy to switch. +## To invoke, use something like `make flash_arduinoISP` +flash_usbtiny: PROGRAMMER_TYPE = usbtiny +flash_usbtiny: PROGRAMMER_ARGS = # USBTiny works with no further arguments +flash_usbtiny: flash + +flash_usbasp: PROGRAMMER_TYPE = usbasp +flash_usbasp: PROGRAMMER_ARGS = # USBasp works with no further arguments +flash_usbasp: flash + +flash_arduinoISP: PROGRAMMER_TYPE = avrisp +flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P /dev/ttyACM0 +## (for windows) flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P com5 +flash_arduinoISP: flash + +flash_109: PROGRAMMER_TYPE = avr109 +flash_109: PROGRAMMER_ARGS = -b 9600 -P /dev/ttyUSB0 +flash_109: flash + +##########------------------------------------------------------########## +########## Fuse settings and suitable defaults ########## +##########------------------------------------------------------########## + +## Mega 48, 88, 168, 328 default values +LFUSE = 0x62 +HFUSE = 0xdf +EFUSE = 0x00 + +## Generic +FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m + +fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) \ + $(PROGRAMMER_ARGS) $(FUSE_STRING) +show_fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nv + +## Called with no extra definitions, sets to defaults +set_default_fuses: FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m +set_default_fuses: fuses + +## Set the fuse byte for full-speed mode +## Note: can also be set in firmware for modern chips +set_fast_fuse: LFUSE = 0xE2 +set_fast_fuse: FUSE_STRING = -U lfuse:w:$(LFUSE):m +set_fast_fuse: fuses + +## Set the EESAVE fuse byte to preserve EEPROM across flashes +set_eeprom_save_fuse: HFUSE = 0xD7 +set_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +set_eeprom_save_fuse: fuses + +## Clear the EESAVE fuse byte +clear_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +clear_eeprom_save_fuse: fuses diff --git a/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds_interrupts/dds_interrupts.c b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds_interrupts/dds_interrupts.c new file mode 100644 index 0000000..cdffa3e --- /dev/null +++ b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds_interrupts/dds_interrupts.c @@ -0,0 +1,74 @@ + /* Direct-digital synthesis */ + +// ------- Preamble -------- // +#include /* Defines pins, ports, etc */ +#include /* Functions to waste time */ +#include +#include +#include "pinDefines.h" + +#include "fullSine.h" +#include "USART.h" + +volatile uint16_t accumulator; +volatile uint16_t tuningWord; + +static inline void initTimer0(void) { + TCCR0A |= (1 << COM0A1); /* PWM output on OCR0A */ + SPEAKER_DDR |= (1 << SPEAKER); /* enable output on pin */ + + TCCR0A |= (1 << WGM00); /* Fast PWM mode */ + TCCR0A |= (1 << WGM01); /* Fast PWM mode, pt.2 */ + + TCCR0B |= (1 << CS00); /* Clock with /1 prescaler */ + TIMSK0 |= (1 << TOIE0); /* Overflow interrupt */ + sei(); /* Enable interrupt */ +} + +ISR(TIMER0_OVF_vect) { + + accumulator += tuningWord; /* take tuningWord steps forward */ + /* lookup and set output */ + OCR0A = 128 + fullSine[(uint8_t) (accumulator >> 8)]; + +} + +static inline void pollButton(void) { + if (bit_is_clear(BUTTON_PIN, BUTTON)) { + SPEAKER_DDR |= (1 << SPEAKER); /* enable output on pin */ + LED_PORT &= ~(1 << LED0); + } + else { + SPEAKER_DDR &= ~(1 << SPEAKER); /* disable output on pin */ + LED_PORT |= (1 << LED0); + } +} + +int main(void) { + + // -------- Inits --------- // + + clock_prescale_set(clock_div_1); /* CPU clock 8 MHz */ + initTimer0(); + initUSART(); + + BUTTON_PORT |= (1 << BUTTON); /* pullup on button */ + + LED_DDR |= (1 << LED0); /* LED on for diagnostics */ + LED_PORT |= (1 << LED0); + _delay_ms(100); + LED_PORT &= ~(1 << LED0); + + SPEAKER_DDR |= (1 << SPEAKER); + + tuningWord = 880; + transmitByte((uint8_t) tuningWord >> 2); /* approx value in Hz */ + + // ------ Event loop ------ // + while (1) { + + pollButton(); + + } /* End event loop */ + return 0; /* This line is never reached */ +} diff --git a/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds_interrupts/fullSaw15.h b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds_interrupts/fullSaw15.h new file mode 100644 index 0000000..69e64a3 --- /dev/null +++ b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds_interrupts/fullSaw15.h @@ -0,0 +1,34 @@ +int8_t fullSaw15[256] = { + 0, 1, 3, 4, 5, 6, 7, 7, + 7, 7, 7, 7, 8, 9, 10, 12, + 13, 15, 17, 18, 20, 21, 21, 22, + 22, 22, 22, 22, 22, 23, 24, 25, + 27, 29, 31, 33, 34, 35, 36, 36, + 36, 36, 36, 36, 36, 37, 38, 39, + 41, 43, 45, 47, 48, 50, 51, 51, + 51, 51, 51, 51, 51, 51, 52, 53, + 54, 56, 58, 61, 63, 64, 66, 66, + 67, 66, 66, 65, 65, 65, 65, 66, + 68, 70, 72, 75, 77, 79, 81, 82, + 82, 82, 81, 80, 79, 78, 78, 78, + 80, 82, 85, 88, 92, 95, 97, 99, + 100, 99, 98, 95, 93, 90, 88, 88, + 89, 91, 96, 101, 108, 115, 121, 125, + 127, 125, 119, 108, 93, 74, 51, 26, + 0, -27, -52, -75, -94, -109, -120, -126, + -128, -126, -122, -116, -109, -102, -97, -92, + -90, -89, -89, -91, -94, -96, -99, -100, + -101, -100, -98, -96, -93, -89, -86, -83, + -81, -79, -79, -79, -80, -81, -82, -83, + -83, -83, -82, -80, -78, -76, -73, -71, + -69, -67, -66, -66, -66, -66, -67, -67, + -68, -67, -67, -65, -64, -62, -59, -57, + -55, -54, -53, -52, -52, -52, -52, -52, + -52, -52, -52, -51, -49, -48, -46, -44, + -42, -40, -39, -38, -37, -37, -37, -37, + -37, -37, -37, -36, -35, -34, -32, -30, + -28, -26, -25, -24, -23, -23, -23, -23, + -23, -23, -22, -22, -21, -19, -18, -16, + -14, -13, -11, -10, -9, -8, -8, -8, + -8, -8, -8, -7, -6, -5, -4, -2 +}; diff --git a/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds_interrupts/fullSaw3.h b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds_interrupts/fullSaw3.h new file mode 100644 index 0000000..c0c1877 --- /dev/null +++ b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds_interrupts/fullSaw3.h @@ -0,0 +1,34 @@ +int8_t fullSaw3[256] = { + 0, 2, 4, 6, 8, 10, 12, 14, + 16, 18, 20, 22, 23, 25, 27, 28, + 29, 31, 32, 33, 34, 35, 35, 36, + 37, 37, 38, 38, 38, 38, 39, 39, + 39, 39, 39, 38, 38, 38, 38, 38, + 38, 38, 38, 38, 38, 38, 38, 38, + 39, 39, 40, 40, 41, 42, 43, 44, + 45, 46, 47, 49, 51, 52, 54, 56, + 58, 61, 63, 65, 68, 70, 73, 76, + 79, 81, 84, 87, 90, 93, 96, 98, + 101, 104, 106, 109, 111, 114, 116, 118, + 120, 121, 123, 124, 125, 126, 126, 127, + 127, 127, 126, 126, 125, 124, 122, 120, + 118, 116, 113, 110, 107, 104, 100, 96, + 92, 87, 83, 78, 72, 67, 62, 56, + 50, 44, 38, 32, 25, 19, 12, 6, + 0, -7, -13, -20, -26, -33, -39, -45, + -51, -57, -63, -68, -73, -79, -84, -88, + -93, -97, -101, -105, -108, -111, -114, -117, + -119, -121, -123, -125, -126, -127, -127, -128, + -128, -128, -127, -127, -126, -125, -124, -122, + -121, -119, -117, -115, -112, -110, -107, -105, + -102, -99, -97, -94, -91, -88, -85, -82, + -80, -77, -74, -71, -69, -66, -64, -62, + -59, -57, -55, -53, -52, -50, -48, -47, + -46, -45, -44, -43, -42, -41, -41, -40, + -40, -39, -39, -39, -39, -39, -39, -39, + -39, -39, -39, -39, -39, -39, -40, -40, + -40, -40, -40, -39, -39, -39, -39, -38, + -38, -37, -36, -36, -35, -34, -33, -32, + -30, -29, -28, -26, -24, -23, -21, -19, + -17, -15, -13, -11, -9, -7, -5, -3 +}; diff --git a/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds_interrupts/fullSaw7.h b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds_interrupts/fullSaw7.h new file mode 100644 index 0000000..ef38b9e --- /dev/null +++ b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds_interrupts/fullSaw7.h @@ -0,0 +1,34 @@ +int8_t fullSaw7[256] = { + 0, 1, 3, 5, 7, 8, 10, 11, + 12, 13, 14, 15, 15, 15, 15, 16, + 16, 16, 16, 16, 16, 16, 16, 17, + 17, 18, 19, 20, 21, 23, 24, 26, + 28, 30, 32, 34, 36, 38, 39, 41, + 43, 44, 45, 46, 47, 47, 48, 48, + 48, 48, 48, 48, 48, 47, 47, 47, + 47, 47, 48, 49, 50, 51, 52, 54, + 55, 57, 60, 62, 64, 66, 69, 71, + 73, 75, 77, 79, 80, 81, 82, 82, + 82, 82, 82, 81, 80, 80, 79, 78, + 77, 76, 75, 75, 75, 76, 76, 78, + 79, 81, 84, 87, 90, 94, 98, 102, + 106, 110, 114, 117, 121, 123, 125, 127, + 127, 127, 125, 122, 119, 114, 108, 101, + 93, 84, 74, 63, 51, 39, 26, 13, + 0, -14, -27, -40, -52, -64, -75, -85, + -94, -102, -109, -115, -120, -123, -126, -128, + -128, -128, -126, -124, -122, -118, -115, -111, + -107, -103, -99, -95, -91, -88, -85, -82, + -80, -79, -77, -77, -76, -76, -76, -77, + -78, -79, -80, -81, -81, -82, -83, -83, + -83, -83, -83, -82, -81, -80, -78, -76, + -74, -72, -70, -67, -65, -63, -61, -58, + -56, -55, -53, -52, -51, -50, -49, -48, + -48, -48, -48, -48, -49, -49, -49, -49, + -49, -49, -49, -48, -48, -47, -46, -45, + -44, -42, -40, -39, -37, -35, -33, -31, + -29, -27, -25, -24, -22, -21, -20, -19, + -18, -18, -17, -17, -17, -17, -17, -17, + -17, -17, -16, -16, -16, -16, -15, -14, + -13, -12, -11, -9, -8, -6, -4, -2 +}; diff --git a/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds_interrupts/fullSine.h b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds_interrupts/fullSine.h new file mode 100644 index 0000000..430d305 --- /dev/null +++ b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds_interrupts/fullSine.h @@ -0,0 +1,34 @@ +int8_t fullSine[256] = { + 0, 3, 6, 9, 12, 15, 18, 21, + 24, 27, 30, 34, 37, 39, 42, 45, + 48, 51, 54, 57, 60, 62, 65, 68, + 70, 73, 75, 78, 80, 83, 85, 87, + 90, 92, 94, 96, 98, 100, 102, 104, + 106, 107, 109, 110, 112, 113, 115, 116, + 117, 118, 120, 121, 122, 122, 123, 124, + 125, 125, 126, 126, 126, 127, 127, 127, + 127, 127, 127, 127, 126, 126, 126, 125, + 125, 124, 123, 122, 122, 121, 120, 118, + 117, 116, 115, 113, 112, 110, 109, 107, + 106, 104, 102, 100, 98, 96, 94, 92, + 90, 87, 85, 83, 80, 78, 75, 73, + 70, 68, 65, 62, 60, 57, 54, 51, + 48, 45, 42, 39, 37, 34, 30, 27, + 24, 21, 18, 15, 12, 9, 6, 3, + 0, -4, -7, -10, -13, -16, -19, -22, + -25, -28, -31, -35, -38, -40, -43, -46, + -49, -52, -55, -58, -61, -63, -66, -69, + -71, -74, -76, -79, -81, -84, -86, -88, + -91, -93, -95, -97, -99, -101, -103, -105, + -107, -108, -110, -111, -113, -114, -116, -117, + -118, -119, -121, -122, -123, -123, -124, -125, + -126, -126, -127, -127, -127, -128, -128, -128, + -128, -128, -128, -128, -127, -127, -127, -126, + -126, -125, -124, -123, -123, -122, -121, -119, + -118, -117, -116, -114, -113, -111, -110, -108, + -107, -105, -103, -101, -99, -97, -95, -93, + -91, -88, -86, -84, -81, -79, -76, -74, + -71, -69, -66, -63, -61, -58, -55, -52, + -49, -46, -43, -40, -38, -35, -31, -28, + -25, -22, -19, -16, -13, -10, -7, -4 +}; diff --git a/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds_interrupts/fullSquare15.h b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds_interrupts/fullSquare15.h new file mode 100644 index 0000000..94a3515 --- /dev/null +++ b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds_interrupts/fullSquare15.h @@ -0,0 +1,34 @@ +int8_t fullSquare15[256] = { + 0, 1, 3, 4, 5, 6, 7, 7, + 7, 7, 7, 7, 8, 9, 10, 12, + 13, 15, 17, 18, 20, 21, 21, 22, + 22, 22, 22, 22, 22, 23, 24, 25, + 27, 29, 31, 33, 34, 35, 36, 36, + 36, 36, 36, 36, 36, 37, 38, 39, + 41, 43, 45, 47, 48, 50, 51, 51, + 51, 51, 51, 51, 51, 51, 52, 53, + 54, 56, 58, 61, 63, 64, 66, 66, + 67, 66, 66, 65, 65, 65, 65, 66, + 68, 70, 72, 75, 77, 79, 81, 82, + 82, 82, 81, 80, 79, 78, 78, 78, + 80, 82, 85, 88, 92, 95, 97, 99, + 100, 99, 98, 95, 93, 90, 88, 88, + 89, 91, 96, 101, 108, 115, 121, 125, + 127, 125, 119, 108, 93, 74, 51, 26, + 0, -27, -52, -75, -94, -109, -120, -126, + -128, -126, -122, -116, -109, -102, -97, -92, + -90, -89, -89, -91, -94, -96, -99, -100, + -101, -100, -98, -96, -93, -89, -86, -83, + -81, -79, -79, -79, -80, -81, -82, -83, + -83, -83, -82, -80, -78, -76, -73, -71, + -69, -67, -66, -66, -66, -66, -67, -67, + -68, -67, -67, -65, -64, -62, -59, -57, + -55, -54, -53, -52, -52, -52, -52, -52, + -52, -52, -52, -51, -49, -48, -46, -44, + -42, -40, -39, -38, -37, -37, -37, -37, + -37, -37, -37, -36, -35, -34, -32, -30, + -28, -26, -25, -24, -23, -23, -23, -23, + -23, -23, -22, -22, -21, -19, -18, -16, + -14, -13, -11, -10, -9, -8, -8, -8, + -8, -8, -8, -7, -6, -5, -4, -2 +}; diff --git a/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds_interrupts/fullSquare3.h b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds_interrupts/fullSquare3.h new file mode 100644 index 0000000..c20fa0a --- /dev/null +++ b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds_interrupts/fullSquare3.h @@ -0,0 +1,34 @@ +int8_t fullSquare3[256] = { + 0, 2, 4, 6, 8, 10, 12, 14, + 16, 18, 20, 22, 23, 25, 27, 28, + 29, 31, 32, 33, 34, 35, 35, 36, + 37, 37, 38, 38, 38, 38, 39, 39, + 39, 39, 39, 38, 38, 38, 38, 38, + 38, 38, 38, 38, 38, 38, 38, 38, + 39, 39, 40, 40, 41, 42, 43, 44, + 45, 46, 47, 49, 51, 52, 54, 56, + 58, 61, 63, 65, 68, 70, 73, 76, + 79, 81, 84, 87, 90, 93, 96, 98, + 101, 104, 106, 109, 111, 114, 116, 118, + 120, 121, 123, 124, 125, 126, 126, 127, + 127, 127, 126, 126, 125, 124, 122, 120, + 118, 116, 113, 110, 107, 104, 100, 96, + 92, 87, 83, 78, 72, 67, 62, 56, + 50, 44, 38, 32, 25, 19, 12, 6, + 0, -7, -13, -20, -26, -33, -39, -45, + -51, -57, -63, -68, -73, -79, -84, -88, + -93, -97, -101, -105, -108, -111, -114, -117, + -119, -121, -123, -125, -126, -127, -127, -128, + -128, -128, -127, -127, -126, -125, -124, -122, + -121, -119, -117, -115, -112, -110, -107, -105, + -102, -99, -97, -94, -91, -88, -85, -82, + -80, -77, -74, -71, -69, -66, -64, -62, + -59, -57, -55, -53, -52, -50, -48, -47, + -46, -45, -44, -43, -42, -41, -41, -40, + -40, -39, -39, -39, -39, -39, -39, -39, + -39, -39, -39, -39, -39, -39, -40, -40, + -40, -40, -40, -39, -39, -39, -39, -38, + -38, -37, -36, -36, -35, -34, -33, -32, + -30, -29, -28, -26, -24, -23, -21, -19, + -17, -15, -13, -11, -9, -7, -5, -3 +}; diff --git a/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds_interrupts/fullSquare7.h b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds_interrupts/fullSquare7.h new file mode 100644 index 0000000..43a679e --- /dev/null +++ b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds_interrupts/fullSquare7.h @@ -0,0 +1,34 @@ +int8_t fullSquare7[256] = { + 0, 1, 3, 5, 7, 8, 10, 11, + 12, 13, 14, 15, 15, 15, 15, 16, + 16, 16, 16, 16, 16, 16, 16, 17, + 17, 18, 19, 20, 21, 23, 24, 26, + 28, 30, 32, 34, 36, 38, 39, 41, + 43, 44, 45, 46, 47, 47, 48, 48, + 48, 48, 48, 48, 48, 47, 47, 47, + 47, 47, 48, 49, 50, 51, 52, 54, + 55, 57, 60, 62, 64, 66, 69, 71, + 73, 75, 77, 79, 80, 81, 82, 82, + 82, 82, 82, 81, 80, 80, 79, 78, + 77, 76, 75, 75, 75, 76, 76, 78, + 79, 81, 84, 87, 90, 94, 98, 102, + 106, 110, 114, 117, 121, 123, 125, 127, + 127, 127, 125, 122, 119, 114, 108, 101, + 93, 84, 74, 63, 51, 39, 26, 13, + 0, -14, -27, -40, -52, -64, -75, -85, + -94, -102, -109, -115, -120, -123, -126, -128, + -128, -128, -126, -124, -122, -118, -115, -111, + -107, -103, -99, -95, -91, -88, -85, -82, + -80, -79, -77, -77, -76, -76, -76, -77, + -78, -79, -80, -81, -81, -82, -83, -83, + -83, -83, -83, -82, -81, -80, -78, -76, + -74, -72, -70, -67, -65, -63, -61, -58, + -56, -55, -53, -52, -51, -50, -49, -48, + -48, -48, -48, -48, -49, -49, -49, -49, + -49, -49, -49, -48, -48, -47, -46, -45, + -44, -42, -40, -39, -37, -35, -33, -31, + -29, -27, -25, -24, -22, -21, -20, -19, + -18, -18, -17, -17, -17, -17, -17, -17, + -17, -17, -16, -16, -16, -16, -15, -14, + -13, -12, -11, -9, -8, -6, -4, -2 +}; diff --git a/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds_interrupts/fullTri15.h b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds_interrupts/fullTri15.h new file mode 100644 index 0000000..e227e64 --- /dev/null +++ b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds_interrupts/fullTri15.h @@ -0,0 +1,34 @@ +int8_t fullTri15[256] = { + 0, 1, 3, 4, 5, 6, 7, 7, + 7, 7, 7, 7, 8, 9, 10, 12, + 13, 15, 17, 18, 20, 21, 21, 22, + 22, 22, 22, 22, 22, 23, 24, 25, + 27, 29, 31, 33, 34, 35, 36, 36, + 36, 36, 36, 36, 36, 37, 38, 39, + 41, 43, 45, 47, 48, 50, 51, 51, + 51, 51, 51, 51, 51, 51, 52, 53, + 54, 56, 58, 61, 63, 64, 66, 66, + 67, 66, 66, 65, 65, 65, 65, 66, + 68, 70, 72, 75, 77, 79, 81, 82, + 82, 82, 81, 80, 79, 78, 78, 78, + 80, 82, 85, 88, 92, 95, 97, 99, + 100, 99, 98, 95, 93, 90, 88, 88, + 89, 91, 96, 101, 108, 115, 121, 125, + 127, 125, 119, 108, 93, 74, 51, 26, + 0, -27, -52, -75, -94, -109, -120, -126, + -128, -126, -122, -116, -109, -102, -97, -92, + -90, -89, -89, -91, -94, -96, -99, -100, + -101, -100, -98, -96, -93, -89, -86, -83, + -81, -79, -79, -79, -80, -81, -82, -83, + -83, -83, -82, -80, -78, -76, -73, -71, + -69, -67, -66, -66, -66, -66, -67, -67, + -68, -67, -67, -65, -64, -62, -59, -57, + -55, -54, -53, -52, -52, -52, -52, -52, + -52, -52, -52, -51, -49, -48, -46, -44, + -42, -40, -39, -38, -37, -37, -37, -37, + -37, -37, -37, -36, -35, -34, -32, -30, + -28, -26, -25, -24, -23, -23, -23, -23, + -23, -23, -22, -22, -21, -19, -18, -16, + -14, -13, -11, -10, -9, -8, -8, -8, + -8, -8, -8, -7, -6, -5, -4, -2 +}; diff --git a/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds_interrupts/fullTri3.h b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds_interrupts/fullTri3.h new file mode 100644 index 0000000..236e937 --- /dev/null +++ b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds_interrupts/fullTri3.h @@ -0,0 +1,34 @@ +int8_t fullTri3[256] = { + 0, 2, 4, 6, 8, 10, 12, 14, + 16, 18, 20, 22, 23, 25, 27, 28, + 29, 31, 32, 33, 34, 35, 35, 36, + 37, 37, 38, 38, 38, 38, 39, 39, + 39, 39, 39, 38, 38, 38, 38, 38, + 38, 38, 38, 38, 38, 38, 38, 38, + 39, 39, 40, 40, 41, 42, 43, 44, + 45, 46, 47, 49, 51, 52, 54, 56, + 58, 61, 63, 65, 68, 70, 73, 76, + 79, 81, 84, 87, 90, 93, 96, 98, + 101, 104, 106, 109, 111, 114, 116, 118, + 120, 121, 123, 124, 125, 126, 126, 127, + 127, 127, 126, 126, 125, 124, 122, 120, + 118, 116, 113, 110, 107, 104, 100, 96, + 92, 87, 83, 78, 72, 67, 62, 56, + 50, 44, 38, 32, 25, 19, 12, 6, + 0, -7, -13, -20, -26, -33, -39, -45, + -51, -57, -63, -68, -73, -79, -84, -88, + -93, -97, -101, -105, -108, -111, -114, -117, + -119, -121, -123, -125, -126, -127, -127, -128, + -128, -128, -127, -127, -126, -125, -124, -122, + -121, -119, -117, -115, -112, -110, -107, -105, + -102, -99, -97, -94, -91, -88, -85, -82, + -80, -77, -74, -71, -69, -66, -64, -62, + -59, -57, -55, -53, -52, -50, -48, -47, + -46, -45, -44, -43, -42, -41, -41, -40, + -40, -39, -39, -39, -39, -39, -39, -39, + -39, -39, -39, -39, -39, -39, -40, -40, + -40, -40, -40, -39, -39, -39, -39, -38, + -38, -37, -36, -36, -35, -34, -33, -32, + -30, -29, -28, -26, -24, -23, -21, -19, + -17, -15, -13, -11, -9, -7, -5, -3 +}; diff --git a/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds_interrupts/fullTri7.h b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds_interrupts/fullTri7.h new file mode 100644 index 0000000..ed0af55 --- /dev/null +++ b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds_interrupts/fullTri7.h @@ -0,0 +1,34 @@ +int8_t fullTri7[256] = { + 0, 1, 3, 5, 7, 8, 10, 11, + 12, 13, 14, 15, 15, 15, 15, 16, + 16, 16, 16, 16, 16, 16, 16, 17, + 17, 18, 19, 20, 21, 23, 24, 26, + 28, 30, 32, 34, 36, 38, 39, 41, + 43, 44, 45, 46, 47, 47, 48, 48, + 48, 48, 48, 48, 48, 47, 47, 47, + 47, 47, 48, 49, 50, 51, 52, 54, + 55, 57, 60, 62, 64, 66, 69, 71, + 73, 75, 77, 79, 80, 81, 82, 82, + 82, 82, 82, 81, 80, 80, 79, 78, + 77, 76, 75, 75, 75, 76, 76, 78, + 79, 81, 84, 87, 90, 94, 98, 102, + 106, 110, 114, 117, 121, 123, 125, 127, + 127, 127, 125, 122, 119, 114, 108, 101, + 93, 84, 74, 63, 51, 39, 26, 13, + 0, -14, -27, -40, -52, -64, -75, -85, + -94, -102, -109, -115, -120, -123, -126, -128, + -128, -128, -126, -124, -122, -118, -115, -111, + -107, -103, -99, -95, -91, -88, -85, -82, + -80, -79, -77, -77, -76, -76, -76, -77, + -78, -79, -80, -81, -81, -82, -83, -83, + -83, -83, -83, -82, -81, -80, -78, -76, + -74, -72, -70, -67, -65, -63, -61, -58, + -56, -55, -53, -52, -51, -50, -49, -48, + -48, -48, -48, -48, -49, -49, -49, -49, + -49, -49, -49, -48, -48, -47, -46, -45, + -44, -42, -40, -39, -37, -35, -33, -31, + -29, -27, -25, -24, -22, -21, -20, -19, + -18, -18, -17, -17, -17, -17, -17, -17, + -17, -17, -16, -16, -16, -16, -15, -14, + -13, -12, -11, -9, -8, -6, -4, -2 +}; diff --git a/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds_interrupts/fullTriangle.h b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds_interrupts/fullTriangle.h new file mode 100644 index 0000000..04cb022 --- /dev/null +++ b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds_interrupts/fullTriangle.h @@ -0,0 +1,34 @@ +int8_t fullTriangle[256] = { + 0, 1, 3, 5, 7, 9, 11, 13, + 15, 17, 19, 21, 23, 25, 27, 29, + 31, 33, 35, 37, 39, 41, 43, 45, + 47, 49, 51, 53, 55, 57, 59, 61, + 63, 65, 67, 69, 71, 73, 75, 77, + 79, 81, 83, 85, 87, 89, 91, 93, + 95, 97, 99, 101, 103, 105, 107, 109, + 111, 113, 115, 117, 119, 121, 123, 125, + 127, 125, 123, 121, 119, 117, 115, 113, + 111, 109, 107, 105, 103, 101, 99, 97, + 95, 93, 91, 89, 87, 85, 83, 81, + 79, 77, 75, 73, 71, 69, 67, 65, + 63, 61, 59, 57, 55, 53, 51, 49, + 47, 45, 43, 41, 39, 37, 35, 33, + 31, 29, 27, 25, 23, 21, 19, 17, + 15, 13, 11, 9, 7, 5, 3, 1, + 0, -2, -4, -6, -8, -10, -12, -14, + -16, -18, -20, -22, -24, -26, -28, -30, + -32, -34, -36, -38, -40, -42, -44, -46, + -48, -50, -52, -54, -56, -58, -60, -62, + -64, -66, -68, -70, -72, -74, -76, -78, + -80, -82, -84, -86, -88, -90, -92, -94, + -96, -98, -100, -102, -104, -106, -108, -110, + -112, -114, -116, -118, -120, -122, -124, -126, + -128, -126, -124, -122, -120, -118, -116, -114, + -112, -110, -108, -106, -104, -102, -100, -98, + -96, -94, -92, -90, -88, -86, -84, -82, + -80, -78, -76, -74, -72, -70, -68, -66, + -64, -62, -60, -58, -56, -54, -52, -50, + -48, -46, -44, -42, -40, -38, -36, -34, + -32, -30, -28, -26, -24, -22, -20, -18, + -16, -14, -12, -10, -8, -6, -4, -2 +}; diff --git a/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds_interrupts/generateWavetables.py b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds_interrupts/generateWavetables.py new file mode 100644 index 0000000..905593f --- /dev/null +++ b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds_interrupts/generateWavetables.py @@ -0,0 +1,101 @@ +## This file generates headers with lookup tables for various waveforms +## Add your own. + +import math + +def phaseSteps(maxPhase, length=256): + steps = range(0, length) + steps = [1.0*x/length * 2.0*math.pi * (maxPhase/360.0) for x in steps] + return(steps) + +def scaleAndRound(data, scale=255, signedInt=True): + data = [0.0+x-min(data) for x in data] + data = [1.0*x/max(data)*scale for x in data] + data = [int(round(x)) for x in data] + if signedInt: + data = [x-(scale+1)/2 for x in data] + return(data) + +def makeSin(maxPhase, length=256): + sinus = [math.sin(x) for x in phaseSteps(maxPhase, length)] + return(sinus) + +def prettyPrint(data, perLine = 8): + outString = "" + for i in range(len(data) / perLine): + strings = [str(x) for x in data[perLine*i:(perLine*i+perLine)]] + outString += "\t" + ", ".join(strings) + ",\n" + outString = outString[:-2] + "\n" # drop the final comma + return(outString) + +def writeHeader(fileName, dataName, data, signedInt=True): + outfile = open(fileName, "w") + if signedInt: + outfile.write("int8_t {}[{:d}] = {{ \n".format(dataName, len(data))) + else: + outfile.write("uint8_t {}[{:d}] = {{ \n".format(dataName, len(data))) + outfile.write(prettyPrint(data)) + outfile.write("};\n") + outfile.close() + +def bandlimitedSawtooth(maxPhase, numberPartials, length=256): + wave = [0]*length + sign = 1.0 + for k in range(1, numberPartials+1): + phases = phaseSteps(maxPhase*k, length) + for i in range(length): + wave[i] += sign * math.sin(phases[i]) / k + sign = sign * -1 + return(wave) + +def bandlimitedSquare(maxPhase, numberPartials, length=256): + wave = [0]*length + for k in range(1, numberPartials*2, 2): + phases = phaseSteps(maxPhase*k, length) + for i in range(length): + wave[i] += math.sin(phases[i]) / k + return(wave) + +def bandlimitedTriangle(maxPhase, numberPartials, length=256): + wave = [0]*length + sign = 1.0 + for k in range(1, numberPartials*2, 2): + phases = phaseSteps(maxPhase*k, length) + for i in range(length): + wave[i] += sign * math.sin(phases[i]) / k**2 + sign = sign * -1 + return(wave) + + + +if __name__ == "__main__": + + ## Full-waves, full 256 bytes, 0-255 range + writeHeader("fullSine.h", 'fullSine', scaleAndRound(makeSin(360))) + + triangleWave = range(0,64) + triangleWave.extend(range(64, -64, -1)) + triangleWave.extend(range(-64, 0, 1)) + triangleWave = scaleAndRound(triangleWave) + writeHeader("fullTriangle.h", 'fullTriangle', triangleWave) + + for numberFrequencies in [3,7,15]: + saw = scaleAndRound(bandlimitedSawtooth(360, numberFrequencies)) + writeHeader("fullSaw{}.h".format(numberFrequencies), + 'fullSaw{}'.format(numberFrequencies), saw) + tri = scaleAndRound(bandlimitedTriangle(360, numberFrequencies)) + writeHeader("fullTri{}.h".format(numberFrequencies), + 'fullTri{}'.format(numberFrequencies), tri) + square = scaleAndRound(bandlimitedSquare(360, numberFrequencies)) + writeHeader("fullSquare{}.h".format(numberFrequencies), + 'fullSquare{}'.format(numberFrequencies), square) + + ## Note that if you define / use too many different waveforms, + ## and you don't store them in PROGMEM in your AVR C routines, + ## you might run the chip out of RAM, which causes strange and + ## nearly impossible-to-diagnose glitches. + + ## So here we're breaking each waveform up into its own include file. + ## There are ways of storing them all in program memory, and we'll + ## see examples of that in later chapters. + diff --git a/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds_saw15/Makefile b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds_saw15/Makefile new file mode 100644 index 0000000..5c588dc --- /dev/null +++ b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds_saw15/Makefile @@ -0,0 +1,196 @@ + +##########------------------------------------------------------########## +########## Project-specific Details ########## +########## Check these every time you start a new project ########## +##########------------------------------------------------------########## + +MCU = atmega168p +F_CPU = 8000000UL +BAUD = 9600UL +## Also try BAUD = 19200 or 38400 if you're feeling lucky. + +## A directory for common include files and the simple USART library. +## If you move either the current folder or the Library folder, you'll +## need to change this path to match. +LIBDIR = ../../AVR-Programming-Library + +##########------------------------------------------------------########## +########## Programmer Defaults ########## +########## Set up once, then forget about it ########## +########## (Can override. See bottom of file.) ########## +##########------------------------------------------------------########## + +PROGRAMMER_TYPE = usbtiny +# extra arguments to avrdude: baud rate, chip type, -F flag, etc. +PROGRAMMER_ARGS = + +##########------------------------------------------------------########## +########## Program Locations ########## +########## Won't need to change if they're in your PATH ########## +##########------------------------------------------------------########## + +CC = avr-gcc +OBJCOPY = avr-objcopy +OBJDUMP = avr-objdump +AVRSIZE = avr-size +AVRDUDE = avrdude + +##########------------------------------------------------------########## +########## Makefile Magic! ########## +########## Summary: ########## +########## We want a .hex file ########## +########## Compile source files into .elf ########## +########## Convert .elf file into .hex ########## +########## You shouldn't need to edit below. ########## +##########------------------------------------------------------########## + +## The name of your project (without the .c) +# TARGET = blinkLED +## Or name it automatically after the enclosing directory +TARGET = $(lastword $(subst /, ,$(CURDIR))) + +# Object files: will find all .c/.h files in current directory +# and in LIBDIR. If you have any other (sub-)directories with code, +# you can add them in to SOURCES below in the wildcard statement. +SOURCES=$(wildcard *.c $(LIBDIR)/*.c) +OBJECTS=$(SOURCES:.c=.o) +HEADERS=$(SOURCES:.c=.h) + +## Compilation options, type man avr-gcc if you're curious. +CPPFLAGS = -DF_CPU=$(F_CPU) -DBAUD=$(BAUD) -I. -I$(LIBDIR) +CFLAGS = -Os -g -std=gnu99 -Wall +## Use short (8-bit) data types +CFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums +## Splits up object files per function +CFLAGS += -ffunction-sections -fdata-sections +LDFLAGS = -Wl,-Map,$(TARGET).map +## Optional, but often ends up with smaller code +LDFLAGS += -Wl,--gc-sections +## Relax shrinks code even more, but makes disassembly messy +## LDFLAGS += -Wl,--relax +## LDFLAGS += -Wl,-u,vfprintf -lprintf_flt -lm ## for floating-point printf +## LDFLAGS += -Wl,-u,vfprintf -lprintf_min ## for smaller printf +TARGET_ARCH = -mmcu=$(MCU) + +## Explicit pattern rules: +## To make .o files from .c files +%.o: %.c $(HEADERS) Makefile + $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c -o $@ $<; + +$(TARGET).elf: $(OBJECTS) + $(CC) $(LDFLAGS) $(TARGET_ARCH) $^ $(LDLIBS) -o $@ + +%.hex: %.elf + $(OBJCOPY) -j .text -j .data -O ihex $< $@ + +%.eeprom: %.elf + $(OBJCOPY) -j .eeprom --change-section-lma .eeprom=0 -O ihex $< $@ + +%.lst: %.elf + $(OBJDUMP) -S $< > $@ + +## These targets don't have files named after them +.PHONY: all disassemble disasm eeprom size clean squeaky_clean flash fuses + +all: $(TARGET).hex + +debug: + @echo + @echo "Source files:" $(SOURCES) + @echo "MCU, F_CPU, BAUD:" $(MCU), $(F_CPU), $(BAUD) + @echo + +# Optionally create listing file from .elf +# This creates approximate assembly-language equivalent of your code. +# Useful for debugging time-sensitive bits, +# or making sure the compiler does what you want. +disassemble: $(TARGET).lst + +disasm: disassemble + +# Optionally show how big the resulting program is +size: $(TARGET).elf + $(AVRSIZE) -C --mcu=$(MCU) $(TARGET).elf + +clean: + rm -f $(TARGET).elf $(TARGET).hex $(TARGET).obj \ + $(TARGET).o $(TARGET).d $(TARGET).eep $(TARGET).lst \ + $(TARGET).lss $(TARGET).sym $(TARGET).map $(TARGET)~ \ + $(TARGET).eeprom + +squeaky_clean: + rm -f *.elf *.hex *.obj *.o *.d *.eep *.lst *.lss *.sym *.map *~ *.eeprom + +##########------------------------------------------------------########## +########## Programmer-specific details ########## +########## Flashing code to AVR using avrdude ########## +##########------------------------------------------------------########## + +flash: $(TARGET).hex + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U flash:w:$< + +## An alias +program: flash + +flash_eeprom: $(TARGET).eeprom + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U eeprom:w:$< + +avrdude_terminal: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nt + +## If you've got multiple programmers that you use, +## you can define them here so that it's easy to switch. +## To invoke, use something like `make flash_arduinoISP` +flash_usbtiny: PROGRAMMER_TYPE = usbtiny +flash_usbtiny: PROGRAMMER_ARGS = # USBTiny works with no further arguments +flash_usbtiny: flash + +flash_usbasp: PROGRAMMER_TYPE = usbasp +flash_usbasp: PROGRAMMER_ARGS = # USBasp works with no further arguments +flash_usbasp: flash + +flash_arduinoISP: PROGRAMMER_TYPE = avrisp +flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P /dev/ttyACM0 +## (for windows) flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P com5 +flash_arduinoISP: flash + +flash_109: PROGRAMMER_TYPE = avr109 +flash_109: PROGRAMMER_ARGS = -b 9600 -P /dev/ttyUSB0 +flash_109: flash + +##########------------------------------------------------------########## +########## Fuse settings and suitable defaults ########## +##########------------------------------------------------------########## + +## Mega 48, 88, 168, 328 default values +LFUSE = 0x62 +HFUSE = 0xdf +EFUSE = 0x00 + +## Generic +FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m + +fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) \ + $(PROGRAMMER_ARGS) $(FUSE_STRING) +show_fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nv + +## Called with no extra definitions, sets to defaults +set_default_fuses: FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m +set_default_fuses: fuses + +## Set the fuse byte for full-speed mode +## Note: can also be set in firmware for modern chips +set_fast_fuse: LFUSE = 0xE2 +set_fast_fuse: FUSE_STRING = -U lfuse:w:$(LFUSE):m +set_fast_fuse: fuses + +## Set the EESAVE fuse byte to preserve EEPROM across flashes +set_eeprom_save_fuse: HFUSE = 0xD7 +set_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +set_eeprom_save_fuse: fuses + +## Clear the EESAVE fuse byte +clear_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +clear_eeprom_save_fuse: fuses diff --git a/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds_saw15/dds_saw15.c b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds_saw15/dds_saw15.c new file mode 100644 index 0000000..35216e0 --- /dev/null +++ b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds_saw15/dds_saw15.c @@ -0,0 +1,56 @@ + /* Direct-digital synthesis */ + +// ------- Preamble -------- // +#include /* Defines pins, ports, etc */ +#include /* Functions to waste time */ +#include + +#include "pinDefines.h" + +#include "fullSaw15.h" + +static inline void initTimer0(void) { + TCCR0A |= (1 << COM0A1); /* PWM output on OCR0A */ + SPEAKER_DDR |= (1 << SPEAKER); /* enable output on pin */ + + TCCR0A |= (1 << WGM00); /* Fast PWM mode */ + TCCR0A |= (1 << WGM01); /* Fast PWM mode, pt.2 */ + + TCCR0B |= (1 << CS00); /* Clock with /1 prescaler */ +} + +int main(void) { + + uint16_t accumulator = 0; + uint16_t accumulatorSteps = 880; /* approx 440 Hz */ + uint8_t waveStep; + int8_t pwmValue; + + // -------- Inits --------- // + + clock_prescale_set(clock_div_1); /* CPU clock 8 MHz */ + initTimer0(); + BUTTON_PORT |= (1 << BUTTON); /* pullup on button */ + + // ------ Event loop ------ // + while (1) { + + if (bit_is_clear(BUTTON_PIN, BUTTON)) { + + SPEAKER_DDR |= (1 << SPEAKER); /* enable speaker */ + accumulator += accumulatorSteps; /* advance accumulator */ + waveStep = accumulator >> 8; /* which entry in lookup? */ + pwmValue = fullSaw15[waveStep]; /* lookup voltage */ + + loop_until_bit_is_set(TIFR0, TOV0); /* wait for PWM cycle */ + OCR0A = 128 + pwmValue; /* set new PWM value */ + TIFR0 |= (1 << TOV0); /* reset PWM overflow bit */ + } + + else { /* button not pressed */ + SPEAKER_DDR &= ~(1 << SPEAKER); /* disable speaker */ + } + + } /* End event loop */ + return 0; /* This line is never reached */ +} diff --git a/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds_saw15/fullSaw15.h b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds_saw15/fullSaw15.h new file mode 100644 index 0000000..69e64a3 --- /dev/null +++ b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds_saw15/fullSaw15.h @@ -0,0 +1,34 @@ +int8_t fullSaw15[256] = { + 0, 1, 3, 4, 5, 6, 7, 7, + 7, 7, 7, 7, 8, 9, 10, 12, + 13, 15, 17, 18, 20, 21, 21, 22, + 22, 22, 22, 22, 22, 23, 24, 25, + 27, 29, 31, 33, 34, 35, 36, 36, + 36, 36, 36, 36, 36, 37, 38, 39, + 41, 43, 45, 47, 48, 50, 51, 51, + 51, 51, 51, 51, 51, 51, 52, 53, + 54, 56, 58, 61, 63, 64, 66, 66, + 67, 66, 66, 65, 65, 65, 65, 66, + 68, 70, 72, 75, 77, 79, 81, 82, + 82, 82, 81, 80, 79, 78, 78, 78, + 80, 82, 85, 88, 92, 95, 97, 99, + 100, 99, 98, 95, 93, 90, 88, 88, + 89, 91, 96, 101, 108, 115, 121, 125, + 127, 125, 119, 108, 93, 74, 51, 26, + 0, -27, -52, -75, -94, -109, -120, -126, + -128, -126, -122, -116, -109, -102, -97, -92, + -90, -89, -89, -91, -94, -96, -99, -100, + -101, -100, -98, -96, -93, -89, -86, -83, + -81, -79, -79, -79, -80, -81, -82, -83, + -83, -83, -82, -80, -78, -76, -73, -71, + -69, -67, -66, -66, -66, -66, -67, -67, + -68, -67, -67, -65, -64, -62, -59, -57, + -55, -54, -53, -52, -52, -52, -52, -52, + -52, -52, -52, -51, -49, -48, -46, -44, + -42, -40, -39, -38, -37, -37, -37, -37, + -37, -37, -37, -36, -35, -34, -32, -30, + -28, -26, -25, -24, -23, -23, -23, -23, + -23, -23, -22, -22, -21, -19, -18, -16, + -14, -13, -11, -10, -9, -8, -8, -8, + -8, -8, -8, -7, -6, -5, -4, -2 +}; diff --git a/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds_saw15/fullSaw3.h b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds_saw15/fullSaw3.h new file mode 100644 index 0000000..c0c1877 --- /dev/null +++ b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds_saw15/fullSaw3.h @@ -0,0 +1,34 @@ +int8_t fullSaw3[256] = { + 0, 2, 4, 6, 8, 10, 12, 14, + 16, 18, 20, 22, 23, 25, 27, 28, + 29, 31, 32, 33, 34, 35, 35, 36, + 37, 37, 38, 38, 38, 38, 39, 39, + 39, 39, 39, 38, 38, 38, 38, 38, + 38, 38, 38, 38, 38, 38, 38, 38, + 39, 39, 40, 40, 41, 42, 43, 44, + 45, 46, 47, 49, 51, 52, 54, 56, + 58, 61, 63, 65, 68, 70, 73, 76, + 79, 81, 84, 87, 90, 93, 96, 98, + 101, 104, 106, 109, 111, 114, 116, 118, + 120, 121, 123, 124, 125, 126, 126, 127, + 127, 127, 126, 126, 125, 124, 122, 120, + 118, 116, 113, 110, 107, 104, 100, 96, + 92, 87, 83, 78, 72, 67, 62, 56, + 50, 44, 38, 32, 25, 19, 12, 6, + 0, -7, -13, -20, -26, -33, -39, -45, + -51, -57, -63, -68, -73, -79, -84, -88, + -93, -97, -101, -105, -108, -111, -114, -117, + -119, -121, -123, -125, -126, -127, -127, -128, + -128, -128, -127, -127, -126, -125, -124, -122, + -121, -119, -117, -115, -112, -110, -107, -105, + -102, -99, -97, -94, -91, -88, -85, -82, + -80, -77, -74, -71, -69, -66, -64, -62, + -59, -57, -55, -53, -52, -50, -48, -47, + -46, -45, -44, -43, -42, -41, -41, -40, + -40, -39, -39, -39, -39, -39, -39, -39, + -39, -39, -39, -39, -39, -39, -40, -40, + -40, -40, -40, -39, -39, -39, -39, -38, + -38, -37, -36, -36, -35, -34, -33, -32, + -30, -29, -28, -26, -24, -23, -21, -19, + -17, -15, -13, -11, -9, -7, -5, -3 +}; diff --git a/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds_saw15/fullSaw7.h b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds_saw15/fullSaw7.h new file mode 100644 index 0000000..ef38b9e --- /dev/null +++ b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds_saw15/fullSaw7.h @@ -0,0 +1,34 @@ +int8_t fullSaw7[256] = { + 0, 1, 3, 5, 7, 8, 10, 11, + 12, 13, 14, 15, 15, 15, 15, 16, + 16, 16, 16, 16, 16, 16, 16, 17, + 17, 18, 19, 20, 21, 23, 24, 26, + 28, 30, 32, 34, 36, 38, 39, 41, + 43, 44, 45, 46, 47, 47, 48, 48, + 48, 48, 48, 48, 48, 47, 47, 47, + 47, 47, 48, 49, 50, 51, 52, 54, + 55, 57, 60, 62, 64, 66, 69, 71, + 73, 75, 77, 79, 80, 81, 82, 82, + 82, 82, 82, 81, 80, 80, 79, 78, + 77, 76, 75, 75, 75, 76, 76, 78, + 79, 81, 84, 87, 90, 94, 98, 102, + 106, 110, 114, 117, 121, 123, 125, 127, + 127, 127, 125, 122, 119, 114, 108, 101, + 93, 84, 74, 63, 51, 39, 26, 13, + 0, -14, -27, -40, -52, -64, -75, -85, + -94, -102, -109, -115, -120, -123, -126, -128, + -128, -128, -126, -124, -122, -118, -115, -111, + -107, -103, -99, -95, -91, -88, -85, -82, + -80, -79, -77, -77, -76, -76, -76, -77, + -78, -79, -80, -81, -81, -82, -83, -83, + -83, -83, -83, -82, -81, -80, -78, -76, + -74, -72, -70, -67, -65, -63, -61, -58, + -56, -55, -53, -52, -51, -50, -49, -48, + -48, -48, -48, -48, -49, -49, -49, -49, + -49, -49, -49, -48, -48, -47, -46, -45, + -44, -42, -40, -39, -37, -35, -33, -31, + -29, -27, -25, -24, -22, -21, -20, -19, + -18, -18, -17, -17, -17, -17, -17, -17, + -17, -17, -16, -16, -16, -16, -15, -14, + -13, -12, -11, -9, -8, -6, -4, -2 +}; diff --git a/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds_saw15/fullSine.h b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds_saw15/fullSine.h new file mode 100644 index 0000000..430d305 --- /dev/null +++ b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds_saw15/fullSine.h @@ -0,0 +1,34 @@ +int8_t fullSine[256] = { + 0, 3, 6, 9, 12, 15, 18, 21, + 24, 27, 30, 34, 37, 39, 42, 45, + 48, 51, 54, 57, 60, 62, 65, 68, + 70, 73, 75, 78, 80, 83, 85, 87, + 90, 92, 94, 96, 98, 100, 102, 104, + 106, 107, 109, 110, 112, 113, 115, 116, + 117, 118, 120, 121, 122, 122, 123, 124, + 125, 125, 126, 126, 126, 127, 127, 127, + 127, 127, 127, 127, 126, 126, 126, 125, + 125, 124, 123, 122, 122, 121, 120, 118, + 117, 116, 115, 113, 112, 110, 109, 107, + 106, 104, 102, 100, 98, 96, 94, 92, + 90, 87, 85, 83, 80, 78, 75, 73, + 70, 68, 65, 62, 60, 57, 54, 51, + 48, 45, 42, 39, 37, 34, 30, 27, + 24, 21, 18, 15, 12, 9, 6, 3, + 0, -4, -7, -10, -13, -16, -19, -22, + -25, -28, -31, -35, -38, -40, -43, -46, + -49, -52, -55, -58, -61, -63, -66, -69, + -71, -74, -76, -79, -81, -84, -86, -88, + -91, -93, -95, -97, -99, -101, -103, -105, + -107, -108, -110, -111, -113, -114, -116, -117, + -118, -119, -121, -122, -123, -123, -124, -125, + -126, -126, -127, -127, -127, -128, -128, -128, + -128, -128, -128, -128, -127, -127, -127, -126, + -126, -125, -124, -123, -123, -122, -121, -119, + -118, -117, -116, -114, -113, -111, -110, -108, + -107, -105, -103, -101, -99, -97, -95, -93, + -91, -88, -86, -84, -81, -79, -76, -74, + -71, -69, -66, -63, -61, -58, -55, -52, + -49, -46, -43, -40, -38, -35, -31, -28, + -25, -22, -19, -16, -13, -10, -7, -4 +}; diff --git a/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds_saw15/fullSquare15.h b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds_saw15/fullSquare15.h new file mode 100644 index 0000000..94a3515 --- /dev/null +++ b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds_saw15/fullSquare15.h @@ -0,0 +1,34 @@ +int8_t fullSquare15[256] = { + 0, 1, 3, 4, 5, 6, 7, 7, + 7, 7, 7, 7, 8, 9, 10, 12, + 13, 15, 17, 18, 20, 21, 21, 22, + 22, 22, 22, 22, 22, 23, 24, 25, + 27, 29, 31, 33, 34, 35, 36, 36, + 36, 36, 36, 36, 36, 37, 38, 39, + 41, 43, 45, 47, 48, 50, 51, 51, + 51, 51, 51, 51, 51, 51, 52, 53, + 54, 56, 58, 61, 63, 64, 66, 66, + 67, 66, 66, 65, 65, 65, 65, 66, + 68, 70, 72, 75, 77, 79, 81, 82, + 82, 82, 81, 80, 79, 78, 78, 78, + 80, 82, 85, 88, 92, 95, 97, 99, + 100, 99, 98, 95, 93, 90, 88, 88, + 89, 91, 96, 101, 108, 115, 121, 125, + 127, 125, 119, 108, 93, 74, 51, 26, + 0, -27, -52, -75, -94, -109, -120, -126, + -128, -126, -122, -116, -109, -102, -97, -92, + -90, -89, -89, -91, -94, -96, -99, -100, + -101, -100, -98, -96, -93, -89, -86, -83, + -81, -79, -79, -79, -80, -81, -82, -83, + -83, -83, -82, -80, -78, -76, -73, -71, + -69, -67, -66, -66, -66, -66, -67, -67, + -68, -67, -67, -65, -64, -62, -59, -57, + -55, -54, -53, -52, -52, -52, -52, -52, + -52, -52, -52, -51, -49, -48, -46, -44, + -42, -40, -39, -38, -37, -37, -37, -37, + -37, -37, -37, -36, -35, -34, -32, -30, + -28, -26, -25, -24, -23, -23, -23, -23, + -23, -23, -22, -22, -21, -19, -18, -16, + -14, -13, -11, -10, -9, -8, -8, -8, + -8, -8, -8, -7, -6, -5, -4, -2 +}; diff --git a/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds_saw15/fullSquare3.h b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds_saw15/fullSquare3.h new file mode 100644 index 0000000..c20fa0a --- /dev/null +++ b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds_saw15/fullSquare3.h @@ -0,0 +1,34 @@ +int8_t fullSquare3[256] = { + 0, 2, 4, 6, 8, 10, 12, 14, + 16, 18, 20, 22, 23, 25, 27, 28, + 29, 31, 32, 33, 34, 35, 35, 36, + 37, 37, 38, 38, 38, 38, 39, 39, + 39, 39, 39, 38, 38, 38, 38, 38, + 38, 38, 38, 38, 38, 38, 38, 38, + 39, 39, 40, 40, 41, 42, 43, 44, + 45, 46, 47, 49, 51, 52, 54, 56, + 58, 61, 63, 65, 68, 70, 73, 76, + 79, 81, 84, 87, 90, 93, 96, 98, + 101, 104, 106, 109, 111, 114, 116, 118, + 120, 121, 123, 124, 125, 126, 126, 127, + 127, 127, 126, 126, 125, 124, 122, 120, + 118, 116, 113, 110, 107, 104, 100, 96, + 92, 87, 83, 78, 72, 67, 62, 56, + 50, 44, 38, 32, 25, 19, 12, 6, + 0, -7, -13, -20, -26, -33, -39, -45, + -51, -57, -63, -68, -73, -79, -84, -88, + -93, -97, -101, -105, -108, -111, -114, -117, + -119, -121, -123, -125, -126, -127, -127, -128, + -128, -128, -127, -127, -126, -125, -124, -122, + -121, -119, -117, -115, -112, -110, -107, -105, + -102, -99, -97, -94, -91, -88, -85, -82, + -80, -77, -74, -71, -69, -66, -64, -62, + -59, -57, -55, -53, -52, -50, -48, -47, + -46, -45, -44, -43, -42, -41, -41, -40, + -40, -39, -39, -39, -39, -39, -39, -39, + -39, -39, -39, -39, -39, -39, -40, -40, + -40, -40, -40, -39, -39, -39, -39, -38, + -38, -37, -36, -36, -35, -34, -33, -32, + -30, -29, -28, -26, -24, -23, -21, -19, + -17, -15, -13, -11, -9, -7, -5, -3 +}; diff --git a/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds_saw15/fullSquare7.h b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds_saw15/fullSquare7.h new file mode 100644 index 0000000..43a679e --- /dev/null +++ b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds_saw15/fullSquare7.h @@ -0,0 +1,34 @@ +int8_t fullSquare7[256] = { + 0, 1, 3, 5, 7, 8, 10, 11, + 12, 13, 14, 15, 15, 15, 15, 16, + 16, 16, 16, 16, 16, 16, 16, 17, + 17, 18, 19, 20, 21, 23, 24, 26, + 28, 30, 32, 34, 36, 38, 39, 41, + 43, 44, 45, 46, 47, 47, 48, 48, + 48, 48, 48, 48, 48, 47, 47, 47, + 47, 47, 48, 49, 50, 51, 52, 54, + 55, 57, 60, 62, 64, 66, 69, 71, + 73, 75, 77, 79, 80, 81, 82, 82, + 82, 82, 82, 81, 80, 80, 79, 78, + 77, 76, 75, 75, 75, 76, 76, 78, + 79, 81, 84, 87, 90, 94, 98, 102, + 106, 110, 114, 117, 121, 123, 125, 127, + 127, 127, 125, 122, 119, 114, 108, 101, + 93, 84, 74, 63, 51, 39, 26, 13, + 0, -14, -27, -40, -52, -64, -75, -85, + -94, -102, -109, -115, -120, -123, -126, -128, + -128, -128, -126, -124, -122, -118, -115, -111, + -107, -103, -99, -95, -91, -88, -85, -82, + -80, -79, -77, -77, -76, -76, -76, -77, + -78, -79, -80, -81, -81, -82, -83, -83, + -83, -83, -83, -82, -81, -80, -78, -76, + -74, -72, -70, -67, -65, -63, -61, -58, + -56, -55, -53, -52, -51, -50, -49, -48, + -48, -48, -48, -48, -49, -49, -49, -49, + -49, -49, -49, -48, -48, -47, -46, -45, + -44, -42, -40, -39, -37, -35, -33, -31, + -29, -27, -25, -24, -22, -21, -20, -19, + -18, -18, -17, -17, -17, -17, -17, -17, + -17, -17, -16, -16, -16, -16, -15, -14, + -13, -12, -11, -9, -8, -6, -4, -2 +}; diff --git a/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds_saw15/fullTri15.h b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds_saw15/fullTri15.h new file mode 100644 index 0000000..e227e64 --- /dev/null +++ b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds_saw15/fullTri15.h @@ -0,0 +1,34 @@ +int8_t fullTri15[256] = { + 0, 1, 3, 4, 5, 6, 7, 7, + 7, 7, 7, 7, 8, 9, 10, 12, + 13, 15, 17, 18, 20, 21, 21, 22, + 22, 22, 22, 22, 22, 23, 24, 25, + 27, 29, 31, 33, 34, 35, 36, 36, + 36, 36, 36, 36, 36, 37, 38, 39, + 41, 43, 45, 47, 48, 50, 51, 51, + 51, 51, 51, 51, 51, 51, 52, 53, + 54, 56, 58, 61, 63, 64, 66, 66, + 67, 66, 66, 65, 65, 65, 65, 66, + 68, 70, 72, 75, 77, 79, 81, 82, + 82, 82, 81, 80, 79, 78, 78, 78, + 80, 82, 85, 88, 92, 95, 97, 99, + 100, 99, 98, 95, 93, 90, 88, 88, + 89, 91, 96, 101, 108, 115, 121, 125, + 127, 125, 119, 108, 93, 74, 51, 26, + 0, -27, -52, -75, -94, -109, -120, -126, + -128, -126, -122, -116, -109, -102, -97, -92, + -90, -89, -89, -91, -94, -96, -99, -100, + -101, -100, -98, -96, -93, -89, -86, -83, + -81, -79, -79, -79, -80, -81, -82, -83, + -83, -83, -82, -80, -78, -76, -73, -71, + -69, -67, -66, -66, -66, -66, -67, -67, + -68, -67, -67, -65, -64, -62, -59, -57, + -55, -54, -53, -52, -52, -52, -52, -52, + -52, -52, -52, -51, -49, -48, -46, -44, + -42, -40, -39, -38, -37, -37, -37, -37, + -37, -37, -37, -36, -35, -34, -32, -30, + -28, -26, -25, -24, -23, -23, -23, -23, + -23, -23, -22, -22, -21, -19, -18, -16, + -14, -13, -11, -10, -9, -8, -8, -8, + -8, -8, -8, -7, -6, -5, -4, -2 +}; diff --git a/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds_saw15/fullTri3.h b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds_saw15/fullTri3.h new file mode 100644 index 0000000..236e937 --- /dev/null +++ b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds_saw15/fullTri3.h @@ -0,0 +1,34 @@ +int8_t fullTri3[256] = { + 0, 2, 4, 6, 8, 10, 12, 14, + 16, 18, 20, 22, 23, 25, 27, 28, + 29, 31, 32, 33, 34, 35, 35, 36, + 37, 37, 38, 38, 38, 38, 39, 39, + 39, 39, 39, 38, 38, 38, 38, 38, + 38, 38, 38, 38, 38, 38, 38, 38, + 39, 39, 40, 40, 41, 42, 43, 44, + 45, 46, 47, 49, 51, 52, 54, 56, + 58, 61, 63, 65, 68, 70, 73, 76, + 79, 81, 84, 87, 90, 93, 96, 98, + 101, 104, 106, 109, 111, 114, 116, 118, + 120, 121, 123, 124, 125, 126, 126, 127, + 127, 127, 126, 126, 125, 124, 122, 120, + 118, 116, 113, 110, 107, 104, 100, 96, + 92, 87, 83, 78, 72, 67, 62, 56, + 50, 44, 38, 32, 25, 19, 12, 6, + 0, -7, -13, -20, -26, -33, -39, -45, + -51, -57, -63, -68, -73, -79, -84, -88, + -93, -97, -101, -105, -108, -111, -114, -117, + -119, -121, -123, -125, -126, -127, -127, -128, + -128, -128, -127, -127, -126, -125, -124, -122, + -121, -119, -117, -115, -112, -110, -107, -105, + -102, -99, -97, -94, -91, -88, -85, -82, + -80, -77, -74, -71, -69, -66, -64, -62, + -59, -57, -55, -53, -52, -50, -48, -47, + -46, -45, -44, -43, -42, -41, -41, -40, + -40, -39, -39, -39, -39, -39, -39, -39, + -39, -39, -39, -39, -39, -39, -40, -40, + -40, -40, -40, -39, -39, -39, -39, -38, + -38, -37, -36, -36, -35, -34, -33, -32, + -30, -29, -28, -26, -24, -23, -21, -19, + -17, -15, -13, -11, -9, -7, -5, -3 +}; diff --git a/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds_saw15/fullTri7.h b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds_saw15/fullTri7.h new file mode 100644 index 0000000..ed0af55 --- /dev/null +++ b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds_saw15/fullTri7.h @@ -0,0 +1,34 @@ +int8_t fullTri7[256] = { + 0, 1, 3, 5, 7, 8, 10, 11, + 12, 13, 14, 15, 15, 15, 15, 16, + 16, 16, 16, 16, 16, 16, 16, 17, + 17, 18, 19, 20, 21, 23, 24, 26, + 28, 30, 32, 34, 36, 38, 39, 41, + 43, 44, 45, 46, 47, 47, 48, 48, + 48, 48, 48, 48, 48, 47, 47, 47, + 47, 47, 48, 49, 50, 51, 52, 54, + 55, 57, 60, 62, 64, 66, 69, 71, + 73, 75, 77, 79, 80, 81, 82, 82, + 82, 82, 82, 81, 80, 80, 79, 78, + 77, 76, 75, 75, 75, 76, 76, 78, + 79, 81, 84, 87, 90, 94, 98, 102, + 106, 110, 114, 117, 121, 123, 125, 127, + 127, 127, 125, 122, 119, 114, 108, 101, + 93, 84, 74, 63, 51, 39, 26, 13, + 0, -14, -27, -40, -52, -64, -75, -85, + -94, -102, -109, -115, -120, -123, -126, -128, + -128, -128, -126, -124, -122, -118, -115, -111, + -107, -103, -99, -95, -91, -88, -85, -82, + -80, -79, -77, -77, -76, -76, -76, -77, + -78, -79, -80, -81, -81, -82, -83, -83, + -83, -83, -83, -82, -81, -80, -78, -76, + -74, -72, -70, -67, -65, -63, -61, -58, + -56, -55, -53, -52, -51, -50, -49, -48, + -48, -48, -48, -48, -49, -49, -49, -49, + -49, -49, -49, -48, -48, -47, -46, -45, + -44, -42, -40, -39, -37, -35, -33, -31, + -29, -27, -25, -24, -22, -21, -20, -19, + -18, -18, -17, -17, -17, -17, -17, -17, + -17, -17, -16, -16, -16, -16, -15, -14, + -13, -12, -11, -9, -8, -6, -4, -2 +}; diff --git a/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds_saw15/fullTriangle.h b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds_saw15/fullTriangle.h new file mode 100644 index 0000000..04cb022 --- /dev/null +++ b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds_saw15/fullTriangle.h @@ -0,0 +1,34 @@ +int8_t fullTriangle[256] = { + 0, 1, 3, 5, 7, 9, 11, 13, + 15, 17, 19, 21, 23, 25, 27, 29, + 31, 33, 35, 37, 39, 41, 43, 45, + 47, 49, 51, 53, 55, 57, 59, 61, + 63, 65, 67, 69, 71, 73, 75, 77, + 79, 81, 83, 85, 87, 89, 91, 93, + 95, 97, 99, 101, 103, 105, 107, 109, + 111, 113, 115, 117, 119, 121, 123, 125, + 127, 125, 123, 121, 119, 117, 115, 113, + 111, 109, 107, 105, 103, 101, 99, 97, + 95, 93, 91, 89, 87, 85, 83, 81, + 79, 77, 75, 73, 71, 69, 67, 65, + 63, 61, 59, 57, 55, 53, 51, 49, + 47, 45, 43, 41, 39, 37, 35, 33, + 31, 29, 27, 25, 23, 21, 19, 17, + 15, 13, 11, 9, 7, 5, 3, 1, + 0, -2, -4, -6, -8, -10, -12, -14, + -16, -18, -20, -22, -24, -26, -28, -30, + -32, -34, -36, -38, -40, -42, -44, -46, + -48, -50, -52, -54, -56, -58, -60, -62, + -64, -66, -68, -70, -72, -74, -76, -78, + -80, -82, -84, -86, -88, -90, -92, -94, + -96, -98, -100, -102, -104, -106, -108, -110, + -112, -114, -116, -118, -120, -122, -124, -126, + -128, -126, -124, -122, -120, -118, -116, -114, + -112, -110, -108, -106, -104, -102, -100, -98, + -96, -94, -92, -90, -88, -86, -84, -82, + -80, -78, -76, -74, -72, -70, -68, -66, + -64, -62, -60, -58, -56, -54, -52, -50, + -48, -46, -44, -42, -40, -38, -36, -34, + -32, -30, -28, -26, -24, -22, -20, -18, + -16, -14, -12, -10, -8, -6, -4, -2 +}; diff --git a/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds_saw15/generateWavetables.py b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds_saw15/generateWavetables.py new file mode 100644 index 0000000..905593f --- /dev/null +++ b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dds_saw15/generateWavetables.py @@ -0,0 +1,101 @@ +## This file generates headers with lookup tables for various waveforms +## Add your own. + +import math + +def phaseSteps(maxPhase, length=256): + steps = range(0, length) + steps = [1.0*x/length * 2.0*math.pi * (maxPhase/360.0) for x in steps] + return(steps) + +def scaleAndRound(data, scale=255, signedInt=True): + data = [0.0+x-min(data) for x in data] + data = [1.0*x/max(data)*scale for x in data] + data = [int(round(x)) for x in data] + if signedInt: + data = [x-(scale+1)/2 for x in data] + return(data) + +def makeSin(maxPhase, length=256): + sinus = [math.sin(x) for x in phaseSteps(maxPhase, length)] + return(sinus) + +def prettyPrint(data, perLine = 8): + outString = "" + for i in range(len(data) / perLine): + strings = [str(x) for x in data[perLine*i:(perLine*i+perLine)]] + outString += "\t" + ", ".join(strings) + ",\n" + outString = outString[:-2] + "\n" # drop the final comma + return(outString) + +def writeHeader(fileName, dataName, data, signedInt=True): + outfile = open(fileName, "w") + if signedInt: + outfile.write("int8_t {}[{:d}] = {{ \n".format(dataName, len(data))) + else: + outfile.write("uint8_t {}[{:d}] = {{ \n".format(dataName, len(data))) + outfile.write(prettyPrint(data)) + outfile.write("};\n") + outfile.close() + +def bandlimitedSawtooth(maxPhase, numberPartials, length=256): + wave = [0]*length + sign = 1.0 + for k in range(1, numberPartials+1): + phases = phaseSteps(maxPhase*k, length) + for i in range(length): + wave[i] += sign * math.sin(phases[i]) / k + sign = sign * -1 + return(wave) + +def bandlimitedSquare(maxPhase, numberPartials, length=256): + wave = [0]*length + for k in range(1, numberPartials*2, 2): + phases = phaseSteps(maxPhase*k, length) + for i in range(length): + wave[i] += math.sin(phases[i]) / k + return(wave) + +def bandlimitedTriangle(maxPhase, numberPartials, length=256): + wave = [0]*length + sign = 1.0 + for k in range(1, numberPartials*2, 2): + phases = phaseSteps(maxPhase*k, length) + for i in range(length): + wave[i] += sign * math.sin(phases[i]) / k**2 + sign = sign * -1 + return(wave) + + + +if __name__ == "__main__": + + ## Full-waves, full 256 bytes, 0-255 range + writeHeader("fullSine.h", 'fullSine', scaleAndRound(makeSin(360))) + + triangleWave = range(0,64) + triangleWave.extend(range(64, -64, -1)) + triangleWave.extend(range(-64, 0, 1)) + triangleWave = scaleAndRound(triangleWave) + writeHeader("fullTriangle.h", 'fullTriangle', triangleWave) + + for numberFrequencies in [3,7,15]: + saw = scaleAndRound(bandlimitedSawtooth(360, numberFrequencies)) + writeHeader("fullSaw{}.h".format(numberFrequencies), + 'fullSaw{}'.format(numberFrequencies), saw) + tri = scaleAndRound(bandlimitedTriangle(360, numberFrequencies)) + writeHeader("fullTri{}.h".format(numberFrequencies), + 'fullTri{}'.format(numberFrequencies), tri) + square = scaleAndRound(bandlimitedSquare(360, numberFrequencies)) + writeHeader("fullSquare{}.h".format(numberFrequencies), + 'fullSquare{}'.format(numberFrequencies), square) + + ## Note that if you define / use too many different waveforms, + ## and you don't store them in PROGMEM in your AVR C routines, + ## you might run the chip out of RAM, which causes strange and + ## nearly impossible-to-diagnose glitches. + + ## So here we're breaking each waveform up into its own include file. + ## There are ways of storing them all in program memory, and we'll + ## see examples of that in later chapters. + diff --git a/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dialTone/Makefile b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dialTone/Makefile new file mode 100644 index 0000000..5c588dc --- /dev/null +++ b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dialTone/Makefile @@ -0,0 +1,196 @@ + +##########------------------------------------------------------########## +########## Project-specific Details ########## +########## Check these every time you start a new project ########## +##########------------------------------------------------------########## + +MCU = atmega168p +F_CPU = 8000000UL +BAUD = 9600UL +## Also try BAUD = 19200 or 38400 if you're feeling lucky. + +## A directory for common include files and the simple USART library. +## If you move either the current folder or the Library folder, you'll +## need to change this path to match. +LIBDIR = ../../AVR-Programming-Library + +##########------------------------------------------------------########## +########## Programmer Defaults ########## +########## Set up once, then forget about it ########## +########## (Can override. See bottom of file.) ########## +##########------------------------------------------------------########## + +PROGRAMMER_TYPE = usbtiny +# extra arguments to avrdude: baud rate, chip type, -F flag, etc. +PROGRAMMER_ARGS = + +##########------------------------------------------------------########## +########## Program Locations ########## +########## Won't need to change if they're in your PATH ########## +##########------------------------------------------------------########## + +CC = avr-gcc +OBJCOPY = avr-objcopy +OBJDUMP = avr-objdump +AVRSIZE = avr-size +AVRDUDE = avrdude + +##########------------------------------------------------------########## +########## Makefile Magic! ########## +########## Summary: ########## +########## We want a .hex file ########## +########## Compile source files into .elf ########## +########## Convert .elf file into .hex ########## +########## You shouldn't need to edit below. ########## +##########------------------------------------------------------########## + +## The name of your project (without the .c) +# TARGET = blinkLED +## Or name it automatically after the enclosing directory +TARGET = $(lastword $(subst /, ,$(CURDIR))) + +# Object files: will find all .c/.h files in current directory +# and in LIBDIR. If you have any other (sub-)directories with code, +# you can add them in to SOURCES below in the wildcard statement. +SOURCES=$(wildcard *.c $(LIBDIR)/*.c) +OBJECTS=$(SOURCES:.c=.o) +HEADERS=$(SOURCES:.c=.h) + +## Compilation options, type man avr-gcc if you're curious. +CPPFLAGS = -DF_CPU=$(F_CPU) -DBAUD=$(BAUD) -I. -I$(LIBDIR) +CFLAGS = -Os -g -std=gnu99 -Wall +## Use short (8-bit) data types +CFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums +## Splits up object files per function +CFLAGS += -ffunction-sections -fdata-sections +LDFLAGS = -Wl,-Map,$(TARGET).map +## Optional, but often ends up with smaller code +LDFLAGS += -Wl,--gc-sections +## Relax shrinks code even more, but makes disassembly messy +## LDFLAGS += -Wl,--relax +## LDFLAGS += -Wl,-u,vfprintf -lprintf_flt -lm ## for floating-point printf +## LDFLAGS += -Wl,-u,vfprintf -lprintf_min ## for smaller printf +TARGET_ARCH = -mmcu=$(MCU) + +## Explicit pattern rules: +## To make .o files from .c files +%.o: %.c $(HEADERS) Makefile + $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c -o $@ $<; + +$(TARGET).elf: $(OBJECTS) + $(CC) $(LDFLAGS) $(TARGET_ARCH) $^ $(LDLIBS) -o $@ + +%.hex: %.elf + $(OBJCOPY) -j .text -j .data -O ihex $< $@ + +%.eeprom: %.elf + $(OBJCOPY) -j .eeprom --change-section-lma .eeprom=0 -O ihex $< $@ + +%.lst: %.elf + $(OBJDUMP) -S $< > $@ + +## These targets don't have files named after them +.PHONY: all disassemble disasm eeprom size clean squeaky_clean flash fuses + +all: $(TARGET).hex + +debug: + @echo + @echo "Source files:" $(SOURCES) + @echo "MCU, F_CPU, BAUD:" $(MCU), $(F_CPU), $(BAUD) + @echo + +# Optionally create listing file from .elf +# This creates approximate assembly-language equivalent of your code. +# Useful for debugging time-sensitive bits, +# or making sure the compiler does what you want. +disassemble: $(TARGET).lst + +disasm: disassemble + +# Optionally show how big the resulting program is +size: $(TARGET).elf + $(AVRSIZE) -C --mcu=$(MCU) $(TARGET).elf + +clean: + rm -f $(TARGET).elf $(TARGET).hex $(TARGET).obj \ + $(TARGET).o $(TARGET).d $(TARGET).eep $(TARGET).lst \ + $(TARGET).lss $(TARGET).sym $(TARGET).map $(TARGET)~ \ + $(TARGET).eeprom + +squeaky_clean: + rm -f *.elf *.hex *.obj *.o *.d *.eep *.lst *.lss *.sym *.map *~ *.eeprom + +##########------------------------------------------------------########## +########## Programmer-specific details ########## +########## Flashing code to AVR using avrdude ########## +##########------------------------------------------------------########## + +flash: $(TARGET).hex + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U flash:w:$< + +## An alias +program: flash + +flash_eeprom: $(TARGET).eeprom + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U eeprom:w:$< + +avrdude_terminal: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nt + +## If you've got multiple programmers that you use, +## you can define them here so that it's easy to switch. +## To invoke, use something like `make flash_arduinoISP` +flash_usbtiny: PROGRAMMER_TYPE = usbtiny +flash_usbtiny: PROGRAMMER_ARGS = # USBTiny works with no further arguments +flash_usbtiny: flash + +flash_usbasp: PROGRAMMER_TYPE = usbasp +flash_usbasp: PROGRAMMER_ARGS = # USBasp works with no further arguments +flash_usbasp: flash + +flash_arduinoISP: PROGRAMMER_TYPE = avrisp +flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P /dev/ttyACM0 +## (for windows) flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P com5 +flash_arduinoISP: flash + +flash_109: PROGRAMMER_TYPE = avr109 +flash_109: PROGRAMMER_ARGS = -b 9600 -P /dev/ttyUSB0 +flash_109: flash + +##########------------------------------------------------------########## +########## Fuse settings and suitable defaults ########## +##########------------------------------------------------------########## + +## Mega 48, 88, 168, 328 default values +LFUSE = 0x62 +HFUSE = 0xdf +EFUSE = 0x00 + +## Generic +FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m + +fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) \ + $(PROGRAMMER_ARGS) $(FUSE_STRING) +show_fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nv + +## Called with no extra definitions, sets to defaults +set_default_fuses: FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m +set_default_fuses: fuses + +## Set the fuse byte for full-speed mode +## Note: can also be set in firmware for modern chips +set_fast_fuse: LFUSE = 0xE2 +set_fast_fuse: FUSE_STRING = -U lfuse:w:$(LFUSE):m +set_fast_fuse: fuses + +## Set the EESAVE fuse byte to preserve EEPROM across flashes +set_eeprom_save_fuse: HFUSE = 0xD7 +set_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +set_eeprom_save_fuse: fuses + +## Clear the EESAVE fuse byte +clear_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +clear_eeprom_save_fuse: fuses diff --git a/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dialTone/dialTone.c b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dialTone/dialTone.c new file mode 100644 index 0000000..eb22e8a --- /dev/null +++ b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dialTone/dialTone.c @@ -0,0 +1,85 @@ +/* Direct-digital synthesis */ + +// ------- Preamble -------- // +#include /* Defines pins, ports, etc */ +#include /* Functions to waste time */ +#include +#include +#include "pinDefines.h" +#include "macros.h" +#include "fullSine.h" + + +static inline void initTimer0(void){ + set_bit(TCCR0A, COM0A1); /* PWM output on OCR0A */ + set_bit(SPEAKER_DDR, SPEAKER); /* enable output on pin */ + + set_bit(TCCR0A, WGM00); /* Fast PWM mode */ + set_bit(TCCR0A, WGM01); /* Fast PWM mode, pt.2 */ + + set_bit(TCCR0B, CS00); /* Clock with /1 prescaler */ +} + +static inline void pollButton(void){ + if (bit_is_clear(BUTTON_PIN, BUTTON)) { + set_bit(SPEAKER_DDR, SPEAKER); /* enable output on pin */ + clear_bit(LED_PORT, LED0); + } + else { + clear_bit(SPEAKER_DDR, SPEAKER); /* disable output on pin */ + set_bit(LED_PORT, LED0); + } +} + +static inline void initLED(void){ + set_bit(LED_DDR, LED0); /* LED on for diagnostics */ + set_bit(LED_PORT, LED0); + _delay_ms(100); + clear_bit(LED_PORT, LED0); +} + +int main(void){ + + volatile uint16_t accumulator0; + volatile uint16_t accumulator1; + volatile uint16_t tuningWord0; + volatile uint16_t tuningWord1; + volatile uint16_t mixer; + + // -------- Inits --------- // + + clock_prescale_set(clock_div_1); /* CPU clock 8 MHz */ + initLED(); + initTimer0(); + + set_bit(BUTTON_PORT, BUTTON); /* pullup on button */ + set_bit(SPEAKER_DDR, SPEAKER); /* speaker output */ + + tuningWord0 = 440*2; /* Dial tone frequencies */ + tuningWord1 = 350*2; + + // ------ Event loop ------ // + while(1){ + + loop_until_bit_is_set(TIFR0, TOV0); /* wait until overflow bit set */ + set_bit(TIFR0, TOV0); /* writing set should reset... */ + + // Note that this bit has to be pretty fast... we have only 256 cycles to + // set the next value in OCR0A, or we may hear a glitch + + accumulator0 += tuningWord0; /* take tuningWord steps forward */ + accumulator1 += tuningWord1; /* take tuningWord steps forward */ + + mixer = fullSine[(uint8_t) (accumulator0 >> 8)]; /* add together */ + mixer += fullSine[(uint8_t) (accumulator1 >> 8)]; + OCR0A = 128 + (mixer >> 1); /* divide by 2, the fast way */ + + pollButton(); + + + } /* End event loop */ + return 0; /* This line is never reached */ +} + + + diff --git a/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dialTone/fullSine.h b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dialTone/fullSine.h new file mode 100644 index 0000000..099a701 --- /dev/null +++ b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dialTone/fullSine.h @@ -0,0 +1,34 @@ +int8_t fullSine[256] = { + 0, 3, 6, 9, 12, 15, 18, 21, + 24, 27, 30, 34, 37, 39, 42, 45, + 48, 51, 54, 57, 60, 62, 65, 68, + 70, 73, 75, 78, 80, 83, 85, 87, + 90, 92, 94, 96, 98, 100, 102, 104, + 106, 107, 109, 110, 112, 113, 115, 116, + 117, 118, 120, 121, 122, 122, 123, 124, + 125, 125, 126, 126, 126, 127, 127, 127, + 127, 127, 127, 127, 126, 126, 126, 125, + 125, 124, 123, 122, 122, 121, 120, 118, + 117, 116, 115, 113, 112, 110, 109, 107, + 106, 104, 102, 100, 98, 96, 94, 92, + 90, 87, 85, 83, 80, 78, 75, 73, + 70, 68, 65, 62, 60, 57, 54, 51, + 48, 45, 42, 39, 37, 34, 30, 27, + 24, 21, 18, 15, 12, 9, 6, 3, + 0, -4, -7, -10, -13, -16, -19, -22, + -25, -28, -31, -35, -38, -40, -43, -46, + -49, -52, -55, -58, -61, -63, -66, -69, + -71, -74, -76, -79, -81, -84, -86, -88, + -91, -93, -95, -97, -99, -101, -103, -105, + -107, -108, -110, -111, -113, -114, -116, -117, + -118, -119, -121, -122, -123, -123, -124, -125, + -126, -126, -127, -127, -127, -128, -128, -128, + -128, -128, -128, -128, -127, -127, -127, -126, + -126, -125, -124, -123, -123, -122, -121, -119, + -118, -117, -116, -114, -113, -111, -110, -108, + -107, -105, -103, -101, -99, -97, -95, -93, + -91, -88, -86, -84, -81, -79, -76, -74, + -71, -69, -66, -63, -61, -58, -55, -52, + -49, -46, -43, -40, -38, -35, -31, -28, + -25, -22, -19, -16, -13, -10, -7, -4 +}; diff --git a/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dialTone/generateWavetables.py b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dialTone/generateWavetables.py new file mode 100644 index 0000000..905593f --- /dev/null +++ b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/dialTone/generateWavetables.py @@ -0,0 +1,101 @@ +## This file generates headers with lookup tables for various waveforms +## Add your own. + +import math + +def phaseSteps(maxPhase, length=256): + steps = range(0, length) + steps = [1.0*x/length * 2.0*math.pi * (maxPhase/360.0) for x in steps] + return(steps) + +def scaleAndRound(data, scale=255, signedInt=True): + data = [0.0+x-min(data) for x in data] + data = [1.0*x/max(data)*scale for x in data] + data = [int(round(x)) for x in data] + if signedInt: + data = [x-(scale+1)/2 for x in data] + return(data) + +def makeSin(maxPhase, length=256): + sinus = [math.sin(x) for x in phaseSteps(maxPhase, length)] + return(sinus) + +def prettyPrint(data, perLine = 8): + outString = "" + for i in range(len(data) / perLine): + strings = [str(x) for x in data[perLine*i:(perLine*i+perLine)]] + outString += "\t" + ", ".join(strings) + ",\n" + outString = outString[:-2] + "\n" # drop the final comma + return(outString) + +def writeHeader(fileName, dataName, data, signedInt=True): + outfile = open(fileName, "w") + if signedInt: + outfile.write("int8_t {}[{:d}] = {{ \n".format(dataName, len(data))) + else: + outfile.write("uint8_t {}[{:d}] = {{ \n".format(dataName, len(data))) + outfile.write(prettyPrint(data)) + outfile.write("};\n") + outfile.close() + +def bandlimitedSawtooth(maxPhase, numberPartials, length=256): + wave = [0]*length + sign = 1.0 + for k in range(1, numberPartials+1): + phases = phaseSteps(maxPhase*k, length) + for i in range(length): + wave[i] += sign * math.sin(phases[i]) / k + sign = sign * -1 + return(wave) + +def bandlimitedSquare(maxPhase, numberPartials, length=256): + wave = [0]*length + for k in range(1, numberPartials*2, 2): + phases = phaseSteps(maxPhase*k, length) + for i in range(length): + wave[i] += math.sin(phases[i]) / k + return(wave) + +def bandlimitedTriangle(maxPhase, numberPartials, length=256): + wave = [0]*length + sign = 1.0 + for k in range(1, numberPartials*2, 2): + phases = phaseSteps(maxPhase*k, length) + for i in range(length): + wave[i] += sign * math.sin(phases[i]) / k**2 + sign = sign * -1 + return(wave) + + + +if __name__ == "__main__": + + ## Full-waves, full 256 bytes, 0-255 range + writeHeader("fullSine.h", 'fullSine', scaleAndRound(makeSin(360))) + + triangleWave = range(0,64) + triangleWave.extend(range(64, -64, -1)) + triangleWave.extend(range(-64, 0, 1)) + triangleWave = scaleAndRound(triangleWave) + writeHeader("fullTriangle.h", 'fullTriangle', triangleWave) + + for numberFrequencies in [3,7,15]: + saw = scaleAndRound(bandlimitedSawtooth(360, numberFrequencies)) + writeHeader("fullSaw{}.h".format(numberFrequencies), + 'fullSaw{}'.format(numberFrequencies), saw) + tri = scaleAndRound(bandlimitedTriangle(360, numberFrequencies)) + writeHeader("fullTri{}.h".format(numberFrequencies), + 'fullTri{}'.format(numberFrequencies), tri) + square = scaleAndRound(bandlimitedSquare(360, numberFrequencies)) + writeHeader("fullSquare{}.h".format(numberFrequencies), + 'fullSquare{}'.format(numberFrequencies), square) + + ## Note that if you define / use too many different waveforms, + ## and you don't store them in PROGMEM in your AVR C routines, + ## you might run the chip out of RAM, which causes strange and + ## nearly impossible-to-diagnose glitches. + + ## So here we're breaking each waveform up into its own include file. + ## There are ways of storing them all in program memory, and we'll + ## see examples of that in later chapters. + diff --git a/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/fatSaw/Makefile b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/fatSaw/Makefile new file mode 100644 index 0000000..5c588dc --- /dev/null +++ b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/fatSaw/Makefile @@ -0,0 +1,196 @@ + +##########------------------------------------------------------########## +########## Project-specific Details ########## +########## Check these every time you start a new project ########## +##########------------------------------------------------------########## + +MCU = atmega168p +F_CPU = 8000000UL +BAUD = 9600UL +## Also try BAUD = 19200 or 38400 if you're feeling lucky. + +## A directory for common include files and the simple USART library. +## If you move either the current folder or the Library folder, you'll +## need to change this path to match. +LIBDIR = ../../AVR-Programming-Library + +##########------------------------------------------------------########## +########## Programmer Defaults ########## +########## Set up once, then forget about it ########## +########## (Can override. See bottom of file.) ########## +##########------------------------------------------------------########## + +PROGRAMMER_TYPE = usbtiny +# extra arguments to avrdude: baud rate, chip type, -F flag, etc. +PROGRAMMER_ARGS = + +##########------------------------------------------------------########## +########## Program Locations ########## +########## Won't need to change if they're in your PATH ########## +##########------------------------------------------------------########## + +CC = avr-gcc +OBJCOPY = avr-objcopy +OBJDUMP = avr-objdump +AVRSIZE = avr-size +AVRDUDE = avrdude + +##########------------------------------------------------------########## +########## Makefile Magic! ########## +########## Summary: ########## +########## We want a .hex file ########## +########## Compile source files into .elf ########## +########## Convert .elf file into .hex ########## +########## You shouldn't need to edit below. ########## +##########------------------------------------------------------########## + +## The name of your project (without the .c) +# TARGET = blinkLED +## Or name it automatically after the enclosing directory +TARGET = $(lastword $(subst /, ,$(CURDIR))) + +# Object files: will find all .c/.h files in current directory +# and in LIBDIR. If you have any other (sub-)directories with code, +# you can add them in to SOURCES below in the wildcard statement. +SOURCES=$(wildcard *.c $(LIBDIR)/*.c) +OBJECTS=$(SOURCES:.c=.o) +HEADERS=$(SOURCES:.c=.h) + +## Compilation options, type man avr-gcc if you're curious. +CPPFLAGS = -DF_CPU=$(F_CPU) -DBAUD=$(BAUD) -I. -I$(LIBDIR) +CFLAGS = -Os -g -std=gnu99 -Wall +## Use short (8-bit) data types +CFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums +## Splits up object files per function +CFLAGS += -ffunction-sections -fdata-sections +LDFLAGS = -Wl,-Map,$(TARGET).map +## Optional, but often ends up with smaller code +LDFLAGS += -Wl,--gc-sections +## Relax shrinks code even more, but makes disassembly messy +## LDFLAGS += -Wl,--relax +## LDFLAGS += -Wl,-u,vfprintf -lprintf_flt -lm ## for floating-point printf +## LDFLAGS += -Wl,-u,vfprintf -lprintf_min ## for smaller printf +TARGET_ARCH = -mmcu=$(MCU) + +## Explicit pattern rules: +## To make .o files from .c files +%.o: %.c $(HEADERS) Makefile + $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c -o $@ $<; + +$(TARGET).elf: $(OBJECTS) + $(CC) $(LDFLAGS) $(TARGET_ARCH) $^ $(LDLIBS) -o $@ + +%.hex: %.elf + $(OBJCOPY) -j .text -j .data -O ihex $< $@ + +%.eeprom: %.elf + $(OBJCOPY) -j .eeprom --change-section-lma .eeprom=0 -O ihex $< $@ + +%.lst: %.elf + $(OBJDUMP) -S $< > $@ + +## These targets don't have files named after them +.PHONY: all disassemble disasm eeprom size clean squeaky_clean flash fuses + +all: $(TARGET).hex + +debug: + @echo + @echo "Source files:" $(SOURCES) + @echo "MCU, F_CPU, BAUD:" $(MCU), $(F_CPU), $(BAUD) + @echo + +# Optionally create listing file from .elf +# This creates approximate assembly-language equivalent of your code. +# Useful for debugging time-sensitive bits, +# or making sure the compiler does what you want. +disassemble: $(TARGET).lst + +disasm: disassemble + +# Optionally show how big the resulting program is +size: $(TARGET).elf + $(AVRSIZE) -C --mcu=$(MCU) $(TARGET).elf + +clean: + rm -f $(TARGET).elf $(TARGET).hex $(TARGET).obj \ + $(TARGET).o $(TARGET).d $(TARGET).eep $(TARGET).lst \ + $(TARGET).lss $(TARGET).sym $(TARGET).map $(TARGET)~ \ + $(TARGET).eeprom + +squeaky_clean: + rm -f *.elf *.hex *.obj *.o *.d *.eep *.lst *.lss *.sym *.map *~ *.eeprom + +##########------------------------------------------------------########## +########## Programmer-specific details ########## +########## Flashing code to AVR using avrdude ########## +##########------------------------------------------------------########## + +flash: $(TARGET).hex + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U flash:w:$< + +## An alias +program: flash + +flash_eeprom: $(TARGET).eeprom + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U eeprom:w:$< + +avrdude_terminal: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nt + +## If you've got multiple programmers that you use, +## you can define them here so that it's easy to switch. +## To invoke, use something like `make flash_arduinoISP` +flash_usbtiny: PROGRAMMER_TYPE = usbtiny +flash_usbtiny: PROGRAMMER_ARGS = # USBTiny works with no further arguments +flash_usbtiny: flash + +flash_usbasp: PROGRAMMER_TYPE = usbasp +flash_usbasp: PROGRAMMER_ARGS = # USBasp works with no further arguments +flash_usbasp: flash + +flash_arduinoISP: PROGRAMMER_TYPE = avrisp +flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P /dev/ttyACM0 +## (for windows) flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P com5 +flash_arduinoISP: flash + +flash_109: PROGRAMMER_TYPE = avr109 +flash_109: PROGRAMMER_ARGS = -b 9600 -P /dev/ttyUSB0 +flash_109: flash + +##########------------------------------------------------------########## +########## Fuse settings and suitable defaults ########## +##########------------------------------------------------------########## + +## Mega 48, 88, 168, 328 default values +LFUSE = 0x62 +HFUSE = 0xdf +EFUSE = 0x00 + +## Generic +FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m + +fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) \ + $(PROGRAMMER_ARGS) $(FUSE_STRING) +show_fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nv + +## Called with no extra definitions, sets to defaults +set_default_fuses: FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m +set_default_fuses: fuses + +## Set the fuse byte for full-speed mode +## Note: can also be set in firmware for modern chips +set_fast_fuse: LFUSE = 0xE2 +set_fast_fuse: FUSE_STRING = -U lfuse:w:$(LFUSE):m +set_fast_fuse: fuses + +## Set the EESAVE fuse byte to preserve EEPROM across flashes +set_eeprom_save_fuse: HFUSE = 0xD7 +set_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +set_eeprom_save_fuse: fuses + +## Clear the EESAVE fuse byte +clear_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +clear_eeprom_save_fuse: fuses diff --git a/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/fatSaw/fatSaw.c b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/fatSaw/fatSaw.c new file mode 100644 index 0000000..4b978b2 --- /dev/null +++ b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/fatSaw/fatSaw.c @@ -0,0 +1,56 @@ +/* + Direct-digital synthesis + Phasing saw waves demo + +*/ + +#include "fatSaw.h" + +int main(void) { + + uint16_t accumulators[NUMBER_OSCILLATORS]; + uint8_t waveStep; + int16_t mixer = 0; + uint8_t i; + + // -------- Inits --------- // + + clock_prescale_set(clock_div_1); /* CPU clock 8 MHz */ + initTimer0(); + SPEAKER_DDR |= (1 << SPEAKER); /* speaker output */ + LED_DDR |= (1 << LED0); + + // Init all to same phase + for (i = 0; i < NUMBER_OSCILLATORS; i++) { + accumulators[i] = 0; + } + + // ------ Event loop ------ // + while (1) { + + /* Load in the PWM value when ready */ + loop_until_bit_is_set(TIFR0, TOV0); /* wait until overflow bit set */ + OCR0A = 128 + mixer; /* signed-integers need shifting up */ + TIFR0 |= (1 << TOV0); /* re-set the overflow bit */ + + /* Update all accumulators, mix together */ + mixer = 0; + for (i = 0; i < NUMBER_OSCILLATORS; i++) { + accumulators[i] += BASEPITCH; + waveStep = accumulators[i] >> 8; + + // Add extra phase increment. + // Makes shifting overtones when + // different frequency components add, subtract + if (waveStep == 0) { /* roughly once per cycle */ + accumulators[i] += PHASE_RATE * i; /* add extra phase */ + } + + mixer += fullSaw15[waveStep]; + } + mixer = mixer >> OSCILLATOR_SHIFT; + /* Dividing by bitshift is very fast. */ + + } /* End event loop */ + return 0; /* This line is never reached */ +} diff --git a/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/fatSaw/fatSaw.h b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/fatSaw/fatSaw.h new file mode 100644 index 0000000..6bb7665 --- /dev/null +++ b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/fatSaw/fatSaw.h @@ -0,0 +1,36 @@ + +// ------- Preamble -------- // +#include /* Defines pins, ports, etc */ +#include /* Functions to waste time */ +#include +#include +#include "pinDefines.h" +#include "macros.h" +#include "fullSaw15.h" + +#define BASEPITCH 220 /* in tuningWord steps, which are ~1/2 Hz */ +#define PHASE_RATE 7 /* controls speed of phasing effect */ + +#define NUMBER_OSCILLATORS 4 +/* 2 and 4 work just fine. + 8 and 16 take too long to maintain our 31.25kHz sample rate + so the pitch shifts downwards and there's all sorts of aliasing. + If you're just after scary sounds, 8 and 16 are awesome, but you may want + to increase the BASEPITCH to compensate. */ + +#define OSCILLATOR_SHIFT 2 +/* This is the number of bits to shift when volume mixing. + 2**OSCILLATOR_SHIFT = NUMBER_OSCILLATORS + If you don't change this to match the number of oscillators, you'll + get clipping and digital distortion. */ + + +static inline void initTimer0(void){ + set_bit(TCCR0A, WGM00); /* Fast PWM mode */ + set_bit(TCCR0A, WGM01); /* Fast PWM mode */ + + set_bit(TCCR0A, COM0A1); /* PWM output on OCR0A */ + set_bit(SPEAKER_DDR, SPEAKER); /* enable output on pin */ + + set_bit(TCCR0B, CS00); /* Clock with /1 prescaler */ +} diff --git a/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/fatSaw/fullSaw15.h b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/fatSaw/fullSaw15.h new file mode 100644 index 0000000..69e64a3 --- /dev/null +++ b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/fatSaw/fullSaw15.h @@ -0,0 +1,34 @@ +int8_t fullSaw15[256] = { + 0, 1, 3, 4, 5, 6, 7, 7, + 7, 7, 7, 7, 8, 9, 10, 12, + 13, 15, 17, 18, 20, 21, 21, 22, + 22, 22, 22, 22, 22, 23, 24, 25, + 27, 29, 31, 33, 34, 35, 36, 36, + 36, 36, 36, 36, 36, 37, 38, 39, + 41, 43, 45, 47, 48, 50, 51, 51, + 51, 51, 51, 51, 51, 51, 52, 53, + 54, 56, 58, 61, 63, 64, 66, 66, + 67, 66, 66, 65, 65, 65, 65, 66, + 68, 70, 72, 75, 77, 79, 81, 82, + 82, 82, 81, 80, 79, 78, 78, 78, + 80, 82, 85, 88, 92, 95, 97, 99, + 100, 99, 98, 95, 93, 90, 88, 88, + 89, 91, 96, 101, 108, 115, 121, 125, + 127, 125, 119, 108, 93, 74, 51, 26, + 0, -27, -52, -75, -94, -109, -120, -126, + -128, -126, -122, -116, -109, -102, -97, -92, + -90, -89, -89, -91, -94, -96, -99, -100, + -101, -100, -98, -96, -93, -89, -86, -83, + -81, -79, -79, -79, -80, -81, -82, -83, + -83, -83, -82, -80, -78, -76, -73, -71, + -69, -67, -66, -66, -66, -66, -67, -67, + -68, -67, -67, -65, -64, -62, -59, -57, + -55, -54, -53, -52, -52, -52, -52, -52, + -52, -52, -52, -51, -49, -48, -46, -44, + -42, -40, -39, -38, -37, -37, -37, -37, + -37, -37, -37, -36, -35, -34, -32, -30, + -28, -26, -25, -24, -23, -23, -23, -23, + -23, -23, -22, -22, -21, -19, -18, -16, + -14, -13, -11, -10, -9, -8, -8, -8, + -8, -8, -8, -7, -6, -5, -4, -2 +}; diff --git a/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/fatSaw/fullSaw3.h b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/fatSaw/fullSaw3.h new file mode 100644 index 0000000..c0c1877 --- /dev/null +++ b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/fatSaw/fullSaw3.h @@ -0,0 +1,34 @@ +int8_t fullSaw3[256] = { + 0, 2, 4, 6, 8, 10, 12, 14, + 16, 18, 20, 22, 23, 25, 27, 28, + 29, 31, 32, 33, 34, 35, 35, 36, + 37, 37, 38, 38, 38, 38, 39, 39, + 39, 39, 39, 38, 38, 38, 38, 38, + 38, 38, 38, 38, 38, 38, 38, 38, + 39, 39, 40, 40, 41, 42, 43, 44, + 45, 46, 47, 49, 51, 52, 54, 56, + 58, 61, 63, 65, 68, 70, 73, 76, + 79, 81, 84, 87, 90, 93, 96, 98, + 101, 104, 106, 109, 111, 114, 116, 118, + 120, 121, 123, 124, 125, 126, 126, 127, + 127, 127, 126, 126, 125, 124, 122, 120, + 118, 116, 113, 110, 107, 104, 100, 96, + 92, 87, 83, 78, 72, 67, 62, 56, + 50, 44, 38, 32, 25, 19, 12, 6, + 0, -7, -13, -20, -26, -33, -39, -45, + -51, -57, -63, -68, -73, -79, -84, -88, + -93, -97, -101, -105, -108, -111, -114, -117, + -119, -121, -123, -125, -126, -127, -127, -128, + -128, -128, -127, -127, -126, -125, -124, -122, + -121, -119, -117, -115, -112, -110, -107, -105, + -102, -99, -97, -94, -91, -88, -85, -82, + -80, -77, -74, -71, -69, -66, -64, -62, + -59, -57, -55, -53, -52, -50, -48, -47, + -46, -45, -44, -43, -42, -41, -41, -40, + -40, -39, -39, -39, -39, -39, -39, -39, + -39, -39, -39, -39, -39, -39, -40, -40, + -40, -40, -40, -39, -39, -39, -39, -38, + -38, -37, -36, -36, -35, -34, -33, -32, + -30, -29, -28, -26, -24, -23, -21, -19, + -17, -15, -13, -11, -9, -7, -5, -3 +}; diff --git a/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/fatSaw/fullSaw7.h b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/fatSaw/fullSaw7.h new file mode 100644 index 0000000..ef38b9e --- /dev/null +++ b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/fatSaw/fullSaw7.h @@ -0,0 +1,34 @@ +int8_t fullSaw7[256] = { + 0, 1, 3, 5, 7, 8, 10, 11, + 12, 13, 14, 15, 15, 15, 15, 16, + 16, 16, 16, 16, 16, 16, 16, 17, + 17, 18, 19, 20, 21, 23, 24, 26, + 28, 30, 32, 34, 36, 38, 39, 41, + 43, 44, 45, 46, 47, 47, 48, 48, + 48, 48, 48, 48, 48, 47, 47, 47, + 47, 47, 48, 49, 50, 51, 52, 54, + 55, 57, 60, 62, 64, 66, 69, 71, + 73, 75, 77, 79, 80, 81, 82, 82, + 82, 82, 82, 81, 80, 80, 79, 78, + 77, 76, 75, 75, 75, 76, 76, 78, + 79, 81, 84, 87, 90, 94, 98, 102, + 106, 110, 114, 117, 121, 123, 125, 127, + 127, 127, 125, 122, 119, 114, 108, 101, + 93, 84, 74, 63, 51, 39, 26, 13, + 0, -14, -27, -40, -52, -64, -75, -85, + -94, -102, -109, -115, -120, -123, -126, -128, + -128, -128, -126, -124, -122, -118, -115, -111, + -107, -103, -99, -95, -91, -88, -85, -82, + -80, -79, -77, -77, -76, -76, -76, -77, + -78, -79, -80, -81, -81, -82, -83, -83, + -83, -83, -83, -82, -81, -80, -78, -76, + -74, -72, -70, -67, -65, -63, -61, -58, + -56, -55, -53, -52, -51, -50, -49, -48, + -48, -48, -48, -48, -49, -49, -49, -49, + -49, -49, -49, -48, -48, -47, -46, -45, + -44, -42, -40, -39, -37, -35, -33, -31, + -29, -27, -25, -24, -22, -21, -20, -19, + -18, -18, -17, -17, -17, -17, -17, -17, + -17, -17, -16, -16, -16, -16, -15, -14, + -13, -12, -11, -9, -8, -6, -4, -2 +}; diff --git a/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/fatSaw/generateWavetables.py b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/fatSaw/generateWavetables.py new file mode 100644 index 0000000..905593f --- /dev/null +++ b/Make AVR Examples/Chapter13_Advanced-PWM-Tricks/fatSaw/generateWavetables.py @@ -0,0 +1,101 @@ +## This file generates headers with lookup tables for various waveforms +## Add your own. + +import math + +def phaseSteps(maxPhase, length=256): + steps = range(0, length) + steps = [1.0*x/length * 2.0*math.pi * (maxPhase/360.0) for x in steps] + return(steps) + +def scaleAndRound(data, scale=255, signedInt=True): + data = [0.0+x-min(data) for x in data] + data = [1.0*x/max(data)*scale for x in data] + data = [int(round(x)) for x in data] + if signedInt: + data = [x-(scale+1)/2 for x in data] + return(data) + +def makeSin(maxPhase, length=256): + sinus = [math.sin(x) for x in phaseSteps(maxPhase, length)] + return(sinus) + +def prettyPrint(data, perLine = 8): + outString = "" + for i in range(len(data) / perLine): + strings = [str(x) for x in data[perLine*i:(perLine*i+perLine)]] + outString += "\t" + ", ".join(strings) + ",\n" + outString = outString[:-2] + "\n" # drop the final comma + return(outString) + +def writeHeader(fileName, dataName, data, signedInt=True): + outfile = open(fileName, "w") + if signedInt: + outfile.write("int8_t {}[{:d}] = {{ \n".format(dataName, len(data))) + else: + outfile.write("uint8_t {}[{:d}] = {{ \n".format(dataName, len(data))) + outfile.write(prettyPrint(data)) + outfile.write("};\n") + outfile.close() + +def bandlimitedSawtooth(maxPhase, numberPartials, length=256): + wave = [0]*length + sign = 1.0 + for k in range(1, numberPartials+1): + phases = phaseSteps(maxPhase*k, length) + for i in range(length): + wave[i] += sign * math.sin(phases[i]) / k + sign = sign * -1 + return(wave) + +def bandlimitedSquare(maxPhase, numberPartials, length=256): + wave = [0]*length + for k in range(1, numberPartials*2, 2): + phases = phaseSteps(maxPhase*k, length) + for i in range(length): + wave[i] += math.sin(phases[i]) / k + return(wave) + +def bandlimitedTriangle(maxPhase, numberPartials, length=256): + wave = [0]*length + sign = 1.0 + for k in range(1, numberPartials*2, 2): + phases = phaseSteps(maxPhase*k, length) + for i in range(length): + wave[i] += sign * math.sin(phases[i]) / k**2 + sign = sign * -1 + return(wave) + + + +if __name__ == "__main__": + + ## Full-waves, full 256 bytes, 0-255 range + writeHeader("fullSine.h", 'fullSine', scaleAndRound(makeSin(360))) + + triangleWave = range(0,64) + triangleWave.extend(range(64, -64, -1)) + triangleWave.extend(range(-64, 0, 1)) + triangleWave = scaleAndRound(triangleWave) + writeHeader("fullTriangle.h", 'fullTriangle', triangleWave) + + for numberFrequencies in [3,7,15]: + saw = scaleAndRound(bandlimitedSawtooth(360, numberFrequencies)) + writeHeader("fullSaw{}.h".format(numberFrequencies), + 'fullSaw{}'.format(numberFrequencies), saw) + tri = scaleAndRound(bandlimitedTriangle(360, numberFrequencies)) + writeHeader("fullTri{}.h".format(numberFrequencies), + 'fullTri{}'.format(numberFrequencies), tri) + square = scaleAndRound(bandlimitedSquare(360, numberFrequencies)) + writeHeader("fullSquare{}.h".format(numberFrequencies), + 'fullSquare{}'.format(numberFrequencies), square) + + ## Note that if you define / use too many different waveforms, + ## and you don't store them in PROGMEM in your AVR C routines, + ## you might run the chip out of RAM, which causes strange and + ## nearly impossible-to-diagnose glitches. + + ## So here we're breaking each waveform up into its own include file. + ## There are ways of storing them all in program memory, and we'll + ## see examples of that in later chapters. + diff --git a/Make AVR Examples/Chapter14_Switches/dcMotorWorkout/Makefile b/Make AVR Examples/Chapter14_Switches/dcMotorWorkout/Makefile new file mode 100644 index 0000000..3d9e544 --- /dev/null +++ b/Make AVR Examples/Chapter14_Switches/dcMotorWorkout/Makefile @@ -0,0 +1,196 @@ + +##########------------------------------------------------------########## +########## Project-specific Details ########## +########## Check these every time you start a new project ########## +##########------------------------------------------------------########## + +MCU = atmega168p +F_CPU = 1000000UL +BAUD = 9600UL +## Also try BAUD = 19200 or 38400 if you're feeling lucky. + +## A directory for common include files and the simple USART library. +## If you move either the current folder or the Library folder, you'll +## need to change this path to match. +LIBDIR = ../../AVR-Programming-Library + +##########------------------------------------------------------########## +########## Programmer Defaults ########## +########## Set up once, then forget about it ########## +########## (Can override. See bottom of file.) ########## +##########------------------------------------------------------########## + +PROGRAMMER_TYPE = usbtiny +# extra arguments to avrdude: baud rate, chip type, -F flag, etc. +PROGRAMMER_ARGS = + +##########------------------------------------------------------########## +########## Program Locations ########## +########## Won't need to change if they're in your PATH ########## +##########------------------------------------------------------########## + +CC = avr-gcc +OBJCOPY = avr-objcopy +OBJDUMP = avr-objdump +AVRSIZE = avr-size +AVRDUDE = avrdude + +##########------------------------------------------------------########## +########## Makefile Magic! ########## +########## Summary: ########## +########## We want a .hex file ########## +########## Compile source files into .elf ########## +########## Convert .elf file into .hex ########## +########## You shouldn't need to edit below. ########## +##########------------------------------------------------------########## + +## The name of your project (without the .c) +# TARGET = blinkLED +## Or name it automatically after the enclosing directory +TARGET = $(lastword $(subst /, ,$(CURDIR))) + +# Object files: will find all .c/.h files in current directory +# and in LIBDIR. If you have any other (sub-)directories with code, +# you can add them in to SOURCES below in the wildcard statement. +SOURCES=$(wildcard *.c $(LIBDIR)/*.c) +OBJECTS=$(SOURCES:.c=.o) +HEADERS=$(SOURCES:.c=.h) + +## Compilation options, type man avr-gcc if you're curious. +CPPFLAGS = -DF_CPU=$(F_CPU) -DBAUD=$(BAUD) -I. -I$(LIBDIR) +CFLAGS = -Os -g -std=gnu99 -Wall +## Use short (8-bit) data types +CFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums +## Splits up object files per function +CFLAGS += -ffunction-sections -fdata-sections +LDFLAGS = -Wl,-Map,$(TARGET).map +## Optional, but often ends up with smaller code +LDFLAGS += -Wl,--gc-sections +## Relax shrinks code even more, but makes disassembly messy +## LDFLAGS += -Wl,--relax +## LDFLAGS += -Wl,-u,vfprintf -lprintf_flt -lm ## for floating-point printf +## LDFLAGS += -Wl,-u,vfprintf -lprintf_min ## for smaller printf +TARGET_ARCH = -mmcu=$(MCU) + +## Explicit pattern rules: +## To make .o files from .c files +%.o: %.c $(HEADERS) Makefile + $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c -o $@ $<; + +$(TARGET).elf: $(OBJECTS) + $(CC) $(LDFLAGS) $(TARGET_ARCH) $^ $(LDLIBS) -o $@ + +%.hex: %.elf + $(OBJCOPY) -j .text -j .data -O ihex $< $@ + +%.eeprom: %.elf + $(OBJCOPY) -j .eeprom --change-section-lma .eeprom=0 -O ihex $< $@ + +%.lst: %.elf + $(OBJDUMP) -S $< > $@ + +## These targets don't have files named after them +.PHONY: all disassemble disasm eeprom size clean squeaky_clean flash fuses + +all: $(TARGET).hex + +debug: + @echo + @echo "Source files:" $(SOURCES) + @echo "MCU, F_CPU, BAUD:" $(MCU), $(F_CPU), $(BAUD) + @echo + +# Optionally create listing file from .elf +# This creates approximate assembly-language equivalent of your code. +# Useful for debugging time-sensitive bits, +# or making sure the compiler does what you want. +disassemble: $(TARGET).lst + +disasm: disassemble + +# Optionally show how big the resulting program is +size: $(TARGET).elf + $(AVRSIZE) -C --mcu=$(MCU) $(TARGET).elf + +clean: + rm -f $(TARGET).elf $(TARGET).hex $(TARGET).obj \ + $(TARGET).o $(TARGET).d $(TARGET).eep $(TARGET).lst \ + $(TARGET).lss $(TARGET).sym $(TARGET).map $(TARGET)~ \ + $(TARGET).eeprom + +squeaky_clean: + rm -f *.elf *.hex *.obj *.o *.d *.eep *.lst *.lss *.sym *.map *~ *.eeprom + +##########------------------------------------------------------########## +########## Programmer-specific details ########## +########## Flashing code to AVR using avrdude ########## +##########------------------------------------------------------########## + +flash: $(TARGET).hex + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U flash:w:$< + +## An alias +program: flash + +flash_eeprom: $(TARGET).eeprom + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U eeprom:w:$< + +avrdude_terminal: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nt + +## If you've got multiple programmers that you use, +## you can define them here so that it's easy to switch. +## To invoke, use something like `make flash_arduinoISP` +flash_usbtiny: PROGRAMMER_TYPE = usbtiny +flash_usbtiny: PROGRAMMER_ARGS = # USBTiny works with no further arguments +flash_usbtiny: flash + +flash_usbasp: PROGRAMMER_TYPE = usbasp +flash_usbasp: PROGRAMMER_ARGS = # USBasp works with no further arguments +flash_usbasp: flash + +flash_arduinoISP: PROGRAMMER_TYPE = avrisp +flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P /dev/ttyACM0 +## (for windows) flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P com5 +flash_arduinoISP: flash + +flash_109: PROGRAMMER_TYPE = avr109 +flash_109: PROGRAMMER_ARGS = -b 9600 -P /dev/ttyUSB0 +flash_109: flash + +##########------------------------------------------------------########## +########## Fuse settings and suitable defaults ########## +##########------------------------------------------------------########## + +## Mega 48, 88, 168, 328 default values +LFUSE = 0x62 +HFUSE = 0xdf +EFUSE = 0x00 + +## Generic +FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m + +fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) \ + $(PROGRAMMER_ARGS) $(FUSE_STRING) +show_fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nv + +## Called with no extra definitions, sets to defaults +set_default_fuses: FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m +set_default_fuses: fuses + +## Set the fuse byte for full-speed mode +## Note: can also be set in firmware for modern chips +set_fast_fuse: LFUSE = 0xE2 +set_fast_fuse: FUSE_STRING = -U lfuse:w:$(LFUSE):m +set_fast_fuse: fuses + +## Set the EESAVE fuse byte to preserve EEPROM across flashes +set_eeprom_save_fuse: HFUSE = 0xD7 +set_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +set_eeprom_save_fuse: fuses + +## Clear the EESAVE fuse byte +clear_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +clear_eeprom_save_fuse: fuses diff --git a/Make AVR Examples/Chapter14_Switches/dcMotorWorkout/dcMotorWorkout.c b/Make AVR Examples/Chapter14_Switches/dcMotorWorkout/dcMotorWorkout.c new file mode 100644 index 0000000..934040e --- /dev/null +++ b/Make AVR Examples/Chapter14_Switches/dcMotorWorkout/dcMotorWorkout.c @@ -0,0 +1,61 @@ + /* Demos PWM control of a DC motor */ + +// ------- Preamble -------- // +#include +#include +#include +#include "pinDefines.h" +#include "USART.h" + +#define SPEED_STEP_DELAY 2 /* milliseconds */ + +// -------- Functions --------- // +static inline void initTimer0(void) { + TCCR0A |= (1 << WGM00); /* Fast PWM mode */ + TCCR0A |= (1 << WGM01); /* Fast PWM mode, pt.2 */ + TCCR0A |= (1 << COM0B1); /* output PWM to pin */ + TCCR0B |= (1 << CS02); /* Clock with /1024 prescaler */ + //TCCR0B |= (1 << CS00); /* Clock with /1024 prescaler, pt.2 */ +} + + +int main(void) { + + uint8_t updateSpeed; + + // -------- Inits --------- // + initTimer0(); + OCR0B = 0; + + ANTENNA_DDR |= (1 << ANTENNA); /* now hooked up to MOSFET, output */ + LED_DDR |= (1 << LED0); + LED_DDR |= (1 << LED1); + + initUSART(); + printString("DC Motor Workout\r\n"); + + // ------ Event loop ------ // + while (1) { + + updateSpeed = getNumber(); + + /* Ramp up/down to desired speed */ + if (OCR0B < updateSpeed) { + LED_PORT |= (1 << LED0); + while (OCR0B < updateSpeed) { + OCR0B++; + _delay_ms(SPEED_STEP_DELAY); + } + } + else { + LED_PORT |= (1 << LED1); + while (OCR0B > updateSpeed) { + OCR0B--; + _delay_ms(SPEED_STEP_DELAY); + } + } + LED_PORT = 0; /* all off */ + + } /* End event loop */ + return 0; /* This line is never reached */ +} diff --git a/Make AVR Examples/Chapter15_Advanced-Motors/hBridgeWorkout/Makefile b/Make AVR Examples/Chapter15_Advanced-Motors/hBridgeWorkout/Makefile new file mode 100644 index 0000000..3d9e544 --- /dev/null +++ b/Make AVR Examples/Chapter15_Advanced-Motors/hBridgeWorkout/Makefile @@ -0,0 +1,196 @@ + +##########------------------------------------------------------########## +########## Project-specific Details ########## +########## Check these every time you start a new project ########## +##########------------------------------------------------------########## + +MCU = atmega168p +F_CPU = 1000000UL +BAUD = 9600UL +## Also try BAUD = 19200 or 38400 if you're feeling lucky. + +## A directory for common include files and the simple USART library. +## If you move either the current folder or the Library folder, you'll +## need to change this path to match. +LIBDIR = ../../AVR-Programming-Library + +##########------------------------------------------------------########## +########## Programmer Defaults ########## +########## Set up once, then forget about it ########## +########## (Can override. See bottom of file.) ########## +##########------------------------------------------------------########## + +PROGRAMMER_TYPE = usbtiny +# extra arguments to avrdude: baud rate, chip type, -F flag, etc. +PROGRAMMER_ARGS = + +##########------------------------------------------------------########## +########## Program Locations ########## +########## Won't need to change if they're in your PATH ########## +##########------------------------------------------------------########## + +CC = avr-gcc +OBJCOPY = avr-objcopy +OBJDUMP = avr-objdump +AVRSIZE = avr-size +AVRDUDE = avrdude + +##########------------------------------------------------------########## +########## Makefile Magic! ########## +########## Summary: ########## +########## We want a .hex file ########## +########## Compile source files into .elf ########## +########## Convert .elf file into .hex ########## +########## You shouldn't need to edit below. ########## +##########------------------------------------------------------########## + +## The name of your project (without the .c) +# TARGET = blinkLED +## Or name it automatically after the enclosing directory +TARGET = $(lastword $(subst /, ,$(CURDIR))) + +# Object files: will find all .c/.h files in current directory +# and in LIBDIR. If you have any other (sub-)directories with code, +# you can add them in to SOURCES below in the wildcard statement. +SOURCES=$(wildcard *.c $(LIBDIR)/*.c) +OBJECTS=$(SOURCES:.c=.o) +HEADERS=$(SOURCES:.c=.h) + +## Compilation options, type man avr-gcc if you're curious. +CPPFLAGS = -DF_CPU=$(F_CPU) -DBAUD=$(BAUD) -I. -I$(LIBDIR) +CFLAGS = -Os -g -std=gnu99 -Wall +## Use short (8-bit) data types +CFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums +## Splits up object files per function +CFLAGS += -ffunction-sections -fdata-sections +LDFLAGS = -Wl,-Map,$(TARGET).map +## Optional, but often ends up with smaller code +LDFLAGS += -Wl,--gc-sections +## Relax shrinks code even more, but makes disassembly messy +## LDFLAGS += -Wl,--relax +## LDFLAGS += -Wl,-u,vfprintf -lprintf_flt -lm ## for floating-point printf +## LDFLAGS += -Wl,-u,vfprintf -lprintf_min ## for smaller printf +TARGET_ARCH = -mmcu=$(MCU) + +## Explicit pattern rules: +## To make .o files from .c files +%.o: %.c $(HEADERS) Makefile + $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c -o $@ $<; + +$(TARGET).elf: $(OBJECTS) + $(CC) $(LDFLAGS) $(TARGET_ARCH) $^ $(LDLIBS) -o $@ + +%.hex: %.elf + $(OBJCOPY) -j .text -j .data -O ihex $< $@ + +%.eeprom: %.elf + $(OBJCOPY) -j .eeprom --change-section-lma .eeprom=0 -O ihex $< $@ + +%.lst: %.elf + $(OBJDUMP) -S $< > $@ + +## These targets don't have files named after them +.PHONY: all disassemble disasm eeprom size clean squeaky_clean flash fuses + +all: $(TARGET).hex + +debug: + @echo + @echo "Source files:" $(SOURCES) + @echo "MCU, F_CPU, BAUD:" $(MCU), $(F_CPU), $(BAUD) + @echo + +# Optionally create listing file from .elf +# This creates approximate assembly-language equivalent of your code. +# Useful for debugging time-sensitive bits, +# or making sure the compiler does what you want. +disassemble: $(TARGET).lst + +disasm: disassemble + +# Optionally show how big the resulting program is +size: $(TARGET).elf + $(AVRSIZE) -C --mcu=$(MCU) $(TARGET).elf + +clean: + rm -f $(TARGET).elf $(TARGET).hex $(TARGET).obj \ + $(TARGET).o $(TARGET).d $(TARGET).eep $(TARGET).lst \ + $(TARGET).lss $(TARGET).sym $(TARGET).map $(TARGET)~ \ + $(TARGET).eeprom + +squeaky_clean: + rm -f *.elf *.hex *.obj *.o *.d *.eep *.lst *.lss *.sym *.map *~ *.eeprom + +##########------------------------------------------------------########## +########## Programmer-specific details ########## +########## Flashing code to AVR using avrdude ########## +##########------------------------------------------------------########## + +flash: $(TARGET).hex + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U flash:w:$< + +## An alias +program: flash + +flash_eeprom: $(TARGET).eeprom + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U eeprom:w:$< + +avrdude_terminal: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nt + +## If you've got multiple programmers that you use, +## you can define them here so that it's easy to switch. +## To invoke, use something like `make flash_arduinoISP` +flash_usbtiny: PROGRAMMER_TYPE = usbtiny +flash_usbtiny: PROGRAMMER_ARGS = # USBTiny works with no further arguments +flash_usbtiny: flash + +flash_usbasp: PROGRAMMER_TYPE = usbasp +flash_usbasp: PROGRAMMER_ARGS = # USBasp works with no further arguments +flash_usbasp: flash + +flash_arduinoISP: PROGRAMMER_TYPE = avrisp +flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P /dev/ttyACM0 +## (for windows) flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P com5 +flash_arduinoISP: flash + +flash_109: PROGRAMMER_TYPE = avr109 +flash_109: PROGRAMMER_ARGS = -b 9600 -P /dev/ttyUSB0 +flash_109: flash + +##########------------------------------------------------------########## +########## Fuse settings and suitable defaults ########## +##########------------------------------------------------------########## + +## Mega 48, 88, 168, 328 default values +LFUSE = 0x62 +HFUSE = 0xdf +EFUSE = 0x00 + +## Generic +FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m + +fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) \ + $(PROGRAMMER_ARGS) $(FUSE_STRING) +show_fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nv + +## Called with no extra definitions, sets to defaults +set_default_fuses: FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m +set_default_fuses: fuses + +## Set the fuse byte for full-speed mode +## Note: can also be set in firmware for modern chips +set_fast_fuse: LFUSE = 0xE2 +set_fast_fuse: FUSE_STRING = -U lfuse:w:$(LFUSE):m +set_fast_fuse: fuses + +## Set the EESAVE fuse byte to preserve EEPROM across flashes +set_eeprom_save_fuse: HFUSE = 0xD7 +set_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +set_eeprom_save_fuse: fuses + +## Clear the EESAVE fuse byte +clear_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +clear_eeprom_save_fuse: fuses diff --git a/Make AVR Examples/Chapter15_Advanced-Motors/hBridgeWorkout/hBridgeWorkout.c b/Make AVR Examples/Chapter15_Advanced-Motors/hBridgeWorkout/hBridgeWorkout.c new file mode 100644 index 0000000..a1178d9 --- /dev/null +++ b/Make AVR Examples/Chapter15_Advanced-Motors/hBridgeWorkout/hBridgeWorkout.c @@ -0,0 +1,63 @@ +// Simple demo of an h-bridge + +// ------- Preamble -------- // +#include +#include +#include +#include "pinDefines.h" + +static inline void setBridgeState(uint8_t bridgeA, uint8_t bridgeB) { + /* Utility function that lights LEDs when it energizes a bridge side */ + if (bridgeA) { + PORTD |= (1 << PD6); + LED_PORT |= (1 << LED0); + } + else { + PORTD &= ~(1 << PD6); + LED_PORT &= ~(1 << LED0); + } + if (bridgeB) { + PORTD |= (1 << PD5); + LED_PORT |= (1 << LED1); + } + else { + PORTD &= ~(1 << PD5); + LED_PORT &= ~(1 << LED1); + } +} + + +int main(void) { + // -------- Inits --------- // + + DDRD |= (1 << PD6); /* now hooked up to bridge, input1 */ + DDRD |= (1 << PD5); /* now hooked up to bridge, input2 */ + LED_DDR |= (1 << LED0); + LED_DDR |= (1 << LED1); + + // ------ Event loop ------ // + while (1) { + + setBridgeState(1, 0); /* "forward" */ + _delay_ms(2000); + + setBridgeState(0, 0); /* both low stops motor */ + _delay_ms(2000); + + setBridgeState(0, 1); /* "reverse" */ + _delay_ms(2000); + + setBridgeState(1, 1); /* both high also stops motor */ + _delay_ms(2000); + + // For extra-quick braking, energize the motor backwards + setBridgeState(1, 0); + _delay_ms(2000); + setBridgeState(0, 1); + _delay_ms(75); /* tune this time to match your system */ + setBridgeState(0, 0); + _delay_ms(2000); + + } /* End event loop */ + return 0; +} diff --git a/Make AVR Examples/Chapter15_Advanced-Motors/stepperWorkout/Makefile b/Make AVR Examples/Chapter15_Advanced-Motors/stepperWorkout/Makefile new file mode 100644 index 0000000..5c588dc --- /dev/null +++ b/Make AVR Examples/Chapter15_Advanced-Motors/stepperWorkout/Makefile @@ -0,0 +1,196 @@ + +##########------------------------------------------------------########## +########## Project-specific Details ########## +########## Check these every time you start a new project ########## +##########------------------------------------------------------########## + +MCU = atmega168p +F_CPU = 8000000UL +BAUD = 9600UL +## Also try BAUD = 19200 or 38400 if you're feeling lucky. + +## A directory for common include files and the simple USART library. +## If you move either the current folder or the Library folder, you'll +## need to change this path to match. +LIBDIR = ../../AVR-Programming-Library + +##########------------------------------------------------------########## +########## Programmer Defaults ########## +########## Set up once, then forget about it ########## +########## (Can override. See bottom of file.) ########## +##########------------------------------------------------------########## + +PROGRAMMER_TYPE = usbtiny +# extra arguments to avrdude: baud rate, chip type, -F flag, etc. +PROGRAMMER_ARGS = + +##########------------------------------------------------------########## +########## Program Locations ########## +########## Won't need to change if they're in your PATH ########## +##########------------------------------------------------------########## + +CC = avr-gcc +OBJCOPY = avr-objcopy +OBJDUMP = avr-objdump +AVRSIZE = avr-size +AVRDUDE = avrdude + +##########------------------------------------------------------########## +########## Makefile Magic! ########## +########## Summary: ########## +########## We want a .hex file ########## +########## Compile source files into .elf ########## +########## Convert .elf file into .hex ########## +########## You shouldn't need to edit below. ########## +##########------------------------------------------------------########## + +## The name of your project (without the .c) +# TARGET = blinkLED +## Or name it automatically after the enclosing directory +TARGET = $(lastword $(subst /, ,$(CURDIR))) + +# Object files: will find all .c/.h files in current directory +# and in LIBDIR. If you have any other (sub-)directories with code, +# you can add them in to SOURCES below in the wildcard statement. +SOURCES=$(wildcard *.c $(LIBDIR)/*.c) +OBJECTS=$(SOURCES:.c=.o) +HEADERS=$(SOURCES:.c=.h) + +## Compilation options, type man avr-gcc if you're curious. +CPPFLAGS = -DF_CPU=$(F_CPU) -DBAUD=$(BAUD) -I. -I$(LIBDIR) +CFLAGS = -Os -g -std=gnu99 -Wall +## Use short (8-bit) data types +CFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums +## Splits up object files per function +CFLAGS += -ffunction-sections -fdata-sections +LDFLAGS = -Wl,-Map,$(TARGET).map +## Optional, but often ends up with smaller code +LDFLAGS += -Wl,--gc-sections +## Relax shrinks code even more, but makes disassembly messy +## LDFLAGS += -Wl,--relax +## LDFLAGS += -Wl,-u,vfprintf -lprintf_flt -lm ## for floating-point printf +## LDFLAGS += -Wl,-u,vfprintf -lprintf_min ## for smaller printf +TARGET_ARCH = -mmcu=$(MCU) + +## Explicit pattern rules: +## To make .o files from .c files +%.o: %.c $(HEADERS) Makefile + $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c -o $@ $<; + +$(TARGET).elf: $(OBJECTS) + $(CC) $(LDFLAGS) $(TARGET_ARCH) $^ $(LDLIBS) -o $@ + +%.hex: %.elf + $(OBJCOPY) -j .text -j .data -O ihex $< $@ + +%.eeprom: %.elf + $(OBJCOPY) -j .eeprom --change-section-lma .eeprom=0 -O ihex $< $@ + +%.lst: %.elf + $(OBJDUMP) -S $< > $@ + +## These targets don't have files named after them +.PHONY: all disassemble disasm eeprom size clean squeaky_clean flash fuses + +all: $(TARGET).hex + +debug: + @echo + @echo "Source files:" $(SOURCES) + @echo "MCU, F_CPU, BAUD:" $(MCU), $(F_CPU), $(BAUD) + @echo + +# Optionally create listing file from .elf +# This creates approximate assembly-language equivalent of your code. +# Useful for debugging time-sensitive bits, +# or making sure the compiler does what you want. +disassemble: $(TARGET).lst + +disasm: disassemble + +# Optionally show how big the resulting program is +size: $(TARGET).elf + $(AVRSIZE) -C --mcu=$(MCU) $(TARGET).elf + +clean: + rm -f $(TARGET).elf $(TARGET).hex $(TARGET).obj \ + $(TARGET).o $(TARGET).d $(TARGET).eep $(TARGET).lst \ + $(TARGET).lss $(TARGET).sym $(TARGET).map $(TARGET)~ \ + $(TARGET).eeprom + +squeaky_clean: + rm -f *.elf *.hex *.obj *.o *.d *.eep *.lst *.lss *.sym *.map *~ *.eeprom + +##########------------------------------------------------------########## +########## Programmer-specific details ########## +########## Flashing code to AVR using avrdude ########## +##########------------------------------------------------------########## + +flash: $(TARGET).hex + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U flash:w:$< + +## An alias +program: flash + +flash_eeprom: $(TARGET).eeprom + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U eeprom:w:$< + +avrdude_terminal: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nt + +## If you've got multiple programmers that you use, +## you can define them here so that it's easy to switch. +## To invoke, use something like `make flash_arduinoISP` +flash_usbtiny: PROGRAMMER_TYPE = usbtiny +flash_usbtiny: PROGRAMMER_ARGS = # USBTiny works with no further arguments +flash_usbtiny: flash + +flash_usbasp: PROGRAMMER_TYPE = usbasp +flash_usbasp: PROGRAMMER_ARGS = # USBasp works with no further arguments +flash_usbasp: flash + +flash_arduinoISP: PROGRAMMER_TYPE = avrisp +flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P /dev/ttyACM0 +## (for windows) flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P com5 +flash_arduinoISP: flash + +flash_109: PROGRAMMER_TYPE = avr109 +flash_109: PROGRAMMER_ARGS = -b 9600 -P /dev/ttyUSB0 +flash_109: flash + +##########------------------------------------------------------########## +########## Fuse settings and suitable defaults ########## +##########------------------------------------------------------########## + +## Mega 48, 88, 168, 328 default values +LFUSE = 0x62 +HFUSE = 0xdf +EFUSE = 0x00 + +## Generic +FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m + +fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) \ + $(PROGRAMMER_ARGS) $(FUSE_STRING) +show_fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nv + +## Called with no extra definitions, sets to defaults +set_default_fuses: FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m +set_default_fuses: fuses + +## Set the fuse byte for full-speed mode +## Note: can also be set in firmware for modern chips +set_fast_fuse: LFUSE = 0xE2 +set_fast_fuse: FUSE_STRING = -U lfuse:w:$(LFUSE):m +set_fast_fuse: fuses + +## Set the EESAVE fuse byte to preserve EEPROM across flashes +set_eeprom_save_fuse: HFUSE = 0xD7 +set_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +set_eeprom_save_fuse: fuses + +## Clear the EESAVE fuse byte +clear_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +clear_eeprom_save_fuse: fuses diff --git a/Make AVR Examples/Chapter15_Advanced-Motors/stepperWorkout/half_stepping.h b/Make AVR Examples/Chapter15_Advanced-Motors/stepperWorkout/half_stepping.h new file mode 100644 index 0000000..a030b16 --- /dev/null +++ b/Make AVR Examples/Chapter15_Advanced-Motors/stepperWorkout/half_stepping.h @@ -0,0 +1,17 @@ + +// Include file for half-stepping order +// You may need to change the software pinouts around to match your motor +// or change your motor connections around to match the software. + +const uint8_t stepOrder[] = { + (1 << PB0) | (1 << PB2), + (1 << PB0), + (1 << PB0) | (1 << PB3), + (1 << PB3), + (1 << PB1) | (1 << PB3), + (1 << PB1), + (1 << PB1) | (1 << PB2), + (1 << PB2) +}; + +#define LAST_PHASE_IN_CYCLE 7 diff --git a/Make AVR Examples/Chapter15_Advanced-Motors/stepperWorkout/stepperWorkout.c b/Make AVR Examples/Chapter15_Advanced-Motors/stepperWorkout/stepperWorkout.c new file mode 100644 index 0000000..c79d057 --- /dev/null +++ b/Make AVR Examples/Chapter15_Advanced-Motors/stepperWorkout/stepperWorkout.c @@ -0,0 +1,137 @@ + /* Stepper Motor Demo with Accelerated Moves */ + +// ------- Preamble -------- // +#include +#include +#include +#include +#include "USART.h" + + /* Set these to +/- 1 for half-stepping, +/- 2 for full-stepping */ +#define FORWARD 1 +#define BACKWARD -1 +#define TURN 400 /* steps per rotation, + depends on stepping & motor */ + + /* These parameters will depend on your motor, what it's driving */ +#define MAX_DELAY 255 /* determines min startup speed */ +#define MIN_DELAY 10 /* determines max cruise speed */ +#define ACCELERATION 16 /* lower = smoother but slower accel */ + +#define RAMP_STEPS (MAX_DELAY - MIN_DELAY) / ACCELERATION + +// -------- Global Variables --------- // +const uint8_t motorPhases[] = { + (1 << PB0) | (1 << PB2), /* full */ + (1 << PB0), /* half */ + (1 << PB0) | (1 << PB3), /* full */ + (1 << PB3), /* half */ + (1 << PB1) | (1 << PB3), /* etc. */ + (1 << PB1), + (1 << PB1) | (1 << PB2), + (1 << PB2) +}; + +volatile uint8_t stepPhase = 0; +volatile int8_t direction = FORWARD; +volatile uint16_t stepCounter = 0; + +// -------- Functions --------- // +void initTimer(void) { + TCCR0A |= (1 << WGM01); /* CTC mode */ + TCCR0B |= (1 << CS00) | (1 << CS02); + OCR0A = MAX_DELAY; /* set default speed as slowest */ + sei(); /* enable global interrupts */ + /* Notice we haven't set the timer0 interrupt flag yet. */ +} + +ISR(TIMER0_COMPA_vect) { + stepPhase += direction; /* take step in right direction */ + stepPhase &= 0b00000111; /* keep phase in range 0-7 */ + PORTB = motorPhases[stepPhase]; /* write phase out to motor */ + stepCounter++; /* count step taken */ +} + +void takeSteps(uint16_t howManySteps, uint8_t delay) { + UDR0 = delay; /* send speed/delay over serial, non-blocking */ + OCR0A = delay; /* delay in counter compare register */ + stepCounter = 0; /* initialize to zero steps taken so far */ + TIMSK0 |= (1 << OCIE0A); /* turn on interrupts, stepping */ + while (!(stepCounter == howManySteps)) {; + } /* wait */ + TIMSK0 &= ~(1 << OCIE0A); /* turn back off */ +} + +void trapezoidMove(int16_t howManySteps) { + uint8_t delay = MAX_DELAY; + uint16_t stepsTaken = 0; + + /* set direction, make howManySteps > 0 */ + if (howManySteps > 0) { + direction = FORWARD; + } + else { + direction = BACKWARD; + howManySteps = -howManySteps; + } + + if (howManySteps > (RAMP_STEPS * 2)) { + /* Have enough steps for a full trapezoid */ + /* Accelerate */ + while (stepsTaken < RAMP_STEPS) { + takeSteps(1, delay); + delay -= ACCELERATION; + stepsTaken++; + } + /* Cruise */ + delay = MIN_DELAY; + takeSteps((howManySteps - 2 * RAMP_STEPS), delay); + stepsTaken += (howManySteps - 2 * RAMP_STEPS); + /* Decelerate */ + while (stepsTaken < howManySteps) { + takeSteps(1, delay); + delay += ACCELERATION; + stepsTaken++; + } + } + else { + /* Partial ramp up/down */ + while (stepsTaken <= howManySteps / 2) { + takeSteps(1, delay); + delay -= ACCELERATION; + stepsTaken++; + } + delay += ACCELERATION; + while (stepsTaken < howManySteps) { + takeSteps(1, delay); + delay += ACCELERATION; + stepsTaken++; + } + } +} + +int main(void) { + // -------- Inits --------- // + clock_prescale_set(clock_div_1); /* CPU clock 8 MHz */ + initUSART(); + _delay_ms(1000); + initTimer(); + DDRB = (1 << PB0) | (1 << PB1) | (1 << PB2) | (1 << PB3); + + // ------ Event loop ------ // + while (1) { + + /* Smooth movements, trapezoidal acceleration */ + trapezoidMove(2 * TURN); /* two full turns */ + trapezoidMove(-TURN / 2); /* half turn */ + trapezoidMove(TURN / 4); /* quarter turn */ + trapezoidMove(-TURN / 8); /* eighth */ + _delay_ms(TURN); + trapezoidMove(-TURN / 4); /* the other way */ + trapezoidMove(TURN / 8); + trapezoidMove(TURN / 2); /* half turn back to start */ + _delay_ms(1000); + + } /* End event loop */ + return 0; /* This line is never reached */ +} diff --git a/Make AVR Examples/Chapter16_SPI/spiEEPROMDemo/25LC256.c b/Make AVR Examples/Chapter16_SPI/spiEEPROMDemo/25LC256.c new file mode 100644 index 0000000..f08ee38 --- /dev/null +++ b/Make AVR Examples/Chapter16_SPI/spiEEPROMDemo/25LC256.c @@ -0,0 +1,105 @@ +#include "25LC256.h" + +void initSPI(void) { + SPI_SS_DDR |= (1 << SPI_SS); /* set SS output */ + SPI_SS_PORT |= (1 << SPI_SS); /* start off not selected (high) */ + + SPI_MOSI_DDR |= (1 << SPI_MOSI); /* output on MOSI */ + SPI_MISO_PORT |= (1 << SPI_MISO); /* pullup on MISO */ + SPI_SCK_DDR |= (1 << SPI_SCK); /* output on SCK */ + + /* Don't have to set phase, polarity b/c + * default works with 25LCxxx chips */ + SPCR |= (1 << SPR1); /* div 16, safer for breadboards */ + SPCR |= (1 << MSTR); /* clockmaster */ + SPCR |= (1 << SPE); /* enable */ +} + +void SPI_tradeByte(uint8_t byte) { + SPDR = byte; /* SPI starts sending immediately */ + loop_until_bit_is_set(SPSR, SPIF); /* wait until done */ + /* SPDR now contains the received byte */ +} + +void EEPROM_send16BitAddress(uint16_t address) { + SPI_tradeByte((uint8_t) (address >> 8)); /* most significant byte */ + SPI_tradeByte((uint8_t) address); /* least significant byte */ +} + +uint8_t EEPROM_readStatus(void) { + SLAVE_SELECT; + SPI_tradeByte(EEPROM_RDSR); + SPI_tradeByte(0); /* clock out eight bits */ + SLAVE_DESELECT; + return (SPDR); /* return the result */ +} + +void EEPROM_writeEnable(void) { + SLAVE_SELECT; + SPI_tradeByte(EEPROM_WREN); + SLAVE_DESELECT; +} + +uint8_t EEPROM_readByte(uint16_t address) { + SLAVE_SELECT; + SPI_tradeByte(EEPROM_READ); + EEPROM_send16BitAddress(address); + SPI_tradeByte(0); + SLAVE_DESELECT; + return (SPDR); +} + +uint16_t EEPROM_readWord(uint16_t address) { + uint16_t eepromWord; + SLAVE_SELECT; + SPI_tradeByte(EEPROM_READ); + EEPROM_send16BitAddress(address); + SPI_tradeByte(0); + eepromWord = SPDR; + eepromWord = (eepromWord << 8); /* most-sig bit */ + SPI_tradeByte(0); + eepromWord += SPDR; /* least-sig bit */ + SLAVE_DESELECT; + return (eepromWord); +} + +void EEPROM_writeByte(uint16_t address, uint8_t byte) { + EEPROM_writeEnable(); + SLAVE_SELECT; + SPI_tradeByte(EEPROM_WRITE); + EEPROM_send16BitAddress(address); + SPI_tradeByte(byte); + SLAVE_DESELECT; + while (EEPROM_readStatus() & _BV(EEPROM_WRITE_IN_PROGRESS)) {; + } +} + +void EEPROM_writeWord(uint16_t address, uint16_t word) { + EEPROM_writeEnable(); + SLAVE_SELECT; + SPI_tradeByte(EEPROM_WRITE); + EEPROM_send16BitAddress(address); + SPI_tradeByte((uint8_t) (word >> 8)); + SPI_tradeByte((uint8_t) word); + SLAVE_DESELECT; + while (EEPROM_readStatus() & _BV(EEPROM_WRITE_IN_PROGRESS)) {; + } +} + +void EEPROM_clearAll(void) { + uint8_t i; + uint16_t pageAddress = 0; + while (pageAddress < EEPROM_BYTES_MAX) { + EEPROM_writeEnable(); + SLAVE_SELECT; + SPI_tradeByte(EEPROM_WRITE); + EEPROM_send16BitAddress(pageAddress); + for (i = 0; i < EEPROM_BYTES_PER_PAGE; i++) { + SPI_tradeByte(0); + } + SLAVE_DESELECT; + pageAddress += EEPROM_BYTES_PER_PAGE; + while (EEPROM_readStatus() & _BV(EEPROM_WRITE_IN_PROGRESS)) {; + } + } +} diff --git a/Make AVR Examples/Chapter16_SPI/spiEEPROMDemo/25LC256.h b/Make AVR Examples/Chapter16_SPI/spiEEPROMDemo/25LC256.h new file mode 100644 index 0000000..01b793e --- /dev/null +++ b/Make AVR Examples/Chapter16_SPI/spiEEPROMDemo/25LC256.h @@ -0,0 +1,60 @@ + /* SPI EEPROM 25LC256 Library */ +#include +#include "pinDefines.h" + + + /* Which pin selects EEPROM as slave? */ +#define SLAVE_SELECT SPI_SS_PORT &= ~(1 << SPI_SS) +#define SLAVE_DESELECT SPI_SS_PORT |= (1 << SPI_SS) + +// Instruction Set -- from data sheet +#define EEPROM_READ 0b00000011 /* read memory */ +#define EEPROM_WRITE 0b00000010 /* write to memory */ + +#define EEPROM_WRDI 0b00000100 /* write disable */ +#define EEPROM_WREN 0b00000110 /* write enable */ + +#define EEPROM_RDSR 0b00000101 /* read status register */ +#define EEPROM_WRSR 0b00000001 /* write status register */ + +// EEPROM Status Register Bits -- from data sheet +// Use these to parse status register +#define EEPROM_WRITE_IN_PROGRESS 0 +#define EEPROM_WRITE_ENABLE_LATCH 1 +#define EEPROM_BLOCK_PROTECT_0 2 +#define EEPROM_BLOCK_PROTECT_1 3 + +#define EEPROM_BYTES_PER_PAGE 64 +#define EEPROM_BYTES_MAX 0x7FFF + +// Functions + + /* Init SPI to run EEPROM with phase, polarity = 0,0 */ +void initSPI(void); + + /* Generic. Just loads up HW SPI register and waits */ +void SPI_tradeByte(uint8_t byte); + + /* splits 16-bit address into 2 bytes, sends both */ +void EEPROM_send16BitAddress(uint16_t address); + + /* reads the EEPROM status register */ +uint8_t EEPROM_readStatus(void); + + /* helper: sets EEPROM write enable */ +void EEPROM_writeEnable(void); + + /* gets a byte from a given memory location */ +uint8_t EEPROM_readByte(uint16_t address); + + /* gets two bytes from a given memory location */ +uint16_t EEPROM_readWord(uint16_t address); + + /* writes a byte to a given memory location */ +void EEPROM_writeByte(uint16_t address, uint8_t byte); + + /* gets two bytes to a given memory location */ +void EEPROM_writeWord(uint16_t address, uint16_t word); + + /* sets every byte in memory to zero */ +void EEPROM_clearAll(void); diff --git a/Make AVR Examples/Chapter16_SPI/spiEEPROMDemo/Makefile b/Make AVR Examples/Chapter16_SPI/spiEEPROMDemo/Makefile new file mode 100644 index 0000000..3d9e544 --- /dev/null +++ b/Make AVR Examples/Chapter16_SPI/spiEEPROMDemo/Makefile @@ -0,0 +1,196 @@ + +##########------------------------------------------------------########## +########## Project-specific Details ########## +########## Check these every time you start a new project ########## +##########------------------------------------------------------########## + +MCU = atmega168p +F_CPU = 1000000UL +BAUD = 9600UL +## Also try BAUD = 19200 or 38400 if you're feeling lucky. + +## A directory for common include files and the simple USART library. +## If you move either the current folder or the Library folder, you'll +## need to change this path to match. +LIBDIR = ../../AVR-Programming-Library + +##########------------------------------------------------------########## +########## Programmer Defaults ########## +########## Set up once, then forget about it ########## +########## (Can override. See bottom of file.) ########## +##########------------------------------------------------------########## + +PROGRAMMER_TYPE = usbtiny +# extra arguments to avrdude: baud rate, chip type, -F flag, etc. +PROGRAMMER_ARGS = + +##########------------------------------------------------------########## +########## Program Locations ########## +########## Won't need to change if they're in your PATH ########## +##########------------------------------------------------------########## + +CC = avr-gcc +OBJCOPY = avr-objcopy +OBJDUMP = avr-objdump +AVRSIZE = avr-size +AVRDUDE = avrdude + +##########------------------------------------------------------########## +########## Makefile Magic! ########## +########## Summary: ########## +########## We want a .hex file ########## +########## Compile source files into .elf ########## +########## Convert .elf file into .hex ########## +########## You shouldn't need to edit below. ########## +##########------------------------------------------------------########## + +## The name of your project (without the .c) +# TARGET = blinkLED +## Or name it automatically after the enclosing directory +TARGET = $(lastword $(subst /, ,$(CURDIR))) + +# Object files: will find all .c/.h files in current directory +# and in LIBDIR. If you have any other (sub-)directories with code, +# you can add them in to SOURCES below in the wildcard statement. +SOURCES=$(wildcard *.c $(LIBDIR)/*.c) +OBJECTS=$(SOURCES:.c=.o) +HEADERS=$(SOURCES:.c=.h) + +## Compilation options, type man avr-gcc if you're curious. +CPPFLAGS = -DF_CPU=$(F_CPU) -DBAUD=$(BAUD) -I. -I$(LIBDIR) +CFLAGS = -Os -g -std=gnu99 -Wall +## Use short (8-bit) data types +CFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums +## Splits up object files per function +CFLAGS += -ffunction-sections -fdata-sections +LDFLAGS = -Wl,-Map,$(TARGET).map +## Optional, but often ends up with smaller code +LDFLAGS += -Wl,--gc-sections +## Relax shrinks code even more, but makes disassembly messy +## LDFLAGS += -Wl,--relax +## LDFLAGS += -Wl,-u,vfprintf -lprintf_flt -lm ## for floating-point printf +## LDFLAGS += -Wl,-u,vfprintf -lprintf_min ## for smaller printf +TARGET_ARCH = -mmcu=$(MCU) + +## Explicit pattern rules: +## To make .o files from .c files +%.o: %.c $(HEADERS) Makefile + $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c -o $@ $<; + +$(TARGET).elf: $(OBJECTS) + $(CC) $(LDFLAGS) $(TARGET_ARCH) $^ $(LDLIBS) -o $@ + +%.hex: %.elf + $(OBJCOPY) -j .text -j .data -O ihex $< $@ + +%.eeprom: %.elf + $(OBJCOPY) -j .eeprom --change-section-lma .eeprom=0 -O ihex $< $@ + +%.lst: %.elf + $(OBJDUMP) -S $< > $@ + +## These targets don't have files named after them +.PHONY: all disassemble disasm eeprom size clean squeaky_clean flash fuses + +all: $(TARGET).hex + +debug: + @echo + @echo "Source files:" $(SOURCES) + @echo "MCU, F_CPU, BAUD:" $(MCU), $(F_CPU), $(BAUD) + @echo + +# Optionally create listing file from .elf +# This creates approximate assembly-language equivalent of your code. +# Useful for debugging time-sensitive bits, +# or making sure the compiler does what you want. +disassemble: $(TARGET).lst + +disasm: disassemble + +# Optionally show how big the resulting program is +size: $(TARGET).elf + $(AVRSIZE) -C --mcu=$(MCU) $(TARGET).elf + +clean: + rm -f $(TARGET).elf $(TARGET).hex $(TARGET).obj \ + $(TARGET).o $(TARGET).d $(TARGET).eep $(TARGET).lst \ + $(TARGET).lss $(TARGET).sym $(TARGET).map $(TARGET)~ \ + $(TARGET).eeprom + +squeaky_clean: + rm -f *.elf *.hex *.obj *.o *.d *.eep *.lst *.lss *.sym *.map *~ *.eeprom + +##########------------------------------------------------------########## +########## Programmer-specific details ########## +########## Flashing code to AVR using avrdude ########## +##########------------------------------------------------------########## + +flash: $(TARGET).hex + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U flash:w:$< + +## An alias +program: flash + +flash_eeprom: $(TARGET).eeprom + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U eeprom:w:$< + +avrdude_terminal: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nt + +## If you've got multiple programmers that you use, +## you can define them here so that it's easy to switch. +## To invoke, use something like `make flash_arduinoISP` +flash_usbtiny: PROGRAMMER_TYPE = usbtiny +flash_usbtiny: PROGRAMMER_ARGS = # USBTiny works with no further arguments +flash_usbtiny: flash + +flash_usbasp: PROGRAMMER_TYPE = usbasp +flash_usbasp: PROGRAMMER_ARGS = # USBasp works with no further arguments +flash_usbasp: flash + +flash_arduinoISP: PROGRAMMER_TYPE = avrisp +flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P /dev/ttyACM0 +## (for windows) flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P com5 +flash_arduinoISP: flash + +flash_109: PROGRAMMER_TYPE = avr109 +flash_109: PROGRAMMER_ARGS = -b 9600 -P /dev/ttyUSB0 +flash_109: flash + +##########------------------------------------------------------########## +########## Fuse settings and suitable defaults ########## +##########------------------------------------------------------########## + +## Mega 48, 88, 168, 328 default values +LFUSE = 0x62 +HFUSE = 0xdf +EFUSE = 0x00 + +## Generic +FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m + +fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) \ + $(PROGRAMMER_ARGS) $(FUSE_STRING) +show_fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nv + +## Called with no extra definitions, sets to defaults +set_default_fuses: FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m +set_default_fuses: fuses + +## Set the fuse byte for full-speed mode +## Note: can also be set in firmware for modern chips +set_fast_fuse: LFUSE = 0xE2 +set_fast_fuse: FUSE_STRING = -U lfuse:w:$(LFUSE):m +set_fast_fuse: fuses + +## Set the EESAVE fuse byte to preserve EEPROM across flashes +set_eeprom_save_fuse: HFUSE = 0xD7 +set_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +set_eeprom_save_fuse: fuses + +## Clear the EESAVE fuse byte +clear_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +clear_eeprom_save_fuse: fuses diff --git a/Make AVR Examples/Chapter16_SPI/spiEEPROMDemo/spiEEPROMDemo.c b/Make AVR Examples/Chapter16_SPI/spiEEPROMDemo/spiEEPROMDemo.c new file mode 100644 index 0000000..ba56d63 --- /dev/null +++ b/Make AVR Examples/Chapter16_SPI/spiEEPROMDemo/spiEEPROMDemo.c @@ -0,0 +1,55 @@ + /* SPI EEPROM 25LC256 Demo */ + +// ------- Preamble -------- // +#include +#include + +#include "pinDefines.h" + +#include "USART.h" +#include "25LC256.h" + +int main(void) { + uint8_t i; + uint8_t address; + + // -------- Inits --------- // + initSPI(); + initUSART(); + + // ------ Event loop ------ // + while (1) { + printString("\r\n==== EEPROM Memory Playground ====\r\n"); + printString("Address Value\r\n"); + + for (i = 0; i < 10; i++) { /* print out first ten bytes of memory */ + printString(" "); + printByte(i); + printString(" "); + printByte(EEPROM_readByte(i)); + printString("\r\n"); + } + printString(" [e] to erase all memory\r\n"); + printString(" [w] to write byte to memory\r\n\r\n"); + + switch (receiveByte()) { /* take input */ + case 'e': + printString("Clearing EEPROM, this could take a few seconds.\r\n"); + EEPROM_clearAll(); + break; + case 'w': + printString("Which memory slot would you like to write to?\r\n"); + address = getNumber(); + printString("\r\nWhat number would you like to store there?\r\n"); + i = getNumber(); + EEPROM_writeByte(address, i); + printString("\r\n"); + break; + default: + printString("What??\r\n"); + } + + + } /* End event loop */ + return 0; /* This line is never reached */ +} diff --git a/Make AVR Examples/Chapter17_I2C/i2cThermometer/Makefile b/Make AVR Examples/Chapter17_I2C/i2cThermometer/Makefile new file mode 100644 index 0000000..5c588dc --- /dev/null +++ b/Make AVR Examples/Chapter17_I2C/i2cThermometer/Makefile @@ -0,0 +1,196 @@ + +##########------------------------------------------------------########## +########## Project-specific Details ########## +########## Check these every time you start a new project ########## +##########------------------------------------------------------########## + +MCU = atmega168p +F_CPU = 8000000UL +BAUD = 9600UL +## Also try BAUD = 19200 or 38400 if you're feeling lucky. + +## A directory for common include files and the simple USART library. +## If you move either the current folder or the Library folder, you'll +## need to change this path to match. +LIBDIR = ../../AVR-Programming-Library + +##########------------------------------------------------------########## +########## Programmer Defaults ########## +########## Set up once, then forget about it ########## +########## (Can override. See bottom of file.) ########## +##########------------------------------------------------------########## + +PROGRAMMER_TYPE = usbtiny +# extra arguments to avrdude: baud rate, chip type, -F flag, etc. +PROGRAMMER_ARGS = + +##########------------------------------------------------------########## +########## Program Locations ########## +########## Won't need to change if they're in your PATH ########## +##########------------------------------------------------------########## + +CC = avr-gcc +OBJCOPY = avr-objcopy +OBJDUMP = avr-objdump +AVRSIZE = avr-size +AVRDUDE = avrdude + +##########------------------------------------------------------########## +########## Makefile Magic! ########## +########## Summary: ########## +########## We want a .hex file ########## +########## Compile source files into .elf ########## +########## Convert .elf file into .hex ########## +########## You shouldn't need to edit below. ########## +##########------------------------------------------------------########## + +## The name of your project (without the .c) +# TARGET = blinkLED +## Or name it automatically after the enclosing directory +TARGET = $(lastword $(subst /, ,$(CURDIR))) + +# Object files: will find all .c/.h files in current directory +# and in LIBDIR. If you have any other (sub-)directories with code, +# you can add them in to SOURCES below in the wildcard statement. +SOURCES=$(wildcard *.c $(LIBDIR)/*.c) +OBJECTS=$(SOURCES:.c=.o) +HEADERS=$(SOURCES:.c=.h) + +## Compilation options, type man avr-gcc if you're curious. +CPPFLAGS = -DF_CPU=$(F_CPU) -DBAUD=$(BAUD) -I. -I$(LIBDIR) +CFLAGS = -Os -g -std=gnu99 -Wall +## Use short (8-bit) data types +CFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums +## Splits up object files per function +CFLAGS += -ffunction-sections -fdata-sections +LDFLAGS = -Wl,-Map,$(TARGET).map +## Optional, but often ends up with smaller code +LDFLAGS += -Wl,--gc-sections +## Relax shrinks code even more, but makes disassembly messy +## LDFLAGS += -Wl,--relax +## LDFLAGS += -Wl,-u,vfprintf -lprintf_flt -lm ## for floating-point printf +## LDFLAGS += -Wl,-u,vfprintf -lprintf_min ## for smaller printf +TARGET_ARCH = -mmcu=$(MCU) + +## Explicit pattern rules: +## To make .o files from .c files +%.o: %.c $(HEADERS) Makefile + $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c -o $@ $<; + +$(TARGET).elf: $(OBJECTS) + $(CC) $(LDFLAGS) $(TARGET_ARCH) $^ $(LDLIBS) -o $@ + +%.hex: %.elf + $(OBJCOPY) -j .text -j .data -O ihex $< $@ + +%.eeprom: %.elf + $(OBJCOPY) -j .eeprom --change-section-lma .eeprom=0 -O ihex $< $@ + +%.lst: %.elf + $(OBJDUMP) -S $< > $@ + +## These targets don't have files named after them +.PHONY: all disassemble disasm eeprom size clean squeaky_clean flash fuses + +all: $(TARGET).hex + +debug: + @echo + @echo "Source files:" $(SOURCES) + @echo "MCU, F_CPU, BAUD:" $(MCU), $(F_CPU), $(BAUD) + @echo + +# Optionally create listing file from .elf +# This creates approximate assembly-language equivalent of your code. +# Useful for debugging time-sensitive bits, +# or making sure the compiler does what you want. +disassemble: $(TARGET).lst + +disasm: disassemble + +# Optionally show how big the resulting program is +size: $(TARGET).elf + $(AVRSIZE) -C --mcu=$(MCU) $(TARGET).elf + +clean: + rm -f $(TARGET).elf $(TARGET).hex $(TARGET).obj \ + $(TARGET).o $(TARGET).d $(TARGET).eep $(TARGET).lst \ + $(TARGET).lss $(TARGET).sym $(TARGET).map $(TARGET)~ \ + $(TARGET).eeprom + +squeaky_clean: + rm -f *.elf *.hex *.obj *.o *.d *.eep *.lst *.lss *.sym *.map *~ *.eeprom + +##########------------------------------------------------------########## +########## Programmer-specific details ########## +########## Flashing code to AVR using avrdude ########## +##########------------------------------------------------------########## + +flash: $(TARGET).hex + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U flash:w:$< + +## An alias +program: flash + +flash_eeprom: $(TARGET).eeprom + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U eeprom:w:$< + +avrdude_terminal: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nt + +## If you've got multiple programmers that you use, +## you can define them here so that it's easy to switch. +## To invoke, use something like `make flash_arduinoISP` +flash_usbtiny: PROGRAMMER_TYPE = usbtiny +flash_usbtiny: PROGRAMMER_ARGS = # USBTiny works with no further arguments +flash_usbtiny: flash + +flash_usbasp: PROGRAMMER_TYPE = usbasp +flash_usbasp: PROGRAMMER_ARGS = # USBasp works with no further arguments +flash_usbasp: flash + +flash_arduinoISP: PROGRAMMER_TYPE = avrisp +flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P /dev/ttyACM0 +## (for windows) flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P com5 +flash_arduinoISP: flash + +flash_109: PROGRAMMER_TYPE = avr109 +flash_109: PROGRAMMER_ARGS = -b 9600 -P /dev/ttyUSB0 +flash_109: flash + +##########------------------------------------------------------########## +########## Fuse settings and suitable defaults ########## +##########------------------------------------------------------########## + +## Mega 48, 88, 168, 328 default values +LFUSE = 0x62 +HFUSE = 0xdf +EFUSE = 0x00 + +## Generic +FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m + +fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) \ + $(PROGRAMMER_ARGS) $(FUSE_STRING) +show_fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nv + +## Called with no extra definitions, sets to defaults +set_default_fuses: FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m +set_default_fuses: fuses + +## Set the fuse byte for full-speed mode +## Note: can also be set in firmware for modern chips +set_fast_fuse: LFUSE = 0xE2 +set_fast_fuse: FUSE_STRING = -U lfuse:w:$(LFUSE):m +set_fast_fuse: fuses + +## Set the EESAVE fuse byte to preserve EEPROM across flashes +set_eeprom_save_fuse: HFUSE = 0xD7 +set_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +set_eeprom_save_fuse: fuses + +## Clear the EESAVE fuse byte +clear_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +clear_eeprom_save_fuse: fuses diff --git a/Make AVR Examples/Chapter17_I2C/i2cThermometer/i2c.c b/Make AVR Examples/Chapter17_I2C/i2cThermometer/i2c.c new file mode 100644 index 0000000..17fa934 --- /dev/null +++ b/Make AVR Examples/Chapter17_I2C/i2cThermometer/i2c.c @@ -0,0 +1,38 @@ +#include "i2c.h" + +void initI2C(void) { + TWBR = 32; /* set bit rate, see p. 242 */ + /* 8MHz / (16+2*TWBR*1) ~= 100kHz */ + TWCR |= (1 << TWEN); /* enable */ +} + +void i2cWaitForComplete(void) { + loop_until_bit_is_set(TWCR, TWINT); +} + +void i2cStart(void) { + TWCR = (_BV(TWINT) | _BV(TWEN) | _BV(TWSTA)); + i2cWaitForComplete(); +} + +void i2cStop(void) { + TWCR = (_BV(TWINT) | _BV(TWEN) | _BV(TWSTO)); +} + +uint8_t i2cReadAck(void) { + TWCR = (_BV(TWINT) | _BV(TWEN) | _BV(TWEA)); + i2cWaitForComplete(); + return (TWDR); +} + +uint8_t i2cReadNoAck(void) { + TWCR = (_BV(TWINT) | _BV(TWEN)); + i2cWaitForComplete(); + return (TWDR); +} + +void i2cSend(uint8_t data) { + TWDR = data; + TWCR = (_BV(TWINT) | _BV(TWEN)); /* init and enable */ + i2cWaitForComplete(); +} diff --git a/Make AVR Examples/Chapter17_I2C/i2cThermometer/i2c.h b/Make AVR Examples/Chapter17_I2C/i2cThermometer/i2c.h new file mode 100644 index 0000000..21b4c4c --- /dev/null +++ b/Make AVR Examples/Chapter17_I2C/i2cThermometer/i2c.h @@ -0,0 +1,22 @@ +// Functions for i2c communication +#include +#include "pinDefines.h" + +void initI2C(void); + /* Sets pullups and initializes bus speed to 100kHz (at FCPU=8MHz) */ + +void i2cWaitForComplete(void); + /* Waits until the hardware sets the TWINT flag */ + +void i2cStart(void); + /* Sends a start condition (sets TWSTA) */ +void i2cStop(void); + /* Sends a stop condition (sets TWSTO) */ + +void i2cSend(uint8_t data); + /* Loads data, sends it out, waiting for completion */ + +uint8_t i2cReadAck(void); + /* Read in from slave, sending ACK when done (sets TWEA) */ +uint8_t i2cReadNoAck(void); + /* Read in from slave, sending NOACK when done (no TWEA) */ diff --git a/Make AVR Examples/Chapter17_I2C/i2cThermometer/i2cThermometer.c b/Make AVR Examples/Chapter17_I2C/i2cThermometer/i2cThermometer.c new file mode 100644 index 0000000..c02a514 --- /dev/null +++ b/Make AVR Examples/Chapter17_I2C/i2cThermometer/i2cThermometer.c @@ -0,0 +1,60 @@ + /* Reads LM75 Thermometer and Prints Value over Serial */ + +// ------- Preamble -------- // +#include +#include +#include + +#include "pinDefines.h" +#include "USART.h" +#include "i2c.h" + +// -------- Defines -------- // + +#define LM75_ADDRESS_W 0b10010000 +#define LM75_ADDRESS_R 0b10010001 +#define LM75_TEMP_REGISTER 0b00000000 +#define LM75_CONFIG_REGISTER 0b00000001 +#define LM75_THYST_REGISTER 0b00000010 +#define LM75_TOS_REGISTER 0b00000011 +// -------- Functions --------- // + +int main(void) { + + uint8_t tempHighByte, tempLowByte; + + // -------- Inits --------- // + clock_prescale_set(clock_div_1); /* 8MHz */ + initUSART(); + printString("\r\n==== i2c Thermometer ====\r\n"); + initI2C(); + + // ------ Event loop ------ // + while (1) { + /* To set register, address LM75 in write mode */ + i2cStart(); + i2cSend(LM75_ADDRESS_W); + i2cSend(LM75_TEMP_REGISTER); + i2cStart(); /* restart, just send start again */ + /* Setup and send address, with read bit */ + i2cSend(LM75_ADDRESS_R); + /* Now receive two bytes of temperature */ + tempHighByte = i2cReadAck(); + tempLowByte = i2cReadNoAck(); + i2cStop(); + + // Print it out nicely over serial for now... + printByte(tempHighByte); + if (tempLowByte & _BV(7)) { + printString(".5\r\n"); + } + else { + printString(".0\r\n"); + } + + /* Once per second */ + _delay_ms(1000); + + } /* End event loop */ + return 0; /* This line is never reached */ +} diff --git a/Make AVR Examples/Chapter17_I2C/loggingThermometer/25LC256.c b/Make AVR Examples/Chapter17_I2C/loggingThermometer/25LC256.c new file mode 100644 index 0000000..ade4746 --- /dev/null +++ b/Make AVR Examples/Chapter17_I2C/loggingThermometer/25LC256.c @@ -0,0 +1,105 @@ +#include "25LC256.h" + +void initSPI(void) { + SPI_SS_DDR |= (1 << SPI_SS); /* set SS output */ + SPI_SS_PORT |= (1 << SPI_SS); /* start off not selected (high) */ + + SPI_MOSI_DDR |= (1 << SPI_MOSI); /* output on MOSI */ + SPI_MISO_PORT |= (1 << SPI_MISO); /* pullup on MISO */ + SPI_SCK_DDR |= (1 << SPI_SCK); /* output on SCK */ + + /* Don't have to set phase, polarity b/c + default works with 25LCxxx chips */ + SPCR |= (1 << SPR1); /* div 16, safer for breadboards */ + SPCR |= (1 << MSTR); /* clockmaster */ + SPCR |= (1 << SPE); /* enable */ +} + +void SPI_tradeByte(uint8_t byte) { + SPDR = byte; /* SPI starts sending immediately */ + loop_until_bit_is_set(SPSR, SPIF); /* wait until done */ + /* SPDR now contains the received byte */ +} + +void EEPROM_send16BitAddress(uint16_t address) { + SPI_tradeByte((uint8_t) (address >> 8)); /* most significant byte */ + SPI_tradeByte((uint8_t) address); /* least significant byte */ +} + +uint8_t EEPROM_readStatus(void) { + SLAVE_SELECT; + SPI_tradeByte(EEPROM_RDSR); + SPI_tradeByte(0); /* clock out eight bits */ + SLAVE_DESELECT; + return (SPDR); /* return the result */ +} + +void EEPROM_writeEnable(void) { + SLAVE_SELECT; + SPI_tradeByte(EEPROM_WREN); + SLAVE_DESELECT; +} + +uint8_t EEPROM_readByte(uint16_t address) { + SLAVE_SELECT; + SPI_tradeByte(EEPROM_READ); + EEPROM_send16BitAddress(address); + SPI_tradeByte(0); + SLAVE_DESELECT; + return (SPDR); +} + +uint16_t EEPROM_readWord(uint16_t address) { + uint16_t eepromWord; + SLAVE_SELECT; + SPI_tradeByte(EEPROM_READ); + EEPROM_send16BitAddress(address); + SPI_tradeByte(0); + eepromWord = SPDR; + eepromWord = (eepromWord << 8); /* most-sig bit */ + SPI_tradeByte(0); + eepromWord += SPDR; /* least-sig bit */ + SLAVE_DESELECT; + return (eepromWord); +} + +void EEPROM_writeByte(uint16_t address, uint8_t byte) { + EEPROM_writeEnable(); + SLAVE_SELECT; + SPI_tradeByte(EEPROM_WRITE); + EEPROM_send16BitAddress(address); + SPI_tradeByte(byte); + SLAVE_DESELECT; + while (EEPROM_readStatus() & _BV(EEPROM_WRITE_IN_PROGRESS)) {; + } +} + +void EEPROM_writeWord(uint16_t address, uint16_t word) { + EEPROM_writeEnable(); + SLAVE_SELECT; + SPI_tradeByte(EEPROM_WRITE); + EEPROM_send16BitAddress(address); + SPI_tradeByte((uint8_t) (word >> 8)); + SPI_tradeByte((uint8_t) word); + SLAVE_DESELECT; + while (EEPROM_readStatus() & _BV(EEPROM_WRITE_IN_PROGRESS)) {; + } +} + +void EEPROM_clearAll(void) { + uint8_t i; + uint16_t pageAddress = 0; + while (pageAddress < EEPROM_BYTES_MAX) { + EEPROM_writeEnable(); + SLAVE_SELECT; + SPI_tradeByte(EEPROM_WRITE); + EEPROM_send16BitAddress(pageAddress); + for (i = 0; i < EEPROM_BYTES_PER_PAGE; i++) { + SPI_tradeByte(0); + } + SLAVE_DESELECT; + pageAddress += EEPROM_BYTES_PER_PAGE; + while (EEPROM_readStatus() & _BV(EEPROM_WRITE_IN_PROGRESS)) {; + } + } +} diff --git a/Make AVR Examples/Chapter17_I2C/loggingThermometer/25LC256.h b/Make AVR Examples/Chapter17_I2C/loggingThermometer/25LC256.h new file mode 100644 index 0000000..c8ef4fc --- /dev/null +++ b/Make AVR Examples/Chapter17_I2C/loggingThermometer/25LC256.h @@ -0,0 +1,60 @@ + /* SPI EEPROM 25LC256 Library */ +#include +#include "pinDefines.h" + + + /* Which pin selects EEPROM as slave? */ +#define SLAVE_SELECT SPI_SS_PORT &= ~(1 << SPI_SS) +#define SLAVE_DESELECT SPI_SS_PORT |= (1 << SPI_SS) + +// Instruction Set -- from data sheet +#define EEPROM_READ 0b00000011 /* read memory */ +#define EEPROM_WRITE 0b00000010 /* write to memory */ + +#define EEPROM_WRDI 0b00000100 /* write disable */ +#define EEPROM_WREN 0b00000110 /* write enable */ + +#define EEPROM_RDSR 0b00000101 /* read status register */ +#define EEPROM_WRSR 0b00000001 /* write status register */ + +// EEPROM Status Register Bits -- from data sheet +// Use these to parse status register +#define EEPROM_WRITE_IN_PROGRESS 0 +#define EEPROM_WRITE_ENABLE_LATCH 1 +#define EEPROM_BLOCK_PROTECT_0 2 +#define EEPROM_BLOCK_PROTECT_1 3 + +#define EEPROM_BYTES_PER_PAGE 64 +#define EEPROM_BYTES_MAX 0x7FFF + +// Functions + +void initSPI(void); + /* Init SPI to run EEPROM with phase, polarity = 0,0 */ + +void SPI_tradeByte(uint8_t byte); + /* Generic. Just loads up HW SPI register and waits */ + +void EEPROM_send16BitAddress(uint16_t address); + /* splits 16-bit address into 2 bytes, sends both */ + +uint8_t EEPROM_readStatus(void); + /* reads the EEPROM status register */ + +void EEPROM_writeEnable(void); + /* helper: sets EEPROM write enable */ + +uint8_t EEPROM_readByte(uint16_t address); + /* gets a byte from a given memory location */ + +uint16_t EEPROM_readWord(uint16_t address); + /* gets two bytes from a given memory location */ + +void EEPROM_writeByte(uint16_t address, uint8_t byte); + /* writes a byte to a given memory location */ + +void EEPROM_writeWord(uint16_t address, uint16_t word); + /* gets two bytes to a given memory location */ + +void EEPROM_clearAll(void); + /* sets every byte in memory to zero */ diff --git a/Make AVR Examples/Chapter17_I2C/loggingThermometer/Makefile b/Make AVR Examples/Chapter17_I2C/loggingThermometer/Makefile new file mode 100644 index 0000000..5c588dc --- /dev/null +++ b/Make AVR Examples/Chapter17_I2C/loggingThermometer/Makefile @@ -0,0 +1,196 @@ + +##########------------------------------------------------------########## +########## Project-specific Details ########## +########## Check these every time you start a new project ########## +##########------------------------------------------------------########## + +MCU = atmega168p +F_CPU = 8000000UL +BAUD = 9600UL +## Also try BAUD = 19200 or 38400 if you're feeling lucky. + +## A directory for common include files and the simple USART library. +## If you move either the current folder or the Library folder, you'll +## need to change this path to match. +LIBDIR = ../../AVR-Programming-Library + +##########------------------------------------------------------########## +########## Programmer Defaults ########## +########## Set up once, then forget about it ########## +########## (Can override. See bottom of file.) ########## +##########------------------------------------------------------########## + +PROGRAMMER_TYPE = usbtiny +# extra arguments to avrdude: baud rate, chip type, -F flag, etc. +PROGRAMMER_ARGS = + +##########------------------------------------------------------########## +########## Program Locations ########## +########## Won't need to change if they're in your PATH ########## +##########------------------------------------------------------########## + +CC = avr-gcc +OBJCOPY = avr-objcopy +OBJDUMP = avr-objdump +AVRSIZE = avr-size +AVRDUDE = avrdude + +##########------------------------------------------------------########## +########## Makefile Magic! ########## +########## Summary: ########## +########## We want a .hex file ########## +########## Compile source files into .elf ########## +########## Convert .elf file into .hex ########## +########## You shouldn't need to edit below. ########## +##########------------------------------------------------------########## + +## The name of your project (without the .c) +# TARGET = blinkLED +## Or name it automatically after the enclosing directory +TARGET = $(lastword $(subst /, ,$(CURDIR))) + +# Object files: will find all .c/.h files in current directory +# and in LIBDIR. If you have any other (sub-)directories with code, +# you can add them in to SOURCES below in the wildcard statement. +SOURCES=$(wildcard *.c $(LIBDIR)/*.c) +OBJECTS=$(SOURCES:.c=.o) +HEADERS=$(SOURCES:.c=.h) + +## Compilation options, type man avr-gcc if you're curious. +CPPFLAGS = -DF_CPU=$(F_CPU) -DBAUD=$(BAUD) -I. -I$(LIBDIR) +CFLAGS = -Os -g -std=gnu99 -Wall +## Use short (8-bit) data types +CFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums +## Splits up object files per function +CFLAGS += -ffunction-sections -fdata-sections +LDFLAGS = -Wl,-Map,$(TARGET).map +## Optional, but often ends up with smaller code +LDFLAGS += -Wl,--gc-sections +## Relax shrinks code even more, but makes disassembly messy +## LDFLAGS += -Wl,--relax +## LDFLAGS += -Wl,-u,vfprintf -lprintf_flt -lm ## for floating-point printf +## LDFLAGS += -Wl,-u,vfprintf -lprintf_min ## for smaller printf +TARGET_ARCH = -mmcu=$(MCU) + +## Explicit pattern rules: +## To make .o files from .c files +%.o: %.c $(HEADERS) Makefile + $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c -o $@ $<; + +$(TARGET).elf: $(OBJECTS) + $(CC) $(LDFLAGS) $(TARGET_ARCH) $^ $(LDLIBS) -o $@ + +%.hex: %.elf + $(OBJCOPY) -j .text -j .data -O ihex $< $@ + +%.eeprom: %.elf + $(OBJCOPY) -j .eeprom --change-section-lma .eeprom=0 -O ihex $< $@ + +%.lst: %.elf + $(OBJDUMP) -S $< > $@ + +## These targets don't have files named after them +.PHONY: all disassemble disasm eeprom size clean squeaky_clean flash fuses + +all: $(TARGET).hex + +debug: + @echo + @echo "Source files:" $(SOURCES) + @echo "MCU, F_CPU, BAUD:" $(MCU), $(F_CPU), $(BAUD) + @echo + +# Optionally create listing file from .elf +# This creates approximate assembly-language equivalent of your code. +# Useful for debugging time-sensitive bits, +# or making sure the compiler does what you want. +disassemble: $(TARGET).lst + +disasm: disassemble + +# Optionally show how big the resulting program is +size: $(TARGET).elf + $(AVRSIZE) -C --mcu=$(MCU) $(TARGET).elf + +clean: + rm -f $(TARGET).elf $(TARGET).hex $(TARGET).obj \ + $(TARGET).o $(TARGET).d $(TARGET).eep $(TARGET).lst \ + $(TARGET).lss $(TARGET).sym $(TARGET).map $(TARGET)~ \ + $(TARGET).eeprom + +squeaky_clean: + rm -f *.elf *.hex *.obj *.o *.d *.eep *.lst *.lss *.sym *.map *~ *.eeprom + +##########------------------------------------------------------########## +########## Programmer-specific details ########## +########## Flashing code to AVR using avrdude ########## +##########------------------------------------------------------########## + +flash: $(TARGET).hex + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U flash:w:$< + +## An alias +program: flash + +flash_eeprom: $(TARGET).eeprom + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U eeprom:w:$< + +avrdude_terminal: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nt + +## If you've got multiple programmers that you use, +## you can define them here so that it's easy to switch. +## To invoke, use something like `make flash_arduinoISP` +flash_usbtiny: PROGRAMMER_TYPE = usbtiny +flash_usbtiny: PROGRAMMER_ARGS = # USBTiny works with no further arguments +flash_usbtiny: flash + +flash_usbasp: PROGRAMMER_TYPE = usbasp +flash_usbasp: PROGRAMMER_ARGS = # USBasp works with no further arguments +flash_usbasp: flash + +flash_arduinoISP: PROGRAMMER_TYPE = avrisp +flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P /dev/ttyACM0 +## (for windows) flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P com5 +flash_arduinoISP: flash + +flash_109: PROGRAMMER_TYPE = avr109 +flash_109: PROGRAMMER_ARGS = -b 9600 -P /dev/ttyUSB0 +flash_109: flash + +##########------------------------------------------------------########## +########## Fuse settings and suitable defaults ########## +##########------------------------------------------------------########## + +## Mega 48, 88, 168, 328 default values +LFUSE = 0x62 +HFUSE = 0xdf +EFUSE = 0x00 + +## Generic +FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m + +fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) \ + $(PROGRAMMER_ARGS) $(FUSE_STRING) +show_fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nv + +## Called with no extra definitions, sets to defaults +set_default_fuses: FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m +set_default_fuses: fuses + +## Set the fuse byte for full-speed mode +## Note: can also be set in firmware for modern chips +set_fast_fuse: LFUSE = 0xE2 +set_fast_fuse: FUSE_STRING = -U lfuse:w:$(LFUSE):m +set_fast_fuse: fuses + +## Set the EESAVE fuse byte to preserve EEPROM across flashes +set_eeprom_save_fuse: HFUSE = 0xD7 +set_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +set_eeprom_save_fuse: fuses + +## Clear the EESAVE fuse byte +clear_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +clear_eeprom_save_fuse: fuses diff --git a/Make AVR Examples/Chapter17_I2C/loggingThermometer/i2c.c b/Make AVR Examples/Chapter17_I2C/loggingThermometer/i2c.c new file mode 100644 index 0000000..18d06e5 --- /dev/null +++ b/Make AVR Examples/Chapter17_I2C/loggingThermometer/i2c.c @@ -0,0 +1,39 @@ +#include "i2c.h" + +void initI2C(void) { + /* set pullups for SDA, SCL lines */ + I2C_SDA_PORT |= ((1 << I2C_SDA) | (1 << I2C_SCL)); + TWBR = 32; /* set bit rate (p.242): 8MHz / (16+2*TWBR*1) ~= 100kHz */ + TWCR |= (1 << TWEN); /* enable */ +} + +void i2cWaitForComplete(void) { + loop_until_bit_is_set(TWCR, TWINT); +} + +void i2cStart(void) { + TWCR = (_BV(TWINT) | _BV(TWEN) | _BV(TWSTA)); + i2cWaitForComplete(); +} + +void i2cStop(void) { + TWCR = (_BV(TWINT) | _BV(TWEN) | _BV(TWSTO)); +} + +uint8_t i2cReadAck(void) { + TWCR = (_BV(TWINT) | _BV(TWEN) | _BV(TWEA)); + i2cWaitForComplete(); + return (TWDR); +} + +uint8_t i2cReadNoAck(void) { + TWCR = (_BV(TWINT) | _BV(TWEN)); + i2cWaitForComplete(); + return (TWDR); +} + +void i2cSend(uint8_t data) { + TWDR = data; + TWCR = (_BV(TWINT) | _BV(TWEN)); /* init and enable */ + i2cWaitForComplete(); +} diff --git a/Make AVR Examples/Chapter17_I2C/loggingThermometer/i2c.h b/Make AVR Examples/Chapter17_I2C/loggingThermometer/i2c.h new file mode 100644 index 0000000..21b4c4c --- /dev/null +++ b/Make AVR Examples/Chapter17_I2C/loggingThermometer/i2c.h @@ -0,0 +1,22 @@ +// Functions for i2c communication +#include +#include "pinDefines.h" + +void initI2C(void); + /* Sets pullups and initializes bus speed to 100kHz (at FCPU=8MHz) */ + +void i2cWaitForComplete(void); + /* Waits until the hardware sets the TWINT flag */ + +void i2cStart(void); + /* Sends a start condition (sets TWSTA) */ +void i2cStop(void); + /* Sends a stop condition (sets TWSTO) */ + +void i2cSend(uint8_t data); + /* Loads data, sends it out, waiting for completion */ + +uint8_t i2cReadAck(void); + /* Read in from slave, sending ACK when done (sets TWEA) */ +uint8_t i2cReadNoAck(void); + /* Read in from slave, sending NOACK when done (no TWEA) */ diff --git a/Make AVR Examples/Chapter17_I2C/loggingThermometer/loggingThermometer.c b/Make AVR Examples/Chapter17_I2C/loggingThermometer/loggingThermometer.c new file mode 100644 index 0000000..0efbb35 --- /dev/null +++ b/Make AVR Examples/Chapter17_I2C/loggingThermometer/loggingThermometer.c @@ -0,0 +1,172 @@ + + +// ------- Preamble -------- // +#include +#include +#include +#include + +#include "pinDefines.h" +#include "USART.h" + +#include "i2c.h" /* for i2c functions */ +#include "25LC256.h" /* for EEPROM specific */ + +// -------- Defines --------- // + +#define LM75_ADDRESS_W 0b10010000 +#define LM75_ADDRESS_R 0b10010001 +#define LM75_TEMP_REGISTER 0b00000000 +#define LM75_CONFIG_REGISTER 0b00000001 +#define LM75_THYST_REGISTER 0b00000010 +#define LM75_TOS_REGISTER 0b00000011 + +#define CURRENT_LOCATION_POINTER 0 + /* where to store a pointer to the current reading in EEPROM */ +#define SECONDS_POINTER 2 + /* store seconds-delay value here */ +#define MEMORY_START 4 + /* where to start logging temperature values */ +#define MENU_DELAY 5 + /* seconds to wait before bypassing main menu */ + +// -------- Functions --------- // + +static inline void printTemperature(uint8_t tempReading) { + /* temperature stored as 2x Celcius */ + printByte((tempReading >> 1)); + if (tempReading & 1) { + printString(".5\r\n"); + } + else { + printString(".0\r\n"); + } +} + +int main(void) { + uint16_t secondsDelay; /* how long to wait between readings */ + uint16_t currentMemoryLocation; /* where are we in EEPROM? */ + uint16_t i; /* used to count memory locations */ + uint8_t tempHighByte, tempLowByte, temperatureByte; /* from LM75 */ + uint8_t enterMenu; /* logical flag */ + + // -------- Inits --------- // + clock_prescale_set(clock_div_1); /* 8 MHz */ + initSPI(); + initI2C(); + initUSART(); + LED_DDR |= (1 << LED0); + + /* Load up last values from EEPROM */ + secondsDelay = EEPROM_readWord(SECONDS_POINTER); + + /* Delay to allow input to enter main menu */ + printString("*** Press [m] within "); + printByte(MENU_DELAY); + printString(" seconds to enter menu. ***\r\n "); + + for (i = 0; i < MENU_DELAY; i++) { + _delay_ms(1000); + } + + if (bit_is_set(UCSR0A, RXC0) && (UDR0 == 'm')) { + enterMenu = 1; + } + else { + enterMenu = 0; + } + + while (enterMenu) { + printString("\r\n====[ Logging Thermometer ]====\r\n "); + currentMemoryLocation = EEPROM_readWord(CURRENT_LOCATION_POINTER); + printWord(currentMemoryLocation - MEMORY_START); + printString(" readings in log.\r\n "); + printWord(secondsDelay); + printString(" seconds between readings.\r\n"); + printString(" [<] to shorten sample delay time\r\n"); + printString(" [>] to increase sample delay time\r\n"); + printString(" [?] to reset delay time to 60 sec\r\n"); + printString(" [d] to print out log over serial\r\n"); + printString(" [e] to erase memory\r\n"); + printString(" [s] to start logging\r\n\r\n"); + + switch (receiveByte()) { + case 'd': + SLAVE_SELECT; + SPI_tradeByte(EEPROM_READ); + EEPROM_send16BitAddress(MEMORY_START); + for (i = MEMORY_START; i < currentMemoryLocation; i++) { + SPI_tradeByte(0); + printTemperature(SPDR); + } + SLAVE_DESELECT; + break; + case '<': + if (secondsDelay >= 10) { + secondsDelay -= 5; + EEPROM_writeWord(SECONDS_POINTER, secondsDelay); + } + break; + case '>': + if (secondsDelay < 65000) { + secondsDelay += 5; + EEPROM_writeWord(SECONDS_POINTER, secondsDelay); + } + break; + case '?': + secondsDelay = 60; + EEPROM_writeWord(SECONDS_POINTER, secondsDelay); + break; + case 'e': + printString("Clearing EEPROM, this could take a few seconds.\r\n"); + EEPROM_clearAll(); + EEPROM_writeWord(CURRENT_LOCATION_POINTER, MEMORY_START); + EEPROM_writeWord(SECONDS_POINTER, secondsDelay); + break; + case 's': + printString("OK, logging...\r\n"); + enterMenu = 0; + break; + default: + printString("Sorry, didn't understand that.\r\n"); + } + } + + // ------ Event loop ------ // + while (1) { + + currentMemoryLocation = EEPROM_readWord(CURRENT_LOCATION_POINTER); + + /* Make sure in temperature mode */ + i2cStart(); + i2cSend(LM75_ADDRESS_W); + i2cSend(LM75_TEMP_REGISTER); + /* Get Temp from thermometer */ + i2cStart(); /* Setup and send address, with read bit */ + i2cSend(LM75_ADDRESS_R); + tempHighByte = i2cReadAck(); /* two bytes of temperature */ + tempLowByte = i2cReadNoAck(); + i2cStop(); + temperatureByte = (tempHighByte << 1) | (tempLowByte >> 7); + /* temperatureByte now contains 2x the temperature in Celcius */ + printTemperature(temperatureByte); /* serial output */ + + /* Save the new temperature value */ + EEPROM_writeByte(currentMemoryLocation, temperatureByte); + + /* move on to next location and record new position + if not already at the end of memory */ + if (currentMemoryLocation < EEPROM_BYTES_MAX) { + currentMemoryLocation++; + EEPROM_writeWord(CURRENT_LOCATION_POINTER, currentMemoryLocation); + } + + /* delay */ + for (i = 0; i < secondsDelay; i++) { + _delay_ms(1000); + LED_PORT ^= (1 << LED0); /* blink to show working */ + } + + } /* End event loop */ + return 0; /* This line is never reached */ +} diff --git a/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/progmemDemo1/Makefile b/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/progmemDemo1/Makefile new file mode 100644 index 0000000..3d9e544 --- /dev/null +++ b/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/progmemDemo1/Makefile @@ -0,0 +1,196 @@ + +##########------------------------------------------------------########## +########## Project-specific Details ########## +########## Check these every time you start a new project ########## +##########------------------------------------------------------########## + +MCU = atmega168p +F_CPU = 1000000UL +BAUD = 9600UL +## Also try BAUD = 19200 or 38400 if you're feeling lucky. + +## A directory for common include files and the simple USART library. +## If you move either the current folder or the Library folder, you'll +## need to change this path to match. +LIBDIR = ../../AVR-Programming-Library + +##########------------------------------------------------------########## +########## Programmer Defaults ########## +########## Set up once, then forget about it ########## +########## (Can override. See bottom of file.) ########## +##########------------------------------------------------------########## + +PROGRAMMER_TYPE = usbtiny +# extra arguments to avrdude: baud rate, chip type, -F flag, etc. +PROGRAMMER_ARGS = + +##########------------------------------------------------------########## +########## Program Locations ########## +########## Won't need to change if they're in your PATH ########## +##########------------------------------------------------------########## + +CC = avr-gcc +OBJCOPY = avr-objcopy +OBJDUMP = avr-objdump +AVRSIZE = avr-size +AVRDUDE = avrdude + +##########------------------------------------------------------########## +########## Makefile Magic! ########## +########## Summary: ########## +########## We want a .hex file ########## +########## Compile source files into .elf ########## +########## Convert .elf file into .hex ########## +########## You shouldn't need to edit below. ########## +##########------------------------------------------------------########## + +## The name of your project (without the .c) +# TARGET = blinkLED +## Or name it automatically after the enclosing directory +TARGET = $(lastword $(subst /, ,$(CURDIR))) + +# Object files: will find all .c/.h files in current directory +# and in LIBDIR. If you have any other (sub-)directories with code, +# you can add them in to SOURCES below in the wildcard statement. +SOURCES=$(wildcard *.c $(LIBDIR)/*.c) +OBJECTS=$(SOURCES:.c=.o) +HEADERS=$(SOURCES:.c=.h) + +## Compilation options, type man avr-gcc if you're curious. +CPPFLAGS = -DF_CPU=$(F_CPU) -DBAUD=$(BAUD) -I. -I$(LIBDIR) +CFLAGS = -Os -g -std=gnu99 -Wall +## Use short (8-bit) data types +CFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums +## Splits up object files per function +CFLAGS += -ffunction-sections -fdata-sections +LDFLAGS = -Wl,-Map,$(TARGET).map +## Optional, but often ends up with smaller code +LDFLAGS += -Wl,--gc-sections +## Relax shrinks code even more, but makes disassembly messy +## LDFLAGS += -Wl,--relax +## LDFLAGS += -Wl,-u,vfprintf -lprintf_flt -lm ## for floating-point printf +## LDFLAGS += -Wl,-u,vfprintf -lprintf_min ## for smaller printf +TARGET_ARCH = -mmcu=$(MCU) + +## Explicit pattern rules: +## To make .o files from .c files +%.o: %.c $(HEADERS) Makefile + $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c -o $@ $<; + +$(TARGET).elf: $(OBJECTS) + $(CC) $(LDFLAGS) $(TARGET_ARCH) $^ $(LDLIBS) -o $@ + +%.hex: %.elf + $(OBJCOPY) -j .text -j .data -O ihex $< $@ + +%.eeprom: %.elf + $(OBJCOPY) -j .eeprom --change-section-lma .eeprom=0 -O ihex $< $@ + +%.lst: %.elf + $(OBJDUMP) -S $< > $@ + +## These targets don't have files named after them +.PHONY: all disassemble disasm eeprom size clean squeaky_clean flash fuses + +all: $(TARGET).hex + +debug: + @echo + @echo "Source files:" $(SOURCES) + @echo "MCU, F_CPU, BAUD:" $(MCU), $(F_CPU), $(BAUD) + @echo + +# Optionally create listing file from .elf +# This creates approximate assembly-language equivalent of your code. +# Useful for debugging time-sensitive bits, +# or making sure the compiler does what you want. +disassemble: $(TARGET).lst + +disasm: disassemble + +# Optionally show how big the resulting program is +size: $(TARGET).elf + $(AVRSIZE) -C --mcu=$(MCU) $(TARGET).elf + +clean: + rm -f $(TARGET).elf $(TARGET).hex $(TARGET).obj \ + $(TARGET).o $(TARGET).d $(TARGET).eep $(TARGET).lst \ + $(TARGET).lss $(TARGET).sym $(TARGET).map $(TARGET)~ \ + $(TARGET).eeprom + +squeaky_clean: + rm -f *.elf *.hex *.obj *.o *.d *.eep *.lst *.lss *.sym *.map *~ *.eeprom + +##########------------------------------------------------------########## +########## Programmer-specific details ########## +########## Flashing code to AVR using avrdude ########## +##########------------------------------------------------------########## + +flash: $(TARGET).hex + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U flash:w:$< + +## An alias +program: flash + +flash_eeprom: $(TARGET).eeprom + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U eeprom:w:$< + +avrdude_terminal: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nt + +## If you've got multiple programmers that you use, +## you can define them here so that it's easy to switch. +## To invoke, use something like `make flash_arduinoISP` +flash_usbtiny: PROGRAMMER_TYPE = usbtiny +flash_usbtiny: PROGRAMMER_ARGS = # USBTiny works with no further arguments +flash_usbtiny: flash + +flash_usbasp: PROGRAMMER_TYPE = usbasp +flash_usbasp: PROGRAMMER_ARGS = # USBasp works with no further arguments +flash_usbasp: flash + +flash_arduinoISP: PROGRAMMER_TYPE = avrisp +flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P /dev/ttyACM0 +## (for windows) flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P com5 +flash_arduinoISP: flash + +flash_109: PROGRAMMER_TYPE = avr109 +flash_109: PROGRAMMER_ARGS = -b 9600 -P /dev/ttyUSB0 +flash_109: flash + +##########------------------------------------------------------########## +########## Fuse settings and suitable defaults ########## +##########------------------------------------------------------########## + +## Mega 48, 88, 168, 328 default values +LFUSE = 0x62 +HFUSE = 0xdf +EFUSE = 0x00 + +## Generic +FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m + +fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) \ + $(PROGRAMMER_ARGS) $(FUSE_STRING) +show_fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nv + +## Called with no extra definitions, sets to defaults +set_default_fuses: FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m +set_default_fuses: fuses + +## Set the fuse byte for full-speed mode +## Note: can also be set in firmware for modern chips +set_fast_fuse: LFUSE = 0xE2 +set_fast_fuse: FUSE_STRING = -U lfuse:w:$(LFUSE):m +set_fast_fuse: fuses + +## Set the EESAVE fuse byte to preserve EEPROM across flashes +set_eeprom_save_fuse: HFUSE = 0xD7 +set_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +set_eeprom_save_fuse: fuses + +## Clear the EESAVE fuse byte +clear_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +clear_eeprom_save_fuse: fuses diff --git a/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/progmemDemo1/progmemDemo1.c b/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/progmemDemo1/progmemDemo1.c new file mode 100644 index 0000000..effff1b --- /dev/null +++ b/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/progmemDemo1/progmemDemo1.c @@ -0,0 +1,32 @@ + /* First steps into using program memory */ + +#include +#include +#include +#include "USART.h" + +const char myVeryLongString[] PROGMEM = "\r\nHi there, \ +this is an example of a long string.\r\n\ +The kind that you wouldn't want to store in RAM.\r\n"; +const uint16_t sixteenBits PROGMEM = 12345; + +int main(void) { + initUSART(); + char oneLetter; + uint8_t i; + + while (1) { + for (i = 0; i < sizeof(myVeryLongString); i++) { + oneLetter = pgm_read_byte(&(myVeryLongString[i])); + transmitByte(oneLetter); + _delay_ms(100); /* slow it down to simulate typing effect :) */ + } + _delay_ms(1000); + + printWord(&sixteenBits); /* this throws a compiler warning... */ + transmitByte('\r'); + transmitByte('\n'); + printWord(pgm_read_word(&sixteenBits)); + } /* End event loop */ + return 0; /* This line is never reached */ +} diff --git a/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/progmemDemo2/Makefile b/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/progmemDemo2/Makefile new file mode 100644 index 0000000..3d9e544 --- /dev/null +++ b/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/progmemDemo2/Makefile @@ -0,0 +1,196 @@ + +##########------------------------------------------------------########## +########## Project-specific Details ########## +########## Check these every time you start a new project ########## +##########------------------------------------------------------########## + +MCU = atmega168p +F_CPU = 1000000UL +BAUD = 9600UL +## Also try BAUD = 19200 or 38400 if you're feeling lucky. + +## A directory for common include files and the simple USART library. +## If you move either the current folder or the Library folder, you'll +## need to change this path to match. +LIBDIR = ../../AVR-Programming-Library + +##########------------------------------------------------------########## +########## Programmer Defaults ########## +########## Set up once, then forget about it ########## +########## (Can override. See bottom of file.) ########## +##########------------------------------------------------------########## + +PROGRAMMER_TYPE = usbtiny +# extra arguments to avrdude: baud rate, chip type, -F flag, etc. +PROGRAMMER_ARGS = + +##########------------------------------------------------------########## +########## Program Locations ########## +########## Won't need to change if they're in your PATH ########## +##########------------------------------------------------------########## + +CC = avr-gcc +OBJCOPY = avr-objcopy +OBJDUMP = avr-objdump +AVRSIZE = avr-size +AVRDUDE = avrdude + +##########------------------------------------------------------########## +########## Makefile Magic! ########## +########## Summary: ########## +########## We want a .hex file ########## +########## Compile source files into .elf ########## +########## Convert .elf file into .hex ########## +########## You shouldn't need to edit below. ########## +##########------------------------------------------------------########## + +## The name of your project (without the .c) +# TARGET = blinkLED +## Or name it automatically after the enclosing directory +TARGET = $(lastword $(subst /, ,$(CURDIR))) + +# Object files: will find all .c/.h files in current directory +# and in LIBDIR. If you have any other (sub-)directories with code, +# you can add them in to SOURCES below in the wildcard statement. +SOURCES=$(wildcard *.c $(LIBDIR)/*.c) +OBJECTS=$(SOURCES:.c=.o) +HEADERS=$(SOURCES:.c=.h) + +## Compilation options, type man avr-gcc if you're curious. +CPPFLAGS = -DF_CPU=$(F_CPU) -DBAUD=$(BAUD) -I. -I$(LIBDIR) +CFLAGS = -Os -g -std=gnu99 -Wall +## Use short (8-bit) data types +CFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums +## Splits up object files per function +CFLAGS += -ffunction-sections -fdata-sections +LDFLAGS = -Wl,-Map,$(TARGET).map +## Optional, but often ends up with smaller code +LDFLAGS += -Wl,--gc-sections +## Relax shrinks code even more, but makes disassembly messy +## LDFLAGS += -Wl,--relax +## LDFLAGS += -Wl,-u,vfprintf -lprintf_flt -lm ## for floating-point printf +## LDFLAGS += -Wl,-u,vfprintf -lprintf_min ## for smaller printf +TARGET_ARCH = -mmcu=$(MCU) + +## Explicit pattern rules: +## To make .o files from .c files +%.o: %.c $(HEADERS) Makefile + $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c -o $@ $<; + +$(TARGET).elf: $(OBJECTS) + $(CC) $(LDFLAGS) $(TARGET_ARCH) $^ $(LDLIBS) -o $@ + +%.hex: %.elf + $(OBJCOPY) -j .text -j .data -O ihex $< $@ + +%.eeprom: %.elf + $(OBJCOPY) -j .eeprom --change-section-lma .eeprom=0 -O ihex $< $@ + +%.lst: %.elf + $(OBJDUMP) -S $< > $@ + +## These targets don't have files named after them +.PHONY: all disassemble disasm eeprom size clean squeaky_clean flash fuses + +all: $(TARGET).hex + +debug: + @echo + @echo "Source files:" $(SOURCES) + @echo "MCU, F_CPU, BAUD:" $(MCU), $(F_CPU), $(BAUD) + @echo + +# Optionally create listing file from .elf +# This creates approximate assembly-language equivalent of your code. +# Useful for debugging time-sensitive bits, +# or making sure the compiler does what you want. +disassemble: $(TARGET).lst + +disasm: disassemble + +# Optionally show how big the resulting program is +size: $(TARGET).elf + $(AVRSIZE) -C --mcu=$(MCU) $(TARGET).elf + +clean: + rm -f $(TARGET).elf $(TARGET).hex $(TARGET).obj \ + $(TARGET).o $(TARGET).d $(TARGET).eep $(TARGET).lst \ + $(TARGET).lss $(TARGET).sym $(TARGET).map $(TARGET)~ \ + $(TARGET).eeprom + +squeaky_clean: + rm -f *.elf *.hex *.obj *.o *.d *.eep *.lst *.lss *.sym *.map *~ *.eeprom + +##########------------------------------------------------------########## +########## Programmer-specific details ########## +########## Flashing code to AVR using avrdude ########## +##########------------------------------------------------------########## + +flash: $(TARGET).hex + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U flash:w:$< + +## An alias +program: flash + +flash_eeprom: $(TARGET).eeprom + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U eeprom:w:$< + +avrdude_terminal: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nt + +## If you've got multiple programmers that you use, +## you can define them here so that it's easy to switch. +## To invoke, use something like `make flash_arduinoISP` +flash_usbtiny: PROGRAMMER_TYPE = usbtiny +flash_usbtiny: PROGRAMMER_ARGS = # USBTiny works with no further arguments +flash_usbtiny: flash + +flash_usbasp: PROGRAMMER_TYPE = usbasp +flash_usbasp: PROGRAMMER_ARGS = # USBasp works with no further arguments +flash_usbasp: flash + +flash_arduinoISP: PROGRAMMER_TYPE = avrisp +flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P /dev/ttyACM0 +## (for windows) flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P com5 +flash_arduinoISP: flash + +flash_109: PROGRAMMER_TYPE = avr109 +flash_109: PROGRAMMER_ARGS = -b 9600 -P /dev/ttyUSB0 +flash_109: flash + +##########------------------------------------------------------########## +########## Fuse settings and suitable defaults ########## +##########------------------------------------------------------########## + +## Mega 48, 88, 168, 328 default values +LFUSE = 0x62 +HFUSE = 0xdf +EFUSE = 0x00 + +## Generic +FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m + +fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) \ + $(PROGRAMMER_ARGS) $(FUSE_STRING) +show_fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nv + +## Called with no extra definitions, sets to defaults +set_default_fuses: FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m +set_default_fuses: fuses + +## Set the fuse byte for full-speed mode +## Note: can also be set in firmware for modern chips +set_fast_fuse: LFUSE = 0xE2 +set_fast_fuse: FUSE_STRING = -U lfuse:w:$(LFUSE):m +set_fast_fuse: fuses + +## Set the EESAVE fuse byte to preserve EEPROM across flashes +set_eeprom_save_fuse: HFUSE = 0xD7 +set_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +set_eeprom_save_fuse: fuses + +## Clear the EESAVE fuse byte +clear_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +clear_eeprom_save_fuse: fuses diff --git a/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/progmemDemo2/progmemDemo2.c b/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/progmemDemo2/progmemDemo2.c new file mode 100644 index 0000000..c2748d7 --- /dev/null +++ b/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/progmemDemo2/progmemDemo2.c @@ -0,0 +1,37 @@ + /* Second steps into using program memory */ + /* Storing the addresses in pointers */ + +#include +#include +#include +#include "USART.h" + +const char myVeryLongString[] PROGMEM = "\r\nHi there, \ +this is an example of a long string.\r\n\ +The kind that you wouldn't want to store in RAM.\r\n"; +const uint16_t sixteenBits PROGMEM = 12345; + +int main(void) { + initUSART(); + + const char *stringPointer; + const uint16_t *wordPointer; + uint8_t i; + char oneLetter; + + stringPointer = &myVeryLongString[0]; /* address of first char */ + // stringPointer = myVeryLongString; /* same as above */ + wordPointer = &sixteenBits; /* address of first byte */ + + while (1) { + for (i = 0; i < sizeof(myVeryLongString); i++) { + oneLetter = pgm_read_byte(stringPointer + i); + transmitByte(oneLetter); + _delay_ms(100); /* slow it down to simulate typing effect :) */ + } + _delay_ms(1000); + + printWord(pgm_read_word(wordPointer)); + } /* End event loop */ + return 0; /* This line is never reached */ +} diff --git a/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/progmemDemo3/Makefile b/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/progmemDemo3/Makefile new file mode 100644 index 0000000..3d9e544 --- /dev/null +++ b/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/progmemDemo3/Makefile @@ -0,0 +1,196 @@ + +##########------------------------------------------------------########## +########## Project-specific Details ########## +########## Check these every time you start a new project ########## +##########------------------------------------------------------########## + +MCU = atmega168p +F_CPU = 1000000UL +BAUD = 9600UL +## Also try BAUD = 19200 or 38400 if you're feeling lucky. + +## A directory for common include files and the simple USART library. +## If you move either the current folder or the Library folder, you'll +## need to change this path to match. +LIBDIR = ../../AVR-Programming-Library + +##########------------------------------------------------------########## +########## Programmer Defaults ########## +########## Set up once, then forget about it ########## +########## (Can override. See bottom of file.) ########## +##########------------------------------------------------------########## + +PROGRAMMER_TYPE = usbtiny +# extra arguments to avrdude: baud rate, chip type, -F flag, etc. +PROGRAMMER_ARGS = + +##########------------------------------------------------------########## +########## Program Locations ########## +########## Won't need to change if they're in your PATH ########## +##########------------------------------------------------------########## + +CC = avr-gcc +OBJCOPY = avr-objcopy +OBJDUMP = avr-objdump +AVRSIZE = avr-size +AVRDUDE = avrdude + +##########------------------------------------------------------########## +########## Makefile Magic! ########## +########## Summary: ########## +########## We want a .hex file ########## +########## Compile source files into .elf ########## +########## Convert .elf file into .hex ########## +########## You shouldn't need to edit below. ########## +##########------------------------------------------------------########## + +## The name of your project (without the .c) +# TARGET = blinkLED +## Or name it automatically after the enclosing directory +TARGET = $(lastword $(subst /, ,$(CURDIR))) + +# Object files: will find all .c/.h files in current directory +# and in LIBDIR. If you have any other (sub-)directories with code, +# you can add them in to SOURCES below in the wildcard statement. +SOURCES=$(wildcard *.c $(LIBDIR)/*.c) +OBJECTS=$(SOURCES:.c=.o) +HEADERS=$(SOURCES:.c=.h) + +## Compilation options, type man avr-gcc if you're curious. +CPPFLAGS = -DF_CPU=$(F_CPU) -DBAUD=$(BAUD) -I. -I$(LIBDIR) +CFLAGS = -Os -g -std=gnu99 -Wall +## Use short (8-bit) data types +CFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums +## Splits up object files per function +CFLAGS += -ffunction-sections -fdata-sections +LDFLAGS = -Wl,-Map,$(TARGET).map +## Optional, but often ends up with smaller code +LDFLAGS += -Wl,--gc-sections +## Relax shrinks code even more, but makes disassembly messy +## LDFLAGS += -Wl,--relax +## LDFLAGS += -Wl,-u,vfprintf -lprintf_flt -lm ## for floating-point printf +## LDFLAGS += -Wl,-u,vfprintf -lprintf_min ## for smaller printf +TARGET_ARCH = -mmcu=$(MCU) + +## Explicit pattern rules: +## To make .o files from .c files +%.o: %.c $(HEADERS) Makefile + $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c -o $@ $<; + +$(TARGET).elf: $(OBJECTS) + $(CC) $(LDFLAGS) $(TARGET_ARCH) $^ $(LDLIBS) -o $@ + +%.hex: %.elf + $(OBJCOPY) -j .text -j .data -O ihex $< $@ + +%.eeprom: %.elf + $(OBJCOPY) -j .eeprom --change-section-lma .eeprom=0 -O ihex $< $@ + +%.lst: %.elf + $(OBJDUMP) -S $< > $@ + +## These targets don't have files named after them +.PHONY: all disassemble disasm eeprom size clean squeaky_clean flash fuses + +all: $(TARGET).hex + +debug: + @echo + @echo "Source files:" $(SOURCES) + @echo "MCU, F_CPU, BAUD:" $(MCU), $(F_CPU), $(BAUD) + @echo + +# Optionally create listing file from .elf +# This creates approximate assembly-language equivalent of your code. +# Useful for debugging time-sensitive bits, +# or making sure the compiler does what you want. +disassemble: $(TARGET).lst + +disasm: disassemble + +# Optionally show how big the resulting program is +size: $(TARGET).elf + $(AVRSIZE) -C --mcu=$(MCU) $(TARGET).elf + +clean: + rm -f $(TARGET).elf $(TARGET).hex $(TARGET).obj \ + $(TARGET).o $(TARGET).d $(TARGET).eep $(TARGET).lst \ + $(TARGET).lss $(TARGET).sym $(TARGET).map $(TARGET)~ \ + $(TARGET).eeprom + +squeaky_clean: + rm -f *.elf *.hex *.obj *.o *.d *.eep *.lst *.lss *.sym *.map *~ *.eeprom + +##########------------------------------------------------------########## +########## Programmer-specific details ########## +########## Flashing code to AVR using avrdude ########## +##########------------------------------------------------------########## + +flash: $(TARGET).hex + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U flash:w:$< + +## An alias +program: flash + +flash_eeprom: $(TARGET).eeprom + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U eeprom:w:$< + +avrdude_terminal: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nt + +## If you've got multiple programmers that you use, +## you can define them here so that it's easy to switch. +## To invoke, use something like `make flash_arduinoISP` +flash_usbtiny: PROGRAMMER_TYPE = usbtiny +flash_usbtiny: PROGRAMMER_ARGS = # USBTiny works with no further arguments +flash_usbtiny: flash + +flash_usbasp: PROGRAMMER_TYPE = usbasp +flash_usbasp: PROGRAMMER_ARGS = # USBasp works with no further arguments +flash_usbasp: flash + +flash_arduinoISP: PROGRAMMER_TYPE = avrisp +flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P /dev/ttyACM0 +## (for windows) flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P com5 +flash_arduinoISP: flash + +flash_109: PROGRAMMER_TYPE = avr109 +flash_109: PROGRAMMER_ARGS = -b 9600 -P /dev/ttyUSB0 +flash_109: flash + +##########------------------------------------------------------########## +########## Fuse settings and suitable defaults ########## +##########------------------------------------------------------########## + +## Mega 48, 88, 168, 328 default values +LFUSE = 0x62 +HFUSE = 0xdf +EFUSE = 0x00 + +## Generic +FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m + +fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) \ + $(PROGRAMMER_ARGS) $(FUSE_STRING) +show_fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nv + +## Called with no extra definitions, sets to defaults +set_default_fuses: FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m +set_default_fuses: fuses + +## Set the fuse byte for full-speed mode +## Note: can also be set in firmware for modern chips +set_fast_fuse: LFUSE = 0xE2 +set_fast_fuse: FUSE_STRING = -U lfuse:w:$(LFUSE):m +set_fast_fuse: fuses + +## Set the EESAVE fuse byte to preserve EEPROM across flashes +set_eeprom_save_fuse: HFUSE = 0xD7 +set_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +set_eeprom_save_fuse: fuses + +## Clear the EESAVE fuse byte +clear_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +clear_eeprom_save_fuse: fuses diff --git a/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/progmemDemo3/progmemDemo3.c b/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/progmemDemo3/progmemDemo3.c new file mode 100644 index 0000000..31df8cb --- /dev/null +++ b/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/progmemDemo3/progmemDemo3.c @@ -0,0 +1,33 @@ + /* Third step into using program memory */ + /* Passing pointers to functions */ + +#include +#include +#include +#include "USART.h" + +const char myVeryLongString1[] PROGMEM = "\r\nHi there, \ +this is an example of a long string.\r\n\ +The kind that you wouldn't want to store in RAM.\r\n"; +const char myVeryLongString2[] PROGMEM = "All work and no play \ +makes Jack something something.\r\n"; + +void printString_Progmem(const char *stringP) { + char oneLetter; + while ((oneLetter = pgm_read_byte(stringP))) { + transmitByte(oneLetter); + stringP++; + _delay_ms(100); /* only b/c it's cute */ + } +} + +int main(void) { + initUSART(); + while (1) { + printString_Progmem(&myVeryLongString1[0]); + printString_Progmem(&myVeryLongString1[50]); + printString_Progmem(myVeryLongString2); + _delay_ms(1000); + } /* End event loop */ + return 0; /* This line is never reached */ +} diff --git a/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/progmemDemo4/Makefile b/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/progmemDemo4/Makefile new file mode 100644 index 0000000..3d9e544 --- /dev/null +++ b/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/progmemDemo4/Makefile @@ -0,0 +1,196 @@ + +##########------------------------------------------------------########## +########## Project-specific Details ########## +########## Check these every time you start a new project ########## +##########------------------------------------------------------########## + +MCU = atmega168p +F_CPU = 1000000UL +BAUD = 9600UL +## Also try BAUD = 19200 or 38400 if you're feeling lucky. + +## A directory for common include files and the simple USART library. +## If you move either the current folder or the Library folder, you'll +## need to change this path to match. +LIBDIR = ../../AVR-Programming-Library + +##########------------------------------------------------------########## +########## Programmer Defaults ########## +########## Set up once, then forget about it ########## +########## (Can override. See bottom of file.) ########## +##########------------------------------------------------------########## + +PROGRAMMER_TYPE = usbtiny +# extra arguments to avrdude: baud rate, chip type, -F flag, etc. +PROGRAMMER_ARGS = + +##########------------------------------------------------------########## +########## Program Locations ########## +########## Won't need to change if they're in your PATH ########## +##########------------------------------------------------------########## + +CC = avr-gcc +OBJCOPY = avr-objcopy +OBJDUMP = avr-objdump +AVRSIZE = avr-size +AVRDUDE = avrdude + +##########------------------------------------------------------########## +########## Makefile Magic! ########## +########## Summary: ########## +########## We want a .hex file ########## +########## Compile source files into .elf ########## +########## Convert .elf file into .hex ########## +########## You shouldn't need to edit below. ########## +##########------------------------------------------------------########## + +## The name of your project (without the .c) +# TARGET = blinkLED +## Or name it automatically after the enclosing directory +TARGET = $(lastword $(subst /, ,$(CURDIR))) + +# Object files: will find all .c/.h files in current directory +# and in LIBDIR. If you have any other (sub-)directories with code, +# you can add them in to SOURCES below in the wildcard statement. +SOURCES=$(wildcard *.c $(LIBDIR)/*.c) +OBJECTS=$(SOURCES:.c=.o) +HEADERS=$(SOURCES:.c=.h) + +## Compilation options, type man avr-gcc if you're curious. +CPPFLAGS = -DF_CPU=$(F_CPU) -DBAUD=$(BAUD) -I. -I$(LIBDIR) +CFLAGS = -Os -g -std=gnu99 -Wall +## Use short (8-bit) data types +CFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums +## Splits up object files per function +CFLAGS += -ffunction-sections -fdata-sections +LDFLAGS = -Wl,-Map,$(TARGET).map +## Optional, but often ends up with smaller code +LDFLAGS += -Wl,--gc-sections +## Relax shrinks code even more, but makes disassembly messy +## LDFLAGS += -Wl,--relax +## LDFLAGS += -Wl,-u,vfprintf -lprintf_flt -lm ## for floating-point printf +## LDFLAGS += -Wl,-u,vfprintf -lprintf_min ## for smaller printf +TARGET_ARCH = -mmcu=$(MCU) + +## Explicit pattern rules: +## To make .o files from .c files +%.o: %.c $(HEADERS) Makefile + $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c -o $@ $<; + +$(TARGET).elf: $(OBJECTS) + $(CC) $(LDFLAGS) $(TARGET_ARCH) $^ $(LDLIBS) -o $@ + +%.hex: %.elf + $(OBJCOPY) -j .text -j .data -O ihex $< $@ + +%.eeprom: %.elf + $(OBJCOPY) -j .eeprom --change-section-lma .eeprom=0 -O ihex $< $@ + +%.lst: %.elf + $(OBJDUMP) -S $< > $@ + +## These targets don't have files named after them +.PHONY: all disassemble disasm eeprom size clean squeaky_clean flash fuses + +all: $(TARGET).hex + +debug: + @echo + @echo "Source files:" $(SOURCES) + @echo "MCU, F_CPU, BAUD:" $(MCU), $(F_CPU), $(BAUD) + @echo + +# Optionally create listing file from .elf +# This creates approximate assembly-language equivalent of your code. +# Useful for debugging time-sensitive bits, +# or making sure the compiler does what you want. +disassemble: $(TARGET).lst + +disasm: disassemble + +# Optionally show how big the resulting program is +size: $(TARGET).elf + $(AVRSIZE) -C --mcu=$(MCU) $(TARGET).elf + +clean: + rm -f $(TARGET).elf $(TARGET).hex $(TARGET).obj \ + $(TARGET).o $(TARGET).d $(TARGET).eep $(TARGET).lst \ + $(TARGET).lss $(TARGET).sym $(TARGET).map $(TARGET)~ \ + $(TARGET).eeprom + +squeaky_clean: + rm -f *.elf *.hex *.obj *.o *.d *.eep *.lst *.lss *.sym *.map *~ *.eeprom + +##########------------------------------------------------------########## +########## Programmer-specific details ########## +########## Flashing code to AVR using avrdude ########## +##########------------------------------------------------------########## + +flash: $(TARGET).hex + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U flash:w:$< + +## An alias +program: flash + +flash_eeprom: $(TARGET).eeprom + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U eeprom:w:$< + +avrdude_terminal: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nt + +## If you've got multiple programmers that you use, +## you can define them here so that it's easy to switch. +## To invoke, use something like `make flash_arduinoISP` +flash_usbtiny: PROGRAMMER_TYPE = usbtiny +flash_usbtiny: PROGRAMMER_ARGS = # USBTiny works with no further arguments +flash_usbtiny: flash + +flash_usbasp: PROGRAMMER_TYPE = usbasp +flash_usbasp: PROGRAMMER_ARGS = # USBasp works with no further arguments +flash_usbasp: flash + +flash_arduinoISP: PROGRAMMER_TYPE = avrisp +flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P /dev/ttyACM0 +## (for windows) flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P com5 +flash_arduinoISP: flash + +flash_109: PROGRAMMER_TYPE = avr109 +flash_109: PROGRAMMER_ARGS = -b 9600 -P /dev/ttyUSB0 +flash_109: flash + +##########------------------------------------------------------########## +########## Fuse settings and suitable defaults ########## +##########------------------------------------------------------########## + +## Mega 48, 88, 168, 328 default values +LFUSE = 0x62 +HFUSE = 0xdf +EFUSE = 0x00 + +## Generic +FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m + +fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) \ + $(PROGRAMMER_ARGS) $(FUSE_STRING) +show_fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nv + +## Called with no extra definitions, sets to defaults +set_default_fuses: FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m +set_default_fuses: fuses + +## Set the fuse byte for full-speed mode +## Note: can also be set in firmware for modern chips +set_fast_fuse: LFUSE = 0xE2 +set_fast_fuse: FUSE_STRING = -U lfuse:w:$(LFUSE):m +set_fast_fuse: fuses + +## Set the EESAVE fuse byte to preserve EEPROM across flashes +set_eeprom_save_fuse: HFUSE = 0xD7 +set_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +set_eeprom_save_fuse: fuses + +## Clear the EESAVE fuse byte +clear_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +clear_eeprom_save_fuse: fuses diff --git a/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/progmemDemo4/progmemDemo4.c b/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/progmemDemo4/progmemDemo4.c new file mode 100644 index 0000000..46b62fd --- /dev/null +++ b/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/progmemDemo4/progmemDemo4.c @@ -0,0 +1,36 @@ + /* Fourth step into using program memory */ + /* Passing data array pointers to functions */ + +#include +#include +#include +#include "USART.h" + +const uint16_t myData[] PROGMEM = + { 1111, 2222, 3333, 4444, 5555, 6666, 7777, 8888, 9999, 10000 }; +const uint16_t myData2[] PROGMEM = { 123, 456, 789, 012, 345, 678, 999 }; + +void printData_Progmem(const uint16_t * dataPointer, uint8_t length) { + while (length) { + printWord((uint16_t) dataPointer); /* print out address */ + printString(": "); + printWord(pgm_read_word(dataPointer)); /* print out data */ + printString("\r\n"); + dataPointer++; /* move to next byte */ + length--; /* one less byte to go */ + _delay_ms(100); + } +} + +int main(void) { + initUSART(); + while (1) { + printData_Progmem(myData, sizeof(myData) / 2); + printString("\r\n"); + _delay_ms(1000); + printData_Progmem(myData2, sizeof(myData2) / sizeof(myData2[0])); + printString("\r\n"); + _delay_ms(1000); + } /* End event loop */ + return 0; /* This line is never reached */ +} diff --git a/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/progmemDemo5/Makefile b/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/progmemDemo5/Makefile new file mode 100644 index 0000000..3d9e544 --- /dev/null +++ b/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/progmemDemo5/Makefile @@ -0,0 +1,196 @@ + +##########------------------------------------------------------########## +########## Project-specific Details ########## +########## Check these every time you start a new project ########## +##########------------------------------------------------------########## + +MCU = atmega168p +F_CPU = 1000000UL +BAUD = 9600UL +## Also try BAUD = 19200 or 38400 if you're feeling lucky. + +## A directory for common include files and the simple USART library. +## If you move either the current folder or the Library folder, you'll +## need to change this path to match. +LIBDIR = ../../AVR-Programming-Library + +##########------------------------------------------------------########## +########## Programmer Defaults ########## +########## Set up once, then forget about it ########## +########## (Can override. See bottom of file.) ########## +##########------------------------------------------------------########## + +PROGRAMMER_TYPE = usbtiny +# extra arguments to avrdude: baud rate, chip type, -F flag, etc. +PROGRAMMER_ARGS = + +##########------------------------------------------------------########## +########## Program Locations ########## +########## Won't need to change if they're in your PATH ########## +##########------------------------------------------------------########## + +CC = avr-gcc +OBJCOPY = avr-objcopy +OBJDUMP = avr-objdump +AVRSIZE = avr-size +AVRDUDE = avrdude + +##########------------------------------------------------------########## +########## Makefile Magic! ########## +########## Summary: ########## +########## We want a .hex file ########## +########## Compile source files into .elf ########## +########## Convert .elf file into .hex ########## +########## You shouldn't need to edit below. ########## +##########------------------------------------------------------########## + +## The name of your project (without the .c) +# TARGET = blinkLED +## Or name it automatically after the enclosing directory +TARGET = $(lastword $(subst /, ,$(CURDIR))) + +# Object files: will find all .c/.h files in current directory +# and in LIBDIR. If you have any other (sub-)directories with code, +# you can add them in to SOURCES below in the wildcard statement. +SOURCES=$(wildcard *.c $(LIBDIR)/*.c) +OBJECTS=$(SOURCES:.c=.o) +HEADERS=$(SOURCES:.c=.h) + +## Compilation options, type man avr-gcc if you're curious. +CPPFLAGS = -DF_CPU=$(F_CPU) -DBAUD=$(BAUD) -I. -I$(LIBDIR) +CFLAGS = -Os -g -std=gnu99 -Wall +## Use short (8-bit) data types +CFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums +## Splits up object files per function +CFLAGS += -ffunction-sections -fdata-sections +LDFLAGS = -Wl,-Map,$(TARGET).map +## Optional, but often ends up with smaller code +LDFLAGS += -Wl,--gc-sections +## Relax shrinks code even more, but makes disassembly messy +## LDFLAGS += -Wl,--relax +## LDFLAGS += -Wl,-u,vfprintf -lprintf_flt -lm ## for floating-point printf +## LDFLAGS += -Wl,-u,vfprintf -lprintf_min ## for smaller printf +TARGET_ARCH = -mmcu=$(MCU) + +## Explicit pattern rules: +## To make .o files from .c files +%.o: %.c $(HEADERS) Makefile + $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c -o $@ $<; + +$(TARGET).elf: $(OBJECTS) + $(CC) $(LDFLAGS) $(TARGET_ARCH) $^ $(LDLIBS) -o $@ + +%.hex: %.elf + $(OBJCOPY) -j .text -j .data -O ihex $< $@ + +%.eeprom: %.elf + $(OBJCOPY) -j .eeprom --change-section-lma .eeprom=0 -O ihex $< $@ + +%.lst: %.elf + $(OBJDUMP) -S $< > $@ + +## These targets don't have files named after them +.PHONY: all disassemble disasm eeprom size clean squeaky_clean flash fuses + +all: $(TARGET).hex + +debug: + @echo + @echo "Source files:" $(SOURCES) + @echo "MCU, F_CPU, BAUD:" $(MCU), $(F_CPU), $(BAUD) + @echo + +# Optionally create listing file from .elf +# This creates approximate assembly-language equivalent of your code. +# Useful for debugging time-sensitive bits, +# or making sure the compiler does what you want. +disassemble: $(TARGET).lst + +disasm: disassemble + +# Optionally show how big the resulting program is +size: $(TARGET).elf + $(AVRSIZE) -C --mcu=$(MCU) $(TARGET).elf + +clean: + rm -f $(TARGET).elf $(TARGET).hex $(TARGET).obj \ + $(TARGET).o $(TARGET).d $(TARGET).eep $(TARGET).lst \ + $(TARGET).lss $(TARGET).sym $(TARGET).map $(TARGET)~ \ + $(TARGET).eeprom + +squeaky_clean: + rm -f *.elf *.hex *.obj *.o *.d *.eep *.lst *.lss *.sym *.map *~ *.eeprom + +##########------------------------------------------------------########## +########## Programmer-specific details ########## +########## Flashing code to AVR using avrdude ########## +##########------------------------------------------------------########## + +flash: $(TARGET).hex + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U flash:w:$< + +## An alias +program: flash + +flash_eeprom: $(TARGET).eeprom + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U eeprom:w:$< + +avrdude_terminal: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nt + +## If you've got multiple programmers that you use, +## you can define them here so that it's easy to switch. +## To invoke, use something like `make flash_arduinoISP` +flash_usbtiny: PROGRAMMER_TYPE = usbtiny +flash_usbtiny: PROGRAMMER_ARGS = # USBTiny works with no further arguments +flash_usbtiny: flash + +flash_usbasp: PROGRAMMER_TYPE = usbasp +flash_usbasp: PROGRAMMER_ARGS = # USBasp works with no further arguments +flash_usbasp: flash + +flash_arduinoISP: PROGRAMMER_TYPE = avrisp +flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P /dev/ttyACM0 +## (for windows) flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P com5 +flash_arduinoISP: flash + +flash_109: PROGRAMMER_TYPE = avr109 +flash_109: PROGRAMMER_ARGS = -b 9600 -P /dev/ttyUSB0 +flash_109: flash + +##########------------------------------------------------------########## +########## Fuse settings and suitable defaults ########## +##########------------------------------------------------------########## + +## Mega 48, 88, 168, 328 default values +LFUSE = 0x62 +HFUSE = 0xdf +EFUSE = 0x00 + +## Generic +FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m + +fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) \ + $(PROGRAMMER_ARGS) $(FUSE_STRING) +show_fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nv + +## Called with no extra definitions, sets to defaults +set_default_fuses: FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m +set_default_fuses: fuses + +## Set the fuse byte for full-speed mode +## Note: can also be set in firmware for modern chips +set_fast_fuse: LFUSE = 0xE2 +set_fast_fuse: FUSE_STRING = -U lfuse:w:$(LFUSE):m +set_fast_fuse: fuses + +## Set the EESAVE fuse byte to preserve EEPROM across flashes +set_eeprom_save_fuse: HFUSE = 0xD7 +set_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +set_eeprom_save_fuse: fuses + +## Clear the EESAVE fuse byte +clear_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +clear_eeprom_save_fuse: fuses diff --git a/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/progmemDemo5/progmemDemo5.c b/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/progmemDemo5/progmemDemo5.c new file mode 100644 index 0000000..98c7d0e --- /dev/null +++ b/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/progmemDemo5/progmemDemo5.c @@ -0,0 +1,68 @@ + /* Fourth step into using program memory */ + /* Passing data array pointers to functions */ + +#include +#include +#include +#include "USART.h" + +const uint16_t myData[] PROGMEM = + { 1111, 2222, 3333, 4444, 5555, 6666, 7777, 8888, 9999, 10000 }; + +const char string1[] PROGMEM = "Hey, string one!\r\n"; +const char string2[] PROGMEM = "Oh my, string two!\r\n"; +const char *const stringIndex[] PROGMEM = { string1, string2 }; + + +void printData_Progmem(const uint16_t * dataPointer, uint8_t length) { + while (length) { + printWord((uint16_t) dataPointer); /* print out address */ + printString(": "); + printWord(pgm_read_word(dataPointer)); /* print out data */ + printString("\r\n"); + dataPointer++; /* move to next byte */ + length--; /* one less byte to go */ + _delay_ms(100); + } +} +void printString_Progmem(const char *stringP) { + char oneLetter; + while ((oneLetter = pgm_read_byte(stringP))) { + transmitByte(oneLetter); + stringP++; + } +} + +int main(void) { + initUSART(); + + uint8_t myArray[] = { 10, 11, 12 }; + uint8_t *p; + uint8_t i; + p = &myArray[0]; + for (i = 0; i < sizeof(myArray); i++) { + printByte(*(p + i)); + printString("\r\n"); + _delay_ms(1000); + } + + + /* To use them: */ + char *stringPointer; + /* Get the pointer to the string you want from PROGMEM */ + + stringPointer = (char *) pgm_read_word(&stringIndex[0]); + printString_Progmem(stringPointer); + /* or */ + stringPointer = (char *) pgm_read_word(&stringIndex[1]); + printString_Progmem(&stringPointer[0]); + /* or */ + printString_Progmem(PSTR("And this string got inlined.\r\n")); + + while (1) { + printData_Progmem(myData, sizeof(myData) / sizeof(myData[0])); + printString("\r\n"); + _delay_ms(1000); + } /* End event loop */ + return 0; /* This line is never reached */ +} diff --git a/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/Makefile b/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/Makefile new file mode 100644 index 0000000..5c588dc --- /dev/null +++ b/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/Makefile @@ -0,0 +1,196 @@ + +##########------------------------------------------------------########## +########## Project-specific Details ########## +########## Check these every time you start a new project ########## +##########------------------------------------------------------########## + +MCU = atmega168p +F_CPU = 8000000UL +BAUD = 9600UL +## Also try BAUD = 19200 or 38400 if you're feeling lucky. + +## A directory for common include files and the simple USART library. +## If you move either the current folder or the Library folder, you'll +## need to change this path to match. +LIBDIR = ../../AVR-Programming-Library + +##########------------------------------------------------------########## +########## Programmer Defaults ########## +########## Set up once, then forget about it ########## +########## (Can override. See bottom of file.) ########## +##########------------------------------------------------------########## + +PROGRAMMER_TYPE = usbtiny +# extra arguments to avrdude: baud rate, chip type, -F flag, etc. +PROGRAMMER_ARGS = + +##########------------------------------------------------------########## +########## Program Locations ########## +########## Won't need to change if they're in your PATH ########## +##########------------------------------------------------------########## + +CC = avr-gcc +OBJCOPY = avr-objcopy +OBJDUMP = avr-objdump +AVRSIZE = avr-size +AVRDUDE = avrdude + +##########------------------------------------------------------########## +########## Makefile Magic! ########## +########## Summary: ########## +########## We want a .hex file ########## +########## Compile source files into .elf ########## +########## Convert .elf file into .hex ########## +########## You shouldn't need to edit below. ########## +##########------------------------------------------------------########## + +## The name of your project (without the .c) +# TARGET = blinkLED +## Or name it automatically after the enclosing directory +TARGET = $(lastword $(subst /, ,$(CURDIR))) + +# Object files: will find all .c/.h files in current directory +# and in LIBDIR. If you have any other (sub-)directories with code, +# you can add them in to SOURCES below in the wildcard statement. +SOURCES=$(wildcard *.c $(LIBDIR)/*.c) +OBJECTS=$(SOURCES:.c=.o) +HEADERS=$(SOURCES:.c=.h) + +## Compilation options, type man avr-gcc if you're curious. +CPPFLAGS = -DF_CPU=$(F_CPU) -DBAUD=$(BAUD) -I. -I$(LIBDIR) +CFLAGS = -Os -g -std=gnu99 -Wall +## Use short (8-bit) data types +CFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums +## Splits up object files per function +CFLAGS += -ffunction-sections -fdata-sections +LDFLAGS = -Wl,-Map,$(TARGET).map +## Optional, but often ends up with smaller code +LDFLAGS += -Wl,--gc-sections +## Relax shrinks code even more, but makes disassembly messy +## LDFLAGS += -Wl,--relax +## LDFLAGS += -Wl,-u,vfprintf -lprintf_flt -lm ## for floating-point printf +## LDFLAGS += -Wl,-u,vfprintf -lprintf_min ## for smaller printf +TARGET_ARCH = -mmcu=$(MCU) + +## Explicit pattern rules: +## To make .o files from .c files +%.o: %.c $(HEADERS) Makefile + $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c -o $@ $<; + +$(TARGET).elf: $(OBJECTS) + $(CC) $(LDFLAGS) $(TARGET_ARCH) $^ $(LDLIBS) -o $@ + +%.hex: %.elf + $(OBJCOPY) -j .text -j .data -O ihex $< $@ + +%.eeprom: %.elf + $(OBJCOPY) -j .eeprom --change-section-lma .eeprom=0 -O ihex $< $@ + +%.lst: %.elf + $(OBJDUMP) -S $< > $@ + +## These targets don't have files named after them +.PHONY: all disassemble disasm eeprom size clean squeaky_clean flash fuses + +all: $(TARGET).hex + +debug: + @echo + @echo "Source files:" $(SOURCES) + @echo "MCU, F_CPU, BAUD:" $(MCU), $(F_CPU), $(BAUD) + @echo + +# Optionally create listing file from .elf +# This creates approximate assembly-language equivalent of your code. +# Useful for debugging time-sensitive bits, +# or making sure the compiler does what you want. +disassemble: $(TARGET).lst + +disasm: disassemble + +# Optionally show how big the resulting program is +size: $(TARGET).elf + $(AVRSIZE) -C --mcu=$(MCU) $(TARGET).elf + +clean: + rm -f $(TARGET).elf $(TARGET).hex $(TARGET).obj \ + $(TARGET).o $(TARGET).d $(TARGET).eep $(TARGET).lst \ + $(TARGET).lss $(TARGET).sym $(TARGET).map $(TARGET)~ \ + $(TARGET).eeprom + +squeaky_clean: + rm -f *.elf *.hex *.obj *.o *.d *.eep *.lst *.lss *.sym *.map *~ *.eeprom + +##########------------------------------------------------------########## +########## Programmer-specific details ########## +########## Flashing code to AVR using avrdude ########## +##########------------------------------------------------------########## + +flash: $(TARGET).hex + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U flash:w:$< + +## An alias +program: flash + +flash_eeprom: $(TARGET).eeprom + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U eeprom:w:$< + +avrdude_terminal: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nt + +## If you've got multiple programmers that you use, +## you can define them here so that it's easy to switch. +## To invoke, use something like `make flash_arduinoISP` +flash_usbtiny: PROGRAMMER_TYPE = usbtiny +flash_usbtiny: PROGRAMMER_ARGS = # USBTiny works with no further arguments +flash_usbtiny: flash + +flash_usbasp: PROGRAMMER_TYPE = usbasp +flash_usbasp: PROGRAMMER_ARGS = # USBasp works with no further arguments +flash_usbasp: flash + +flash_arduinoISP: PROGRAMMER_TYPE = avrisp +flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P /dev/ttyACM0 +## (for windows) flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P com5 +flash_arduinoISP: flash + +flash_109: PROGRAMMER_TYPE = avr109 +flash_109: PROGRAMMER_ARGS = -b 9600 -P /dev/ttyUSB0 +flash_109: flash + +##########------------------------------------------------------########## +########## Fuse settings and suitable defaults ########## +##########------------------------------------------------------########## + +## Mega 48, 88, 168, 328 default values +LFUSE = 0x62 +HFUSE = 0xdf +EFUSE = 0x00 + +## Generic +FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m + +fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) \ + $(PROGRAMMER_ARGS) $(FUSE_STRING) +show_fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nv + +## Called with no extra definitions, sets to defaults +set_default_fuses: FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m +set_default_fuses: fuses + +## Set the fuse byte for full-speed mode +## Note: can also be set in firmware for modern chips +set_fast_fuse: LFUSE = 0xE2 +set_fast_fuse: FUSE_STRING = -U lfuse:w:$(LFUSE):m +set_fast_fuse: fuses + +## Set the EESAVE fuse byte to preserve EEPROM across flashes +set_eeprom_save_fuse: HFUSE = 0xD7 +set_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +set_eeprom_save_fuse: fuses + +## Clear the EESAVE fuse byte +clear_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +clear_eeprom_save_fuse: fuses diff --git a/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/allDigits.h b/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/allDigits.h new file mode 100644 index 0000000..da176f5 --- /dev/null +++ b/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/allDigits.h @@ -0,0 +1,14923 @@ +const uint8_t DPCM_one_8000[] PROGMEM = { + 153, + 90, + 106, + 150, + 105, + 86, + 150, + 106, + 150, + 85, + 165, + 150, + 165, + 169, + 90, + 85, + 102, + 149, + 166, + 105, + 153, + 165, + 170, + 89, + 106, + 153, + 150, + 101, + 149, + 105, + 150, + 166, + 153, + 85, + 149, + 85, + 170, + 170, + 169, + 149, + 85, + 89, + 106, + 169, + 169, + 105, + 170, + 170, + 169, + 85, + 90, + 170, + 169, + 85, + 85, + 170, + 169, + 85, + 85, + 170, + 170, + 150, + 170, + 153, + 85, + 85, + 170, + 170, + 89, + 85, + 86, + 170, + 170, + 85, + 85, + 106, + 170, + 149, + 85, + 170, + 170, + 149, + 85, + 170, + 149, + 85, + 90, + 170, + 85, + 86, + 191, + 165, + 64, + 90, + 170, + 149, + 85, + 106, + 85, + 170, + 169, + 85, + 90, + 170, + 149, + 86, + 170, + 165, + 17, + 127, + 250, + 64, + 22, + 186, + 149, + 86, + 169, + 85, + 107, + 233, + 69, + 106, + 169, + 85, + 106, + 169, + 85, + 145, + 26, + 255, + 224, + 1, + 175, + 233, + 86, + 169, + 81, + 107, + 233, + 1, + 111, + 165, + 85, + 170, + 149, + 90, + 169, + 1, + 191, + 244, + 0, + 127, + 228, + 86, + 185, + 65, + 111, + 228, + 1, + 191, + 144, + 90, + 169, + 85, + 170, + 170, + 0, + 191, + 252, + 0, + 127, + 213, + 42, + 232, + 2, + 255, + 144, + 27, + 249, + 69, + 170, + 149, + 106, + 169, + 106, + 64, + 127, + 252, + 1, + 191, + 149, + 126, + 128, + 27, + 253, + 1, + 191, + 149, + 106, + 149, + 90, + 169, + 170, + 168, + 2, + 255, + 160, + 15, + 245, + 111, + 224, + 2, + 255, + 80, + 86, + 170, + 165, + 89, + 166, + 85, + 186, + 149, + 96, + 15, + 250, + 0, + 123, + 150, + 254, + 0, + 175, + 229, + 85, + 86, + 250, + 69, + 170, + 85, + 170, + 149, + 105, + 0, + 255, + 0, + 15, + 98, + 255, + 64, + 63, + 197, + 190, + 0, + 191, + 65, + 174, + 81, + 170, + 86, + 169, + 64, + 47, + 240, + 4, + 246, + 191, + 192, + 27, + 244, + 111, + 128, + 127, + 209, + 46, + 145, + 105, + 86, + 186, + 18, + 0, + 255, + 0, + 31, + 171, + 248, + 2, + 254, + 70, + 164, + 27, + 233, + 42, + 149, + 106, + 149, + 126, + 132, + 104, + 7, + 252, + 2, + 250, + 127, + 192, + 47, + 244, + 89, + 2, + 254, + 6, + 229, + 26, + 165, + 106, + 166, + 86, + 96, + 143, + 240, + 11, + 218, + 250, + 0, + 255, + 230, + 64, + 127, + 196, + 106, + 149, + 165, + 106, + 150, + 165, + 85, + 160, + 143, + 240, + 7, + 203, + 252, + 1, + 255, + 186, + 64, + 127, + 209, + 89, + 170, + 85, + 106, + 166, + 101, + 106, + 86, + 13, + 255, + 2, + 84, + 255, + 64, + 46, + 255, + 128, + 31, + 234, + 21, + 170, + 149, + 105, + 154, + 85, + 169, + 149, + 104, + 63, + 224, + 12, + 27, + 248, + 4, + 87, + 252, + 0, + 155, + 248, + 22, + 154, + 164, + 86, + 169, + 90, + 213, + 85, + 168, + 63, + 192, + 40, + 47, + 208, + 20, + 47, + 228, + 16, + 47, + 228, + 20, + 107, + 149, + 85, + 170, + 150, + 165, + 86, + 105, + 15, + 240, + 5, + 15, + 241, + 84, + 15, + 245, + 164, + 15, + 245, + 148, + 43, + 170, + 81, + 106, + 170, + 86, + 101, + 150, + 176, + 255, + 1, + 0, + 255, + 91, + 0, + 255, + 175, + 0, + 170, + 234, + 84, + 106, + 170, + 85, + 90, + 169, + 90, + 149, + 150, + 168, + 63, + 194, + 192, + 63, + 159, + 128, + 121, + 191, + 64, + 101, + 190, + 153, + 85, + 170, + 165, + 90, + 154, + 149, + 105, + 90, + 90, + 128, + 253, + 61, + 3, + 230, + 252, + 2, + 139, + 232, + 100, + 26, + 170, + 149, + 90, + 169, + 85, + 90, + 165, + 105, + 106, + 149, + 86, + 160, + 255, + 95, + 0, + 229, + 253, + 5, + 66, + 250, + 100, + 22, + 91, + 165, + 149, + 105, + 106, + 150, + 105, + 101, + 150, + 90, + 85, + 106, + 11, + 250, + 244, + 26, + 91, + 229, + 85, + 90, + 170, + 149, + 85, + 170, + 170, + 86, + 150, + 169, + 85, + 106, + 170, + 150, + 153, + 153, + 169, + 39, + 170, + 216, + 85, + 106, + 149, + 149, + 106, + 170, + 85, + 86, + 169, + 169, + 86, + 86, + 165, + 154, + 153, + 165, + 170, + 102, + 149, + 165, + 86, + 153, + 170, + 102, + 102, + 149, + 85, + 90, + 169, + 86, + 170, + 149, + 102, + 170, + 85, + 85, + 165, + 169, + 90, + 150, + 165, + 106, + 154, + 85, + 86, + 170, + 170, + 150, + 85, + 85, + 85, + 90, + 165, + 85, + 106, + 106, + 166, + 105, + 165, + 150, + 149, + 85, + 90, + 170, + 85, + 165, + 85, + 86, + 170, + 170, + 165, + 105, + 86, + 85, + 169, + 105, + 89, + 165, + 170, + 169, + 149, + 170, + 85, + 85, + 170, + 165, + 86, + 170, + 105, + 85, + 154, + 170, + 106, + 170, + 85, + 105, + 85, + 86, + 165, + 105, + 166, + 170, + 169, + 165, + 89, + 85, + 86, + 90, + 169, + 86, + 149, + 170, + 85, + 90, + 106, + 170, + 169, + 85, + 165, + 85, + 90, + 85, + 165, + 170, + 170, + 102, + 170, + 153, + 85, + 90, + 170, + 89, + 170, + 170, + 85, + 85, + 86, + 170, + 106, + 170, + 149, + 89, + 85, + 150, + 101, + 105, + 154, + 170, + 170, + 166, + 85, + 85, + 101, + 102, + 90, + 170, + 165, + 150, + 85, + 102, + 154, + 170, + 170, + 149, + 86, + 85, + 89, + 102, + 165, + 106, + 170, + 170, + 149, + 101, + 85, + 101, + 154, + 166, + 106, + 165, + 85, + 85, + 106, + 106, + 170, + 170, + 85, + 85, + 85, + 89, + 86, + 170, + 170, + 170, + 165, + 105, + 85, + 86, + 101, + 170, + 170, + 101, + 165, + 85, + 86, + 170, + 170, + 170, + 165, + 85, + 85, + 85, + 101, + 170, + 106, + 101, + 170, + 105, + 101, + 153, + 85, + 101, + 106, + 149, + 101, + 149, + 89, + 166, + 170, + 170, + 165, + 85, + 85, + 90, + 85, + 105, + 150, + 169, + 106, + 90, + 153, + 101, + 85, + 153, + 166, + 150, + 85, + 166, + 154, + 170, + 170, + 170, + 85, + 149, + 89, + 149, + 101, + 106, + 102, + 169, + 170, + 101, + 89, + 90, + 85, + 166, + 154, + 86, + 166, + 166, + 154, + 169, + 86, + 85, + 89, + 90, + 85, + 170, + 154, + 165, + 105, + 105, + 105, + 85, + 165, + 89, + 166, + 154, + 169, + 150, + 150, + 105, + 102, + 149, + 105, + 90, + 85, + 150, + 105, + 106, + 90, + 165, + 105, + 90, + 90, + 89, + 90, + 105, + 106, + 154, + 153, + 165, + 149, + 105, + 105, + 149, + 105, + 102, + 154, + 105, + 105, + 170, + 102, + 150, + 154, + 101, + 154, + 85, + 102, + 154, + 149, + 170, + 149, + 165, + 169, + 154, + 105, + 106, + 89, + 101, + 165, + 89, + 169, + 106, + 105, + 102, + 89, + 150, + 101, + 169, + 101, + 86, + 165, + 106, + 150, + 149, + 101, + 165, + 169, + 86, + 169, + 102, + 170, + 150, + 153, + 105, + 154, + 89, + 165, + 102, + 86, + 150, + 105, + 149, + 150, + 150, + 149, + 165, + 169, + 106, + 165, + 105, + 149, + 105, + 166, + 90, + 102, + 102, + 101, + 153, + 149, + 90, + 102, + 102, + 89, + 169, + 169, + 106, + 86, + 154, + 149, + 165, + 106, + 150, + 149, + 169, + 105, + 150, + 165, + 154, + 150, + 105, + 106, + 150, + 153, + 90, + 165, + 101, + 166, + 166, + 149, + 154, + 89, + 105, + 169, + 105, + 85, + 154, + 105, + 86, + 165, + 90, + 165, + 102, + 90, + 86, + 169, + 150, + 150, + 165, + 150, + 86, + 165, + 150, + 106, + 150, + 150, + 89, + 105, + 102, + 149, + 105, + 105, + 90, + 150, + 105, + 90, + 85, + 154, + 105, + 150, + 165, + 170, + 102, + 105, + 170, + 149, + 149, + 165, + 90, + 105, + 170, + 90, + 101, + 169, + 154, + 102, + 154, + 90, + 102, + 165, + 101, + 166, + 165, + 101, + 154, + 89, + 101, + 165, + 105, + 102, + 149, + 169, + 105, + 106, + 102, + 85, + 150, + 165, + 102, + 86, + 165, + 102, + 90, + 85, + 165, + 85, + 169, + 102, + 90, + 89, + 149, + 169, + 106, + 150, + 90, + 89, + 86, + 90, + 101, + 154, + 90, + 101, + 153, + 169, + 165, + 105, + 154, + 150, + 86, + 153, + 150, + 105, + 165, + 86, + 90, + 101, + 90, + 101, + 169, + 150, + 85, + 165, + 90, + 89, + 154, + 90, + 90, + 153, + 106, + 150, + 153, + 169, + 106, + 149, + 106, + 105, + 153, + 166, + 90, + 89, + 165, + 86, + 105, + 154, + 150, + 165, + 150, + 102, + 149, + 150, + 101, + 149, + 165, + 102, + 169, + 105, + 105, + 166, + 90, + 89, + 102, + 105, + 169, + 106, + 165, + 105, + 149, + 105, + 102, + 85, + 149, + 102, + 90, + 85, + 165, + 89, + 166, + 150, + 90, + 150, + 101, + 86, + 165, + 154, + 85, + 105, + 90, + 154, + 150, + 102, + 169, + 150, + 169, + 89, + 90, + 169, + 90, + 150, + 153, + 106, + 86, + 153, + 166, + 150, + 165, + 86, + 150, + 150, + 154, + 85, + 85, + 165, + 154, + 149, + 106, + 90, + 85, + 154, + 90, + 105, + 105, + 85, + 150, + 105, + 90, + 165, + 149, + 166, + 90, + 165, + 106, + 149, + 170, + 149, + 166, + 169, + 149, + 165, + 165, + 170, + 105, + 102, + 101, + 169, + 150, + 154, + 90, + 105, + 89, + 102, + 165, + 90, + 86, + 150, + 165, + 170, + 150, + 105, + 154, + 89, + 149, +}; +const uint8_t DPCM_two_8000[] PROGMEM = { + 153, + 105, + 154, + 102, + 101, + 170, + 86, + 86, + 105, + 150, + 149, + 153, + 102, + 170, + 90, + 102, + 150, + 149, + 169, + 165, + 105, + 150, + 170, + 101, + 165, + 153, + 105, + 102, + 90, + 169, + 102, + 106, + 101, + 154, + 85, + 101, + 150, + 101, + 105, + 166, + 85, + 166, + 101, + 90, + 165, + 153, + 105, + 153, + 153, + 131, + 101, + 101, + 153, + 153, + 169, + 165, + 166, + 101, + 153, + 169, + 166, + 153, + 154, + 101, + 170, + 86, + 153, + 102, + 89, + 94, + 232, + 85, + 86, + 102, + 102, + 153, + 205, + 89, + 115, + 102, + 108, + 217, + 167, + 38, + 150, + 88, + 166, + 105, + 153, + 230, + 85, + 153, + 166, + 117, + 161, + 153, + 157, + 53, + 115, + 77, + 93, + 89, + 104, + 163, + 151, + 89, + 156, + 227, + 103, + 41, + 153, + 201, + 99, + 97, + 213, + 206, + 30, + 52, + 211, + 207, + 25, + 49, + 225, + 206, + 90, + 49, + 150, + 143, + 29, + 50, + 168, + 201, + 106, + 114, + 104, + 169, + 150, + 38, + 88, + 216, + 195, + 99, + 44, + 221, + 102, + 55, + 52, + 196, + 199, + 54, + 56, + 229, + 135, + 30, + 40, + 150, + 211, + 89, + 168, + 105, + 162, + 155, + 41, + 156, + 211, + 35, + 60, + 232, + 211, + 39, + 56, + 220, + 195, + 99, + 108, + 168, + 229, + 91, + 45, + 88, + 147, + 151, + 92, + 164, + 179, + 90, + 93, + 105, + 162, + 151, + 153, + 153, + 165, + 163, + 90, + 92, + 165, + 98, + 154, + 157, + 105, + 118, + 153, + 154, + 102, + 89, + 154, + 102, + 105, + 166, + 149, + 89, + 101, + 169, + 150, + 86, + 89, + 152, + 214, + 164, + 48, + 125, + 207, + 11, + 4, + 144, + 242, + 255, + 188, + 44, + 21, + 71, + 159, + 61, + 180, + 146, + 192, + 195, + 243, + 60, + 28, + 34, + 129, + 195, + 250, + 252, + 112, + 36, + 15, + 31, + 174, + 104, + 132, + 198, + 135, + 39, + 204, + 240, + 240, + 200, + 15, + 31, + 95, + 227, + 192, + 192, + 188, + 125, + 125, + 75, + 11, + 42, + 131, + 205, + 205, + 52, + 60, + 49, + 19, + 207, + 199, + 180, + 224, + 240, + 121, + 111, + 46, + 21, + 194, + 198, + 220, + 242, + 48, + 207, + 15, + 12, + 133, + 112, + 248, + 246, + 53, + 12, + 15, + 27, + 215, + 198, + 84, + 108, + 169, + 131, + 3, + 204, + 244, + 60, + 184, + 51, + 143, + 199, + 145, + 196, + 176, + 120, + 239, + 47, + 21, + 82, + 166, + 107, + 12, + 15, + 51, + 208, + 241, + 240, + 206, + 63, + 31, + 13, + 1, + 145, + 227, + 253, + 109, + 36, + 53, + 182, + 182, + 60, + 12, + 55, + 208, + 193, + 240, + 222, + 127, + 31, + 13, + 2, + 145, + 242, + 245, + 108, + 41, + 102, + 230, + 202, + 15, + 7, + 30, + 240, + 48, + 108, + 123, + 175, + 203, + 147, + 64, + 233, + 61, + 173, + 87, + 6, + 135, + 167, + 117, + 112, + 192, + 243, + 190, + 15, + 3, + 70, + 250, + 124, + 124, + 5, + 7, + 199, + 241, + 228, + 36, + 29, + 110, + 217, + 213, + 195, + 3, + 206, + 253, + 12, + 15, + 22, + 252, + 244, + 56, + 2, + 67, + 219, + 230, + 40, + 9, + 41, + 174, + 218, + 133, + 131, + 3, + 205, + 190, + 12, + 11, + 37, + 252, + 125, + 20, + 64, + 177, + 254, + 175, + 1, + 65, + 181, + 191, + 102, + 85, + 160, + 240, + 251, + 143, + 195, + 208, + 223, + 31, + 203, + 192, + 44, + 15, + 171, + 245, + 160, + 25, + 75, + 249, + 184, + 105, + 70, + 15, + 195, + 252, + 47, + 10, + 64, + 124, + 63, + 21, + 80, + 56, + 43, + 247, + 240, + 21, + 11, + 106, + 185, + 105, + 85, + 150, + 15, + 195, + 252, + 15, + 1, + 148, + 62, + 31, + 224, + 116, + 26, + 81, + 254, + 170, + 1, + 145, + 189, + 111, + 85, + 165, + 102, + 192, + 252, + 255, + 193, + 208, + 11, + 67, + 246, + 255, + 2, + 64, + 111, + 15, + 229, + 184, + 10, + 82, + 249, + 106, + 6, + 149, + 107, + 15, + 211, + 191, + 11, + 0, + 62, + 31, + 248, + 124, + 1, + 144, + 189, + 63, + 228, + 96, + 26, + 170, + 234, + 85, + 85, + 106, + 170, + 15, + 231, + 126, + 6, + 16, + 31, + 27, + 252, + 42, + 64, + 121, + 47, + 186, + 248, + 17, + 85, + 186, + 150, + 145, + 90, + 90, + 170, + 7, + 251, + 47, + 64, + 40, + 11, + 184, + 191, + 80, + 160, + 22, + 166, + 175, + 213, + 84, + 6, + 165, + 170, + 149, + 85, + 90, + 170, + 130, + 255, + 143, + 224, + 10, + 0, + 191, + 175, + 248, + 1, + 80, + 111, + 171, + 249, + 5, + 85, + 111, + 149, + 165, + 86, + 165, + 106, + 144, + 127, + 225, + 254, + 1, + 144, + 11, + 254, + 111, + 128, + 26, + 69, + 191, + 165, + 80, + 86, + 166, + 170, + 165, + 90, + 90, + 170, + 160, + 47, + 240, + 255, + 64, + 22, + 66, + 255, + 150, + 164, + 1, + 169, + 95, + 249, + 5, + 80, + 107, + 230, + 90, + 85, + 106, + 166, + 180, + 11, + 252, + 107, + 208, + 2, + 145, + 175, + 248, + 26, + 64, + 111, + 170, + 191, + 64, + 90, + 85, + 190, + 85, + 101, + 86, + 170, + 89, + 1, + 255, + 89, + 248, + 0, + 170, + 87, + 254, + 65, + 85, + 5, + 191, + 170, + 165, + 5, + 170, + 86, + 169, + 85, + 165, + 170, + 170, + 0, + 191, + 229, + 174, + 64, + 26, + 165, + 191, + 212, + 21, + 85, + 111, + 233, + 85, + 85, + 106, + 165, + 106, + 81, + 106, + 170, + 170, + 128, + 31, + 249, + 86, + 148, + 6, + 234, + 90, + 169, + 5, + 170, + 86, + 169, + 85, + 170, + 86, + 169, + 85, + 165, + 90, + 170, + 86, + 164, + 6, + 255, + 149, + 101, + 65, + 170, + 149, + 170, + 85, + 106, + 149, + 170, + 149, + 90, + 149, + 170, + 85, + 90, + 165, + 90, + 169, + 105, + 85, + 171, + 165, + 89, + 85, + 106, + 165, + 90, + 149, + 86, + 169, + 90, + 169, + 86, + 165, + 90, + 165, + 86, + 170, + 90, + 169, + 85, + 170, + 149, + 170, + 149, + 90, + 85, + 170, + 149, + 90, + 165, + 90, + 165, + 170, + 149, + 86, + 170, + 169, + 85, + 170, + 106, + 169, + 86, + 150, + 90, + 170, + 85, + 85, + 90, + 170, + 86, + 149, + 90, + 170, + 165, + 165, + 85, + 105, + 106, + 169, + 85, + 102, + 170, + 170, + 149, + 90, + 165, + 90, + 149, + 101, + 106, + 90, + 165, + 165, + 89, + 106, + 165, + 165, + 149, + 85, + 165, + 170, + 153, + 86, + 170, + 90, + 169, + 85, + 169, + 106, + 86, + 86, + 169, + 86, + 166, + 85, + 170, + 154, + 166, + 85, + 169, + 85, + 170, + 86, + 85, + 85, + 170, + 86, + 170, + 85, + 106, + 149, + 85, + 101, + 165, + 169, + 169, + 101, + 150, + 150, + 166, + 149, + 150, + 170, + 86, + 89, + 149, + 106, + 89, + 106, + 106, + 86, + 106, + 170, + 86, + 149, + 90, + 165, + 150, + 165, + 154, + 165, + 169, + 85, + 105, + 166, + 105, + 85, + 169, + 90, + 101, + 154, + 90, + 90, + 149, + 170, + 149, + 166, + 89, + 170, + 85, + 102, + 89, + 166, + 165, + 105, + 165, + 166, + 106, + 165, + 101, + 101, + 90, + 89, + 106, + 149, + 170, + 154, + 106, + 86, + 89, + 170, + 166, + 85, + 149, + 106, + 89, + 86, + 101, + 170, + 90, + 105, + 106, + 90, + 101, + 165, + 89, + 105, + 154, + 150, + 85, + 165, + 105, + 153, + 169, + 86, + 154, + 106, + 153, + 85, + 153, + 106, + 150, + 89, + 105, + 154, + 165, + 165, + 150, + 105, + 106, + 150, + 153, + 90, + 85, + 106, + 149, + 86, + 89, + 102, + 154, + 85, + 169, + 105, + 170, + 85, + 105, + 102, + 153, + 153, + 86, + 153, + 106, + 90, + 149, + 165, +}; +const uint8_t DPCM_three_8000[] PROGMEM = { + 153, + 149, + 169, + 89, + 150, + 89, + 166, + 102, + 102, + 165, + 153, + 102, + 90, + 90, + 101, + 154, + 149, + 166, + 105, + 106, + 102, + 154, + 105, + 150, + 153, + 102, + 166, + 149, + 150, + 150, + 89, + 166, + 90, + 149, + 105, + 90, + 165, + 105, + 90, + 89, + 169, + 90, + 105, + 170, + 90, + 86, + 150, + 150, + 149, + 149, + 170, + 101, + 150, + 89, + 85, + 165, + 150, + 169, + 101, + 165, + 86, + 150, + 149, + 106, + 89, + 106, + 86, + 89, + 166, + 90, + 149, + 105, + 90, + 166, + 89, + 165, + 90, + 105, + 105, + 166, + 165, + 166, + 89, + 105, + 169, + 150, + 150, + 90, + 90, + 85, + 101, + 169, + 153, + 86, + 89, + 102, + 149, + 154, + 149, + 149, + 102, + 165, + 166, + 86, + 102, + 165, + 169, + 149, + 90, + 106, + 150, + 102, + 105, + 149, + 165, + 101, + 149, + 166, + 166, + 85, + 165, + 165, + 105, + 89, + 169, + 102, + 166, + 98, + 217, + 89, + 149, + 153, + 89, + 150, + 90, + 102, + 105, + 105, + 150, + 170, + 88, + 101, + 105, + 154, + 60, + 182, + 89, + 166, + 153, + 153, + 117, + 102, + 101, + 165, + 213, + 153, + 117, + 170, + 150, + 138, + 90, + 41, + 121, + 166, + 214, + 102, + 153, + 153, + 102, + 105, + 149, + 170, + 86, + 89, + 105, + 113, + 226, + 214, + 90, + 89, + 85, + 106, + 170, + 170, + 85, + 85, + 89, + 170, + 105, + 150, + 154, + 106, + 96, + 252, + 62, + 47, + 129, + 160, + 104, + 47, + 155, + 229, + 101, + 85, + 149, + 170, + 169, + 150, + 150, + 166, + 67, + 225, + 252, + 126, + 1, + 128, + 56, + 47, + 159, + 209, + 84, + 26, + 91, + 150, + 229, + 160, + 165, + 170, + 67, + 240, + 252, + 47, + 0, + 132, + 15, + 71, + 226, + 248, + 5, + 129, + 180, + 189, + 106, + 84, + 105, + 47, + 80, + 252, + 63, + 7, + 192, + 37, + 3, + 224, + 253, + 47, + 65, + 160, + 46, + 75, + 210, + 164, + 26, + 91, + 224, + 63, + 15, + 193, + 240, + 25, + 64, + 248, + 63, + 15, + 192, + 180, + 31, + 71, + 228, + 184, + 11, + 71, + 224, + 15, + 195, + 240, + 252, + 15, + 1, + 125, + 47, + 131, + 192, + 244, + 47, + 75, + 228, + 248, + 25, + 90, + 233, + 131, + 240, + 252, + 47, + 3, + 192, + 226, + 95, + 211, + 240, + 56, + 30, + 11, + 230, + 244, + 184, + 31, + 15, + 196, + 63, + 15, + 195, + 240, + 240, + 60, + 63, + 253, + 252, + 56, + 13, + 15, + 95, + 174, + 73, + 66, + 147, + 230, + 160, + 240, + 252, + 61, + 15, + 3, + 2, + 190, + 191, + 15, + 3, + 131, + 195, + 226, + 240, + 164, + 27, + 75, + 199, + 131, + 195, + 240, + 240, + 240, + 8, + 71, + 227, + 240, + 240, + 48, + 60, + 47, + 47, + 7, + 130, + 162, + 123, + 167, + 15, + 15, + 67, + 192, + 224, + 52, + 30, + 31, + 15, + 193, + 65, + 105, + 189, + 125, + 41, + 25, + 26, + 126, + 122, + 15, + 15, + 7, + 196, + 112, + 52, + 60, + 63, + 223, + 195, + 67, + 195, + 211, + 241, + 184, + 40, + 58, + 123, + 246, + 96, + 192, + 243, + 248, + 76, + 42, + 14, + 143, + 247, + 209, + 192, + 17, + 61, + 125, + 121, + 16, + 69, + 95, + 175, + 157, + 67, + 3, + 207, + 241, + 176, + 208, + 50, + 63, + 159, + 47, + 8, + 3, + 199, + 203, + 194, + 128, + 96, + 170, + 250, + 184, + 131, + 199, + 203, + 240, + 244, + 176, + 52, + 95, + 127, + 14, + 5, + 2, + 86, + 247, + 211, + 128, + 64, + 181, + 245, + 241, + 225, + 12, + 63, + 63, + 143, + 3, + 2, + 135, + 243, + 242, + 192, + 80, + 36, + 189, + 253, + 240, + 80, + 36, + 125, + 250, + 179, + 73, + 28, + 62, + 63, + 79, + 7, + 2, + 75, + 215, + 231, + 194, + 65, + 65, + 169, + 252, + 240, + 208, + 144, + 169, + 249, + 248, + 176, + 195, + 15, + 207, + 243, + 192, + 193, + 33, + 249, + 247, + 240, + 160, + 80, + 113, + 239, + 251, + 224, + 64, + 85, + 186, + 250, + 226, + 98, + 12, + 63, + 63, + 142, + 11, + 4, + 15, + 95, + 159, + 199, + 3, + 6, + 71, + 143, + 159, + 70, + 5, + 10, + 91, + 155, + 135, + 75, + 12, + 63, + 63, + 207, + 11, + 8, + 15, + 31, + 159, + 159, + 2, + 6, + 9, + 219, + 175, + 153, + 65, + 5, + 90, + 170, + 169, + 150, + 131, + 207, + 207, + 243, + 194, + 130, + 2, + 199, + 235, + 231, + 194, + 66, + 66, + 139, + 159, + 186, + 149, + 65, + 86, + 166, + 230, + 166, + 147, + 12, + 62, + 63, + 44, + 28, + 16, + 13, + 47, + 127, + 174, + 29, + 24, + 40, + 44, + 126, + 185, + 100, + 20, + 89, + 170, + 170, + 169, + 172, + 48, + 252, + 254, + 56, + 116, + 80, + 52, + 125, + 253, + 184, + 180, + 96, + 160, + 242, + 231, + 218, + 85, + 85, + 86, + 170, + 170, + 166, + 86, + 44, + 223, + 123, + 60, + 148, + 32, + 24, + 174, + 190, + 189, + 100, + 32, + 85, + 93, + 186, + 246, + 149, + 85, + 86, + 166, + 166, + 166, + 90, + 12, + 51, + 63, + 220, + 117, + 32, + 8, + 106, + 190, + 254, + 165, + 20, + 21, + 155, + 105, + 170, + 166, + 85, + 85, + 150, + 169, + 165, + 166, + 131, + 12, + 223, + 183, + 77, + 69, + 18, + 10, + 175, + 190, + 169, + 149, + 85, + 86, + 109, + 246, + 218, + 149, + 86, + 86, + 154, + 166, + 170, + 104, + 56, + 215, + 183, + 124, + 208, + 81, + 20, + 150, + 183, + 234, + 153, + 85, + 85, + 86, + 154, + 170, + 165, + 149, + 85, + 106, + 170, + 169, + 105, + 152, + 50, + 205, + 223, + 179, + 196, + 129, + 18, + 154, + 235, + 170, + 149, + 85, + 86, + 86, + 158, + 106, + 101, + 85, + 85, + 106, + 170, + 105, + 105, + 147, + 206, + 59, + 119, + 205, + 85, + 33, + 73, + 170, + 106, + 169, + 165, + 85, + 85, + 150, + 106, + 170, + 89, + 85, + 85, + 170, + 170, + 154, + 154, + 97, + 195, + 79, + 110, + 154, + 89, + 24, + 25, + 106, + 170, + 169, + 165, + 85, + 86, + 154, + 106, + 170, + 153, + 85, + 101, + 170, + 166, + 150, + 90, + 84, + 210, + 151, + 154, + 154, + 86, + 69, + 85, + 106, + 170, + 170, + 105, + 85, + 85, + 102, + 169, + 170, + 150, + 85, + 89, + 106, + 154, + 105, + 150, + 101, + 89, + 106, + 106, + 169, + 165, + 101, + 85, + 150, + 170, + 170, + 165, + 86, + 86, + 90, + 170, + 105, + 105, + 101, + 150, + 154, + 89, + 102, + 153, + 165, + 154, + 106, + 106, + 90, + 89, + 105, + 165, + 150, + 154, + 86, + 90, + 89, + 105, + 101, + 165, + 170, + 165, + 149, + 150, + 150, + 90, + 105, + 105, + 166, + 150, + 89, + 150, + 154, + 90, + 105, + 105, + 101, + 150, + 165, + 166, + 154, + 89, + 101, + 166, + 89, + 105, + 166, + 154, + 89, + 105, + 101, + 166, + 154, + 101, + 150, + 86, + 154, + 105, + 105, + 105, + 165, + 150, + 150, + 154, + 90, + 101, + 86, + 89, + 90, + 105, + 105, + 169, + 102, + 150, + 90, + 89, + 90, + 86, + 90, + 90, + 89, + 106, + 85, + 153, + 85, + 102, + 106, + 105, + 165, + 166, + 150, + 89, + 170, + 89, + 105, + 105, + 165, + 150, + 154, + 89, + 101, + 170, + 149, + 102, + 166, + 105, + 169, + 165, + 166, + 150, + 150, + 86, + 154, + 89, + 105, + 165, + 165, + 166, + 149, + 169, + 150, + 154, + 149, + 89, + 86, + 90, + 102, + 150, + 105, + 90, + 153, + 169, + 166, + 149, + 105, + 101, + 90, + 165, + 166, + 166, + 150, + 170, + 105, + 85, + 170, + 86, + 90, + 153, + 101, + 102, + 166, + 153, + 166, + 169, + 102, + 166, + 149, + 105, + 85, + 150, + 106, + 89, + 165, + 166, + 90, + 169, + 170, + 101, + 86, + 149, + 105, + 89, + 150, + 106, + 165, + 165, + 90, + 86, + 149, + 149, + 166, + 90, + 102, +}; +const uint8_t DPCM_four_8000[] PROGMEM = { + 153, + 89, + 166, + 105, + 89, + 166, + 105, + 90, + 90, + 89, + 102, + 90, + 89, + 166, + 154, + 89, + 165, + 150, + 166, + 150, + 149, + 105, + 102, + 105, + 89, + 106, + 89, + 101, + 90, + 90, + 149, + 165, + 165, + 105, + 150, + 105, + 101, + 90, + 154, + 150, + 90, + 105, + 166, + 102, + 90, + 85, + 90, + 165, + 102, + 90, + 149, + 105, + 106, + 85, + 102, + 90, + 86, + 102, + 149, + 165, + 153, + 102, + 106, + 154, + 101, + 165, + 150, + 153, + 169, + 101, + 170, + 153, + 153, + 105, + 105, + 165, + 86, + 169, + 105, + 105, + 165, + 106, + 165, + 169, + 169, + 106, + 89, + 149, + 101, + 153, + 106, + 89, + 101, + 102, + 149, + 90, + 154, + 90, + 165, + 90, + 90, + 105, + 101, + 170, + 85, + 106, + 165, + 106, + 154, + 166, + 101, + 169, + 169, + 85, + 170, + 149, + 105, + 165, + 90, + 166, + 85, + 85, + 86, + 191, + 228, + 1, + 106, + 170, + 169, + 85, + 105, + 86, + 170, + 170, + 144, + 11, + 255, + 208, + 1, + 230, + 5, + 191, + 244, + 0, + 107, + 170, + 169, + 85, + 90, + 169, + 106, + 169, + 80, + 3, + 255, + 240, + 0, + 186, + 129, + 127, + 252, + 0, + 11, + 255, + 169, + 80, + 70, + 90, + 170, + 169, + 149, + 64, + 15, + 255, + 192, + 2, + 238, + 21, + 255, + 224, + 0, + 111, + 250, + 166, + 85, + 21, + 170, + 154, + 89, + 85, + 128, + 15, + 255, + 192, + 2, + 239, + 20, + 255, + 244, + 0, + 47, + 250, + 170, + 149, + 5, + 170, + 170, + 150, + 89, + 164, + 3, + 255, + 248, + 0, + 47, + 229, + 31, + 254, + 64, + 3, + 255, + 250, + 165, + 65, + 90, + 186, + 165, + 85, + 106, + 64, + 47, + 255, + 128, + 2, + 254, + 80, + 255, + 244, + 0, + 47, + 254, + 149, + 85, + 21, + 171, + 170, + 101, + 85, + 170, + 64, + 63, + 255, + 64, + 3, + 254, + 81, + 255, + 228, + 0, + 127, + 250, + 86, + 85, + 21, + 170, + 170, + 165, + 85, + 106, + 144, + 7, + 255, + 224, + 0, + 191, + 165, + 127, + 249, + 0, + 31, + 254, + 81, + 106, + 85, + 90, + 170, + 149, + 85, + 106, + 170, + 0, + 63, + 255, + 0, + 7, + 254, + 65, + 255, + 208, + 0, + 191, + 229, + 86, + 169, + 85, + 170, + 165, + 89, + 85, + 170, + 170, + 0, + 47, + 255, + 64, + 7, + 253, + 81, + 255, + 224, + 0, + 191, + 229, + 90, + 169, + 85, + 170, + 154, + 105, + 85, + 86, + 170, + 128, + 11, + 255, + 192, + 2, + 254, + 64, + 191, + 244, + 0, + 111, + 249, + 86, + 149, + 85, + 170, + 150, + 170, + 85, + 90, + 170, + 168, + 0, + 255, + 248, + 0, + 47, + 229, + 111, + 253, + 0, + 47, + 250, + 154, + 169, + 85, + 170, + 170, + 170, + 149, + 86, + 170, + 170, + 0, + 47, + 254, + 0, + 11, + 233, + 27, + 253, + 0, + 27, + 250, + 90, + 169, + 1, + 170, + 149, + 106, + 165, + 85, + 170, + 170, + 160, + 3, + 255, + 192, + 6, + 249, + 7, + 255, + 64, + 27, + 249, + 107, + 229, + 1, + 174, + 165, + 105, + 85, + 169, + 85, + 170, + 164, + 0, + 255, + 240, + 1, + 254, + 6, + 255, + 128, + 11, + 229, + 91, + 232, + 1, + 190, + 166, + 149, + 86, + 170, + 85, + 170, + 149, + 128, + 15, + 255, + 0, + 46, + 80, + 255, + 208, + 7, + 233, + 27, + 248, + 1, + 170, + 90, + 165, + 22, + 185, + 85, + 170, + 149, + 168, + 1, + 255, + 192, + 7, + 208, + 127, + 240, + 6, + 249, + 27, + 249, + 1, + 170, + 90, + 169, + 22, + 170, + 90, + 149, + 106, + 150, + 96, + 15, + 253, + 0, + 105, + 7, + 255, + 0, + 121, + 70, + 254, + 1, + 169, + 90, + 233, + 86, + 165, + 106, + 149, + 106, + 165, + 107, + 0, + 191, + 208, + 6, + 1, + 191, + 192, + 26, + 70, + 255, + 64, + 105, + 90, + 249, + 90, + 149, + 106, + 165, + 165, + 85, + 170, + 148, + 3, + 255, + 0, + 0, + 31, + 252, + 5, + 85, + 127, + 149, + 89, + 90, + 170, + 90, + 149, + 90, + 169, + 169, + 86, + 169, + 106, + 144, + 63, + 240, + 0, + 1, + 255, + 144, + 80, + 47, + 249, + 105, + 5, + 190, + 106, + 148, + 90, + 86, + 170, + 85, + 90, + 170, + 170, + 64, + 255, + 192, + 0, + 31, + 253, + 84, + 0, + 191, + 169, + 84, + 42, + 169, + 170, + 85, + 105, + 106, + 149, + 101, + 90, + 170, + 170, + 1, + 255, + 64, + 64, + 127, + 249, + 144, + 26, + 254, + 164, + 5, + 170, + 111, + 149, + 105, + 91, + 229, + 101, + 86, + 150, + 165, + 106, + 64, + 255, + 208, + 0, + 63, + 254, + 144, + 10, + 255, + 169, + 5, + 91, + 170, + 149, + 86, + 170, + 229, + 105, + 86, + 165, + 190, + 90, + 144, + 63, + 246, + 64, + 15, + 255, + 228, + 7, + 171, + 250, + 1, + 150, + 233, + 101, + 85, + 186, + 105, + 86, + 150, + 170, + 90, + 149, + 169, + 3, + 255, + 164, + 0, + 254, + 254, + 0, + 41, + 191, + 149, + 21, + 91, + 150, + 149, + 170, + 149, + 85, + 106, + 165, + 106, + 90, + 149, + 184, + 15, + 255, + 160, + 2, + 251, + 248, + 0, + 102, + 254, + 85, + 85, + 170, + 90, + 86, + 170, + 149, + 90, + 170, + 165, + 90, + 170, + 86, + 228, + 15, + 251, + 224, + 2, + 235, + 244, + 4, + 90, + 249, + 85, + 85, + 170, + 106, + 86, + 149, + 165, + 106, + 165, + 165, + 106, + 165, + 149, + 185, + 1, + 249, + 189, + 1, + 169, + 190, + 6, + 86, + 170, + 90, + 85, + 165, + 170, + 90, + 86, + 165, + 169, + 90, + 149, + 169, + 90, + 90, + 149, + 169, + 11, + 234, + 228, + 6, + 150, + 229, + 85, + 90, + 165, + 101, + 85, + 106, + 90, + 85, + 170, + 170, + 149, + 85, + 170, + 169, + 85, + 106, + 85, + 126, + 170, + 85, + 90, + 170, + 85, + 86, + 170, + 149, + 90, + 150, + 165, + 85, + 169, + 106, + 86, + 85, + 170, + 85, + 90, + 105, + 90, + 170, + 169, + 86, + 106, + 154, + 86, + 149, + 150, + 170, + 86, + 85, + 169, + 169, + 90, + 150, + 165, + 86, + 86, + 169, + 90, + 86, + 165, + 165, + 86, + 149, + 165, + 165, + 101, + 89, + 165, + 105, + 105, + 85, + 170, + 169, + 85, + 105, + 106, + 149, + 106, + 90, + 150, + 165, + 106, + 86, + 149, + 101, + 165, + 90, + 150, + 150, + 150, + 149, + 86, + 90, + 150, + 165, + 106, + 85, + 106, + 165, + 165, + 106, + 86, + 149, + 169, + 105, + 90, + 85, + 170, + 169, + 90, + 150, + 149, + 86, + 169, + 85, + 106, + 169, + 85, + 105, + 169, + 86, + 86, + 166, + 105, + 105, + 85, + 90, + 106, + 105, + 86, + 150, + 165, + 149, + 106, + 90, + 86, + 169, + 105, + 86, + 150, + 169, + 86, + 170, + 85, + 150, + 165, + 90, + 90, + 149, + 165, + 105, + 90, + 86, + 85, + 165, + 105, + 101, + 149, + 169, + 169, + 86, + 89, + 170, + 89, + 90, + 106, + 90, + 101, + 169, + 85, + 106, + 165, + 150, + 105, + 166, + 102, + 149, + 90, + 106, + 149, + 150, + 106, + 89, + 106, + 90, + 149, + 106, + 85, + 150, + 170, + 101, + 149, + 150, +}; +const uint8_t DPCM_five_8000[] PROGMEM = { + 154, + 102, + 105, + 153, + 154, + 105, + 105, + 102, + 153, + 102, + 153, + 86, + 85, + 165, + 150, + 150, + 149, + 165, + 102, + 150, + 165, + 90, + 106, + 153, + 101, + 86, + 149, + 106, + 86, + 165, + 169, + 102, + 106, + 150, + 105, + 105, + 166, + 154, + 101, + 150, + 85, + 166, + 90, + 101, + 106, + 165, + 90, + 89, + 170, + 86, + 170, + 89, + 102, + 86, + 150, + 90, + 153, + 106, + 149, + 170, + 168, + 2, + 255, + 64, + 5, + 11, + 254, + 0, + 86, + 175, + 229, + 21, + 170, + 165, + 86, + 170, + 85, + 105, + 4, + 255, + 64, + 15, + 27, + 252, + 0, + 191, + 219, + 164, + 6, + 250, + 149, + 21, + 190, + 145, + 111, + 149, + 106, + 4, + 255, + 64, + 15, + 159, + 252, + 0, + 255, + 213, + 100, + 7, + 249, + 5, + 106, + 186, + 65, + 127, + 145, + 106, + 144, + 95, + 244, + 2, + 249, + 255, + 192, + 31, + 244, + 1, + 70, + 255, + 64, + 106, + 170, + 84, + 106, + 149, + 175, + 149, + 65, + 127, + 160, + 15, + 247, + 190, + 0, + 191, + 192, + 10, + 107, + 244, + 7, + 229, + 90, + 165, + 85, + 91, + 229, + 74, + 192, + 127, + 160, + 15, + 241, + 126, + 0, + 255, + 128, + 47, + 171, + 224, + 31, + 224, + 11, + 164, + 85, + 107, + 228, + 27, + 240, + 15, + 248, + 3, + 252, + 111, + 128, + 63, + 208, + 47, + 135, + 244, + 11, + 244, + 11, + 169, + 102, + 90, + 164, + 43, + 182, + 3, + 253, + 0, + 255, + 91, + 224, + 15, + 248, + 10, + 161, + 253, + 6, + 252, + 6, + 170, + 89, + 86, + 249, + 6, + 170, + 176, + 47, + 208, + 15, + 246, + 253, + 1, + 255, + 0, + 170, + 111, + 64, + 191, + 148, + 85, + 170, + 69, + 190, + 81, + 170, + 91, + 1, + 254, + 0, + 255, + 111, + 192, + 47, + 224, + 25, + 106, + 245, + 7, + 238, + 80, + 47, + 228, + 27, + 165, + 154, + 149, + 172, + 11, + 248, + 3, + 254, + 253, + 0, + 255, + 132, + 16, + 191, + 129, + 125, + 165, + 66, + 254, + 1, + 190, + 150, + 165, + 86, + 176, + 15, + 240, + 15, + 251, + 244, + 3, + 255, + 20, + 2, + 250, + 69, + 100, + 127, + 65, + 254, + 22, + 150, + 170, + 85, + 170, + 188, + 15, + 248, + 3, + 191, + 252, + 2, + 255, + 168, + 2, + 254, + 65, + 154, + 173, + 85, + 170, + 86, + 170, + 149, + 85, + 185, + 169, + 15, + 252, + 1, + 203, + 252, + 0, + 255, + 249, + 1, + 254, + 86, + 85, + 190, + 6, + 169, + 89, + 106, + 164, + 86, + 165, + 95, + 192, + 255, + 64, + 52, + 255, + 128, + 63, + 255, + 128, + 47, + 217, + 21, + 169, + 150, + 154, + 89, + 169, + 170, + 69, + 170, + 90, + 104, + 15, + 248, + 1, + 15, + 248, + 2, + 171, + 244, + 6, + 254, + 225, + 90, + 90, + 165, + 165, + 106, + 86, + 169, + 22, + 249, + 85, + 180, + 63, + 240, + 0, + 63, + 208, + 5, + 127, + 208, + 22, + 191, + 128, + 106, + 170, + 101, + 165, + 106, + 149, + 85, + 106, + 165, + 86, + 244, + 63, + 224, + 0, + 63, + 224, + 64, + 191, + 128, + 85, + 191, + 64, + 106, + 170, + 149, + 106, + 165, + 86, + 170, + 85, + 169, + 90, + 172, + 15, + 244, + 64, + 15, + 228, + 16, + 47, + 213, + 64, + 63, + 229, + 70, + 190, + 85, + 170, + 149, + 90, + 169, + 149, + 171, + 149, + 90, + 195, + 255, + 12, + 3, + 250, + 132, + 11, + 253, + 144, + 7, + 250, + 84, + 46, + 166, + 134, + 169, + 105, + 86, + 149, + 85, + 169, + 85, + 172, + 63, + 241, + 192, + 63, + 125, + 128, + 191, + 174, + 0, + 106, + 249, + 81, + 170, + 169, + 86, + 165, + 86, + 170, + 85, + 106, + 149, + 90, + 160, + 255, + 203, + 0, + 254, + 249, + 2, + 175, + 248, + 1, + 91, + 229, + 65, + 110, + 169, + 86, + 150, + 169, + 105, + 165, + 154, + 105, + 90, + 131, + 255, + 92, + 2, + 251, + 244, + 6, + 111, + 244, + 0, + 111, + 229, + 66, + 170, + 169, + 25, + 106, + 165, + 86, + 106, + 165, + 85, + 153, + 15, + 252, + 224, + 31, + 239, + 192, + 37, + 191, + 149, + 1, + 190, + 164, + 86, + 155, + 165, + 85, + 170, + 150, + 90, + 106, + 165, + 86, + 240, + 255, + 223, + 0, + 189, + 253, + 1, + 71, + 254, + 100, + 22, + 171, + 149, + 25, + 110, + 149, + 86, + 169, + 105, + 90, + 154, + 165, + 105, + 104, + 63, + 247, + 192, + 30, + 127, + 64, + 66, + 255, + 169, + 5, + 106, + 229, + 85, + 106, + 169, + 85, + 170, + 149, + 86, + 170, + 149, + 86, + 104, + 63, + 251, + 192, + 22, + 127, + 84, + 65, + 170, + 233, + 5, + 90, + 233, + 165, + 86, + 154, + 150, + 85, + 105, + 170, + 90, + 149, + 90, + 100, + 63, + 251, + 192, + 69, + 127, + 169, + 65, + 170, + 234, + 85, + 86, + 170, + 165, + 86, + 90, + 169, + 105, + 85, + 165, + 154, + 149, + 90, + 144, + 255, + 255, + 1, + 5, + 190, + 169, + 65, + 150, + 170, + 89, + 85, + 90, + 170, + 165, + 89, + 154, + 165, + 85, + 149, + 106, + 89, + 102, + 160, + 191, + 251, + 128, + 69, + 126, + 170, + 145, + 101, + 170, + 154, + 85, + 89, + 106, + 105, + 149, + 150, + 170, + 90, + 85, + 165, + 165, + 90, + 144, + 106, + 175, + 145, + 85, + 106, + 170, + 165, + 85, + 85, + 170, + 165, + 86, + 85, + 169, + 106, + 149, + 149, + 90, + 90, + 153, + 85, + 106, + 164, + 106, + 170, + 165, + 85, + 86, + 150, + 169, + 106, + 89, + 149, + 169, + 170, + 149, + 85, + 170, + 166, + 149, + 105, + 90, + 154, + 149, + 154, + 165, + 85, + 90, + 170, + 169, + 85, + 86, + 85, + 106, + 169, + 85, + 86, + 170, + 150, + 85, + 101, + 150, + 105, + 89, + 150, + 90, + 105, + 165, + 89, + 170, + 170, + 165, + 85, + 154, + 102, + 149, + 154, + 154, + 105, + 90, + 105, + 169, + 166, + 90, + 150, + 149, + 106, + 85, + 149, + 153, + 170, + 101, + 86, + 150, + 105, + 153, + 165, + 105, + 166, + 90, + 90, + 149, + 169, + 101, + 105, + 165, + 102, + 153, + 102, + 89, + 165, + 165, + 149, + 170, + 166, + 90, + 165, + 170, + 101, + 101, + 105, + 153, + 149, + 166, + 150, + 153, + 101, + 169, + 90, + 102, + 150, + 154, + 86, + 153, + 89, + 102, + 165, + 149, + 105, + 102, + 165, + 150, + 90, + 86, + 102, + 149, + 170, + 90, + 90, + 89, + 165, + 101, + 150, + 86, + 106, + 170, + 149, + 106, + 154, + 85, + 150, + 105, + 165, + 165, + 166, + 153, + 106, + 149, + 150, + 149, + 106, + 85, + 105, + 101, + 150, + 154, + 90, + 90, + 102, + 149, + 169, + 89, + 89, + 166, + 153, + 106, + 165, + 105, + 89, + 150, + 169, + 101, + 101, + 154, + 90, + 102, + 90, + 89, + 165, + 165, + 150, + 166, + 90, + 90, + 89, + 165, + 166, + 154, + 106, + 86, + 149, + 105, + 170, + 101, + 150, + 102, + 154, + 101, + 150, + 89, + 106, + 154, + 90, + 105, + 90, + 165, + 165, + 166, + 150, + 154, + 105, + 101, + 170, + 166, + 150, + 90, + 90, + 86, + 101, + 166, + 90, + 149, + 86, + 166, + 153, + 101, +}; +const uint8_t DPCM_six_8000[] PROGMEM = { + 153, + 153, + 90, + 105, + 165, + 150, + 102, + 101, + 90, + 105, + 105, + 154, + 89, + 165, + 166, + 102, + 101, + 153, + 101, + 150, + 169, + 90, + 169, + 153, + 102, + 149, + 166, + 89, + 102, + 149, + 169, + 154, + 101, + 89, + 102, + 101, + 165, + 102, + 105, + 165, + 101, + 153, + 150, + 105, + 102, + 86, + 101, + 153, + 153, + 166, + 86, + 90, + 89, + 90, + 153, + 166, + 101, + 101, + 102, + 89, + 153, + 166, + 102, + 149, + 149, + 153, + 150, + 101, + 154, + 150, + 102, + 105, + 153, + 153, + 166, + 89, + 153, + 105, + 150, + 106, + 105, + 150, + 154, + 106, + 101, + 154, + 154, + 89, + 153, + 150, + 153, + 166, + 102, + 105, + 153, + 102, + 102, + 89, + 153, + 150, + 102, + 169, + 102, + 153, + 154, + 102, + 89, + 153, + 153, + 150, + 101, + 153, + 153, + 150, + 102, + 102, + 106, + 101, + 153, + 153, + 154, + 101, + 153, + 150, + 102, + 102, + 153, + 153, + 153, + 102, + 105, + 153, + 166, + 102, + 102, + 102, + 153, + 153, + 153, + 102, + 153, + 150, + 102, + 102, + 102, + 153, + 153, + 153, + 165, + 102, + 105, + 153, + 150, + 102, + 101, + 154, + 153, + 166, + 89, + 154, + 166, + 102, + 153, + 153, + 153, + 150, + 102, + 154, + 90, + 102, + 85, + 153, + 150, + 105, + 154, + 101, + 153, + 153, + 102, + 102, + 166, + 154, + 154, + 166, + 153, + 153, + 101, + 150, + 102, + 106, + 89, + 102, + 101, + 153, + 166, + 150, + 89, + 153, + 169, + 102, + 154, + 154, + 106, + 102, + 89, + 101, + 153, + 153, + 90, + 90, + 101, + 154, + 105, + 154, + 101, + 102, + 166, + 89, + 105, + 153, + 166, + 105, + 154, + 101, + 154, + 102, + 105, + 153, + 153, + 153, + 105, + 101, + 153, + 86, + 106, + 102, + 102, + 89, + 153, + 153, + 150, + 105, + 105, + 166, + 106, + 105, + 153, + 150, + 153, + 166, + 154, + 106, + 105, + 150, + 89, + 102, + 150, + 154, + 153, + 149, + 166, + 102, + 105, + 153, + 154, + 166, + 86, + 101, + 166, + 169, + 153, + 101, + 150, + 90, + 105, + 150, + 166, + 169, + 154, + 144, + 181, + 111, + 95, + 148, + 144, + 85, + 106, + 171, + 230, + 148, + 85, + 106, + 170, + 102, + 101, + 86, + 160, + 217, + 239, + 63, + 16, + 192, + 141, + 63, + 123, + 129, + 64, + 105, + 255, + 170, + 5, + 86, + 151, + 234, + 117, + 39, + 12, + 207, + 227, + 241, + 56, + 28, + 207, + 219, + 48, + 32, + 143, + 175, + 117, + 65, + 70, + 188, + 245, + 102, + 26, + 33, + 205, + 252, + 60, + 19, + 67, + 205, + 248, + 177, + 5, + 14, + 223, + 215, + 64, + 32, + 190, + 174, + 14, + 6, + 151, + 15, + 59, + 240, + 208, + 76, + 46, + 59, + 195, + 128, + 80, + 246, + 255, + 44, + 5, + 71, + 219, + 164, + 161, + 89, + 111, + 195, + 199, + 252, + 48, + 51, + 15, + 79, + 241, + 209, + 64, + 60, + 255, + 158, + 5, + 86, + 234, + 229, + 100, + 101, + 185, + 124, + 60, + 47, + 195, + 130, + 16, + 248, + 254, + 110, + 9, + 10, + 219, + 219, + 160, + 96, + 169, + 189, + 104, + 26, + 90, + 138, + 220, + 56, + 127, + 207, + 15, + 2, + 242, + 246, + 232, + 52, + 58, + 175, + 154, + 65, + 86, + 166, + 165, + 165, + 101, + 106, + 153, + 156, + 60, + 63, + 207, + 7, + 2, + 162, + 246, + 224, + 32, + 40, + 126, + 170, + 70, + 6, + 150, + 154, + 150, + 85, + 101, + 181, + 182, + 67, + 79, + 235, + 224, + 224, + 225, + 190, + 125, + 24, + 2, + 71, + 235, + 229, + 80, + 21, + 170, + 170, + 85, + 85, + 86, + 170, + 170, + 67, + 203, + 207, + 224, + 176, + 240, + 250, + 190, + 28, + 9, + 26, + 171, + 219, + 130, + 65, + 166, + 250, + 169, + 85, + 85, + 170, + 170, + 102, + 86, + 154, + 154, + 90, + 149, + 150, + 166, + 166, + 160, + 240, + 240, + 240, + 240, + 36, + 30, + 31, + 31, + 14, + 10, + 6, + 150, + 230, + 225, + 145, + 149, + 165, + 169, + 169, + 105, + 89, + 105, + 86, + 154, + 170, + 154, + 85, + 85, + 170, + 170, + 89, + 85, + 101, + 169, + 169, + 90, + 90, + 90, + 90, + 85, + 149, + 165, + 169, + 165, + 89, + 105, + 169, + 169, + 85, + 89, + 170, + 166, + 149, + 85, + 106, + 170, + 106, + 85, + 90, + 106, + 106, + 86, + 149, + 166, + 165, + 150, + 89, + 90, + 170, + 170, + 89, + 101, + 106, + 165, + 165, + 165, + 150, + 154, + 90, + 85, + 89, + 170, + 150, + 85, + 149, + 166, + 165, + 165, + 85, + 90, + 170, + 85, + 85, + 150, + 170, + 105, + 105, + 89, + 106, + 106, + 153, + 86, + 86, + 153, + 165, + 169, + 106, + 89, + 85, + 106, + 170, + 165, + 149, + 90, + 90, + 90, + 101, + 149, + 149, + 106, + 170, + 153, + 165, + 165, + 150, + 166, + 169, + 105, + 105, + 106, + 170, + 90, + 90, + 86, + 105, + 105, + 165, + 150, + 89, + 102, + 154, + 90, + 85, + 154, + 102, + 149, + 165, + 165, + 166, + 105, + 89, + 86, + 86, + 90, + 90, + 90, + 86, + 95, + 70, + 149, + 169, + 106, + 90, + 86, + 149, + 166, + 106, + 85, + 46, + 90, + 85, + 165, + 165, + 169, + 105, + 90, + 86, + 149, + 165, + 165, + 105, + 101, + 102, + 169, + 90, + 90, + 165, + 149, + 86, + 90, + 150, + 170, + 89, + 101, + 89, + 105, + 86, + 149, + 165, + 169, + 109, + 90, + 86, + 165, + 170, + 86, + 90, + 90, + 86, + 169, + 165, + 90, + 90, + 90, + 149, + 165, + 169, + 86, + 150, + 165, + 90, + 90, + 153, + 154, + 101, + 170, + 154, + 153, + 150, + 150, + 149, + 101, + 102, + 90, + 89, + 154, + 150, + 86, + 102, + 150, + 154, + 89, + 101, + 165, + 101, + 150, + 153, + 89, + 166, + 150, + 150, + 105, + 102, + 170, + 149, + 169, + 165, + 166, + 150, + 101, + 105, + 169, + 154, + 90, + 102, + 105, + 89, + 154, + 166, + 154, + 101, + 154, + 150, + 90, + 89, + 86, + 149, + 166, + 101, + 90, + 102, + 165, + 153, + 153, + 90, + 102, + 149, + 106, + 106, + 89, + 149, + 106, + 105, + 105, + 166, + 153, + 166, + 102, + 89, + 105, + 105, + 166, + 90, + 105, + 165, + 153, + 89, + 166, + 102, + 90, + 102, + 153, + 166, + 89, + 153, + 166, + 85, + 153, + 102, + 153, + 86, + 166, + 89, + 169, + 150, + 102, + 89, + 106, + 101, + 153, + 150, + 102, + 89, + 154, + 86, + 89, + 102, + 102, + 89, + 149, + 154, + 90, + 101, + 101, + 150, + 105, + 106, + 102, + 149, + 169, + 105, + 150, + 153, + 105, + 105, + 166, + 138, + 105, + 102, + 166, + 89, + 105, + 102, + 150, + 154, + 105, + 166, + 102, + 85, + 89, + 165, + 150, + 89, + 153, + 166, + 150, + 105, + 101, + 102, + 150, + 154, + 101, + 169, + 170, + 86, + 150, + 153, + 105, + 105, + 166, + 90, + 89, + 166, + 154, + 89, + 105, + 166, + 138, + 105, + 101, + 150, + 150, + 101, + 101, + 150, + 153, + 105, + 150, + 170, + 90, + 105, + 89, + 150, + 86, + 90, + 90, + 102, + 153, + 153, + 102, + 165, + 165, + 102, + 154, + 150, + 89, + 165, + 150, + 90, + 105, + 166, + 150, + 85, + 169, + 106, + 102, + 153, + 153, + 154, + 90, + 154, + 105, + 101, + 102, + 154, + 154, + 165, + 166, + 90, + 89, + 105, + 86, + 105, + 101, + 154, + 106, + 153, + 90, + 86, + 150, + 86, + 105, + 154, + 150, + 85, + 105, + 150, + 86, + 165, + 165, + 154, + 105, + 165, + 165, + 105, + 90, + 165, + 154, + 90, + 101, + 165, + 86, + 165, + 165, + 166, + 154, + 105, + 101, + 170, + 90, + 105, + 165, + 170, + 90, + 90, + 165, + 165, + 150, + 149, + 165, + 150, + 90, + 86, + 165, + 169, + 90, + 105, + 165, + 154, + 90, + 166, + 150, + 106, + 89, + 101, + 90, + 154, + 101, + 166, + 153, + 166, + 154, + 154, + 106, + 153, + 101, + 86, + 105, + 105, + 169, + 101, + 170, + 166, + 154, + 89, + 105, + 154, + 86, + 149, + 169, + 89, + 150, + 169, + 106, + 86, + 165, + 166, + 154, + 149, + 102, + 90, + 105, + 170, + 90, + 85, + 166, + 90, + 85, + 165, + 90, + 150, + 89, + 89, + 150, + 150, + 102, + 154, + 153, + 166, + 166, + 90, + 89, + 149, + 153, + 106, + 90, + 86, + 102, +}; +const uint8_t DPCM_seven_8000[] PROGMEM = { + 154, + 149, + 169, + 101, + 86, + 165, + 106, + 101, + 102, + 154, + 85, + 169, + 90, + 90, + 165, + 90, + 165, + 106, + 154, + 149, + 165, + 90, + 166, + 101, + 154, + 90, + 153, + 106, + 150, + 149, + 170, + 150, + 153, + 106, + 86, + 153, + 105, + 106, + 101, + 149, + 170, + 105, + 169, + 150, + 101, + 102, + 90, + 153, + 166, + 90, + 153, + 165, + 166, + 105, + 105, + 150, + 150, + 101, + 153, + 166, + 153, + 154, + 102, + 102, + 149, + 105, + 149, + 150, + 90, + 102, + 102, + 153, + 153, + 166, + 102, + 101, + 153, + 154, + 102, + 102, + 89, + 153, + 154, + 86, + 102, + 153, + 90, + 86, + 165, + 170, + 105, + 153, + 150, + 154, + 102, + 89, + 153, + 106, + 105, + 106, + 166, + 153, + 153, + 154, + 102, + 102, + 150, + 101, + 169, + 102, + 153, + 154, + 150, + 102, + 105, + 154, + 86, + 102, + 89, + 153, + 166, + 101, + 153, + 153, + 153, + 150, + 105, + 101, + 166, + 101, + 153, + 166, + 149, + 165, + 169, + 150, + 166, + 166, + 166, + 89, + 105, + 150, + 90, + 101, + 150, + 166, + 89, + 166, + 90, + 89, + 165, + 165, + 154, + 102, + 90, + 150, + 105, + 153, + 89, + 102, + 102, + 154, + 154, + 101, + 105, + 153, + 153, + 102, + 102, + 89, + 153, + 165, + 101, + 166, + 105, + 105, + 154, + 90, + 105, + 102, + 154, + 101, + 153, + 150, + 90, + 102, + 102, + 150, + 89, + 102, + 90, + 89, + 169, + 149, + 86, + 102, + 105, + 153, + 153, + 90, + 102, + 153, + 169, + 166, + 105, + 105, + 169, + 166, + 106, + 102, + 153, + 153, + 102, + 150, + 102, + 101, + 153, + 106, + 101, + 150, + 154, + 149, + 166, + 154, + 90, + 90, + 101, + 165, + 105, + 154, + 154, + 165, + 165, + 90, + 89, + 165, + 165, + 106, + 106, + 85, + 154, + 169, + 101, + 154, + 89, + 101, + 166, + 170, + 86, + 165, + 153, + 106, + 105, + 85, + 154, + 85, + 85, + 106, + 170, + 165, + 85, + 90, + 170, + 150, + 149, + 101, + 106, + 102, + 102, + 13, + 246, + 241, + 25, + 2, + 230, + 253, + 21, + 3, + 170, + 253, + 149, + 70, + 102, + 182, + 89, + 90, + 150, + 160, + 255, + 31, + 16, + 224, + 79, + 155, + 240, + 25, + 95, + 245, + 144, + 106, + 110, + 146, + 149, + 164, + 170, + 158, + 136, + 55, + 199, + 192, + 56, + 111, + 192, + 32, + 31, + 239, + 160, + 16, + 175, + 237, + 80, + 170, + 173, + 22, + 170, + 166, + 131, + 253, + 44, + 3, + 247, + 190, + 0, + 130, + 255, + 20, + 64, + 255, + 125, + 65, + 138, + 185, + 102, + 74, + 170, + 166, + 144, + 255, + 15, + 0, + 255, + 255, + 0, + 177, + 255, + 0, + 65, + 255, + 41, + 2, + 234, + 184, + 26, + 151, + 169, + 106, + 168, + 63, + 195, + 192, + 63, + 251, + 192, + 45, + 191, + 192, + 8, + 127, + 209, + 69, + 125, + 150, + 70, + 185, + 86, + 150, + 183, + 7, + 252, + 48, + 3, + 255, + 252, + 2, + 239, + 253, + 0, + 70, + 254, + 101, + 87, + 153, + 105, + 106, + 149, + 169, + 169, + 156, + 63, + 240, + 192, + 15, + 254, + 240, + 7, + 255, + 248, + 1, + 91, + 249, + 149, + 9, + 170, + 149, + 106, + 90, + 150, + 166, + 112, + 63, + 211, + 64, + 31, + 251, + 224, + 10, + 107, + 248, + 5, + 22, + 254, + 153, + 5, + 170, + 170, + 86, + 169, + 149, + 90, + 172, + 27, + 245, + 232, + 2, + 169, + 254, + 81, + 148, + 106, + 106, + 165, + 86, + 106, + 170, + 149, + 89, + 90, + 165, + 85, + 90, + 170, + 144, + 111, + 219, + 180, + 5, + 86, + 170, + 90, + 85, + 105, + 105, + 102, + 154, + 154, + 90, + 90, + 165, + 165, + 86, + 153, + 170, + 166, + 149, + 22, + 170, + 170, + 85, + 89, + 90, + 169, + 166, + 85, + 170, + 169, + 85, + 154, + 169, + 102, + 86, + 154, + 86, + 165, + 90, + 153, + 102, + 105, + 85, + 170, + 154, + 149, + 85, + 106, + 165, + 85, + 89, + 86, + 170, + 169, + 165, + 90, + 154, + 89, + 165, + 90, + 102, + 169, + 90, + 85, + 165, + 90, + 90, + 169, + 169, + 85, + 85, + 150, + 86, + 170, + 90, + 149, + 101, + 105, + 169, + 165, + 90, + 85, + 166, + 154, + 149, + 102, + 154, + 85, + 106, + 170, + 149, + 85, + 90, + 86, + 105, + 165, + 101, + 169, + 154, + 106, + 169, + 170, + 85, + 150, + 106, + 106, + 149, + 166, + 169, + 7, + 233, + 185, + 70, + 149, + 170, + 90, + 149, + 169, + 90, + 149, + 105, + 106, + 166, + 85, + 106, + 169, + 86, + 106, + 153, + 105, + 144, + 191, + 159, + 128, + 105, + 107, + 209, + 165, + 26, + 166, + 165, + 86, + 90, + 169, + 165, + 86, + 170, + 169, + 90, + 170, + 153, + 168, + 63, + 230, + 208, + 46, + 31, + 224, + 101, + 11, + 166, + 164, + 90, + 90, + 169, + 165, + 90, + 90, + 165, + 165, + 90, + 90, + 166, + 160, + 239, + 107, + 64, + 165, + 127, + 69, + 144, + 122, + 154, + 69, + 101, + 170, + 85, + 150, + 169, + 105, + 106, + 149, + 86, + 170, + 90, + 96, + 223, + 127, + 0, + 213, + 191, + 21, + 129, + 170, + 169, + 85, + 86, + 169, + 106, + 86, + 153, + 165, + 101, + 89, + 102, + 153, + 169, + 84, + 171, + 123, + 64, + 162, + 110, + 85, + 81, + 170, + 169, + 85, + 86, + 170, + 105, + 86, + 90, + 169, + 85, + 90, + 106, + 150, + 105, + 106, + 13, + 243, + 169, + 25, + 86, + 213, + 89, + 86, + 170, + 149, + 85, + 106, + 170, + 149, + 101, + 106, + 86, + 86, + 165, + 170, + 106, + 86, + 149, + 38, + 218, + 165, + 101, + 106, + 85, + 165, + 90, + 170, + 101, + 150, + 169, + 149, + 106, + 169, + 101, + 86, + 169, + 165, + 86, + 154, + 165, + 165, + 89, + 170, + 101, + 170, + 105, + 85, + 101, + 90, + 165, + 149, + 90, + 102, + 166, + 154, + 169, + 85, + 154, + 105, + 85, + 86, + 170, + 165, + 170, + 85, + 86, + 166, + 170, + 166, + 149, + 86, + 85, + 90, + 89, + 101, + 106, + 154, + 170, + 101, + 170, + 169, + 85, + 85, + 150, + 169, + 86, + 166, + 169, + 149, + 90, + 170, + 170, + 170, + 85, + 85, + 85, + 89, + 90, + 150, + 154, + 90, + 86, + 170, + 154, + 85, + 85, + 165, + 86, + 105, + 170, + 165, + 85, + 86, + 170, + 170, + 169, + 165, + 85, + 85, + 86, + 86, + 166, + 169, + 154, + 170, + 170, + 170, + 85, + 90, + 165, + 86, + 154, + 170, + 169, + 86, + 85, + 170, + 170, + 170, + 170, + 85, + 85, + 85, + 85, + 150, + 150, + 86, + 170, + 170, + 165, + 154, + 105, + 165, + 85, + 105, + 170, + 90, + 105, + 149, + 86, + 170, + 170, + 170, + 85, + 85, + 85, + 85, + 149, + 85, + 106, + 170, + 170, + 154, + 169, + 85, + 86, + 105, + 101, + 165, + 90, + 89, + 101, + 90, + 154, + 106, + 170, + 153, + 85, + 85, + 85, + 149, + 166, + 90, + 90, + 170, + 170, + 101, + 149, + 149, + 165, + 165, + 150, + 89, + 105, + 90, + 170, + 169, + 170, + 149, + 85, + 85, + 86, + 85, + 85, + 170, + 154, + 170, + 150, + 153, + 85, + 106, + 90, + 89, + 106, + 169, + 106, + 89, + 169, + 86, + 150, + 85, + 90, + 90, + 86, + 149, + 90, + 85, + 150, + 169, + 150, + 149, + 89, + 166, + 154, + 169, + 105, + 165, + 105, + 89, + 106, + 86, + 85, + 165, + 170, + 170, + 166, + 149, + 170, + 86, + 106, + 89, + 105, + 105, + 86, + 150, + 106, + 89, + 149, + 105, + 90, + 149, + 153, + 86, + 154, + 105, + 169, + 166, + 169, + 165, + 105, + 105, + 170, + 86, + 86, + 101, + 89, + 169, + 106, + 86, + 150, + 90, + 105, + 150, + 89, + 105, + 86, + 154, + 169, + 166, + 165, + 105, +}; +const uint8_t DPCM_eight_8000[] PROGMEM = { + 153, + 170, + 149, + 165, + 105, + 154, + 85, + 150, + 165, + 102, + 89, + 106, + 90, + 90, + 150, + 86, + 154, + 150, + 166, + 90, + 86, + 170, + 90, + 150, + 101, + 170, + 149, + 149, + 154, + 89, + 105, + 101, + 150, + 105, + 105, + 166, + 154, + 102, + 90, + 89, + 170, + 90, + 90, + 102, + 90, + 90, + 101, + 153, + 101, + 165, + 89, + 166, + 165, + 101, + 150, + 170, + 105, + 102, + 89, + 89, + 105, + 154, + 90, + 90, + 90, + 90, + 102, + 150, + 150, + 150, + 149, + 165, + 165, + 153, + 149, + 101, + 166, + 169, + 105, + 101, + 154, + 154, + 101, + 153, + 154, + 154, + 169, + 105, + 150, + 87, + 89, + 149, + 170, + 101, + 165, + 165, + 165, + 164, + 165, + 105, + 101, + 166, + 153, + 90, + 102, + 135, + 26, + 134, + 139, + 101, + 210, + 195, + 102, + 101, + 166, + 153, + 108, + 182, + 105, + 90, + 153, + 99, + 86, + 154, + 213, + 101, + 169, + 108, + 56, + 177, + 100, + 229, + 154, + 41, + 105, + 154, + 89, + 105, + 166, + 89, + 105, + 105, + 154, + 93, + 101, + 151, + 92, + 60, + 247, + 193, + 0, + 58, + 255, + 144, + 0, + 191, + 249, + 160, + 21, + 122, + 229, + 149, + 26, + 94, + 60, + 160, + 156, + 60, + 62, + 188, + 8, + 15, + 191, + 73, + 6, + 15, + 175, + 70, + 9, + 126, + 219, + 69, + 25, + 90, + 174, + 104, + 151, + 11, + 63, + 254, + 192, + 2, + 191, + 250, + 128, + 2, + 255, + 229, + 146, + 135, + 154, + 229, + 145, + 85, + 229, + 242, + 240, + 248, + 60, + 255, + 251, + 4, + 8, + 191, + 251, + 4, + 9, + 191, + 167, + 12, + 44, + 167, + 106, + 88, + 34, + 95, + 92, + 112, + 212, + 12, + 60, + 60, + 76, + 45, + 61, + 237, + 13, + 30, + 46, + 94, + 47, + 29, + 45, + 110, + 106, + 89, + 24, + 163, + 203, + 204, + 48, + 255, + 252, + 48, + 16, + 159, + 255, + 116, + 0, + 25, + 127, + 125, + 201, + 4, + 57, + 250, + 161, + 85, + 138, + 167, + 228, + 114, + 255, + 252, + 176, + 0, + 89, + 254, + 249, + 80, + 0, + 122, + 249, + 233, + 96, + 97, + 235, + 234, + 100, + 85, + 168, + 248, + 48, + 255, + 253, + 112, + 0, + 4, + 190, + 253, + 224, + 0, + 38, + 254, + 255, + 89, + 4, + 42, + 190, + 169, + 96, + 84, + 244, + 60, + 255, + 255, + 60, + 0, + 17, + 126, + 255, + 244, + 0, + 21, + 191, + 253, + 124, + 96, + 161, + 186, + 245, + 149, + 41, + 122, + 12, + 59, + 255, + 76, + 16, + 16, + 30, + 255, + 249, + 0, + 4, + 127, + 254, + 245, + 145, + 69, + 171, + 250, + 149, + 85, + 170, + 203, + 61, + 255, + 219, + 4, + 4, + 7, + 127, + 255, + 68, + 0, + 10, + 191, + 187, + 73, + 70, + 26, + 110, + 169, + 85, + 29, + 172, + 48, + 238, + 255, + 48, + 128, + 0, + 61, + 255, + 250, + 80, + 0, + 102, + 251, + 233, + 226, + 130, + 138, + 171, + 86, + 137, + 42, + 176, + 243, + 207, + 253, + 242, + 128, + 0, + 119, + 255, + 250, + 128, + 1, + 70, + 251, + 234, + 198, + 21, + 149, + 151, + 105, + 102, + 85, + 227, + 12, + 51, + 255, + 204, + 48, + 16, + 77, + 127, + 254, + 232, + 0, + 16, + 110, + 251, + 173, + 36, + 96, + 150, + 170, + 166, + 154, + 103, + 176, + 195, + 63, + 252, + 195, + 2, + 4, + 211, + 255, + 238, + 129, + 1, + 10, + 239, + 186, + 214, + 70, + 9, + 90, + 170, + 106, + 150, + 103, + 112, + 199, + 243, + 184, + 193, + 67, + 0, + 203, + 247, + 234, + 128, + 66, + 82, + 207, + 171, + 154, + 69, + 70, + 90, + 94, + 106, + 102, + 86, + 107, + 12, + 115, + 51, + 204, + 36, + 48, + 76, + 191, + 126, + 172, + 68, + 17, + 28, + 191, + 190, + 100, + 129, + 86, + 170, + 234, + 166, + 86, + 74, + 170, + 166, + 160, + 195, + 195, + 207, + 241, + 224, + 194, + 134, + 186, + 246, + 226, + 145, + 64, + 162, + 234, + 234, + 229, + 85, + 85, + 86, + 169, + 234, + 166, + 85, + 89, + 102, + 106, + 169, + 166, + 106, + 80, + 195, + 195, + 215, + 228, + 112, + 112, + 181, + 190, + 126, + 45, + 25, + 6, + 86, + 150, + 150, + 166, + 165, + 101, + 89, + 102, + 90, + 154, + 154, + 89, + 105, + 165, + 170, + 85, + 102, + 165, + 166, + 169, + 105, + 105, + 166, + 154, + 89, + 90, + 102, + 150, + 150, + 101, + 150, + 150, + 149, + 165, + 170, + 101, + 85, + 86, + 90, + 90, + 89, + 101, + 149, + 106, + 154, + 106, + 85, + 101, + 150, + 150, + 154, + 154, + 90, + 90, + 105, + 150, + 90, + 154, + 90, + 85, + 154, + 86, + 150, + 154, + 105, + 166, + 85, + 149, + 150, + 105, + 105, + 101, + 86, + 86, + 106, + 105, + 165, + 149, + 85, + 90, + 166, + 166, + 165, + 165, + 102, + 169, + 165, + 165, + 154, + 85, + 150, + 101, + 166, + 85, + 169, + 170, + 101, + 149, + 170, + 101, + 166, + 86, + 86, + 102, + 154, + 165, + 86, + 154, + 170, + 165, + 149, + 89, + 102, + 90, + 106, + 85, + 105, + 90, + 106, + 169, + 86, + 86, + 90, + 106, + 90, + 165, + 101, + 149, + 86, + 105, + 169, + 101, + 149, + 85, + 165, + 170, + 170, + 149, +}; +const uint8_t DPCM_nine_8000[] PROGMEM = { + 154, + 85, + 169, + 90, + 150, + 153, + 150, + 105, + 89, + 105, + 149, + 169, + 106, + 150, + 165, + 150, + 105, + 86, + 169, + 105, + 86, + 150, + 102, + 150, + 153, + 102, + 150, + 89, + 90, + 165, + 105, + 105, + 101, + 106, + 90, + 102, + 85, + 166, + 90, + 149, + 170, + 86, + 169, + 166, + 85, + 165, + 154, + 89, + 102, + 150, + 89, + 86, + 169, + 165, + 166, + 90, + 101, + 150, + 105, + 86, + 150, + 106, + 106, + 90, + 106, + 89, + 102, + 149, + 102, + 153, + 165, + 102, + 89, + 102, + 150, + 90, + 106, + 154, + 90, + 166, + 153, + 102, + 150, + 89, + 106, + 101, + 153, + 101, + 150, + 150, + 89, + 150, + 169, + 102, + 153, + 153, + 102, + 154, + 85, + 154, + 106, + 102, + 90, + 154, + 90, + 89, + 89, + 166, + 154, + 85, + 166, + 149, + 102, + 149, + 169, + 101, + 170, + 85, + 150, + 89, + 86, + 106, + 154, + 101, + 101, + 86, + 169, + 90, + 85, + 165, + 106, + 150, + 106, + 166, + 89, + 150, + 154, + 89, + 150, + 150, + 85, + 102, + 150, + 90, + 106, + 105, + 90, + 85, + 149, + 101, + 150, + 105, + 170, + 154, + 105, + 105, + 85, + 166, + 154, + 170, + 170, + 149, + 85, + 85, + 89, + 106, + 170, + 170, + 170, + 170, + 149, + 85, + 85, + 149, + 106, + 169, + 85, + 90, + 170, + 170, + 170, + 85, + 85, + 85, + 106, + 170, + 170, + 106, + 170, + 170, + 165, + 85, + 85, + 86, + 170, + 170, + 170, + 85, + 90, + 170, + 170, + 170, + 149, + 85, + 85, + 106, + 169, + 165, + 170, + 170, + 170, + 149, + 86, + 85, + 102, + 170, + 169, + 165, + 85, + 106, + 106, + 170, + 169, + 85, + 85, + 85, + 154, + 150, + 169, + 170, + 102, + 98, + 221, + 101, + 90, + 106, + 102, + 170, + 160, + 239, + 63, + 16, + 192, + 253, + 109, + 2, + 151, + 248, + 100, + 11, + 170, + 144, + 85, + 170, + 101, + 90, + 149, + 217, + 105, + 195, + 188, + 252, + 7, + 79, + 240, + 16, + 47, + 234, + 128, + 111, + 190, + 133, + 90, + 185, + 149, + 90, + 169, + 147, + 41, + 217, + 15, + 243, + 192, + 63, + 191, + 192, + 45, + 255, + 64, + 26, + 250, + 21, + 27, + 166, + 84, + 106, + 150, + 89, + 154, + 89, + 180, + 63, + 192, + 128, + 63, + 203, + 64, + 63, + 255, + 0, + 191, + 228, + 10, + 190, + 129, + 105, + 105, + 130, + 173, + 147, + 153, + 248, + 63, + 208, + 0, + 63, + 194, + 128, + 63, + 197, + 0, + 127, + 145, + 26, + 249, + 6, + 169, + 149, + 149, + 175, + 144, + 238, + 124, + 11, + 240, + 20, + 31, + 208, + 16, + 47, + 208, + 20, + 47, + 208, + 41, + 186, + 70, + 169, + 86, + 90, + 90, + 208, + 46, + 188, + 11, + 240, + 8, + 47, + 208, + 0, + 47, + 208, + 24, + 111, + 192, + 46, + 250, + 65, + 169, + 166, + 90, + 106, + 165, + 106, + 159, + 128, + 255, + 1, + 134, + 253, + 0, + 7, + 252, + 2, + 102, + 248, + 7, + 249, + 80, + 174, + 85, + 89, + 166, + 169, + 86, + 175, + 192, + 127, + 128, + 98, + 190, + 128, + 2, + 254, + 1, + 166, + 253, + 2, + 253, + 85, + 106, + 149, + 85, + 170, + 86, + 150, + 185, + 156, + 11, + 244, + 10, + 107, + 228, + 0, + 47, + 224, + 26, + 159, + 208, + 111, + 166, + 150, + 169, + 102, + 150, + 165, + 105, + 90, + 170, + 1, + 255, + 1, + 134, + 254, + 0, + 7, + 249, + 2, + 166, + 249, + 7, + 234, + 165, + 90, + 85, + 165, + 170, + 86, + 153, + 170, + 88, + 31, + 240, + 13, + 111, + 208, + 4, + 127, + 208, + 25, + 175, + 144, + 46, + 170, + 149, + 105, + 90, + 149, + 165, + 106, + 90, + 234, + 128, + 255, + 64, + 147, + 253, + 0, + 66, + 253, + 1, + 155, + 248, + 6, + 170, + 229, + 86, + 149, + 165, + 86, + 165, + 169, + 106, + 138, + 194, + 190, + 0, + 131, + 252, + 1, + 3, + 252, + 1, + 91, + 244, + 22, + 170, + 165, + 86, + 106, + 149, + 86, + 169, + 153, + 87, + 153, + 194, + 254, + 64, + 67, + 252, + 20, + 3, + 253, + 20, + 11, + 229, + 85, + 175, + 149, + 81, + 170, + 85, + 86, + 169, + 86, + 102, + 150, + 176, + 191, + 64, + 0, + 255, + 29, + 0, + 255, + 164, + 6, + 250, + 148, + 106, + 234, + 84, + 106, + 229, + 90, + 106, + 149, + 166, + 122, + 91, + 15, + 240, + 64, + 31, + 166, + 128, + 47, + 189, + 1, + 171, + 168, + 42, + 15, + 145, + 165, + 189, + 86, + 86, + 229, + 105, + 186, + 94, + 131, + 252, + 180, + 7, + 219, + 224, + 18, + 255, + 68, + 6, + 250, + 89, + 89, + 186, + 149, + 90, + 169, + 86, + 106, + 106, + 150, + 138, + 176, + 251, + 175, + 8, + 242, + 241, + 4, + 63, + 246, + 65, + 170, + 181, + 85, + 90, + 158, + 85, + 150, + 170, + 101, + 106, + 90, + 90, + 90, + 144, + 247, + 254, + 12, + 43, + 226, + 64, + 126, + 249, + 65, + 31, + 234, + 145, + 150, + 234, + 84, + 86, + 170, + 85, + 102, + 166, + 86, + 102, + 176, + 243, + 253, + 28, + 62, + 235, + 1, + 26, + 246, + 144, + 90, + 186, + 85, + 86, + 106, + 149, + 85, + 170, + 153, + 85, + 170, + 149, + 150, + 154, + 131, + 207, + 232, + 96, + 246, + 237, + 20, + 106, + 170, + 69, + 86, + 170, + 150, + 85, + 106, + 165, + 85, + 170, + 165, + 85, + 90, + 150, + 149, + 168, + 60, + 190, + 138, + 10, + 111, + 149, + 66, + 170, + 165, + 149, + 86, + 170, + 101, + 86, + 170, + 101, + 86, + 170, + 149, + 90, + 165, + 150, + 166, + 104, + 57, + 191, + 154, + 10, + 90, + 149, + 149, + 90, + 169, + 165, + 85, + 169, + 230, + 86, + 105, + 165, + 165, + 90, + 89, + 105, + 150, + 86, + 170, + 165, + 26, + 175, + 150, + 69, + 170, + 165, + 149, + 102, + 170, + 165, + 86, + 154, + 153, + 165, + 166, + 101, + 89, + 169, + 149, + 153, + 105, + 170, + 166, + 89, + 41, + 170, + 154, + 90, + 90, + 165, + 149, + 85, + 170, + 165, + 85, + 106, + 170, + 149, + 85, + 90, + 90, + 86, + 150, + 150, + 149, + 170, + 169, + 85, + 85, + 170, + 169, + 170, + 166, + 153, + 85, + 149, + 101, + 106, + 89, + 153, + 154, + 106, + 166, + 165, + 105, + 149, + 169, + 85, + 90, + 170, + 105, + 85, + 90, + 170, + 170, + 170, + 101, + 85, + 149, + 85, + 90, + 170, + 105, + 90, + 165, + 166, + 153, + 86, + 85, + 85, + 170, + 166, + 150, + 169, + 85, + 106, + 170, + 170, + 165, + 85, + 85, + 85, + 150, + 150, + 154, + 170, + 149, + 166, + 154, + 85, + 165, + 165, + 149, + 170, + 170, + 149, + 85, + 90, + 90, + 170, + 170, + 149, + 89, + 89, + 85, + 166, + 170, + 166, + 170, + 170, + 154, + 101, + 149, + 85, + 101, + 166, + 106, + 105, + 101, + 85, + 170, + 170, + 170, + 85, + 85, + 85, + 86, + 90, + 89, + 101, + 165, + 166, + 101, + 165, + 101, + 85, + 90, + 165, + 166, + 165, + 85, + 85, + 170, + 170, + 170, + 153, + 85, + 85, + 89, + 90, + 90, + 105, + 169, + 90, + 170, + 165, + 85, + 101, + 149, + 106, + 105, + 169, + 105, + 85, + 90, + 106, + 170, + 169, + 101, + 150, + 85, + 101, + 85, + 154, + 150, + 166, + 170, + 150, + 170, + 149, + 101, + 90, + 85, + 165, + 90, + 169, + 170, + 170, + 153, + 89, + 89, + 90, + 153, + 105, + 102, + 170, + 86, + 169, + 154, + 89, + 85, + 165, + 150, + 150, + 105, + 101, + 170, + 154, + 90, + 106, + 85, + 90, + 149, + 165, + 169, + 86, + 149, + 166, + 150, + 170, + 89, + 86, + 102, + 153, + 154, + 85, + 169, + 106, + 153, + 102, + 101, + 89, + 85, + 105, + 90, + 150, + 170, + 101, + 165, + 90, + 154, + 149, + 166, + 150, + 154, + 169, + 86, + 166, + 105, + 166, + 101, + 85, + 105, + 90, + 90, + 89, + 90, + 166, + 150, + 86, + 150, + 153, + 90, + 165, + 154, + 153, + 102, + 165, + 106, + 165, + 149, + 165, + 153, + 86, + 101, + 165, + 153, + 106, + 90, + 85, + 106, + 166, + 149, + 102, + 150, + 101, + 166, + 150, + 150, + 165, + 150, + 166, + 154, + 89, + 169, + 153, + 105, + 106, + 105, + 90, + 105, + 154, + 105, + 153, + 105, + 89, + 169, + 165, + 153, + 86, + 169, + 105, + 85, + 165, + 169, + 105, + 90, + 89, + 90, + 86, + 149, + 102, + 105, + 106, + 89, + 153, + 165, + 86, + 166, + 101, + 154, + 165, + 150, + 165, + 165, + 169, + 165, + 90, + 165, + 169, + 154, + 105, + 170, + 106, + 89, + 90, + 105, + 154, + 85, + 154, + 102, + 154, + 102, + 150, + 169, + 86, + 90, + 154, + 101, + 165, + 169, + 101, + 150, + 150, + 169, + 102, + 153, + 105, + 90, + 154, + 86, + 166, + 105, + 150, + 154, + 149, + 154, + 106, + 150, + 150, + 169, + 85, + 169, + 101, + 165, + 105, + 105, + 89, + 165, + 90, + 106, + 85, + 169, + 106, + 85, + 106, + 90, + 169, + 150, + 90, + 149, + 165, + 153, + 169, + 106, + 105, + 165, + 169, + 105, + 149, + 105, + 102, + 90, + 150, + 154, + 89, + 150, + 165, + 154, + 102, + 169, + 102, + 149, + 166, + 101, + 101, + 169, + 150, + 165, + 165, + 90, + 101, + 153, + 105, + 150, + 106, + 85, + 170, + 90, + 153, + 86, + 90, + 102, + 105, + 101, + 166, + 85, + 150, + 165, + 154, + 105, + 166, + 154, + 106, + 90, + 86, + 101, + 90, + 86, + 150, + 150, + 154, + 150, + 154, + 86, + 149, + 165, + 106, + 105, + 149, + 165, + 166, + 106, + 86, + 106, + 89, + 170, + 90, + 102, + 154, + 90, + 89, + 101, + 90, + 89, + 150, + 165, + 105, + 149, +}; +const uint8_t DPCM_zero_8000[] PROGMEM = { + 153, + 153, + 106, + 89, + 154, + 101, + 90, + 105, + 106, + 89, + 165, + 101, + 150, + 153, + 101, + 90, + 154, + 86, + 165, + 89, + 150, + 102, + 153, + 165, + 153, + 105, + 86, + 169, + 106, + 86, + 90, + 90, + 149, + 170, + 165, + 150, + 85, + 90, + 102, + 150, + 149, + 90, + 165, + 165, + 105, + 166, + 90, + 106, + 149, + 169, + 106, + 150, + 105, + 105, + 85, + 101, + 150, + 154, + 166, + 90, + 102, + 106, + 150, + 149, + 169, + 86, + 149, + 106, + 105, + 169, + 150, + 165, + 169, + 169, + 166, + 102, + 105, + 153, + 85, + 89, + 153, + 166, + 105, + 102, + 90, + 150, + 165, + 101, + 106, + 102, + 101, + 105, + 169, + 153, + 153, + 165, + 165, + 106, + 101, + 166, + 101, + 150, + 153, + 169, + 166, + 105, + 154, + 85, + 101, + 102, + 86, + 105, + 154, + 149, + 105, + 166, + 106, + 105, + 149, + 154, + 105, + 102, + 153, + 86, + 170, + 106, + 169, + 150, + 90, + 101, + 170, + 89, + 150, + 149, + 165, + 106, + 101, + 105, + 170, + 166, + 86, + 90, + 165, + 169, + 153, + 153, + 150, + 166, + 102, + 105, + 153, + 150, + 101, + 169, + 102, + 153, + 150, + 102, + 102, + 153, + 153, + 153, + 166, + 166, + 106, + 106, + 89, + 165, + 105, + 150, + 101, + 153, + 150, + 153, + 165, + 102, + 166, + 105, + 105, + 153, + 149, + 170, + 85, + 169, + 106, + 86, + 105, + 105, + 153, + 153, + 166, + 102, + 154, + 102, + 89, + 166, + 101, + 153, + 101, + 153, + 102, + 102, + 153, + 170, + 102, + 102, + 101, + 153, + 153, + 150, + 90, + 105, + 86, + 153, + 150, + 102, + 102, + 89, + 89, + 153, + 166, + 105, + 89, + 105, + 153, + 86, + 106, + 89, + 102, + 102, + 154, + 170, + 101, + 153, + 153, + 154, + 102, + 166, + 102, + 106, + 105, + 85, + 150, + 153, + 105, + 101, + 90, + 90, + 106, + 105, + 130, + 163, + 169, + 173, + 106, + 86, + 74, + 86, + 165, + 169, + 165, + 102, + 105, + 150, + 150, + 90, + 86, + 162, + 154, + 176, + 193, + 243, + 60, + 44, + 50, + 2, + 199, + 150, + 184, + 244, + 164, + 101, + 105, + 106, + 106, + 90, + 9, + 90, + 154, + 15, + 63, + 60, + 195, + 211, + 200, + 120, + 60, + 253, + 119, + 13, + 6, + 22, + 151, + 231, + 214, + 145, + 149, + 233, + 224, + 243, + 242, + 206, + 60, + 60, + 54, + 27, + 207, + 195, + 132, + 144, + 161, + 230, + 245, + 232, + 100, + 24, + 157, + 190, + 79, + 15, + 15, + 51, + 192, + 226, + 208, + 234, + 61, + 60, + 40, + 25, + 95, + 111, + 143, + 83, + 69, + 150, + 235, + 208, + 243, + 240, + 226, + 48, + 12, + 61, + 30, + 111, + 139, + 195, + 131, + 195, + 231, + 245, + 164, + 112, + 120, + 125, + 189, + 15, + 15, + 15, + 11, + 0, + 192, + 176, + 252, + 252, + 124, + 25, + 10, + 95, + 171, + 149, + 130, + 65, + 170, + 250, + 180, + 60, + 60, + 63, + 15, + 7, + 0, + 240, + 248, + 188, + 60, + 28, + 74, + 247, + 229, + 224, + 96, + 165, + 186, + 182, + 144, + 240, + 240, + 252, + 60, + 8, + 3, + 242, + 248, + 244, + 56, + 30, + 107, + 244, + 240, + 112, + 124, + 107, + 151, + 214, + 194, + 240, + 248, + 60, + 12, + 2, + 164, + 253, + 61, + 8, + 2, + 107, + 239, + 166, + 65, + 86, + 170, + 174, + 90, + 86, + 192, + 240, + 252, + 63, + 0, + 80, + 63, + 15, + 131, + 128, + 105, + 111, + 195, + 208, + 180, + 47, + 154, + 224, + 180, + 110, + 128, + 252, + 63, + 15, + 64, + 125, + 15, + 195, + 240, + 21, + 7, + 249, + 249, + 20, + 85, + 186, + 106, + 85, + 90, + 111, + 144, + 188, + 31, + 130, + 208, + 15, + 195, + 244, + 61, + 1, + 229, + 191, + 150, + 144, + 26, + 91, + 213, + 101, + 26, + 155, + 164, + 15, + 195, + 240, + 56, + 1, + 252, + 63, + 2, + 128, + 43, + 234, + 248, + 6, + 66, + 249, + 169, + 85, + 86, + 174, + 170, + 64, + 252, + 63, + 0, + 144, + 15, + 241, + 252, + 5, + 65, + 191, + 91, + 192, + 105, + 111, + 165, + 89, + 10, + 150, + 170, + 149, + 3, + 240, + 252, + 1, + 64, + 127, + 195, + 240, + 25, + 27, + 253, + 11, + 65, + 249, + 190, + 85, + 89, + 91, + 150, + 165, + 104, + 7, + 240, + 252, + 2, + 64, + 191, + 71, + 192, + 42, + 107, + 244, + 45, + 11, + 230, + 249, + 5, + 165, + 185, + 106, + 85, + 160, + 15, + 195, + 240, + 6, + 82, + 254, + 15, + 0, + 175, + 155, + 208, + 164, + 47, + 170, + 148, + 6, + 154, + 229, + 105, + 101, + 96, + 31, + 195, + 224, + 7, + 227, + 252, + 25, + 1, + 190, + 95, + 64, + 110, + 75, + 209, + 228, + 26, + 166, + 244, + 41, + 106, + 112, + 63, + 199, + 208, + 11, + 211, + 248, + 5, + 65, + 254, + 105, + 64, + 110, + 170, + 165, + 85, + 90, + 170, + 164, + 85, + 170, + 172, + 7, + 249, + 228, + 2, + 249, + 255, + 64, + 84, + 127, + 165, + 84, + 106, + 170, + 90, + 85, + 106, + 154, + 165, + 69, + 170, + 253, + 128, + 127, + 238, + 128, + 62, + 175, + 244, + 5, + 90, + 254, + 85, + 85, + 110, + 164, + 105, + 90, + 165, + 106, + 85, + 86, + 190, + 86, + 0, + 255, + 86, + 0, + 127, + 255, + 208, + 6, + 171, + 245, + 69, + 86, + 171, + 149, + 101, + 106, + 149, + 165, + 90, + 149, + 186, + 149, + 128, + 191, + 209, + 64, + 31, + 251, + 240, + 2, + 171, + 254, + 65, + 86, + 171, + 229, + 70, + 170, + 153, + 86, + 150, + 153, + 90, + 165, + 168, + 7, + 253, + 16, + 0, + 255, + 190, + 64, + 42, + 190, + 164, + 21, + 170, + 170, + 80, + 110, + 170, + 149, + 106, + 149, + 165, + 106, + 165, + 100, + 31, + 252, + 64, + 0, + 255, + 229, + 64, + 27, + 234, + 165, + 6, + 170, + 90, + 85, + 110, + 149, + 85, + 106, + 165, + 101, + 90, + 165, + 164, + 27, + 253, + 64, + 1, + 255, + 229, + 65, + 91, + 234, + 90, + 85, + 90, + 170, + 165, + 85, + 102, + 170, + 166, + 149, + 86, + 169, + 90, + 168, + 6, + 255, + 164, + 0, + 107, + 249, + 85, + 86, + 170, + 150, + 85, + 90, + 170, + 169, + 85, + 105, + 166, + 170, + 85, + 106, + 170, + 85, + 102, + 128, + 111, + 250, + 0, + 5, + 190, + 169, + 85, + 85, + 170, + 150, + 165, + 90, + 165, + 86, + 170, + 85, + 149, + 106, + 149, + 165, + 85, + 106, + 160, + 27, + 254, + 144, + 5, + 111, + 165, + 85, + 101, + 170, + 149, + 90, + 150, + 170, + 85, + 170, + 165, + 85, + 106, + 165, + 86, + 86, + 170, + 164, + 6, + 255, + 144, + 5, + 90, + 169, + 85, + 170, + 150, + 169, + 86, + 170, + 101, + 86, + 170, + 149, + 86, + 170, + 149, + 86, + 169, + 86, + 170, + 65, + 111, + 229, + 85, + 85, + 170, + 149, + 90, + 149, + 106, + 149, + 106, + 149, + 90, + 165, + 85, + 150, + 170, + 149, + 90, + 166, + 106, + 101, + 85, + 170, + 165, + 90, + 149, + 106, + 165, + 86, + 169, + 86, + 169, + 86, + 169, + 86, + 165, + 149, + 170, + 85, + 86, + 105, + 86, + 169, + 89, + 86, + 170, + 149, + 90, + 170, + 89, + 85, + 106, + 169, + 86, + 149, + 106, + 165, + 86, + 169, + 86, + 170, + 85, + 170, + 149, + 90, + 165, + 90, + 165, + 90, + 169, + 86, + 90, + 150, + 149, + 90, + 165, + 85, + 170, + 105, + 169, + 85, + 170, + 149, + 90, + 169, + 85, + 170, + 85, + 170, + 85, + 106, + 149, + 90, + 170, + 86, + 169, + 106, + 85, + 90, + 170, + 85, + 170, + 165, + 85, + 170, + 169, + 86, + 170, + 101, + 86, + 169, + 86, + 169, + 85, + 106, + 149, + 86, + 170, + 85, + 102, + 170, + 90, + 150, + 101, + 86, + 170, + 165, + 86, + 170, + 105, + 102, + 165, + 90, + 169, + 85, + 106, + 149, + 90, + 169, + 85, + 106, + 165, + 85, + 90, + 165, + 85, + 170, + 149, + 106, + 169, + 85, + 106, + 170, + 85, + 106, + 106, + 153, + 85, + 170, + 165, + 86, + 170, + 165, + 154, + 170, + 85, + 85, + 170, + 149, + 165, + 169, + 86, + 106, + 169, + 86, + 106, + 149, + 89, + 169, + 90, + 165, + 90, + 169, + 85, + 154, + 165, + 85, + 154, + 169, + 85, + 106, + 165, + 89, + 106, + 165, + 101, + 170, + 165, + 86, + 106, + 165, + 90, + 153, + 90, + 170, + 90, + 105, + 165, + 90, + 150, + 85, + 170, + 149, + 90, + 169, + 85, + 166, + 169, + 85, + 170, + 149, + 86, + 90, + 149, + 89, + 170, + 105, + 89, + 149, + 170, + 166, + 86, +}; +const uint8_t DPCM_point_8000[] PROGMEM = { + 153, + 169, + 90, + 89, + 154, + 90, + 149, + 154, + 102, + 150, + 165, + 150, + 149, + 165, + 89, + 102, + 153, + 102, + 149, + 169, + 105, + 90, + 90, + 105, + 90, + 105, + 102, + 90, + 86, + 165, + 90, + 85, + 150, + 90, + 89, + 165, + 90, + 166, + 101, + 169, + 150, + 165, + 102, + 89, + 90, + 105, + 101, + 101, + 154, + 90, + 86, + 154, + 105, + 153, + 90, + 150, + 149, + 166, + 89, + 105, + 150, + 86, + 149, + 106, + 90, + 101, + 169, + 102, + 90, + 153, + 89, + 106, + 86, + 166, + 90, + 153, + 101, + 150, + 150, + 150, + 153, + 85, + 166, + 89, + 170, + 101, + 150, + 85, + 170, + 90, + 86, + 153, + 105, + 165, + 101, + 153, + 105, + 170, + 106, + 150, + 89, + 106, + 154, + 101, + 150, + 86, + 166, + 149, + 105, + 169, + 106, + 89, + 85, + 166, + 106, + 86, + 105, + 90, + 89, + 154, + 90, + 149, + 61, + 89, + 120, + 79, + 165, + 86, + 170, + 169, + 139, + 165, + 170, + 149, + 105, + 169, + 166, + 86, + 170, + 86, + 166, + 165, + 106, + 165, + 150, + 170, + 149, + 106, + 86, + 165, + 105, + 106, + 149, + 106, + 101, + 101, + 165, + 154, + 153, + 86, + 170, + 86, + 106, + 85, + 102, + 106, + 150, + 149, + 166, + 154, + 149, + 154, + 149, + 154, + 90, + 165, + 90, + 169, + 149, + 86, + 106, + 165, + 90, + 170, + 153, + 85, + 170, + 170, + 85, + 90, + 166, + 149, + 87, + 170, + 85, + 90, + 170, + 149, + 90, + 170, + 149, + 90, + 170, + 101, + 102, + 106, + 165, + 85, + 170, + 149, + 150, + 170, + 86, + 86, + 154, + 166, + 85, + 90, + 153, + 86, + 169, + 85, + 106, + 165, + 149, + 101, + 102, + 106, + 85, + 154, + 153, + 86, + 106, + 85, + 90, + 169, + 90, + 153, + 85, + 90, + 191, + 165, + 5, + 175, + 165, + 5, + 106, + 169, + 86, + 106, + 170, + 101, + 104, + 0, + 255, + 248, + 0, + 63, + 253, + 0, + 47, + 249, + 1, + 191, + 229, + 22, + 170, + 149, + 85, + 170, + 170, + 85, + 168, + 1, + 255, + 240, + 0, + 255, + 244, + 0, + 191, + 224, + 2, + 255, + 144, + 27, + 250, + 64, + 86, + 170, + 170, + 149, + 106, + 0, + 127, + 252, + 0, + 63, + 252, + 0, + 127, + 244, + 6, + 254, + 80, + 107, + 249, + 1, + 106, + 165, + 90, + 169, + 85, + 172, + 1, + 255, + 240, + 0, + 255, + 208, + 2, + 255, + 64, + 111, + 144, + 27, + 254, + 64, + 27, + 233, + 86, + 170, + 85, + 170, + 170, + 128, + 127, + 252, + 0, + 255, + 192, + 7, + 253, + 6, + 254, + 0, + 127, + 244, + 2, + 186, + 149, + 86, + 170, + 85, + 90, + 170, + 160, + 15, + 255, + 0, + 63, + 240, + 7, + 248, + 7, + 253, + 0, + 191, + 224, + 31, + 228, + 26, + 228, + 27, + 228, + 6, + 250, + 81, + 160, + 31, + 252, + 0, + 255, + 128, + 189, + 0, + 255, + 192, + 47, + 225, + 111, + 144, + 31, + 225, + 43, + 228, + 86, + 170, + 170, + 166, + 128, + 63, + 240, + 7, + 244, + 107, + 192, + 31, + 244, + 11, + 208, + 111, + 208, + 127, + 128, + 190, + 65, + 185, + 6, + 249, + 66, + 185, + 96, + 31, + 240, + 11, + 160, + 191, + 64, + 46, + 171, + 244, + 6, + 249, + 175, + 96, + 89, + 86, + 169, + 86, + 165, + 170, + 150, + 170, + 160, + 63, + 240, + 188, + 23, + 244, + 36, + 6, + 249, + 105, + 65, + 190, + 154, + 165, + 153, + 86, + 149, + 106, + 90, + 170, + 165, + 153, + 188, + 15, + 217, + 240, + 31, + 75, + 224, + 45, + 31, + 209, + 164, + 31, + 170, + 229, + 105, + 31, + 85, + 85, + 169, + 106, + 90, + 101, + 170, + 67, + 243, + 244, + 53, + 15, + 195, + 128, + 165, + 190, + 90, + 67, + 218, + 229, + 100, + 106, + 106, + 86, + 86, + 150, + 150, + 169, + 106, + 195, + 246, + 240, + 112, + 124, + 121, + 69, + 71, + 155, + 214, + 145, + 166, + 215, + 85, + 89, + 170, + 165, + 150, + 90, + 154, + 166, + 90, + 208, + 199, + 227, + 144, + 228, + 240, + 240, + 145, + 170, + 169, + 164, + 105, + 186, + 169, + 85, + 105, + 105, + 105, + 105, + 105, + 169, + 166, + 160, + 207, + 199, + 25, + 68, + 242, + 146, + 133, + 86, + 169, + 213, + 86, + 170, + 154, + 85, + 105, + 169, + 102, + 86, + 149, + 154, + 169, + 212, + 227, + 243, + 205, + 133, + 54, + 153, + 149, + 21, + 169, + 165, + 149, + 169, + 170, + 165, + 85, + 94, + 105, + 101, + 150, + 106, + 102, + 102, + 107, + 12, + 253, + 179, + 101, + 140, + 162, + 102, + 73, + 89, + 106, + 90, + 89, + 89, + 170, + 101, + 85, + 85, + 106, + 166, + 89, + 154, + 170, + 105, + 149, + 165, + 150, + 169, + 170, + 131, + 75, + 143, + 93, + 101, + 145, + 150, + 165, + 101, + 165, + 165, + 166, + 165, + 169, + 149, + 106, + 85, + 86, + 106, + 154, + 102, + 85, + 170, + 149, + 85, + 90, + 169, + 86, + 85, + 105, + 154, + 169, + 85, + 90, + 170, + 105, + 89, + 105, + 170, + 165, + 85, + 86, + 150, + 154, + 90, + 154, + 150, + 106, + 165, + 150, + 150, + 153, + 102, + 165, + 169, + 149, + 105, + 105, + 153, + 102, + 169, + 165, + 90, + 105, + 102, + 150, + 86, + 150, + 89, + 86, + 169, + 102, + 86, + 149, + 165, + 154, + 150, + 85, + 106, + 170, + 169, + 101, + 170, + 169, + 85, + 85, + 170, + 89, + 150, + 90, + 90, + 86, + 90, + 149, + 165, + 165, + 90, + 170, + 165, + 149, + 90, + 85, + 170, + 89, + 169, + 170, + 165, + 165, + 150, + 90, + 90, + 165, + 102, + 150, + 169, + 165, + 102, + 149, + 166, + 150, + 153, + 90, + 169, + 165, + 102, + 86, + 165, + 105, + 89, + 85, + 169, + 106, + 169, + 150, + 149, + 165, + 166, + 86, + 150, + 106, + 85, + 166, + 150, + 153, + 86, + 86, + 169, + 166, + 105, + 170, + 150, + 149, + 106, + 89, + 165, + 101, + 154, + 150, + 153, + 85, + 102, + 86, + 150, + 170, + 106, + 105, + 153, + 153, + 153, + 153, + 131, + 76, + 242, + 240, + 220, + 31, + 14, + 146, + 225, + 228, + 170, + 30, + 26, + 89, + 162, + 165, + 166, + 141, + 90, + 105, + 149, + 166, + 166, + 102, + 141, + 154, + 41, + 117, + 149, + 154, + 90, + 105, + 149, + 150, + 169, + 170, + 105, + 166, + 166, + 150, + 89, + 90, + 85, + 165, + 165, + 170, + 170, + 89, + 102, + 149, + 165, + 150, + 90, + 105, + 102, + 150, + 85, + 150, + 150, + 153, + 105, + 106, + 101, + 153, + 150, + 149, + 165, + 90, + 106, + 85, + 150, + 150, + 153, + 105, + 90, + 102, + 149, + 165, + 105, + 105, + 105, + 165, + 166, + 150, + 169, + 102, + 105, + 102, + 170, + 154, + 89, + 105, + 101, + 149, + 154, + 102, + 150, + 153, + 102, + 90, + 86, + 169, + 150, + 154, + 106, + 101, + 153, + 105, + 105, + 153, + 102, + 165, + 105, + 169, + 89, + 105, + 166, + 165, + 169, + 106, + 90, + 150, + 90, + 154, + 101, + 166, + 90, + 101, + 150, + 106, + 101, + 153, + 86, + 169, + 150, + 101, + 169, + 165, + 106, + 85, + 166, + 154, + 86, + 150, + 90, + 154, + 102, + 165, + 166, + 89, + 170, + 85, + 150, + 165, + 166, + 165, + 90, + 89, + 102, + 165, + 89, + 154, + 153, + 106, + 150, + 169, + 90, + 154, + 89, + 154, + 150, + 154, + 169, + 101, + 169, + 165, + 149, + 165, + 169, + 86, + 90, + 153, + 101, + 153, + 165, + 90, + 90, + 90, + 169, + 150, + 89, + 150, + 105, + 89, + 106, + 150, + 165, + 169, + 154, + 165, + 150, + 153, + 106, + 105, + 102, + 149, + 169, + 105, + 166, + 153, + 106, + 86, + 166, + 165, + 150, + 149, + 102, + 150, + 149, + 166, + 149, + 166, + 101, + 90, + 101, + 154, + 85, + 165, + 149, + 86, + 169, + 154, + 105, + 154, + 154, + 90, + 89, + 150, + 154, + 101, + 154, + 154, + 86, + 149, + 105, + 101, + 153, + 166, + 102, + 85, + 170, + 149, + 105, + 90, + 106, + 85, + 170, + 86, + 149, + 150, + 89, + 165, + 166, + 90, + 150, + 170, + 149, + 170, + 150, + 165, + 165, + 166, + 153, + 86, + 149, + 101, + 170, + 86, + 170, + 89, + 105, + 153, + 86, + 149, + 154, + 90, + 85, + 154, + 86, + 166, + 153, + 90, + 165, + 153, + 105, + 165, + 90, + 105, + 165, + 165, + 169, + 90, + 85, + 150, + 86, + 149, + 149, + 150, + 86, + 165, + 106, + 106, + 169, + 86, + 165, + 105, + 154, + 165, + 165, + 165, + 101, + 105, + 86, + 102, + 89, + 106, + 90, + 102, + 90, + 90, + 153, + 105, + 90, + 150, + 150, + 150, + 165, + 153, + 105, + 165, + 105, + 105, + 165, + 169, + 105, + 86, + 102, + 169, + 150, + 105, + 90, + 154, + 101, + 102, + 154, + 101, + 166, + 154, + 86, + 170, + 89, +}; +const uint8_t DPCM_volts_8000[] PROGMEM = { + 154, + 90, + 165, + 90, + 150, + 89, + 101, + 90, + 105, + 90, + 165, + 150, + 149, + 101, + 166, + 150, + 153, + 150, + 105, + 166, + 89, + 165, + 105, + 101, + 150, + 105, + 169, + 105, + 106, + 101, + 150, + 153, + 149, + 106, + 150, + 150, + 165, + 154, + 90, + 166, + 89, + 154, + 105, + 154, + 166, + 149, + 170, + 86, + 89, + 150, + 89, + 153, + 102, + 85, + 106, + 165, + 106, + 89, + 166, + 149, + 150, + 170, + 85, + 166, + 165, + 154, + 89, + 165, + 165, + 102, + 149, + 154, + 150, + 166, + 154, + 90, + 89, + 166, + 90, + 86, + 169, + 150, + 166, + 105, + 90, + 86, + 105, + 150, + 149, + 89, + 86, + 153, + 165, + 170, + 102, + 150, + 89, + 165, + 153, + 101, + 169, + 105, + 154, + 90, + 89, + 102, + 150, + 89, + 90, + 90, + 150, + 150, + 150, + 86, + 150, + 106, + 150, + 166, + 153, + 101, + 169, + 86, + 153, + 150, + 102, + 153, + 166, + 165, + 153, + 154, + 165, + 154, + 150, + 102, + 101, + 154, + 101, + 154, + 86, + 166, + 101, + 153, + 149, + 106, + 165, + 169, + 101, + 153, + 106, + 89, + 166, + 165, + 102, + 102, + 154, + 101, + 166, + 153, + 85, + 106, + 90, + 170, + 105, + 86, + 169, + 150, + 165, + 165, + 169, + 85, + 170, + 86, + 166, + 149, + 86, + 169, + 86, + 149, + 170, + 85, + 89, + 169, + 85, + 170, + 86, + 106, + 165, + 86, + 169, + 85, + 170, + 149, + 106, + 106, + 166, + 89, + 102, + 169, + 101, + 170, + 165, + 86, + 170, + 85, + 170, + 85, + 106, + 84, + 27, + 255, + 144, + 5, + 170, + 90, + 190, + 149, + 5, + 106, + 170, + 149, + 85, + 170, + 170, + 170, + 4, + 63, + 255, + 0, + 39, + 233, + 95, + 253, + 0, + 15, + 254, + 145, + 170, + 80, + 43, + 250, + 85, + 85, + 86, + 170, + 165, + 96, + 3, + 255, + 240, + 0, + 47, + 229, + 175, + 249, + 0, + 47, + 254, + 85, + 89, + 85, + 106, + 170, + 85, + 85, + 86, + 170, + 166, + 64, + 27, + 255, + 128, + 1, + 191, + 166, + 191, + 228, + 0, + 111, + 250, + 85, + 85, + 85, + 170, + 170, + 85, + 85, + 106, + 170, + 149, + 64, + 23, + 255, + 224, + 0, + 111, + 234, + 175, + 229, + 0, + 91, + 254, + 148, + 86, + 85, + 106, + 170, + 85, + 85, + 170, + 170, + 170, + 85, + 0, + 95, + 255, + 128, + 1, + 191, + 234, + 170, + 165, + 0, + 91, + 254, + 149, + 85, + 86, + 170, + 165, + 85, + 90, + 170, + 170, + 165, + 85, + 85, + 86, + 191, + 233, + 0, + 90, + 186, + 150, + 106, + 85, + 86, + 170, + 149, + 86, + 170, + 165, + 89, + 101, + 86, + 170, + 165, + 85, + 90, + 169, + 80, + 91, + 255, + 144, + 1, + 106, + 170, + 106, + 170, + 80, + 86, + 170, + 169, + 85, + 85, + 90, + 170, + 169, + 85, + 86, + 170, + 166, + 165, + 150, + 165, + 85, + 111, + 250, + 64, + 22, + 174, + 165, + 154, + 165, + 85, + 106, + 170, + 85, + 90, + 170, + 149, + 85, + 86, + 106, + 170, + 149, + 86, + 170, + 169, + 85, + 86, + 255, + 164, + 1, + 90, + 170, + 154, + 170, + 149, + 85, + 170, + 169, + 85, + 106, + 165, + 90, + 165, + 149, + 85, + 150, + 170, + 169, + 85, + 90, + 165, + 69, + 111, + 250, + 64, + 22, + 170, + 165, + 170, + 165, + 85, + 106, + 170, + 85, + 170, + 85, + 86, + 170, + 165, + 85, + 170, + 170, + 85, + 85, + 106, + 170, + 165, + 69, + 191, + 233, + 0, + 90, + 169, + 90, + 170, + 80, + 22, + 170, + 165, + 170, + 149, + 85, + 170, + 165, + 86, + 170, + 149, + 106, + 165, + 85, + 170, + 166, + 169, + 85, + 90, + 170, + 85, + 86, + 175, + 165, + 85, + 89, + 85, + 170, + 169, + 85, + 86, + 165, + 106, + 169, + 85, + 106, + 170, + 170, + 85, + 85, + 106, + 170, + 89, + 86, + 170, + 150, + 149, + 101, + 101, + 165, + 170, + 165, + 69, + 111, + 233, + 85, + 101, + 85, + 106, + 234, + 85, + 149, + 85, + 106, + 170, + 90, + 165, + 85, + 106, + 170, + 170, + 149, + 85, + 170, + 166, + 105, + 169, + 170, + 149, + 86, + 170, + 165, + 154, + 150, + 85, + 90, + 170, + 165, + 149, + 86, + 170, + 169, + 85, + 85, + 170, + 170, + 149, + 149, + 90, + 170, + 149, + 89, + 170, + 169, + 86, + 90, + 85, + 170, + 170, + 85, + 101, + 90, + 169, + 166, + 166, + 86, + 86, + 154, + 149, + 149, + 90, + 170, + 165, + 85, + 90, + 170, + 150, + 85, + 90, + 90, + 150, + 169, + 101, + 90, + 170, + 149, + 149, + 106, + 170, + 85, + 105, + 149, + 90, + 170, + 86, + 89, + 149, + 154, + 89, + 85, + 106, + 90, + 169, + 89, + 90, + 150, + 169, + 105, + 101, + 150, + 149, + 170, + 154, + 165, + 86, + 153, + 170, + 90, + 101, + 154, + 106, + 105, + 165, + 89, + 149, + 86, + 90, + 153, + 170, + 150, + 150, + 105, + 154, + 150, + 150, + 101, + 85, + 169, + 105, + 170, + 85, + 102, + 169, + 105, + 169, + 86, + 101, + 106, + 106, + 149, + 102, + 154, + 165, + 169, + 90, + 166, + 170, + 153, + 85, + 105, + 166, + 105, + 150, + 89, + 102, + 165, + 165, + 165, + 165, + 166, + 86, + 106, + 170, + 106, + 165, + 153, + 154, + 165, + 86, + 86, + 169, + 170, + 105, + 150, + 165, + 89, + 101, + 170, + 106, + 85, + 166, + 170, + 89, + 166, + 86, + 86, + 149, + 153, + 150, + 102, + 165, + 102, + 149, + 153, + 170, + 105, + 150, + 106, + 166, + 85, + 106, + 101, + 170, + 105, + 165, + 154, + 89, + 149, + 153, + 166, + 153, + 150, + 102, + 105, + 149, + 153, + 86, + 154, + 102, + 105, + 153, + 166, + 102, + 105, + 153, + 150, + 105, + 102, + 89, + 153, + 101, + 102, + 105, + 86, + 166, + 105, + 153, + 153, + 153, + 102, + 101, + 153, + 166, + 86, + 89, + 166, + 102, + 169, + 89, + 149, + 102, + 102, + 102, + 102, + 89, + 150, + 150, + 153, + 150, + 166, + 102, + 102, + 102, + 153, + 154, + 102, + 101, + 153, + 166, + 102, + 166, + 102, + 153, + 166, + 102, + 153, + 154, + 105, + 150, + 102, + 102, + 89, + 166, + 105, + 153, + 153, + 150, + 102, + 102, + 89, + 153, + 102, + 89, + 102, + 89, + 150, + 153, + 150, + 102, + 89, + 154, + 102, + 154, + 153, + 150, + 105, + 165, + 86, + 105, + 154, + 102, + 153, + 153, + 102, + 101, + 153, + 154, + 102, + 89, + 154, + 102, + 102, + 89, + 154, + 102, + 153, + 153, + 153, + 150, + 102, + 102, + 102, + 102, + 102, + 89, + 153, + 153, + 153, + 166, + 105, + 166, + 102, + 153, + 102, + 153, + 153, + 150, + 102, + 105, + 153, + 153, + 153, + 166, + 98, + 102, + 154, + 89, + 153, + 153, + 154, + 102, + 38, + 101, + 153, + 141, + 99, + 102, + 153, + 154, + 102, + 166, + 89, + 102, + 102, + 105, + 102, + 89, + 153, + 166, + 153, + 102, + 102, + 89, + 153, + 151, + 101, + 152, + 218, + 102, + 89, + 150, + 38, + 153, + 150, + 89, + 153, + 154, + 90, + 102, + 105, + 150, + 150, + 153, + 153, + 150, + 102, + 102, + 153, + 89, + 150, + 153, + 166, + 153, + 150, + 105, + 166, + 90, + 102, + 105, + 102, + 153, + 105, + 154, + 102, + 101, + 153, + 153, + 102, + 102, + 102, + 101, + 153, + 102, + 106, + 102, + 153, + 150, + 102, + 102, + 101, + 153, + 102, + 105, + 153, + 154, + 102, + 102, + 101, + 153, + 150, + 102, + 105, + 153, + 150, + 106, + 101, + 153, + 153, + 166, + 102, + 90, + 101, + 154, + 102, + 101, + 153, + 149, + 153, + 154, + 154, + 102, + 105, + 153, + 166, + 102, + 102, + 101, + 153, + 153, + 90, + 105, + 154, + 102, + 149, + 169, + 90, + 102, + 89, + 149, + 154, + 150, + 165, + 150, + 102, + 153, + 150, + 90, + 149, + 105, + 102, + 154, + 85, + 106, + 89, + 101, + 170, + 101, + 89, + 166, + 153, + 165, + 101, + 102, + 149, + 105, + 101, + 154, + 102, + 86, + 166, + 90, + 89, + 166, + 169, + 90, + 165, + 150, + 89, + 150, + 105, + 106, + 86, + 149, + 86, + 149, + 150, + 169, + 86, + 165, + 102, + 169, + 165, + 105, + 105, + 101, + 101, + 154, + 165, + 169, + 90, + 102, + 89, + 166, + 165, + 149, + 90, + 149, + 154, + 101, + 86, + 169, + 166, + 86, + 101, + 170, + 165, + 105, + 105, + 86, + 165, + 105, + 102, + 165, + 105, + 154, + 89, + 85, + 154, + 149, + 106, + 89, + 165, + 170, + 90, + 165, + 165, + 101, + 150, + 153, + 105, + 153, + 165, + 106, + 86, + 90, + 106, + 166, + 154, + 106, + 150, + 169, + 90, + 150, + 169, + 105, + 150, + 101, + 166, +}; +const uint8_t DPCM_talkingvoltmeter_8000[] PROGMEM = { + 153, + 89, + 170, + 106, + 101, + 86, + 89, + 102, + 165, + 154, + 90, + 169, + 105, + 105, + 154, + 101, + 90, + 102, + 169, + 90, + 153, + 166, + 154, + 165, + 149, + 106, + 150, + 106, + 90, + 165, + 154, + 90, + 154, + 105, + 169, + 86, + 165, + 90, + 101, + 149, + 102, + 154, + 165, + 169, + 90, + 101, + 165, + 86, + 169, + 169, + 90, + 86, + 149, + 169, + 86, + 90, + 90, + 86, + 101, + 106, + 165, + 86, + 165, + 102, + 153, + 169, + 102, + 165, + 154, + 102, + 150, + 106, + 90, + 105, + 166, + 154, + 149, + 169, + 153, + 170, + 102, + 153, + 153, + 165, + 153, + 165, + 89, + 102, + 154, + 101, + 154, + 101, + 150, + 106, + 154, + 166, + 101, + 153, + 101, + 154, + 106, + 153, + 102, + 86, + 89, + 150, + 89, + 101, + 169, + 105, + 165, + 149, + 106, + 89, + 165, + 105, + 165, + 105, + 153, + 149, + 150, + 166, + 90, + 165, + 165, + 150, + 106, + 150, + 90, + 101, + 170, + 154, + 150, + 169, + 90, + 101, + 165, + 169, + 149, + 165, + 149, + 166, + 149, + 106, + 150, + 169, + 169, + 86, + 169, + 169, + 101, + 149, + 105, + 154, + 150, + 101, + 102, + 101, + 102, + 106, + 102, + 153, + 152, + 250, + 102, + 86, + 102, + 154, + 94, + 142, + 102, + 86, + 101, + 169, + 154, + 89, + 150, + 166, + 106, + 105, + 150, + 154, + 101, + 166, + 85, + 101, + 166, + 154, + 149, + 154, + 166, + 165, + 101, + 85, + 102, + 153, + 153, + 150, + 105, + 101, + 150, + 154, + 105, + 106, + 166, + 86, + 102, + 165, + 90, + 106, + 165, + 90, + 105, + 101, + 154, + 106, + 85, + 170, + 105, + 86, + 169, + 86, + 86, + 169, + 154, + 90, + 149, + 166, + 89, + 106, + 102, + 102, + 149, + 105, + 170, + 150, + 65, + 191, + 148, + 0, + 191, + 153, + 1, + 190, + 149, + 90, + 186, + 85, + 90, + 165, + 85, + 154, + 122, + 192, + 255, + 64, + 0, + 127, + 240, + 1, + 111, + 249, + 1, + 186, + 149, + 22, + 186, + 85, + 90, + 170, + 85, + 90, + 168, + 15, + 252, + 0, + 183, + 255, + 128, + 31, + 250, + 164, + 7, + 249, + 85, + 86, + 169, + 86, + 169, + 169, + 90, + 165, + 111, + 192, + 127, + 192, + 15, + 234, + 252, + 0, + 255, + 150, + 64, + 111, + 144, + 106, + 165, + 149, + 90, + 165, + 105, + 106, + 149, + 175, + 0, + 255, + 64, + 63, + 155, + 244, + 3, + 253, + 74, + 65, + 190, + 69, + 170, + 149, + 85, + 170, + 85, + 165, + 106, + 149, + 175, + 128, + 63, + 192, + 15, + 234, + 248, + 2, + 254, + 86, + 65, + 127, + 149, + 105, + 170, + 81, + 170, + 149, + 85, + 169, + 101, + 107, + 148, + 7, + 253, + 0, + 87, + 255, + 64, + 110, + 170, + 84, + 106, + 165, + 86, + 170, + 149, + 90, + 165, + 106, + 149, + 105, + 106, + 166, + 129, + 175, + 233, + 0, + 110, + 229, + 85, + 150, + 165, + 90, + 149, + 170, + 85, + 165, + 85, + 86, + 170, + 165, + 26, + 165, + 169, + 91, + 129, + 190, + 90, + 149, + 169, + 90, + 85, + 169, + 90, + 150, + 169, + 86, + 170, + 149, + 90, + 149, + 169, + 90, + 154, + 85, + 105, + 86, + 150, + 149, + 102, + 170, + 165, + 86, + 106, + 85, + 106, + 165, + 85, + 170, + 150, + 149, + 106, + 166, + 150, + 170, + 86, + 169, + 169, + 86, + 165, + 85, + 90, + 105, + 85, + 106, + 165, + 106, + 165, + 86, + 105, + 170, + 85, + 106, + 149, + 85, + 170, + 149, + 85, + 170, + 149, + 106, + 149, + 105, + 86, + 166, + 86, + 169, + 86, + 170, + 149, + 106, + 150, + 165, + 90, + 169, + 85, + 170, + 169, + 85, + 90, + 169, + 90, + 169, + 101, + 86, + 106, + 149, + 154, + 85, + 170, + 85, + 86, + 169, + 154, + 85, + 106, + 149, + 89, + 153, + 105, + 90, + 90, + 90, + 150, + 150, + 149, + 170, + 165, + 85, + 166, + 165, + 101, + 102, + 89, + 90, + 149, + 149, + 153, + 89, + 90, + 150, + 102, + 61, + 41, + 89, + 106, + 105, + 105, + 105, + 105, + 152, + 116, + 165, + 165, + 169, + 105, + 165, + 150, + 150, + 90, + 90, + 105, + 166, + 101, + 153, + 169, + 165, + 165, + 165, + 166, + 150, + 86, + 154, + 102, + 90, + 153, + 150, + 89, + 106, + 101, + 101, + 166, + 154, + 105, + 165, + 165, + 166, + 150, + 90, + 106, + 106, + 89, + 89, + 106, + 105, + 101, + 165, + 150, + 154, + 90, + 105, + 85, + 150, + 154, + 154, + 90, + 85, + 90, + 105, + 105, + 165, + 165, + 166, + 170, + 144, + 195, + 195, + 203, + 15, + 29, + 45, + 105, + 105, + 89, + 105, + 166, + 166, + 150, + 154, + 86, + 89, + 102, + 90, + 105, + 160, + 240, + 243, + 195, + 199, + 15, + 30, + 109, + 101, + 89, + 106, + 105, + 165, + 150, + 154, + 89, + 89, + 101, + 166, + 166, + 166, + 161, + 203, + 219, + 43, + 25, + 89, + 102, + 101, + 149, + 150, + 170, + 89, + 89, + 106, + 165, + 149, + 150, + 154, + 89, + 154, + 90, + 134, + 43, + 125, + 169, + 150, + 166, + 90, + 153, + 90, + 166, + 85, + 90, + 170, + 170, + 165, + 85, + 89, + 169, + 86, + 170, + 153, + 85, + 122, + 169, + 169, + 169, + 85, + 101, + 149, + 166, + 150, + 85, + 106, + 170, + 170, + 101, + 85, + 149, + 150, + 154, + 154, + 70, + 90, + 106, + 105, + 169, + 85, + 105, + 89, + 101, + 165, + 85, + 106, + 170, + 166, + 149, + 85, + 85, + 166, + 170, + 164, + 101, + 166, + 170, + 154, + 149, + 86, + 150, + 154, + 86, + 89, + 90, + 170, + 106, + 105, + 101, + 85, + 166, + 170, + 168, + 101, + 165, + 166, + 166, + 165, + 85, + 153, + 154, + 149, + 85, + 86, + 170, + 170, + 89, + 89, + 101, + 166, + 165, + 101, + 85, + 170, + 170, + 166, + 149, + 85, + 89, + 102, + 149, + 85, + 86, + 170, + 170, + 165, + 85, + 85, + 169, + 150, + 149, + 85, + 106, + 170, + 170, + 169, + 85, + 86, + 85, + 101, + 165, + 166, + 154, + 170, + 90, + 85, + 85, + 90, + 106, + 89, + 149, + 86, + 154, + 170, + 154, + 170, + 85, + 85, + 90, + 150, + 101, + 106, + 170, + 165, + 101, + 150, + 169, + 170, + 86, + 150, + 85, + 85, + 170, + 154, + 170, + 169, + 85, + 85, + 150, + 149, + 106, + 90, + 90, + 90, + 149, + 169, + 169, + 150, + 149, + 85, + 86, + 170, + 106, + 101, + 169, + 85, + 151, + 149, + 105, + 85, + 170, + 149, + 106, + 149, + 101, + 105, + 166, + 169, + 86, + 102, + 165, + 106, + 149, + 89, + 150, + 165, + 89, + 154, + 154, + 165, + 90, + 101, + 101, + 150, + 86, + 90, + 170, + 170, + 169, + 86, + 90, + 85, + 90, + 90, + 150, + 165, + 106, + 165, + 90, + 154, + 85, + 149, + 170, + 166, + 169, + 105, + 101, + 149, + 106, + 86, + 165, + 150, + 90, + 149, + 154, + 149, + 165, + 85, + 170, + 149, + 106, + 149, + 85, + 166, + 86, + 170, + 85, + 90, + 154, + 86, + 149, + 170, + 148, + 22, + 255, + 149, + 85, + 85, + 90, + 170, + 85, + 106, + 149, + 85, + 170, + 165, + 86, + 170, + 64, + 47, + 253, + 1, + 105, + 69, + 191, + 233, + 85, + 90, + 170, + 85, + 170, + 149, + 106, + 224, + 11, + 255, + 0, + 27, + 229, + 111, + 249, + 0, + 90, + 191, + 164, + 22, + 234, + 70, + 180, + 3, + 255, + 128, + 7, + 249, + 11, + 253, + 0, + 107, + 254, + 164, + 6, + 186, + 69, + 120, + 2, + 255, + 208, + 2, + 254, + 70, + 254, + 64, + 31, + 254, + 149, + 86, + 186, + 149, + 100, + 3, + 255, + 192, + 7, + 254, + 10, + 254, + 64, + 31, + 249, + 65, + 90, + 169, + 86, + 0, + 127, + 252, + 0, + 127, + 225, + 175, + 224, + 2, + 255, + 148, + 86, + 169, + 85, + 144, + 15, + 255, + 64, + 11, + 249, + 91, + 253, + 0, + 127, + 229, + 22, + 186, + 65, + 80, + 31, + 255, + 128, + 7, + 249, + 91, + 253, + 0, + 111, + 233, + 22, + 250, + 85, + 64, + 47, + 255, + 64, + 10, + 249, + 95, + 252, + 0, + 111, + 245, + 86, + 169, + 84, + 0, + 255, + 248, + 0, + 110, + 85, + 191, + 224, + 1, + 255, + 149, + 106, + 148, + 80, + 11, + 255, + 192, + 6, + 249, + 87, + 254, + 64, + 11, + 249, + 86, + 254, + 64, + 0, + 255, + 252, + 0, + 90, + 85, + 191, + 228, + 1, + 191, + 149, + 106, + 149, + 64, + 15, + 255, + 128, + 6, + 165, + 95, + 254, + 0, + 42, + 230, + 170, + 165, + 85, + 0, + 255, + 248, + 0, + 89, + 22, + 255, + 208, + 2, + 170, + 170, + 233, + 89, + 148, + 1, + 255, + 240, + 5, + 80, + 27, + 254, + 80, + 85, + 22, + 254, + 149, + 105, + 85, + 97, + 15, + 255, + 65, + 84, + 2, + 191, + 229, + 169, + 64, + 91, + 234, + 170, + 85, + 106, + 149, + 4, + 255, + 101, + 165, + 0, + 63, + 230, + 174, + 144, + 26, + 165, + 106, + 169, + 170, + 165, + 102, + 153, + 85, + 85, + 102, + 170, + 85, + 170, + 85, + 169, + 85, + 106, + 86, + 170, + 170, + 165, + 85, + 106, + 166, + 170, + 149, + 86, + 170, + 169, + 85, + 85, + 105, + 170, + 170, + 85, + 86, + 170, + 165, + 105, + 85, + 90, + 170, + 85, + 90, + 170, + 90, + 169, + 85, + 90, + 170, + 149, + 85, + 105, + 150, + 106, + 165, + 85, + 106, + 154, + 106, + 165, + 85, + 86, + 170, + 170, + 154, + 85, + 90, + 170, + 85, + 90, + 85, + 90, + 170, + 149, + 106, + 170, + 149, + 86, + 170, + 86, + 165, + 149, + 149, + 170, + 105, + 86, + 169, + 89, + 170, + 86, + 105, + 85, + 170, + 166, + 170, + 149, + 106, + 169, + 85, + 170, + 85, + 86, + 105, + 166, + 85, + 169, + 89, + 170, + 85, + 106, + 89, + 106, + 149, + 90, + 101, + 170, + 149, + 86, + 86, + 170, + 169, + 170, + 85, + 86, + 169, + 90, + 170, + 85, + 106, + 105, + 170, + 165, + 86, + 149, + 90, + 169, + 90, + 169, + 89, + 102, + 150, + 90, + 150, + 90, + 86, + 170, + 85, + 90, + 89, + 149, + 106, + 101, + 86, + 85, + 165, + 105, + 106, + 106, + 170, + 89, + 85, + 149, + 86, + 86, + 170, + 90, + 170, + 149, + 86, + 85, + 101, + 106, + 149, + 101, + 106, + 170, + 169, + 85, + 101, + 85, + 149, + 170, + 154, + 170, + 154, + 85, + 89, + 89, + 85, + 170, + 105, + 90, + 90, + 106, + 105, + 105, + 101, + 85, + 150, + 169, + 85, + 90, + 170, + 170, + 105, + 85, + 101, + 149, + 85, + 106, + 169, + 169, + 169, + 165, + 166, + 149, + 85, + 102, + 150, + 170, + 154, + 149, + 90, + 86, + 85, + 102, + 165, + 154, + 150, + 170, + 90, + 89, + 89, + 22, + 106, + 170, + 106, + 149, + 165, + 105, + 90, + 86, + 150, + 165, + 165, + 169, + 105, + 153, + 84, + 101, + 126, + 170, + 85, + 90, + 154, + 105, + 165, + 150, + 154, + 89, + 105, + 169, + 165, + 165, + 101, + 29, + 46, + 109, + 41, + 86, + 90, + 150, + 150, + 90, + 90, + 89, + 154, + 170, + 105, + 169, + 165, + 45, + 125, + 185, + 101, + 90, + 90, + 154, + 25, + 25, + 106, + 165, + 90, + 105, + 101, + 166, + 85, + 52, + 206, + 215, + 25, + 29, + 102, + 151, + 73, + 89, + 101, + 165, + 150, + 153, + 101, + 165, + 148, + 56, + 125, + 249, + 149, + 89, + 105, + 166, + 150, + 74, + 45, + 105, + 165, + 169, + 120, + 165, + 148, + 52, + 185, + 245, + 165, + 85, + 105, + 185, + 101, + 149, + 215, + 154, + 89, + 105, + 109, + 121, + 164, + 40, + 124, + 249, + 165, + 25, + 105, + 174, + 105, + 40, + 105, + 169, + 165, + 102, + 151, + 90, + 105, + 13, + 46, + 126, + 105, + 9, + 90, + 107, + 154, + 70, + 75, + 90, + 90, + 90, + 149, + 214, + 150, + 67, + 135, + 235, + 149, + 129, + 145, + 170, + 245, + 161, + 149, + 230, + 166, + 169, + 169, + 120, + 117, + 144, + 226, + 251, + 169, + 100, + 37, + 106, + 174, + 29, + 25, + 42, + 154, + 154, + 90, + 151, + 150, + 149, + 29, + 109, + 170, + 82, + 70, + 70, + 165, + 229, + 165, + 86, + 89, + 153, + 170, + 165, + 101, + 105, + 81, + 217, + 234, + 118, + 105, + 85, + 86, + 166, + 166, + 165, + 85, + 105, + 105, + 154, + 166, + 101, + 150, + 105, + 166, + 89, + 90, + 106, + 169, + 149, + 89, + 86, + 90, + 89, + 105, + 105, + 166, + 154, + 89, + 105, + 165, + 149, + 165, + 106, + 170, + 154, + 85, + 149, + 85, + 105, + 106, + 150, + 89, + 101, + 166, + 154, + 86, + 90, + 105, + 166, + 150, + 154, + 169, + 105, + 85, + 85, + 165, + 166, + 154, + 90, + 89, + 101, + 165, + 154, + 74, + 6, + 166, + 249, + 169, + 21, + 70, + 171, + 234, + 168, + 100, + 101, + 170, + 150, + 150, + 74, + 90, + 169, + 15, + 15, + 230, + 160, + 36, + 42, + 175, + 214, + 145, + 194, + 170, + 174, + 90, + 88, + 57, + 106, + 80, + 244, + 252, + 106, + 1, + 193, + 250, + 254, + 70, + 66, + 214, + 249, + 169, + 26, + 15, + 135, + 208, + 62, + 47, + 6, + 128, + 120, + 63, + 175, + 144, + 144, + 185, + 189, + 90, + 70, + 195, + 225, + 228, + 15, + 139, + 208, + 224, + 15, + 15, + 231, + 224, + 84, + 47, + 95, + 145, + 149, + 180, + 189, + 41, + 3, + 240, + 248, + 40, + 2, + 226, + 253, + 185, + 6, + 71, + 231, + 228, + 105, + 110, + 31, + 75, + 128, + 124, + 63, + 6, + 64, + 124, + 127, + 91, + 129, + 96, + 189, + 126, + 6, + 150, + 210, + 245, + 104, + 15, + 195, + 240, + 100, + 7, + 199, + 245, + 164, + 22, + 15, + 214, + 160, + 105, + 105, + 110, + 74, + 64, + 252, + 63, + 6, + 64, + 125, + 127, + 90, + 64, + 85, + 190, + 110, + 70, + 150, + 146, + 229, + 165, + 3, + 211, + 240, + 36, + 2, + 225, + 248, + 120, + 5, + 90, + 170, + 169, + 105, + 105, + 31, + 91, + 144, + 63, + 15, + 194, + 128, + 31, + 79, + 210, + 208, + 6, + 155, + 230, + 165, + 102, + 145, + 245, + 105, + 65, + 244, + 252, + 25, + 0, + 184, + 126, + 26, + 0, + 90, + 110, + 90, + 85, + 89, + 27, + 150, + 148, + 15, + 195, + 240, + 164, + 7, + 210, + 245, + 180, + 5, + 166, + 185, + 105, + 89, + 100, + 185, + 110, + 84, + 47, + 31, + 130, + 64, + 27, + 91, + 234, + 149, + 21, + 90, + 150, + 165, + 106, + 70, + 225, + 185, + 80, + 125, + 191, + 85, + 64, + 106, + 107, + 170, + 85, + 86, + 170, + 170, + 150, + 169, + 26, + 86, + 165, + 145, + 185, + 254, + 85, + 80, + 105, + 110, + 170, + 85, + 85, + 153, + 170, + 170, + 149, + 105, + 90, + 90, + 84, + 105, + 110, + 90, + 85, + 86, + 170, + 169, + 165, + 85, + 86, + 170, + 165, + 101, + 105, + 106, + 169, + 85, + 106, + 170, + 169, + 85, + 90, + 170, + 154, + 165, + 85, + 86, + 169, + 105, + 89, + 86, + 154, + 165, + 149, + 86, + 170, + 169, + 105, + 85, + 90, + 170, + 86, + 85, + 170, + 106, + 154, + 165, + 85, + 105, + 90, + 85, + 150, + 166, + 169, + 105, + 90, + 90, + 149, + 169, + 106, + 106, + 170, + 165, + 105, + 86, + 154, + 90, + 165, + 90, + 166, + 90, + 149, + 86, + 169, + 86, + 166, + 101, + 106, + 169, + 165, + 89, + 86, + 165, + 106, + 170, + 86, + 169, + 90, + 106, + 90, + 149, + 170, + 90, + 154, + 165, + 170, + 154, + 165, + 90, + 86, + 165, + 170, + 86, + 90, + 149, + 170, + 85, + 85, + 102, + 169, + 89, + 150, + 166, + 169, + 86, + 165, + 89, + 90, + 106, + 85, + 106, + 150, + 166, + 149, + 90, + 149, + 150, + 85, + 153, + 86, + 169, + 105, + 105, + 86, + 166, + 169, + 105, + 106, + 153, + 106, + 101, + 90, + 105, + 90, + 85, + 170, + 86, + 166, + 149, + 102, + 86, + 149, + 165, + 154, + 105, + 150, + 149, + 106, + 86, + 149, + 154, + 166, + 86, + 170, + 86, + 101, + 89, + 106, + 89, + 153, + 90, + 150, + 170, + 86, + 150, + 166, + 170, + 89, + 86, + 150, + 150, + 149, + 101, + 90, + 165, + 169, + 106, + 150, + 89, + 169, + 102, + 90, + 85, + 149, + 169, + 86, + 169, + 150, + 149, + 149, + 165, + 105, + 165, + 165, + 169, + 105, + 101, + 165, + 149, + 85, + 105, + 90, + 149, + 166, + 105, + 90, + 150, + 85, + 166, + 153, + 166, + 105, + 166, + 154, + 166, + 89, + 86, + 166, + 169, + 105, + 105, + 101, + 106, + 90, + 153, + 106, + 90, + 149, + 169, + 86, + 169, + 166, + 89, + 149, + 106, +}; diff --git a/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/cornell/dpcm_1bit/Makefile b/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/cornell/dpcm_1bit/Makefile new file mode 100644 index 0000000..609e6e2 --- /dev/null +++ b/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/cornell/dpcm_1bit/Makefile @@ -0,0 +1,186 @@ + +##########------------------------------------------------------########## +########## Project-specific Details ########## +########## Check these every time you start a new project ########## +##########------------------------------------------------------########## + +MCU = atmega168 +F_CPU = 8000000 +BAUD = 9600 +## Also try BAUD = 19200 or 38400 if you're feeling lucky. + +## This is where your main() routine lives (without .c extension) +TARGET = speech_1_bit_diff +## If you've split your program into multiple .c / .h files, +## include the additional source here (without the .c or .h extension) +LOCAL_SOURCE = + +EXTRA_SOURCE_DIR = ../../../learningAVR/ +EXTRA_SOURCE_FILES = USART + +##########------------------------------------------------------########## +########## Programmer Defaults ########## +########## Set up once, then forget about it ########## +########## (Can override. See bottom of file.) ########## +##########------------------------------------------------------########## + +PROGRAMMER_TYPE = usbtiny +# extra arguments to avrdude: baud rate, chip type, -F flag, etc. +PROGRAMMER_ARGS = + +##########------------------------------------------------------########## +########## Makefile Magic! ########## +########## Summary: ########## +########## We want a .hex file ########## +########## Compile source files into .elf ########## +########## Convert .elf file into .hex ########## +########## You shouldn't need to edit below. ########## +##########------------------------------------------------------########## + +## Defined programs / locations +CC = avr-gcc +OBJCOPY = avr-objcopy +OBJDUMP = avr-objdump +AVRSIZE = avr-size +AVRDUDE = avrdude + +## Compilation options, type man avr-gcc if you're curious. +CFLAGS = -mmcu=$(MCU) -DF_CPU=$(F_CPU)UL -DBAUD=$(BAUD) -Os -I. -I$(EXTRA_SOURCE_DIR) +CFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums +CFLAGS += -Wall -Wstrict-prototypes +CFLAGS += -g -ggdb +CFLAGS += -ffunction-sections -fdata-sections -Wl,--gc-sections -Wl,--relax +CFLAGS += -std=gnu99 +## CFLAGS += -Wl,-u,vfprintf -lprintf_flt -lm ## for floating-point printf +## CFLAGS += -Wl,-u,vfprintf -lprintf_min ## for smaller printf + +## Lump target and extra source files together +TARGET = $(strip $(basename $(MAIN))) +SRC = $(TARGET).c +EXTRA_SOURCE = $(addprefix $(EXTRA_SOURCE_DIR), $(EXTRA_SOURCE_FILES)) +SRC += $(EXTRA_SOURCE) +SRC += $(LOCAL_SOURCE) + +## List of all header files +HEADERS = $(SRC:.c=.h) + +## For every .c file, compile an .o object file +OBJ = $(SRC:.c=.o) + +## Generic Makefile targets. (Only .hex file is necessary) +all: $(TARGET).hex + +%.hex: %.elf + $(OBJCOPY) -R .eeprom -O ihex $< $@ + +%.elf: $(SRC) + $(CC) $(CFLAGS) $(SRC) --output $@ + +%.eeprom: %.elf + $(OBJCOPY) -j .eeprom --change-section-lma .eeprom=0 -O ihex $< $@ + +debug: + @echo + @echo "Source files:" $(SRC) + @echo "MCU, F_CPU, BAUD:" $(MCU), $(F_CPU), $(BAUD) + @echo + +# Optionally create listing file from .elf +# This creates approximate assembly-language equivalent of your code. +# Useful for debugging time-sensitive bits, +# or making sure the compiler does what you want. +disassemble: $(TARGET).lst + +disasm: disassemble + +eeprom: $(TARGET).eeprom + +%.lst: %.elf + $(OBJDUMP) -S $< > $@ + +# Optionally show how big the resulting program is +size: $(TARGET).elf + $(AVRSIZE) -C --mcu=$(MCU) $(TARGET).elf + +clean: + rm -f $(TARGET).elf $(TARGET).hex $(TARGET).obj \ + $(TARGET).o $(TARGET).d $(TARGET).eep $(TARGET).lst \ + $(TARGET).lss $(TARGET).sym $(TARGET).map $(TARGET)~ \ + $(TARGET).eeprom + +squeaky_clean: + rm -f *.elf *.hex *.obj *.o *.d *.eep *.lst *.lss *.sym *.map *~ + +##########------------------------------------------------------########## +########## Programmer-specific details ########## +########## Flashing code to AVR using avrdude ########## +##########------------------------------------------------------########## + +flash: $(TARGET).hex + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U flash:w:$< + +## An alias +program: flash + +flash_eeprom: $(TARGET).eeprom + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U eeprom:w:$< + +avrdude_terminal: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nt + +## If you've got multiple programmers that you use, +## you can define them here so that it's easy to switch. +## To invoke, use something like `make flash_arduinoISP` +flash_usbtiny: PROGRAMMER_TYPE = usbtiny +flash_usbtiny: PROGRAMMER_ARGS = # USBTiny works with no further arguments +flash_usbtiny: flash + +flash_usbasp: PROGRAMMER_TYPE = usbasp +flash_usbasp: PROGRAMMER_ARGS = # USBasp works with no further arguments +flash_usbasp: flash + +flash_arduinoISP: PROGRAMMER_TYPE = avrisp +flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P /dev/ttyACM0 +## (for windows) flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P com5 +flash_arduinoISP: flash + +flash_109: PROGRAMMER_TYPE = avr109 +flash_109: PROGRAMMER_ARGS = -b 9600 -P /dev/ttyUSB0 +flash_109: flash + +##########------------------------------------------------------########## +########## Fuse settings and suitable defaults ########## +##########------------------------------------------------------########## + +## Mega 48, 88, 168, 328 default values +LFUSE = 0x62 +HFUSE = 0xdf +EFUSE = 0x00 + +## Generic +FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m + +fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) \ + $(PROGRAMMER_ARGS) $(FUSE_STRING) +show_fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nv + +## Called with no extra definitions, sets to defaults +set_default_fuses: FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m +set_default_fuses: fuses + +## Set the fuse byte for full-speed mode +## Note: can also be set in firmware for modern chips +set_fast_fuse: LFUSE = 0xE2 +set_fast_fuse: FUSE_STRING = -U lfuse:w:$(LFUSE):m +set_fast_fuse: fuses + +## Set the EESAVE fuse byte to preserve EEPROM across flashes +set_eeprom_save_fuse: HFUSE = 0xD7 +set_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +set_eeprom_save_fuse: fuses + +## Clear the EESAVE fuse byte +clear_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +clear_eeprom_save_fuse: fuses diff --git a/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/cornell/dpcm_1bit/Speech_1_bit_diff.m b/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/cornell/dpcm_1bit/Speech_1_bit_diff.m new file mode 100644 index 0000000..843a9cb --- /dev/null +++ b/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/cornell/dpcm_1bit/Speech_1_bit_diff.m @@ -0,0 +1,84 @@ + +% Speech encoder for Mega644/GCC decoder +clear all + +%===================================%the Encoder +[d,r] = wavread('mega644small.wav'); %4 +%scale to about unity +res = 1/(max(max(d),abs(min(d)) )); +dd = diff(d * res); +%init the code vector +ddcode = zeros(1,length(dd)); + +brkpt1= 0 ; +%quantize the first derivative +ddcode(find(dd=brkpt1)) = 1; + +%make the length of ddcode a multiple of 8 +ddcode = [ddcode,zeros(1,8-mod(length(ddcode),8))]; +length(ddcode) +index=1; +for i=1:8:length(ddcode) + packed(index)= ... + ddcode(i)*128 + ddcode(i+1)*64 + ... + ddcode(i+2)*32 + ddcode(i+3)*16 + ... + ddcode(i+4)*8 + ddcode(i+5)*4 + ... + ddcode(i+6)*2 + ddcode(i+7) ; + index=index+1; +end +%make a textfile with GCC source code in it. +fname='mega644_1_bit.h'; +fid = fopen(fname,'w'); +fprintf(fid,'const prog_uint8_t mega644[%d]={\r',length(packed)); +for i=1:length(packed)-1 + fprintf(fid,' %5d,\r',packed(i)); +end +fprintf(fid,' %5d};\r',packed(end)); +fclose(fid); + +%===================================%the Decoder +%value based on quantizer +value = [-.16, .16]; +dl(1)=0; +j=2; +highpassfactor = 1/8; +for i=1:length(packed) + p1 = round(bitand(packed(i),128)/128); + p2 = round(bitand(packed(i),64)/64); + p3 = round(bitand(packed(i),32)/32); + p4 = round(bitand(packed(i),16)/16); + p5 = round(bitand(packed(i),8)/8); + p6 = round(bitand(packed(i),4)/4); + p7 = round(bitand(packed(i),2)/2); + p8 = round(bitand(packed(i),1)/1); + + %note that a bit of highpass has been added to reduce drift + dl(j) = dl(j-1)+ value(p1+1) - highpassfactor * dl(j-1); + j=j+1; + dl(j) = dl(j-1)+ value(p2+1) - highpassfactor * dl(j-1); + j=j+1; + dl(j) = dl(j-1)+ value(p3+1) - highpassfactor * dl(j-1); + j=j+1; + dl(j) = dl(j-1)+ value(p4+1) - highpassfactor * dl(j-1); + j=j+1; + dl(j) = dl(j-1)+ value(p5+1) - highpassfactor * dl(j-1); + j=j+1; + dl(j) = dl(j-1)+ value(p6+1) - highpassfactor * dl(j-1); + j=j+1; + dl(j) = dl(j-1)+ value(p7+1) - highpassfactor * dl(j-1); + j=j+1; + dl(j) = dl(j-1)+ value(p8+1) - highpassfactor * dl(j-1); + j=j+1; +end +% dl(1)=0; +% for i=1:length(ddcode) +% dl(i) = dl(i-1)+ value(ddcode(i)+1) - .125*dl(i-1); % .* w'; +% end + +%return +%====================================%playback and graphing +% sound(dl,r); +dl = dl/(max(abs(dl))+.001); +wavwrite(dl', 'mega644_1_bit.wav'); + diff --git a/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/cornell/dpcm_1bit/Welcome4760small.wav b/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/cornell/dpcm_1bit/Welcome4760small.wav new file mode 100644 index 0000000000000000000000000000000000000000..bc26990a081a5bded88ec5a7c361a8218d53bd16 GIT binary patch literal 44228 zcmeFaSCb=an%_6P)1|(FbSYg)ONk8b&d$#9?W?=1yUTk6?>&$}!lZ%s9w^_wk3TbK z*3AyN6oV^?5ekKLp|7Lg^P;+snVDUR5sZ*RC#wntBr@N8?PLCrd6#c}^2u*M``OP{ z-(UII;g9{-|K-nq_OpM+&wKyX&(z;P``Lf-v!ngk{)B4^KOH~y!2j2KAphgzM-3`2 zj#8;ww+*9I$ma`%ysqncUUK~Ac#&6i$mv3{R5A?HvTWNfm&^RAH>M>w>p3lx&ZLs@ zXe8+O_!EgpGFvK@jY_j#Hmasw%;yawS1g(Q7-iEaRiunct!7s%Wr{FOs$&$31^($; zHWBfAjt@5;Z_gU)oeVl>Osd8gSPRO`BFmvg0htx;*V zMvYptQ!`6?QH%Nlj_oH;p4|D1+l5e6pS*eVdGp(s^Q4~e`|oWYrgvlc?#XOA|Mk3Y zHwt>dkc7#)H)-H~+ z&Yi7r>Y!A(y14AT`Fz+YmG%5#RJSu`eR?$+pT8RSsZ=Qv%f!4#``fEaOE+))@}Utd zmS4R2=1uQc)4nfr;NN+$?oPVR;`!yv;mc1i2X*=;63-Y}%kIzTqmzqCw`>-3ey`WF zzqz)#zx(9T>dIy=m$rtJ(^+#gt!ueNBIb8z@;S3LdiMJ1t1n(((l@nYD#uvnOO+~v zR?20Qv9NP*Z*P~sqvL&ND4xwXn(bP%*{T>t(<~KA)mo#`8BIsS$#}@nRSWqn!&1=m z*<4ynW|E0SJQ4|qBmBf8!B9992}k2uEnl+gwPwBBZZ;dOX0u$cv?}#-xoVe9n*rC2 zT%O8hvsyOIUpAM`FkQ5auJM=Q6K6E$t8Nqwt7w*N=7V9EOv5Z19F}ELISz}7Q!+|2 zO$s{mInS(Rq_cWf&t>x(vs5ogi*xycu4fBbnag@HU*cm?=e1BM7+SeB`f~wX&r=ml!!_eM!%ia>as`wbPYUB~|7& zDqv)7t*r62ovCDM$!f;T(S?R)Ws9^hSI{lJXynUsl8Y&XwiJ28(+YWu+w+EQWz8Hv zsd}oGvUA0}R!TKujYuQWNZM(WkC{rEHC0Pg;^nNKr<^n`r0kMbPE_?0y-h9kQnsX7 z>2kV~sH6?8%=d+YX2q(Ra?;L}H6BT6StFk-u(S)howXCyR4rrVtpc57l=8)#O@*w2 zrJ4DPW@?qZonodGGj_3(EoEEjaBXFG6&MV| zD&@--lgqAEY}>4wWxc|B*W!t2AnXbpdJetba3qy2*yUz(&>i)M{o!EH8}$18bUD## zSInZ83MknW!aj(}bu|Ogreeeht-ad_kkX_jTQ$J{#@4ywg$Hl2O6Koc>r|FB!e=sMG7vtYX1rW)+Jyvr+4I2JLpI-Kn(9 zPO+J7Xf@4b@@F+Ior=Z$L8p7y;|Y2Kp(GrsSgkhTI}N*RnGC&QR?1b5Mx#=%H0-)X zfu%~(GT&i=S-GEp~Q=B==`&CqgXH0_^TAEdbwa)&~hW6Pv^tAVA2=&xt&Lc z#|QpYAzP`i0?N&5HD5^Oa#T3asx_;PW~<%ov>LTqRel?dM!jBd)XJ5zZ5H)xIvELi zT}OM{TN~?Z%MW(iR<$#E@#b8w+ohOmKafvp#rpW9S8cWJeAu5XWHqBcIT;ORC*!td zR;#92?Tkju~mZYuKZ^%Jqg_?T$yI!RTZ*==QqpdJ(o3bnS0$ZfB+c3muS9FB4?M1rAFPz#S&1XtXc1m`n}$u+pN`l;~B?v)UgX%GU7Wv zI1om;yY=|)ZD+jBcoxYKV zZved+3`e7Wr&TYP5Nbj`=h6QD{_f_=@?$4cMJp8TwyEb$)2cv(M7bslW5J$~?TZDVD9&*MqJR_TFur`hNa zyRBBM(P=j-RThnr&%$|=$#^`GOhbE%7R7dY6grv8F&U5gTxu4yI0JsLwfgA6!}ayY ztGjM@JekOrJ9P?c4u_oDW$xIHIx~bO6Iuu?pE_H0YsU*H<1dudHou?Yn&ObiP>bbO-%@w>RuDs1OdLkQWg- zn`Y(H3$$MZoV-z~)mxo`%&Gaw>B)RLrVqHoEajP9^zHG%&gR<6<43DIJNrleNCIiO zN>#`GL3aQxMMgFlERmKVgp{30r&C%Mp}c5S>y1`-FrLn4C#S0D5fivd%jn*K*Lk?N zwf6YY@}rHd?R{4`n&XD{cra$d3`U(sg-M_aW@4q2QtNaor9oSf;iTZ66ik&Vcm}oa zazinfj)#0Ke|mU%d3j}XYxlqxO%;qveJ~kMhOEY6yIw{SD4_;G1({&!w3M69>4lP2 zt}w;=!^xCVPfw&=S#Wld6%lYB?`^FB;)mo+A*+Qfg;9nZr_s<9?e7USuXn z>zND5R9X%#hYV1zG&(&-ZF+inaYnHx(*dnB^GNIr+M|27Z{NQAa3h#CYt8Xs-m5^k zQ(7`@R@#uaddn(M#Y8HWLMuU5LW3z9_0C{8oQy`jZnxX-c6%-LidY}I<+WeQ?U%}u|1kjhwXN&QLVO+L*Sk* zNI}GXe0aFOe{{ILvHoP;V^>m!j@i-0io@R`2v|)SnCxpflk(B(lno^#<)~8Tx5fs`XC4g9ek2d-qoEeDMCC z@5T3xi&5o#R?Taf(6Kuejo13!;o145+iStUl1ymRhFo59&<%Z3L@o-GYPU^Jq=zvQ0*&!<@E_Tsj$a z9`8JPaPQ8+&T6z6OU*mx=&Dwk)G|donM7wURm$~No0-;XRV%DnM3)j$O%>)TY`p^M zhfMmMj=hbQE$8+gGEoYy)S0!~lL7qSDj`)Pb|Yr+baXBz2?`RwC|>AeqU={h?}vV% zB(WkB(Qwf35BhyU5vwv95*~_pxx!JU3Ke7rp*3hZ0x57PbO9O4E+bae(JhTinO;DF zu#0>x@IgX|GDV@6nF2Ia$_QbIVU%p!RV0%pldi^7C{{}+qki|n*4B=1#~CZc4Cw24 zP9N0JBa-n*7>WEOB^-K-FxT@o*&Q_J>k=vpSf;2!~zdZqY`C zKek%HIoX)saj><%bmw*;A27PFPM>$rPU`V!)a}@HhO(J_b2x?3^y~RdG8*#wqUnro z)jLSxil4%x@`hDyw0k0CG^<7~6$^Tu#}L5Hl{K%K(#wdT0}@I6%D&J z=++P(jVxS+k<2i8j7p=~Xdqh3%;69+(`q)VRxzJt{zSv!pwI2~I1ct*$xKGK8|_B9 zS}zv`5y-$j(9;dOf{20s58u}Fe5}#+UFyn;6XBzT^Z`3hD%K!^O+3bth(}{kPtFRj zP}7px$jC1y6EnbKI-@<5D}qpP8fgv%U*QHC3?T!ekjo&%XEGv@XPCpqY$=U$4y!;S z&lO>q=+7d)v(nIaOK8hXZVoD4D%k~eRm61@_1M(yTsh0qE^;w?eKCvH0Mikq4S+>T zF5n1w)`MQz=RZEf6%Ngfb!^1iA=^Xwao%PLyuel#coYM!~X^ ziFK{AuAGt>ZlQh|dQWwPw2H5!aH*%NqCA@e{ZYD} z3+2-5LP1#6lT>r0U>-*ez+E(O7lEEs&r=#>DC59=svD$(1&89Fdb~xMx|uF#7y`N< z=*mjjAW;P#Kyy%rxKHkuAKo#{43Lx|6{TG=_9i1GRnCDyfp$@4u8=`oObD4Lg2hN5 z6m`Zi2goEduau*@Sqm^q14^Rp@G&)VOhI{|+#xuZv_dZywTcF?Mb#K$9#+(Vq&Q=N zjv=0!)SCyD@?Zsst0>$SPqT9+3(k;7ac62Xltms66p=$q5M(l%0HVz5urj;atb=5> z+EAY+(iy4%JkUl!6y~02@&=r&^4%bmRI5SKbBzT8Au1qSm+`kx=l}%fWxGLB`(BvAk-Bhzfo&I&CCpRDUY2492gi5 zRz}gqqzOqy52!`zvAR|?6U|67T%{rLDw8hW2-h>Ya;z6?WwXt2BVDK_!MKHx=FMC= z1uSl4Xn>vtI4?nV4C(}nM*4tzl{MX3Jo<-mfcnAKprHi}28Dda1a1W6 z&eQMGA{jKn!sUt*m?HgdqaZM?F$4%OPd8FoQpVMld$$N;i%sZJ?V!Bgvl?NTIK!X9eKBVBcht%~)YfR*MS*L2@aoyWXq(+N+idb}g z$ceY_<^SS}>({pr`SE|MD791%_+u|`zrVgp)#JJ{s>+Kp7tQ=}`Ty~s7hS9xcHKPb zcGW+;sFuI&Ep=LIt4gQU(ry|mAK`WKfj6qU5Dn=S`6yqqNEdy?#ayN^BM3Bar3{8r zb+ssGVsjP4?c#t83+Vx0!fYE31^hmb$Kwrz6FF=eKsvov6_QdAiM!M5^|~FjOLSV4 zM)06$BoqvIP$nNO-MPQv$aXHj_~xr;<7y@x@P}easC6QdDOCGsFFyV3<@vBy)Y4j^ z-0Gt(H!M9F33!}`+mG*j_=}J39~P$H{QW=t{a2@U5Q>Y+lRwUA}aE zc6E6=?xJ#)bD^WH)yEI--T397{@FcW=d<7bo8LU|Vr8wAlFpUex7H)|lV{J)$GySH zvlr*xV$>hfs)OldI2dB!8I}{SgM(w2bNk*e{`sH$>2hNB)z`015r`(!PWIsb?T33& zvjbGvn7;Vz&9iA8JO%K-HmmhDWM^ERy{`s3% z^Lj4gI&%3LIltZo1RT#VpFcZkV@Witl~Td#%+6+gz)7=^4m$RCHkNPv;!l5mC~&;v4P%l_u<(p= zy9zdO*0#FMEXs5`>I-9ZEdpcCMkmka;G&%hhIoT2V|NG!J-cA}cUB|&-e#jaIzNAU z(HQrO@mSR1Ja9%r@qDwfYZT1Lp{_xjwCbh6NBA?V97>2_Oy0irAmo`Z0ij0M4wR@S}CyJ>Hz zRJGf~`D}1DtF@X%!0cc!h;C6ZiuHbXFq>l}7(om1sem!#ydd_{xY#vz)_43XM;U*} zC>NR_$%B(&of0xY(tr`sbiQEJ+wDFRdLpoEOB52S00f^(CZZv~`)F@tJ+QNpPPnyp z-UK%uo(#}mY)pyKa0)Xf^uLCUWHKF%fqlB28sa@P9>pbtbj(=#FoUeSJ!{@v#9wLV zYA5~rWZtN?%6W}iMiUq(jYFSP^7|;_5B@;=*O5KGhlvA zEM$G?K0X0COaFg?#?;A-DYAp-%q(H*)_UD&zO=|HCKV7WnqR)cOw|f9(AA#Uk^m;|Fil zIdz5?Y474&^+vV-`X=uD?%j2X(skcIe*Bs5=)Xn3st)F@T(8c_n|vO0djY4&2PM;i zTU13QdiOXg#TeKaU$Q9_G%N-(1=O4bJ(odJ2Q!L;w=!4djnsH?$n#iF@?4SnWZkGK zsYF3FU74EvXW}fTv|2HOe=c}~DA7znQM1vr!A`^CDItbe0F_)311Yd_1=}<$g*6L* z5q|-(YGL3|iaZmXxd#x-y+FFoql3NuV}GL5nw(vnjazmug%LNMRR^$t3-j5ykJp(j z8JHU=F_b};3Z>*S3D6Y)n(d9Xts{S~F}-^E;%rdKMuWi+ki3{evqif#nw`u>EsV-( zR5YOFCbj{*3E>I!U?v&E6A@eU>cgeg{fIq%_4!vXXSH0!;|oPWbj1RmE%)YEFD^#) ze4KOnN*fs$cn1W!i2=4K{15md>N{Aw|H+LJ}Mw5W6Q;q4o@9_@vV!R3qB&rW;Q64u%f zGL73G)9d4l=g+A~3E;b6A){k&Y4m4jXH(=|XcojP9S=%t9zDE&e|axfJAL!@=T|)o z+H3(Ljhefs7pjvqKE#+=(*`@Xc@7nuz&s(LXUi=_%>=zFs}o}bNetAbMFTady+kP182 z?tSv{t$Qn8`{K>(%hTzgY33r1&Gmy|rdVzcPtMLyMs+{x%g>*U`=i;Yn)d8%@B5O}-|An!xE$6N7z%EsMr()_elVV3 zCPctwNr>(fa__A@dbo7=-e!F8{BqbDUR(|GLATc*2n54%y)nBu={K64POYStkj&QZ zXgv7H%}6kriMfy5QN7&4mfRnW`*jn?A6!;S zn2_)enBbiuHf!-nz@O54j04N^!~2hp^}(=F?mc@o#UIGXhn< z9Eyc1x~C`~Bu^-uIFdrC)B&LrFjA-=v{=aD_2u9H$GK}t`R?C>!V6Je&`hD5*T>@I zA7wW0iunGUw+!R|cmL^xcZ}>mrSaFD{rmskj>hl($EaX8@Y~T0KsQ7scqOzhQ_ut* zD_LlvERw;uq})U%v9KM5ePb4%h@UH3rJTch$j}4i~+EX({Ki7 z)oean(9p2J>oNt(&NF9~c*au@=rf3XdKT5gF4i$wV9!Q0ETnVTbwK_Mo`m%;k2Z!K zF=G_~F_p-MM2QAkw8F#&_{+(M|Y7)KMc`=^&vcr6YqEx7E}C5p3MZ9`RYb!*kkJkG1ww^2+{ zk8j`j;6~}yH~)4PTwB`@nb~B%dj6}g=6TnizfkLqX0N{d{GuB7#jWwx}&FD|OihbwLi9A-X3 zr)^~XzHIN=r%(G#SFnd%GM%?Z~3#Wle=n2pIy_+9@a&KM#=Ig(G z>0bWDjiW4%Z2kV#Stq}@vKQ&T_~O;jOlHdUZo@F_&ScsvV>oX02W?6~sY?6z9xvUx zd3*VI{_WR)X{>+p%k?NWvO#xtHLwC}TRss#rWGw-z@4dL;=MEM*MVK?y?zJLK^!|% zLC4mUrCYb}J&Jwt)wi#_58k_bTo?k1_OCA6*?pQZeEH_QQA}shi)%Q5b_QLFFsogh zPVgjxBLY17j(0ckr@a4QZS?i4Ul&$y+&#?jsCIMwd}0MRccaboXXj0<-sN_U`D?dv zzAGDLT+l%Z-JG8EO7T$A z!XXUD^2wxuUsD<9MBF_Y7~m+HNk|XALMDPedO1EIZpXp)gOBeV7$+Bld?bvwc19~U zC-Xr?$0HOK$EbHlL-9Ssi5EY^4)_Q1OAW`@EH)C*X+y_Uh|ZBg{`Va2?d6=K0@H9gB$b^^+E^|A0`!og8GFbCP0MP9FZ4A?f^GPC&hmh3>>R7 zK8g6IqQ)pr$ZUbsQ#PoZIs{Wt%8>{sN_r6$O$i;MJ1#^PZdHe3pd!ZzJA5mR$i;H* zt#tEFz6rX{4&0@4u+W{bzoG$q6q)kA;`O28iK+2MD7Pdj{>2wsA&22wV)Al(V%l9wU{0TGj$z$c(F3W(uu>Zk-tym_Dk0@kPss&WOu;WLg6 zNFY2Dph|!xQ~_XOoi>BoG6{gdRVV_DW3)I2HY+|-3)eX52+_Ln^A-q+H)sI@c8MD) zSaDgDQ4nBe7q}f$jEM!pB|cB^V)3*UkEm;%o(V*AX>7TM=RON!fwT$8D^(-f3dJoN z3HYN3@D`qMwVJ3vS=>YglvQRSdI;?sZIfP6)_620k+u~aA@f*V|72$JR320j$(`EB zu`tKW*AfXR#`+Zgu)&B{((?5xF;d7KnLIN9hbxd<3`-b92|mCgEMp;HG|Nk^B9@S> zhU@vRKBxtuCJJX|#^PEgopIg8q9!P1fl-ng)2kdxO91o?h4o6N*eRo;=+w=?PEAlE z6N64f3_}W&rHS1P+Zn?zg{$c&Lq;#C>d8u#Z)D2Kp{|lTULUHyyqBpYH_5@>*V+hT zoP788&g=I|k4Y!uiISDFn%I}|Wyuj@rrTvK!D9cA)xq?}49t638Fa4f_7FV|<~lEv}+5BT93xk?R>nwE>fm;RQk-W97zsG10B{Q#~Cm6qDbrQCj9uOHmB zxLbOggKy*xIlgzTT>t;@kOJOLjK$oL@}v-X%v&W#-m7lobuo!$7W|>^{=G4m8`Yth zimLT@5B#pF-%Z)K*MI-N0w|UB{kp70E2a5zT=&J>K9N$@3Q_+TS1cN|XpbyHbzC<> zT_JNx4)tNt1K%65MGF>BmDlU5-d^|J7w_KvprY!ms^`1!|LHf2XS}`cZD+shmbYIl z{{Pbzy1xFqj$WL2Tdp+rhedw>(;sQ*+rs{lJL#(H2mPZLeg9$d{vW&e$JZ`Ct2^F4 zOiq3O{U5&Nr?Wrxz)wB!QxE*q13&e^Pd)Hc5B$^vKlQ**J@8Wx{L}+K^}tU(@KX=` z)B`{D!2ip7;2qBQ7JBVmNUo!y}urBn#Zz$1m(e;@&B4 znS#(=L(k%Gj1Qlr>LE@BcR)OH#NVgnZtST}P?3Es!okRwYtuK0_J)1LT{r16l%1+UqV=msp>^-76+9-GT| zZ+v{~$#&T2UB3F_)zeuQ=K~B-64Mk&6zY@9moKg+^+J-Ag>ibGV2sA#JxZr!%Y<%755gj7|9!13Pt zdvroU7nm)&Y)8p`EYR|s@{Gz5sq9k&R>8t?|Xx<@vN%)uZ0SJtB^uEZw<#Ts`^vsvS8#a6~Z9=Q~&UVwA#Of7%d# z{#LJ3$#{>P(Nb&B$H4|C|7xQ$HyPZ)rN$D8AT$KPR~xsGBoK`vILaj|GK%heCytFv@(4& zZpYmFj!0TURXVdP5_%;4zDT~(#4kvUaD@z3yL^@O7@bCgAdT}2Lb7F^XJhW2m6i4N zjmJy(1F`<|lM_9>cj(Gk6;jmoCMV~kiWc-m$avEv^aU4IF=^BS|t@ye>|H{#i~Mc)edWoHKS5R&9Jk9=EY8@a$t1^u zR6#}^AsS6C!kdk#mq>uHHn*Eq>UKL__@t1sMWQ&!O@u23 zktO1yP6_yjC^96rRb{-prjjbwgA=S_F+I}?6$&Ha9oWYuua&Z+3V~K;Q?aWF(dP48 zdQFMyP~N7zyQbd%gjwUqEMW0jF@m37{?mKl4|i+6U=cYdHsw+&n=Dk#WYVY>lNoIJ zDV!|D`-b6VVG>lI%aBneY4#d9eDm-xzz2gkGw~$RaTt#UszWBM8E*BDdwVcZn zU?+|ucx8*#ogAJlf|Oou*haO1zfv(LJ`#8@FbQ$0kc>t$({MBqcLCz_B#P1$?kkgu zI*>O>yu1l-k~|fp&Mg(m^2Cx3M`E#nmlVccUw{m{F)~Y(8$DPXUiVWXE&Hu{9R^9p zrkc!lvO3{w?_qKHye^l=wZF5ywYBGp>Sm=gCVWc*z$C~?!m%VocX~P=kZrI9-R#t> zq&;fkYhmOP(RhNWSBJxWyuW*}zxCwd11ISnnnI39MO#RQ0%48J0+s|XRPf1W`NDAr z@*))*UL-^!?2{Xj_>7gu$2GhMNBzN|7;qDV7>{dpVbzplq#|TK zW*J$HPM3_UlJ~*18iVl|AIWZq?0F(vh|39aBY2Rx9B!P>_jYy<-0AjMQRzY|gs*3T zU|4)It7evzK}lRmRqCD+u@4DS;$6p&kQ+*}AK}Ojomm``V@|S45uHao$>G7_K2Bvv zUY)#JbpwYRoIw)lVy!!b+2X|lw@sxOWnv|8WxyFkJ~Fc)E(9BrdL6fE zIj*ayYUR*_m_uNR1mQVI?sn`COJb~8T0&gN&wx;cmpimgyv=xrP=(jY!b?Tu93fX! zN&@}y0Txat!VQ8BgCz4L zhQ)F0^mrNmxMV9OVq7S=cq%F9enwfmgs7_$W>r(wV;6ZmaKGcBGHfz%Jb3Y3=^z>@ zw4P*h{c^ii|A?mpqPxo)wlMLaT_G^e|m4zETT*pmK-M(n?Jt zn0TT@waYVA4UHw3gRsZpF#u=$4Dwg`~tnpLsbx!dY-DTNbKr~ zJd)$ub&4oQmLpjOS+ZoVT0Bq988wP>gG63QtRoLY7L#avuSDY$^_WaE2}yn06wgHE zbOpr`E~TDDHB|$Nf)KAPx?FW80sFW$(?Euj#z}HUnVpFK>H#G1CQP0q#6f&(C<2k7 zSr9M!Mnz<*9=VqMrA-`)mEx+&EEb(b=B6Cddke2LmeisV;>U?=BuWm`OS$MPb_>gu z!MrX``G(+I1~*m;invWK94CJ`_QDf>pU{fdkONPWUxapGPrC?d&vYX402D^|d z6RVgjbBQE(A{B|G8c_~uh6dZjr<26okS*d05 zq(_8AyhJ6R6*Cl1JfYcg855m}t%LyB7qw$zi{dP9O)L*+5EOesi_n!q~gH|T(M9tsFkARs;p}PUiog4XHZ}O*#GYKE=3`S6(l;72z=5-N}ME#T9L~n zw4B8IHuX|O8p4UfBW+ZUe~Q>r6q1C`d9bs+@ARYTW(x$z6Oc#7V0`Qew_$SxA$%!` zPnE2~pft3xt-RA!ybR(Zvp}YgWEXbq?`-Wky|6Hixc@Ht{BsZ$jd zn#8fldy;cfqS1v0F+=eU6_Oq$r3tCI_njU;uES=d(jsY|YSq z(t0oUz7lA~=QuprcOD)Fh(oliR&zG#%t-szYtxaSA7q$`lC&78soIp}2t?tK9+Pye zaHgC_WToVzB-Fw0J>K6tcJ6rL(UNd|H0e%G$>q@DLaGxZ*IO(_*V*MppHY~R8o5ty zae@}W=@8X&@Zd};8b*sg*mWH52BP5@xxc%p|74u#wOgqE=}3^|31Ng=^4Ky}$@MTJ zt1covnJ*BbBzFRo7MF8`W|@qKhui*0C`pcx!DKdJy^;5u_=kAF7xMc<2_|E;1x`m& z(61ZgKEgC9ypP7;W_4#42{*IkiNf~5R|**S>Mv{P>s$=~L83G$f0=e{-Q zjn7Y~68zdCc^q{miF}s)<gNzzEkjY$?yszZgOO5|XZPm82ryyvXcnXI1Fg|dk+B#ornZG$Y2 zvO>9*$OnmQAyp>?L~h}QSF)@@4xmnw3sn87tda6KRVtUL0wv#@JVcU`sjQFXw8{?2 z_i|R!XG%g#l?#(o!p?c1B(zZ3D^+zQJVU-97(}wjNmfd!26s!+Nm9j0 z5Gg6ph?b-@5d*HXSIYC~2?Q2-249n^($MHC(qGycDODOp9cZc4R(ee;!6j0tyvdNV zl8l_}Rl*55pCKU}2~1V~Oj=HYNjgwKHkIF!>~I#j;_O8>Qkr6u!>*cCt(Ar`AXJc! zB2gTXpuD3>?8&mo4oW&Xc8Wog_)Q?9<$CK_YPZrE9+pT12FXv@+ z$qP%bs+6FrVdTvuHUL7vph}KVI*h-(p+RYMN-MHq3%yGNNYzLGNlh49#GOS4@(quc z_Xti5qh#A8l2r*`GNIVmM*VP`OdDAPG6{qaVj_^wysC*uzCP|EYb~INP&c$_w)s)v zSIi<-s8K>f5K)G-KV$>q4}60&EE9yrOfn^blBDS&X~gdK<^j96q|!++NK$sqC-Ygq zO@3oiI)Ig$7N}r{#5xK=5K98Y8TL)a2?r_ASC^L$*H%ac#hx^^-fTQOy&&a%i^SG| z;_OHT5hrl1O{nMT`N{kg1f?g*wUNk32^w%5A8bBezPG!4-+OcrW9yyXXncBcfdJF2 z)=P;jXfs+(g3he8+a!3Jo|3?7I_|bfV*xOlPK14I4YRtkw7z=VwY%@n#mrV`G`T#R z&CikH*c=E83F$H7kPkHS=AcIs0Z1ueZBM{cWc6e`>^?qNeY~`L_pWzk&z}tt)!3Uo zpU*GPn`5wei;N2KkRK&6h4jp>4nq<^pPY;*qh6D2ZALMZBq69{Z}q|U#{0g_4Rqg>LmlXL51goK8$|BE+V+EgMFVk-9GTq)2@sl+f2wLj+q5K!w3u=!m6m|8YT#_aO=>8@5?aVB(l`8o zErDVIU(n(5f;@!7Ns>U8B?o@H#f}kGi8&@WsR1@DDgeHpw-D39v?>V<4au#S$RQ(GU@d;3<_m zNbo732T_^nH%VHAXigZUa2i%T>>ZdLWg!|y%t;WdSR@JS0?v}G3qlA4L6Foe3;kZy z7(g&dH4qCzy$Smy z&>IXC9E$RUJD}@J5^uCFS)vkoxX#3q@-2b z{qE$ldpa2bIf5zZB-{(3#!6D76fg{t^>y~C>9XyJ;N4go3E~72W3{k`$$v;v|IOWl zCmzpnB5vkHD?GXApG`)@MN0$1@ff4i*pkWEh%N%IsCL<)m1K=e zpkTU=_cxxbI&bZHxBcN#veuY&$1lh8lT%V~OQxDwB%bhN&`;%Ui=g-}21R!GzzV=_ zUNnz95LtF?hy}^;xV`pdd+(q?LiNv z3FTSba3_zMmMka8%SrFFdh(LcHhWC zn>(Yym>qfun`fIOCKhB2p`HoB^a}cp_qSG-H+Swj-A6$Lrr}^detI=yW2P~3{yF!Tc9tLdovuVPUq3rLIe&9@ zI-RvFdOMK7fRYG@NqSM64o9a~C-d_;O{*d&<*;3m)=B7cK|`@)FOb#c`}ZDgKRRHS zi}JWRefr|$^63O!6B8}jv;1h-XtQN>Blb!XumhGT`)IyoTHYa= zLwn_%a1~VyrLY85naKO{o?khHBTI<42*MO2iBaG;!hl49;Ctajyc6s*XON83RaIL)3;Rt*2bo0jfod zvr?xY)NAoUy}tc!(XV`xU-=*-EPWzslbpPM++qZ;JCbtc+rO+~K5Ty+xAESiN&n1y8Dy-Z@NuST-ROK?eXAQKC{zM__MGhiq80 zvE|gnckAmnr}boW{cbV8ZBJeEP-fvu4_}zw3zP>umWZ z`CSDL?lmo4gg>}iChFdMa_`3Nbys2d>Z`9lJ#7|HDidl$iz8=5Z=Sq({rt3JW@3>9 z$tWcQaj8u1y|WWZ-U78EWfa?A$i{7CbN=X)J6nnF%P)WR`9()m4m}k*UVpshFLcje zyg2Q%M;St3H6IH_HD=BExd54xT`-@L`IL$K4_5Ac^x;Q0mJV{`m!EyfzRO5CSGK9eC9}&FX`%H0k#Rd`@x_8`FqRJ(bwO8`E)jH z|d}b}Qsuu9gewBxkLRZx@fWTQ_ff z{2(y+)n9%(XV=(Xy%^nHez=#gs+QH9Jbn3mUe|(*ke!P~^PLlF0{S~3*HAjHu?Mn= zgJL4$-G6fX;~RJHKXIGq&rkY;%jdH)vJ^SbeG%m6#`JvN!~W4KG6_)x$PV2GASdr4 z-V5Z3Mn#3KuvmaW_tzgkdc3@}nd(o=nsxcB7nOLX-YWPG@vS3w296q|`LL2NHoKK{ zG*|D`ilye5REo0i37K<%UrarT)|d1SOmX_5^h z(HIxk3fqPAiTb5jwHSCrqeM>TK&uwjKx_tR&Ej?=d491>M@5grYKby+t?3Ej6F-Mg zAcYKQu`;UdK@0V)oDWAaokx?EUZ*>I@#=y-5oZmvS~t?9`HVV_9otJEezX?f-8O(0 zx~ET1%GG{3;*G>SE?2Us<(t4S)AO@2&U|%prvMr>*~<_DjOWeH^34xF*xy`^p!7}W zPtPZ(^EzqX0xryM{xE%8A5G`ym*lR*v;i4}h>0nrkO9xyTYYqI`(Vj~c-+KWcRHVS zdwmS3&>Hd}vdc`N)F7So$te=`1fgGcZIg7UDYA|o@9(UxcviQ95vOJq%FHijeG8ih za|PuH2V$|jstvl>%NH=LkA+P#TH?PK!LM|0W7EC98weZ&#+7h4z@mXIiW$s)Hh>tK zWEn*jg81X$*T)-&ZEe8gloKi_mg8vG<=FLvJbseF7!4cq4HJ}6CC?oqt!&thNd&(e z8-o%%a&{>kU8;hXr^9R5gVMF{b8q{i9uGSr+a04Z?AQ7|1`R8+p2ve%!$E~~oTM~| z1)+|yp%?r0uo}rk$4-2>b?*CJn}LYSO`>rMsE_)!9`=}WMdZIkQqy9xc{sUpC1pC+ zKNKd+EO;Pd+Q7adW~0N<&VD#@6gN}ZX3J)C(FT?wAPp4yTs+PcrVRxg4bfET1U6G; zH&anYFrH$_M4R4q__vOu5hrMB0VS_PCt^4iaS&BK$sVg1!pPN1u`n(i8_|YQ+L_IW zzNm>fG#&4`{QFLJF_!(&>g=zJy9vw|6knH2L70!>pEfI|jagM3Ls$`lX$TgRO_PEx zMt*oKPEOykGm?z5fdXD2jCC8>S$KPv#X`sOXcFRs>qRGg9Jt-}m z4krT90IptWJ}gK~{E$36YK^i2p0Pw=^1x%quAvdZyfCH%19LWuY?(~vLatzyhy?)% zUhD;Y5EBS}CtIJ%fiXlGMA$PO2@EV+pm^B}20H>kxu8kxlCFSw_Qa8oNKt%=L?TuM zJ}=~15v@4EADtlr8d9BXD1$U576m1V^Kda}Pz@f%KPgSFRa<1qY{QKB+$R?rA7JIr{p?{6a$7OI)j)) z@3>#vo0{xN6O|1mLqLI=`*r%w37@uTQJ~daw!XX$U72$gR)U&u) zZWj4oq-P`-FjL9XE|@1et$?S1UodlQwSIsvAC6|}yky|T)Cj#*>GYJhocMLI9`Umb zICt51_QnS{-D%ApK7IWhvQkU?*&F28856&X>E#u`2RlnpU3P(jE~A|f8)i1<*hvwdG=i<>M+ zhAvwYA8b8&^7z5M2io%&v&pP)I#&*(@kq9Daz1F($$0FKX6?r4f_*))^e_=5WiiQ; zs{l@ECBkm8A-%>3ef(!%u)>I@VLR{Mb|!(n?cQ`$X9BTv99g`@1BOj+p!*!KJESTMBtiUk zxPN8k;iDscGM~bmtQ6uYJ0=(H4ss`RP#h@RxHN#YlIsxQ5(Wc=gJ=kH9P#5qu(z|h zvgyiTSfluIf$VW?ErmNUxFqwLpabj|B#TxS2)rUGQ>m0nAQO2?^g@I#{9iy^1!93^ z2>2p;rCJoSA~+Dk)VdHOgIXV)qk-3G1PZJ8Sz!B6K937mRt4CwIv49pl_q6g7p+#L zd}igTf3glCbu4)0X(+|LJ*bsZn<-0Ozo?OVr53VO-L|ngye#Vf^tyDkGgF6i3~O5Q8COu~&q0@DS=a&ul z(UAkslSp}Tem?4s`_*i~!$M74y^EI@Q(QXgVA-TC1xD;aF%Xsl2W$m>=i?7SgsLIA6&v@ zvlter_?2J}L>yFZa#9uMhZG_e;k-CIQ3xB|7Bdmg{_6ctKD>43&N4L#VVtyO8-p5s zC*d;UJSMq_B}e;pT%I^Cw^bpC{Zbdg(Iisn$-R%?|K#?a2di7h!MK*kP7VyBw(Sx> zU`a`gaC==0y}T%fg!F*k6LKEoj9&uDcI>P^y#3+(pWM8+yh?qNSz%iE6!x&oN(VAW zu;?fpSyl@6F5-T83Y)OcPS2-w4vetKC^^`Z@;(81pDeBJx(L9F#K|Siwb(Yq#Z88a zW{Dywwh{&k0hZR{>V%h=;;-yFj6+q#=h)xgTzj;<^l8ij)pvJrYr#vYiny8+e9zz`?0&?$4wR3 z<4c%0tCG^Fm^@@b@2M>qIx5z1I-k;h)&;sT8;gr62xZCRhetaO4v%pza~z7pHfBhY z*phD)LO{{j?3BwtF8C}>W*XL~KHgL`?%jVhv z@dgiIcEZsirW5`pI3ZXx!U!rp8%1Czsx`z>g?{*tsyOo-4$QkRG5Ir0`N~f z>_b(DGA5(=85}vHNOdt1_2S)@W0!d|0}6tU$NmOPP8`oh7!NURF^^Ht#QcR8j549& z)s3kS4ut1;3^gXk22@xf;&FBjiLi~A;xd>|7;zv2OwB5@t~e7)a%^$A65}A7I0#)9 z9R{_Yof6Vfyaj{Fxc~Ub@!7cS)h0()8!HW@y_=4`lI{zA3nJI$>Vfq&}4|LLONTUozJ?}TB}ArR8(pRpe;F? zQ43}3jp>+0dU7&nS@a|%G!wzzx&H9hou&J?KK}57y;`Hj=8`Qdl_>R3X9J;8RUE{{ z1Z}VfE=!)7Tx&tuS);7=F=Nmnt+W_zK2{DY}TZ|u0C#i@BS?=B^@BhX7H}BkE1HU9oJv-(im5F<(Tq$|l zd9Kh7%;O|%R(uoWdJ(B2p1g@g0Pn4jKfZPM!P@qbKcSUsZM=nW8KNjzaonybG}wo@ zG^kP}jF?guXVBpB2v%XqtIJFGA3a*x+&%P$iDa!{I2K|`IZ}$WN-!(|zj+lDec@OD z9{_$69*l~PcM`V9-OZIpPY4X%-aEzvF$?rUPfAg01}pb&hy`3i*tziY1xU82lsrc^ zI#(OxNVE+us5^vT?H{{*>>bFYVQoowN@3FBLQa4Y1b34|$txnFh@2rps8m|Xf(Sl& zq!NXKj0Fyif(wo~ z1Iv2Q#rqC9PRtn8QXHd^sE}AibrkN*rBW1hhuJQ{KeSH_@#1$wzfm|^xRU1t_D3L# z5bzQPQ4hhEM3%BtNEV=pR|zX_f3QURX%^RZBQa zIGRM%BuW|CM#c20`2^c$j>)4KU|em)=VNDW`QGh&TQR$4n!V?rUv)9XSZO?3oGx}r z$QJ5j$ii@XGHyz2jZzMvEFvp4$}k7^^4Z@+dU)@Hd(INp@80Xb`f5_Gwkk;%Jk8-1 zhjL)<(=q;C9W*e8gZ-NtIIGLjMAE}IArbPi6X^Q#tq+y^^rOCP?s zQ^*DUldqpO8|P2QMgl1micvK=UZ5!YJK^y;dw)2F$1Eiz)iKh!9gGdnQ z0_=!|%Q!LD2Qj}Rgr72YCWN|rlgN6MCfNc@mbqBdF~}hw;jkvOgkQBZl=j9MrYC+l z54{T3gkfyfgFO&idrxqTWaZyi`R(;-RW4wM7*wN`aOD3B-1Yoy3Xb1VX~44doVv%;And(6d3=Y5Ayo7c2YCYL3bf4VG`QrJ zUvJ~?k`+vC&`CQK3@ zgVO)Av=;}R;JV}1{o;0&D{Cfnb_et%(7(N3zXBaGComPoSi$hX91=Uj+6HhMI7b6v zEZtD)YfKT5w0=~wOWDn_KT;+~1p8dZO2m3N|BR?5dj<_bx;xIU31pOV6aJ1~uAN&6 z5Mgaz`=S%YPslazs#&=76CK(eWUrm+6_j8#85hH>JgvRiF!?OAc>l=ye)jWEK04oD zxOMo)@$oNDULDwKxqSKJmCnl5F7M0-PhK4V`ta$|9oAb)Fwx$NQa2ou%*2FD_kP9&+wKdhzt|(X)rP_i6qX(KvB(SFT;T z@Z}fhmcKo_deB>X`D*v@_48dz9d8J*0J-j+0;7970uKu)eZ-Sph?x=hxvfoxCC`Rl zUh~7!&li@5oonO6{@~I5!RTOHWSHK{V7=#Q%-a@BbS4DTA8j5yFW8uG9nJ{TObwi5 zn2RrML6bBnm2bf(Q;z8WDEkbV*^yt-;Es^2$)P2xd8Mtd3leNIfS!Nakr|*JH8)Lv z_&zPiDc7UdF!<(Ozh_Lp{Ui!XU@!<9Grz~h(f!TNnziO_BWH7GORv@0RggynEA6Iv zD07aHGi8@o8)H?L(&^NhU+@v%CDT&emRwL7%Tm`kE7{045LlAA?l-WH&eK78MUi$F@`&4_)7HmP6~;XyIBU#!b1j>gjbzU8*<~O@ zv`jRk{|1>)7`^)JOg-5ZKog1ZX1?RT zvZaKh1?iVIDP(>^hu&~ZIz~tX5locfHSM-Cq4#0Ysa56j;A2sG!YlWlT3mZ4X9+z5Zz9E~|eA*N9{7xRZ5@ID{F# zqg#7j(LTjCv^*#?iI+xH)7c7z=?RG%rkxoiha2{@QWLFc< zB98Z0X~q7|-q!Azqr6>OT~Gg_DR=XD2zpVEtkzAivdHMN>gFjlb8G9=DJBh>G9rmg z*-mS^PW!etZjD@urwNKBE(nkfblu)HORzq7DbK6wnr_zP*=l2p#cCdR;qLJa^sa@# zHE}&tT_sKAPN2ll>Ki%xMCP-xm{L{5Ht``hn@Fd4Cyr=Vf{Bf=TCbT0HOwvV1~4KA z@tY$C44`4J6F2hsDVRmo(Z5I`ZD8CQ!PU9dIF){b2X}H*PsquPwd9!`$xsOrWNli_+O~W-pSJsy$eg|_lQmK;k!p=}f>mUyTQUe_>yO>o*0=^%deqd= zoF3lB@QIAG>L@DJm><*1$y4n!{r&#GCp^4=!gGq#YN=ygoVUq5%_(QIR-WB=B@$`> zX1xIA3GtS2a(mWeTuqYpe@i>%s<@d`oE0?bIwzT(QJp9HkFzxT2_}{K?+jAB+cEDE R^RsuO@FDdF3H*O0@DD5OS(X3* literal 0 HcmV?d00001 diff --git a/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/cornell/dpcm_1bit/mega644_1_bit.h b/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/cornell/dpcm_1bit/mega644_1_bit.h new file mode 100644 index 0000000..106cfc6 --- /dev/null +++ b/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/cornell/dpcm_1bit/mega644_1_bit.h @@ -0,0 +1 @@ +const uint8_t mega644[3280] PROGMEM ={ 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 253, 255, 255, 255, 255, 255, 255, 253, 255, 239, 238, 127, 159, 187, 223, 109, 255, 185, 238, 109, 158, 238, 230, 127, 182, 204, 230, 118, 185, 249, 111, 118, 255, 172, 227, 123, 188, 231, 56, 207, 166, 121, 190, 239, 251, 227, 188, 0, 2, 255, 252, 255, 128, 0, 12, 241, 30, 241, 238, 24, 64, 31, 48, 255, 30, 241, 198, 5, 224, 31, 32, 243, 14, 0, 30, 1, 240, 15, 128, 0, 3, 193, 175, 135, 220, 56, 32, 120, 53, 248, 56, 241, 128, 15, 193, 135, 240, 65, 224, 1, 252, 48, 63, 136, 12, 0, 63, 135, 131, 248, 0, 128, 7, 240, 240, 127, 0, 16, 1, 252, 60, 31, 192, 32, 0, 254, 30, 15, 135, 2, 0, 254, 10, 63, 135, 128, 1, 248, 48, 252, 60, 32, 7, 193, 199, 193, 199, 0, 60, 28, 124, 56, 224, 3, 193, 207, 135, 28, 0, 124, 49, 240, 199, 128, 15, 134, 62, 25, 224, 1, 240, 79, 199, 60, 0, 62, 9, 248, 231, 192, 7, 193, 63, 24, 240, 0, 240, 47, 199, 158, 0, 30, 5, 248, 243, 192, 3, 193, 190, 31, 112, 0, 248, 55, 195, 231, 0, 15, 2, 252, 62, 0, 1, 240, 111, 195, 224, 128, 15, 2, 252, 31, 0, 0, 120, 31, 224, 248, 6, 1, 224, 127, 131, 248, 28, 3, 224, 255, 135, 240, 60, 3, 224, 255, 195, 252, 30, 0, 248, 61, 240, 127, 195, 224, 7, 131, 207, 135, 158, 15, 12, 15, 7, 159, 7, 159, 15, 14, 1, 240, 121, 240, 120, 248, 60, 120, 1, 248, 120, 248, 60, 124, 28, 124, 56, 1, 248, 60, 124, 30, 63, 15, 159, 131, 1, 65, 248, 124, 124, 30, 31, 135, 207, 131, 129, 193, 239, 224, 249, 248, 62, 127, 15, 199, 131, 130, 163, 239, 224, 249, 248, 63, 127, 159, 227, 224, 208, 240, 184, 127, 7, 135, 224, 125, 255, 127, 253, 6, 165, 98, 248, 63, 224, 245, 254, 15, 255, 245, 250, 92, 89, 63, 47, 135, 248, 29, 63, 129, 255, 253, 127, 171, 194, 219, 233, 124, 159, 248, 125, 255, 139, 255, 253, 127, 79, 133, 233, 250, 63, 199, 255, 234, 255, 250, 191, 255, 253, 126, 173, 175, 253, 250, 255, 15, 255, 255, 191, 253, 253, 223, 95, 239, 235, 254, 255, 239, 255, 255, 255, 255, 191, 255, 181, 255, 219, 239, 251, 245, 255, 255, 191, 255, 215, 254, 255, 223, 239, 239, 223, 255, 191, 223, 215, 255, 219, 253, 255, 255, 251, 127, 254, 254, 191, 223, 255, 239, 223, 255, 239, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 247, 255, 251, 253, 253, 127, 255, 255, 255, 191, 158, 20, 83, 248, 254, 135, 195, 252, 0, 3, 225, 237, 15, 144, 248, 111, 199, 252, 120, 115, 66, 8, 60, 123, 195, 180, 62, 83, 225, 124, 24, 79, 15, 112, 246, 159, 73, 255, 62, 1, 192, 0, 120, 223, 13, 225, 254, 91, 207, 240, 128, 12, 120, 79, 16, 212, 57, 79, 161, 240, 0, 12, 124, 39, 145, 204, 55, 147, 240, 124, 0, 12, 125, 39, 195, 124, 7, 195, 248, 152, 128, 0, 60, 134, 225, 62, 151, 232, 255, 35, 48, 3, 55, 33, 152, 78, 196, 127, 63, 248, 12, 0, 230, 123, 31, 208, 236, 2, 243, 51, 57, 0, 0, 103, 236, 63, 1, 252, 15, 230, 119, 25, 128, 204, 103, 200, 86, 1, 184, 71, 225, 187, 76, 192, 48, 141, 242, 45, 225, 58, 199, 249, 230, 28, 160, 8, 83, 190, 229, 233, 11, 118, 247, 255, 125, 225, 128, 0, 1, 255, 238, 76, 152, 145, 55, 255, 249, 144, 32, 0, 159, 255, 114, 68, 204, 137, 255, 255, 196, 0, 0, 0, 31, 255, 251, 48, 32, 101, 255, 255, 240, 0, 0, 127, 255, 230, 96, 128, 143, 255, 255, 246, 0, 0, 0, 127, 249, 147, 230, 15, 62, 124, 241, 195, 6, 0, 240, 71, 156, 60, 225, 159, 56, 227, 142, 97, 196, 120, 7, 216, 63, 192, 125, 131, 252, 11, 192, 0, 120, 7, 248, 39, 200, 63, 129, 254, 0, 128, 117, 15, 240, 15, 240, 31, 224, 254, 0, 0, 29, 99, 190, 65, 158, 33, 255, 255, 253, 32, 0, 223, 255, 243, 252, 128, 23, 255, 255, 64, 0, 31, 255, 214, 109, 128, 5, 255, 255, 168, 0, 11, 255, 255, 126, 128, 5, 255, 255, 224, 0, 27, 255, 223, 125, 128, 7, 255, 253, 224, 0, 251, 29, 226, 57, 71, 127, 223, 225, 0, 7, 17, 252, 39, 152, 206, 103, 185, 140, 0, 112, 63, 136, 236, 55, 185, 220, 196, 0, 57, 15, 228, 118, 19, 241, 254, 204, 0, 59, 31, 196, 118, 39, 201, 252, 0, 0, 232, 127, 35, 240, 156, 15, 224, 32, 14, 135, 242, 59, 15, 192, 254, 0, 3, 33, 252, 143, 194, 240, 63, 0, 3, 33, 252, 207, 195, 240, 61, 128, 14, 7, 241, 157, 143, 226, 120, 0, 58, 31, 198, 116, 63, 200, 248, 0, 96, 63, 152, 236, 55, 49, 220, 64, 56, 143, 227, 61, 142, 225, 127, 223, 96, 15, 145, 254, 39, 192, 127, 143, 255, 159, 193, 228, 3, 254, 63, 229, 190, 103, 223, 127, 251, 232, 7, 223, 255, 255, 253, 170, 187, 255, 255, 239, 191, 255, 255, 255, 255, 255, 255, 255, 255, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 191, 255, 255, 255, 255, 255, 255, 125, 255, 255, 254, 222, 219, 239, 255, 251, 255, 255, 253, 189, 239, 119, 191, 255, 255, 255, 255, 251, 239, 168, 0, 5, 127, 255, 255, 176, 0, 0, 1, 127, 255, 201, 153, 18, 127, 255, 128, 0, 127, 255, 221, 248, 1, 47, 255, 96, 0, 31, 152, 127, 131, 28, 115, 207, 120, 0, 0, 248, 135, 56, 115, 141, 249, 159, 0, 0, 31, 136, 243, 15, 112, 223, 25, 230, 24, 0, 120, 71, 152, 115, 15, 241, 222, 1, 192, 3, 194, 60, 35, 220, 125, 199, 188, 195, 0, 60, 33, 210, 30, 97, 230, 30, 113, 192, 9, 210, 159, 8, 240, 215, 143, 120, 112, 0, 31, 15, 240, 122, 131, 227, 15, 12, 48, 0, 120, 123, 224, 240, 131, 225, 249, 195, 192, 1, 240, 254, 208, 248, 61, 120, 126, 30, 16, 8, 120, 31, 10, 31, 7, 195, 135, 224, 248, 16, 15, 129, 240, 43, 248, 126, 30, 159, 131, 224, 0, 62, 7, 193, 161, 224, 126, 94, 31, 135, 224, 0, 62, 7, 192, 248, 224, 124, 31, 248, 62, 0, 124, 15, 129, 245, 224, 124, 63, 248, 62, 0, 24, 15, 193, 241, 224, 124, 63, 233, 252, 0, 224, 62, 131, 203, 128, 243, 255, 255, 240, 3, 1, 253, 62, 124, 2, 15, 255, 255, 0, 0, 15, 255, 251, 227, 1, 127, 255, 248, 0, 0, 127, 255, 248, 112, 0, 127, 255, 128, 0, 15, 255, 255, 204, 0, 31, 255, 224, 0, 0, 255, 255, 251, 0, 6, 255, 252, 0, 0, 127, 255, 255, 96, 1, 127, 255, 0, 0, 15, 255, 255, 232, 0, 47, 255, 208, 0, 3, 255, 255, 233, 0, 3, 255, 248, 0, 0, 255, 255, 252, 225, 2, 127, 255, 0, 0, 59, 255, 220, 48, 65, 159, 255, 192, 0, 15, 255, 247, 4, 16, 247, 255, 248, 0, 19, 255, 254, 233, 129, 55, 255, 232, 0, 159, 251, 119, 108, 81, 223, 248, 0, 57, 167, 60, 227, 156, 227, 156, 192, 1, 200, 119, 136, 102, 31, 198, 240, 0, 57, 14, 241, 60, 199, 243, 28, 128, 14, 97, 252, 79, 112, 126, 103, 32, 7, 224, 103, 35, 123, 19, 185, 0, 6, 200, 110, 198, 127, 38, 118, 0, 59, 35, 59, 35, 63, 3, 50, 1, 187, 51, 127, 34, 127, 32, 0, 27, 178, 38, 254, 64, 239, 192, 1, 178, 100, 205, 255, 64, 155, 32, 19, 102, 205, 155, 50, 118, 109, 32, 1, 127, 255, 221, 160, 77, 181, 186, 140, 191, 255, 255, 250, 183, 117, 170, 165, 191, 255, 255, 237, 86, 251, 239, 118, 223, 252, 155, 52, 217, 50, 108, 255, 100, 147, 118, 219, 124, 221, 255, 178, 79, 246, 4, 137, 255, 252, 153, 191, 144, 0, 2, 246, 100, 6, 255, 192, 79, 240, 0, 69, 217, 128, 223, 224, 79, 254, 1, 244, 0, 238, 64, 63, 240, 31, 248, 7, 244, 0, 123, 128, 79, 224, 27, 252, 7, 254, 0, 30, 226, 63, 248, 7, 252, 3, 200, 0, 223, 160, 29, 246, 1, 190, 224, 0, 5, 186, 196, 51, 204, 35, 253, 132, 33, 25, 190, 97, 31, 239, 49, 220, 66, 18, 177, 79, 252, 115, 223, 60, 243, 214, 41, 214, 153, 127, 252, 235, 94, 251, 93, 58, 225, 92, 74, 170, 213, 85, 90, 175, 85, 106, 210, 169, 170, 90, 206, 173, 86, 181, 84, 170, 214, 213, 86, 170, 170, 213, 115, 214, 245, 171, 85, 84, 183, 89, 111, 42, 106, 170, 197, 85, 74, 170, 170, 175, 85, 234, 171, 212, 170, 85, 42, 210, 171, 92, 186, 171, 117, 95, 106, 234, 170, 213, 85, 43, 85, 85, 87, 74, 170, 219, 122, 170, 170, 170, 165, 170, 169, 170, 234, 234, 84, 170, 173, 85, 170, 213, 106, 170, 149, 125, 212, 214, 173, 85, 165, 90, 154, 173, 86, 154, 102, 150, 234, 165, 107, 85, 85, 42, 147, 105, 182, 219, 81, 140, 247, 123, 236, 82, 0, 0, 127, 152, 79, 243, 13, 254, 128, 0, 25, 196, 3, 117, 136, 255, 224, 32, 1, 187, 72, 142, 236, 39, 119, 51, 32, 51, 35, 19, 59, 153, 155, 217, 128, 6, 236, 204, 142, 238, 255, 238, 213, 84, 141, 255, 255, 182, 255, 255, 237, 119, 223, 191, 255, 255, 255, 247, 223, 251, 255, 255, 127, 255, 255, 223, 247, 206, 111, 127, 206, 102, 63, 216, 206, 99, 185, 230, 115, 155, 204, 103, 56, 206, 99, 57, 157, 53, 42, 227, 85, 206, 117, 87, 86, 170, 174, 170, 170, 171, 91, 149, 212, 85, 110, 170, 173, 85, 85, 170, 169, 37, 173, 87, 43, 154, 227, 21, 170, 213, 107, 86, 173, 107, 90, 181, 45, 89, 106, 212, 173, 87, 58, 116, 157, 162, 121, 156, 107, 218, 183, 172, 178, 89, 181, 75, 172, 248, 117, 173, 203, 220, 158, 239, 243, 126, 239, 119, 109, 205, 251, 109, 110, 191, 255, 191, 247, 127, 255, 127, 251, 238, 251, 222, 191, 111, 255, 127, 255, 255, 255, 255, 255, 251, 255, 255, 255, 250, 251, 247, 190, 219, 254, 255, 255, 255, 255, 255, 255, 255, 237, 223, 127, 247, 241, 247, 250, 243, 255, 179, 247, 203, 239, 151, 246, 191, 247, 223, 254, 254, 128, 0, 31, 254, 3, 254, 60, 0, 0, 127, 128, 124, 255, 128, 254, 0, 3, 252, 7, 247, 248, 15, 240, 0, 31, 224, 62, 191, 192, 127, 0, 0, 255, 1, 227, 252, 7, 254, 0, 7, 248, 14, 31, 192, 125, 252, 0, 31, 192, 96, 254, 7, 7, 192, 0, 63, 7, 7, 240, 240, 124, 0, 0, 127, 6, 7, 227, 193, 241, 224, 224, 126, 28, 31, 158, 7, 63, 128, 0, 126, 0, 31, 254, 0, 254, 0, 0, 126, 112, 28, 249, 193, 199, 128, 0, 62, 120, 193, 231, 140, 30, 112, 192, 15, 56, 227, 159, 60, 99, 140, 113, 0, 115, 206, 115, 24, 198, 51, 156, 198, 32, 239, 255, 243, 19, 62, 247, 32, 0, 110, 243, 200, 103, 125, 152, 198, 32, 111, 242, 37, 191, 200, 143, 252, 0, 6, 108, 32, 79, 255, 36, 127, 96, 3, 38, 246, 71, 111, 252, 137, 89, 1, 183, 114, 68, 110, 221, 137, 3, 0, 109, 221, 153, 51, 254, 64, 9, 128, 25, 54, 102, 100, 221, 217, 17, 52, 1, 179, 102, 68, 111, 236, 128, 77, 128, 27, 187, 96, 153, 255, 64, 2, 108, 0, 63, 254, 224, 31, 255, 242, 80, 204, 34, 11, 255, 242, 23, 255, 188, 204, 214, 101, 108, 255, 255, 251, 185, 219, 119, 54, 77, 231, 158, 115, 103, 223, 216, 217, 237, 141, 198, 51, 91, 153, 250, 230, 246, 198, 103, 58, 205, 175, 253, 246, 253, 236, 239, 127, 191, 239, 63, 245, 179, 111, 255, 255, 251, 239, 247, 191, 247, 255, 255, 183, 255, 255, 255, 255, 255, 255, 255, 255, 255, 239, 127, 255, 191, 251, 255, 255, 255, 255, 255, 254, 255, 215, 255, 127, 247, 157, 239, 219, 47, 187, 187, 189, 231, 238, 255, 127, 190, 235, 127, 185, 220, 255, 54, 189, 140, 117, 191, 248, 157, 254, 253, 223, 98, 251, 123, 252, 253, 255, 122, 20, 5, 255, 248, 63, 232, 0, 7, 240, 31, 31, 240, 31, 192, 3, 254, 3, 247, 248, 7, 244, 0, 127, 192, 62, 255, 192, 127, 128, 3, 254, 1, 255, 255, 0, 254, 0, 31, 240, 7, 255, 192, 7, 240, 0, 255, 128, 63, 255, 0, 255, 128, 15, 248, 3, 255, 240, 15, 240, 0, 255, 192, 63, 255, 0, 254, 0, 7, 252, 7, 255, 248, 31, 192, 0, 63, 192, 126, 127, 1, 248, 28, 1, 254, 0, 231, 240, 31, 199, 192, 3, 248, 15, 143, 224, 126, 62, 3, 15, 224, 120, 126, 7, 195, 224, 48, 63, 7, 3, 240, 240, 252, 8, 1, 252, 8, 63, 128, 15, 231, 0, 7, 192, 193, 249, 224, 241, 240, 0, 124, 112, 62, 248, 60, 120, 0, 3, 199, 3, 223, 0, 14, 112, 0, 121, 225, 15, 206, 17, 252, 0, 30, 56, 195, 255, 8, 127, 192, 7, 156, 96, 247, 140, 63, 224, 1, 206, 16, 123, 206, 12, 240, 0, 123, 194, 28, 255, 2, 254, 0, 7, 252, 97, 255, 208, 7, 224, 4, 124, 224, 199, 254, 96, 201, 18, 100, 183, 109, 219, 107, 164, 182, 149, 173, 218, 221, 182, 75, 117, 109, 42, 219, 90, 202, 210, 210, 82, 218, 214, 182, 182, 169, 106, 212, 173, 90, 210, 149, 43, 82, 82, 181, 169, 90, 212, 169, 94, 219, 93, 106, 149, 74, 181, 74, 173, 85, 165, 106, 173, 74, 165, 171, 93, 74, 171, 85, 170, 169, 77, 82, 173, 171, 86, 169, 86, 165, 170, 85, 106, 181, 93, 172, 173, 106, 211, 165, 74, 182, 202, 90, 150, 150, 214, 221, 187, 102, 125, 157, 183, 154, 246, 219, 183, 238, 221, 183, 251, 183, 255, 255, 255, 119, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 253, 255, 255, 255, 255, 253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 223, 255, 255, 255, 251, 57, 153, 206, 128, 103, 255, 176, 1, 51, 253, 137, 159, 255, 0, 55, 111, 224, 77, 131, 102, 202, 76, 155, 249, 178, 0, 79, 255, 81, 36, 19, 100, 212, 201, 191, 246, 72, 5, 155, 242, 6, 252, 27, 100, 220, 137, 55, 118, 192, 36, 223, 250, 36, 222, 4, 155, 103, 68, 187, 252, 1, 182, 221, 186, 38, 217, 0, 147, 109, 186, 55, 233, 34, 72, 95, 255, 255, 255, 255, 100, 1, 47, 255, 255, 253, 222, 253, 213, 187, 255, 255, 255, 253, 247, 191, 255, 255, 255, 255, 109, 228, 219, 109, 191, 178, 233, 146, 89, 124, 146, 218, 73, 119, 178, 219, 220, 150, 214, 211, 219, 47, 73, 201, 182, 77, 236, 153, 159, 164, 155, 70, 201, 191, 118, 77, 255, 233, 111, 216, 145, 55, 38, 236, 200, 159, 255, 242, 101, 2, 76, 158, 201, 132, 223, 192, 223, 255, 204, 200, 1, 129, 187, 1, 187, 201, 159, 217, 159, 248, 15, 0, 3, 178, 27, 248, 19, 248, 31, 252, 15, 251, 9, 180, 128, 14, 200, 77, 196, 223, 196, 254, 200, 255, 223, 219, 236, 54, 0, 63, 35, 126, 3, 254, 7, 254, 151, 254, 223, 253, 159, 144, 32, 63, 50, 126, 76, 222, 25, 255, 250, 127, 247, 191, 223, 255, 238, 255, 253, 191, 233, 32, 3, 255, 239, 255, 251, 230, 223, 255, 239, 187, 255, 255, 255, 250, 0, 3, 255, 237, 203, 239, 130, 175, 255, 247, 87, 255, 251, 255, 255, 127, 239, 255, 255, 255, 255, 255, 255, 253, 181, 104, 0, 127, 255, 250, 255, 236, 219, 255, 255, 183, 127, 247, 255, 254, 200, 4, 11, 255, 255, 247, 219, 183, 255, 255, 95, 255, 255, 254, 255, 191, 255, 119, 255, 238, 253, 254, 255, 255, 235, 191, 255, 255, 255, 191, 255, 190, 247, 111, 191, 255, 254, 253, 251, 239, 255, 255, 255, 251, 255, 255, 253, 255, 255, 219, 255, 255, 255, 255, 255, 253, 253, 253, 255, 255, 255, 253, 255, 255, 255, 254, 255, 253, 255, 127, 255, 255, 253, 255, 255, 247, 239, 255, 255, 255, 190, 255, 255, 255, 251, 255, 251, 255, 255, 255, 255, 255, 254, 253, 255, 223, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 191, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 254}; \ No newline at end of file diff --git a/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/cornell/dpcm_1bit/speech_1_bit_diff.c b/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/cornell/dpcm_1bit/speech_1_bit_diff.c new file mode 100644 index 0000000..881954b --- /dev/null +++ b/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/cornell/dpcm_1bit/speech_1_bit_diff.c @@ -0,0 +1,113 @@ +//Voice decompressor example +#include +#include +#include +#include +#include +#include "USART.h" + +#define TableSize 3280 //refers to the following incl file +//Contains the packed 1-bit codes for syntehsis +#include "mega644_1_bit.h" + +//reconstruction differentials +//volatile signed char PCMvalue[4] = {-78, -16, 16, 78}; +volatile signed char PCMvalue[2] = {-10, 10}; + +volatile unsigned int outI, tableI; //indexes +volatile unsigned char cycle ; //decode phase counter +volatile signed char out, lastout, newvalue; //output values +volatile unsigned char p1,p2,p3,p4,p5,p6,p7,p8; //hold 8 differentials +volatile unsigned char packed ; //byte containing 4 2-bit values +volatile uint8_t speaking; /* flag for whether currently speaking or not */ + +//generate waveform at 7812 scamples/sec +ISR (TIMER2_COMPA_vect){ + //compute next sample + cycle = outI & 7; // outI modulo 8 + if (cycle==0) //do we need to unpack more data? + { + if (tableI>3); + //update outputs + OCR0A = out + 128; + lastout = out; + outI++; + //at end, turn off TCCRO + if (tableI==TableSize) TCCR2B = 0; +} //ISR + +int main(void){ + DDRD |= (1<0){}; + OCR0A = 128 ; + _delay_ms(500); + PORTB ^= (1<=p(1) & dd=p(2) & dd=p(3)))=3; + +dl = zeros(1,length(ddcode)); +for i=2:length(ddcode) + dl(i) = dl(i-1)+ p(ddcode(i)+4) - .125*dl(i-1); % .* w'; +end + +fit = mean((d(2:end)-dl').^2); \ No newline at end of file diff --git a/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/cornell/dpcm_2bit/Makefile b/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/cornell/dpcm_2bit/Makefile new file mode 100644 index 0000000..09f3b4d --- /dev/null +++ b/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/cornell/dpcm_2bit/Makefile @@ -0,0 +1,186 @@ + +##########------------------------------------------------------########## +########## Project-specific Details ########## +########## Check these every time you start a new project ########## +##########------------------------------------------------------########## + +MCU = atmega168 +F_CPU = 8000000 +BAUD = 9600 +## Also try BAUD = 19200 or 38400 if you're feeling lucky. + +## This is where your main() routine lives (without .c extension) +TARGET = speech_644_GCC +## If you've split your program into multiple .c / .h files, +## include the additional source here (without the .c or .h extension) +LOCAL_SOURCE = + +EXTRA_SOURCE_DIR = ../../../learningAVR/ +EXTRA_SOURCE_FILES = USART + +##########------------------------------------------------------########## +########## Programmer Defaults ########## +########## Set up once, then forget about it ########## +########## (Can override. See bottom of file.) ########## +##########------------------------------------------------------########## + +PROGRAMMER_TYPE = usbtiny +# extra arguments to avrdude: baud rate, chip type, -F flag, etc. +PROGRAMMER_ARGS = + +##########------------------------------------------------------########## +########## Makefile Magic! ########## +########## Summary: ########## +########## We want a .hex file ########## +########## Compile source files into .elf ########## +########## Convert .elf file into .hex ########## +########## You shouldn't need to edit below. ########## +##########------------------------------------------------------########## + +## Defined programs / locations +CC = avr-gcc +OBJCOPY = avr-objcopy +OBJDUMP = avr-objdump +AVRSIZE = avr-size +AVRDUDE = avrdude + +## Compilation options, type man avr-gcc if you're curious. +CFLAGS = -mmcu=$(MCU) -DF_CPU=$(F_CPU)UL -DBAUD=$(BAUD) -Os -I. -I$(EXTRA_SOURCE_DIR) +CFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums +CFLAGS += -Wall -Wstrict-prototypes +CFLAGS += -g -ggdb +CFLAGS += -ffunction-sections -fdata-sections -Wl,--gc-sections -Wl,--relax +CFLAGS += -std=gnu99 +## CFLAGS += -Wl,-u,vfprintf -lprintf_flt -lm ## for floating-point printf +## CFLAGS += -Wl,-u,vfprintf -lprintf_min ## for smaller printf + +## Lump target and extra source files together +TARGET = $(strip $(basename $(MAIN))) +SRC = $(TARGET).c +EXTRA_SOURCE = $(addprefix $(EXTRA_SOURCE_DIR), $(EXTRA_SOURCE_FILES)) +SRC += $(EXTRA_SOURCE) +SRC += $(LOCAL_SOURCE) + +## List of all header files +HEADERS = $(SRC:.c=.h) + +## For every .c file, compile an .o object file +OBJ = $(SRC:.c=.o) + +## Generic Makefile targets. (Only .hex file is necessary) +all: $(TARGET).hex + +%.hex: %.elf + $(OBJCOPY) -R .eeprom -O ihex $< $@ + +%.elf: $(SRC) + $(CC) $(CFLAGS) $(SRC) --output $@ + +%.eeprom: %.elf + $(OBJCOPY) -j .eeprom --change-section-lma .eeprom=0 -O ihex $< $@ + +debug: + @echo + @echo "Source files:" $(SRC) + @echo "MCU, F_CPU, BAUD:" $(MCU), $(F_CPU), $(BAUD) + @echo + +# Optionally create listing file from .elf +# This creates approximate assembly-language equivalent of your code. +# Useful for debugging time-sensitive bits, +# or making sure the compiler does what you want. +disassemble: $(TARGET).lst + +disasm: disassemble + +eeprom: $(TARGET).eeprom + +%.lst: %.elf + $(OBJDUMP) -S $< > $@ + +# Optionally show how big the resulting program is +size: $(TARGET).elf + $(AVRSIZE) -C --mcu=$(MCU) $(TARGET).elf + +clean: + rm -f $(TARGET).elf $(TARGET).hex $(TARGET).obj \ + $(TARGET).o $(TARGET).d $(TARGET).eep $(TARGET).lst \ + $(TARGET).lss $(TARGET).sym $(TARGET).map $(TARGET)~ \ + $(TARGET).eeprom + +squeaky_clean: + rm -f *.elf *.hex *.obj *.o *.d *.eep *.lst *.lss *.sym *.map *~ + +##########------------------------------------------------------########## +########## Programmer-specific details ########## +########## Flashing code to AVR using avrdude ########## +##########------------------------------------------------------########## + +flash: $(TARGET).hex + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U flash:w:$< + +## An alias +program: flash + +flash_eeprom: $(TARGET).eeprom + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U eeprom:w:$< + +avrdude_terminal: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nt + +## If you've got multiple programmers that you use, +## you can define them here so that it's easy to switch. +## To invoke, use something like `make flash_arduinoISP` +flash_usbtiny: PROGRAMMER_TYPE = usbtiny +flash_usbtiny: PROGRAMMER_ARGS = # USBTiny works with no further arguments +flash_usbtiny: flash + +flash_usbasp: PROGRAMMER_TYPE = usbasp +flash_usbasp: PROGRAMMER_ARGS = # USBasp works with no further arguments +flash_usbasp: flash + +flash_arduinoISP: PROGRAMMER_TYPE = avrisp +flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P /dev/ttyACM0 +## (for windows) flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P com5 +flash_arduinoISP: flash + +flash_109: PROGRAMMER_TYPE = avr109 +flash_109: PROGRAMMER_ARGS = -b 9600 -P /dev/ttyUSB0 +flash_109: flash + +##########------------------------------------------------------########## +########## Fuse settings and suitable defaults ########## +##########------------------------------------------------------########## + +## Mega 48, 88, 168, 328 default values +LFUSE = 0x62 +HFUSE = 0xdf +EFUSE = 0x00 + +## Generic +FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m + +fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) \ + $(PROGRAMMER_ARGS) $(FUSE_STRING) +show_fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nv + +## Called with no extra definitions, sets to defaults +set_default_fuses: FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m +set_default_fuses: fuses + +## Set the fuse byte for full-speed mode +## Note: can also be set in firmware for modern chips +set_fast_fuse: LFUSE = 0xE2 +set_fast_fuse: FUSE_STRING = -U lfuse:w:$(LFUSE):m +set_fast_fuse: fuses + +## Set the EESAVE fuse byte to preserve EEPROM across flashes +set_eeprom_save_fuse: HFUSE = 0xD7 +set_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +set_eeprom_save_fuse: fuses + +## Clear the EESAVE fuse byte +clear_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +clear_eeprom_save_fuse: fuses diff --git a/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/cornell/dpcm_2bit/Speech_encode_GCC.m b/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/cornell/dpcm_2bit/Speech_encode_GCC.m new file mode 100644 index 0000000..f7a6eab --- /dev/null +++ b/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/cornell/dpcm_2bit/Speech_encode_GCC.m @@ -0,0 +1,83 @@ + +% Speech encoder for Mega644/GCC decoder +clear all + +%===================================%the Encoder +[d,r] = wavread('Z:\EEdocs\4760\ece4760labstuff\GCCmega644\Speech\AllDigits8khz.WAV'); %4 +%scale to about unity +res = 1/(max(max(d),abs(min(d)) )); +dd = diff(d * res); +%init the code vector +ddcode = zeros(1,length(dd)); + +% brkpt1=-0.5; brkpt2=0 ; brkpt3=0.5; +% value = [-.75, -.25 .25 .75]; +%breakpoints are changeable +brkpt1=-0.05; brkpt2=0 ; brkpt3=0.05; +%quantize the first derivative +ddcode(find(dd=brkpt1 & dd=brkpt2 & dd=brkpt3))=3; + +%make the length of ddcode a multiple of 4 +ddcode = [ddcode,zeros(1,4-mod(length(ddcode),4))]; +length(ddcode) +index=1; +for i=1:4:length(ddcode) + packed(index)=ddcode(i)*64 + ddcode(i+1)*16 + ... + ddcode(i+2)*4 + ddcode(i+3) ; + index=index+1; +end +%make a textfile with GCC source code in it. +fname='DPCMAllDigits.h'; +fid = fopen(fname,'w'); +fprintf(fid,'const prog_uint8_t DPCMAllDigits[%d]={\r',length(packed)); +for i=1:length(packed)-1 + fprintf(fid,' %5d,\r',packed(i)); +end +fprintf(fid,' %5d};\r',packed(end)); +fclose(fid); + +%===================================%the Decoder +%value based on quantizer +value = [-.16, -.026 .026 .16]; +dl(1)=0; +j=2; +for i=1:length(packed) + p1 = fix(bitand(packed(i),192)/64); + p2 = fix(bitand(packed(i),48)/16); + p3 = fix(bitand(packed(i), 12)/4); + p4 = fix(bitand(packed(i),3)); + %note that a bit of highpass has been added to reduce drift + dl(j) = dl(j-1)+ value(p1+1) - .125*dl(j-1); + j=j+1; + dl(j) = dl(j-1)+ value(p2+1) - .125*dl(j-1); + j=j+1; + dl(j) = dl(j-1)+ value(p3+1) - .125*dl(j-1); + j=j+1; + dl(j) = dl(j-1)+ value(p4+1) - .125*dl(j-1); + j=j+1; +end +% dl(1)=0; +% for i=1:length(ddcode) +% dl(i) = dl(i-1)+ value(ddcode(i)+1) - .125*dl(i-1); % .* w'; +% end + +%====================================%playback and graphing +soundsc(dl,r); +% Compare the spectrograms +figure(1);clf + +subplot(211) +spectrogram(d,256,r); +colormap gray +title('Original'); + +subplot(212) +spectrogram(dl,256,r); +colormap gray +title('synth'); + + + diff --git a/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/cornell/dpcm_2bit/downsample.m b/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/cornell/dpcm_2bit/downsample.m new file mode 100644 index 0000000..b175c87 --- /dev/null +++ b/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/cornell/dpcm_2bit/downsample.m @@ -0,0 +1,5 @@ +clear all +%reads a file at 16kHz and outputs it a 8kHz, 8 bits +[d,r] = wavread('test6.WAV'); +y = resample(d,1,2); +wavwrite(y,8000,8,'test6small.wav') \ No newline at end of file diff --git a/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/cornell/dpcm_2bit/sineWave.py b/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/cornell/dpcm_2bit/sineWave.py new file mode 100644 index 0000000..ed0c618 --- /dev/null +++ b/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/cornell/dpcm_2bit/sineWave.py @@ -0,0 +1,38 @@ +## Demo python program to create sine wave + +from struct import pack, unpack +from math import sin, pi +import wave +import os +import random + + +RATE = 44100 + +## GENERATE MONO FILE ## +wv = wave.open('test_mono.wav', 'w') +wv.setparams((1, 2, RATE, 0, 'NONE', 'not compressed')) +maxVol=2**15-1.0 #maximum amplitude +wvData="" +for i in range(0, RATE*3): + wvData+=pack('h', maxVol*sin(2*pi*i*440.0/RATE)) + +wv.writeframes(wvData) +wv.close() +os.system("mplayer test_mono.wav") + +## GENERATE STEREO FILE ## +wv = wave.open('test_stereo.wav', 'w') +wv.setparams((2, 2, RATE, 0, 'NONE', 'not compressed')) +maxVol=2**15-1.0 #maximum amplitude +waveData = "" +for i in range(0, RATE*3): + t = 2*pi*i/RATE # time-step in radians*sec + waveData+=pack('h', maxVol*sin(t*440.0)) #440Hz left + waveData+=pack('h', maxVol*sin(t*220.0)) #220Hz right + + +wv.writeframes(waveData) +wv.close() +os.system("mplayer test_stereo.wav") + diff --git a/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/cornell/dpcm_2bit/speech_644_GCC.c b/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/cornell/dpcm_2bit/speech_644_GCC.c new file mode 100644 index 0000000..130fddb --- /dev/null +++ b/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/cornell/dpcm_2bit/speech_644_GCC.c @@ -0,0 +1,109 @@ +// Talking Voltmeter Example + +#include +#include +#include +#include +#include +#include "pinDefines.h" + +#include "DPCM_rich_hello_world_8000.h" +#define TABLE_NAME DPCM_rich_hello_world_8000 + +volatile uint16_t sampleNumber; // sample index +volatile int8_t out, lastout; // output values +volatile uint8_t p1, p2, p3, p4; // hold 4 differentials +const int8_t PCMvalue[4] = {-20, -4, 4, 20}; + +ISR (TIMER2_COMPA_vect){ + /* Timer 2 controls sampling speed -- + ISR reads new data, loads PWM output, OCR0A */ + /* Since we can decode 4 2-bit values at once, need to know where + we are in the 4-step mini-cycle. */ + uint8_t cycle = sampleNumber & 0b00000011; /* our 4 steps */ + uint16_t tableEntry = sampleNumber >> 2; /* 4 steps per table byte */ + uint8_t packedData; /* the new byte */ + switch(cycle){ + case 0: // Start of the cycle, unpack next byte of samples + if (tableEntry < sizeof(TABLE_NAME)){ + packedData = pgm_read_byte(&TABLE_NAME[tableEntry]) ; + p1 = (packedData>>6) & 3 ; + p2 = (packedData>>4) & 3 ; + p3 = (packedData>>2) & 3 ; + p4 = (packedData & 3); + } + /* Add in the next PCM differential value */ + out = lastout + PCMvalue[p1] - (lastout>>3) ; + break; + case 1: + out = lastout + PCMvalue[p2] - (lastout>>3) ; + break; + case 2: + out = lastout + PCMvalue[p3] - (lastout>>3) ; + break; + case 3: + out = lastout + PCMvalue[p4] - (lastout>>3) ; + break; + } + /* Update PWM audio output */ + OCR0A = out + 128; /* re-center for 0-255 PWM */ + lastout = out; /* update last value */ + sampleNumber++; /* on to next sample */ + + /* When done, turn off PWM, Timer0 */ + if (sampleNumber == 4*sizeof(TABLE_NAME)-1) { + TCCR2B = 0; /* disable sample-playback clock */ + OCR0A = 128; /* idle at mid-voltage */ + lastout = 0; /* start at 0 next time */ + } +} // end ISR + +void initTimer0(void){ + // Timer 0 Configured for free-running PWM Audio Output + TCCR0A |= (1<-3ZQDxQq;bZ^Iscpd-*cW!CNl?nuf5j0 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 s#(urHQgZRzAXQCNs+L3koXpzc`*!U9=lA)4 zpMCav@8#~geEuta<>@sBu9Wa8hj8gvdi2;GdfpgXYc_z%1X;ZEGa^DrAM7X5)P#6oc^ z;vVstm`Lo!w_$707$g!|hO{HU(K4(Ezd{rd&k0Xr2QI*yu|WI|uEwkJ{WyYuhB?f_ z|KWQ4A#RCZ!Pa7@u}rK1tH%nlZ`fUIFqVo=fqOTgS=eU$Cf*%>6NU}LHo**&&^lxh zask(?E1%Ci@ZpDQJP88!O@$oQDPdpH( z@kLg%@BmuUG zxQOr|8u1gjCmw@M#x&?NxPK%%65Wbsq5jwr>?=s%6SfRXMDvgoPQ`v!)F2Rh+E?rUI`L(hF`3JCr!kLV+J$>eS#iDm!RX& zey9X}4(sEEoJ2OGH?Vv7AmS475!R@Tct-Rj?%};*R&(%oxC*ZXX)*Xr>^aJUtW8`V zha-y-4YC~lh?b!S)Ehg9q3~=s@W=RV{2)FGZ^w3Gy|IZ{4z>|S*o*(c24GTbCB}#K zK8Fv&-(x+o0`xsvjCRHjV{fo0*et9o))8BSeaDorCe!d}(4|Gh1|pcy;-$C&Z@}l` zV=xoa%B|*(a?RXi2p2sdIWXl@i5hxA0;kzUALWE*lH zVUaWFKr9t&#qMAPHWAH29wQCNesliV7D<(>>3(^GH}?S5$HvfLuX?r0W01h$xrA{v>B}i{fR_*s0y)#JAX#` zm>l{{ZC5VU?hLTj1MKuqL5c2#l}^dxU+&K42$cJSp}Q(3F8vF!~9Y*)D7l zW{U{{6XUU?SQ;k6CxCTM!oTD1!H(Sk>v(S8I?JirIS3LXX9Y!-T=?I1LolY7Ags5nTtAsW~5+pz}*qBVi)kqxE?UP6Ml6Hy9E-60Sju2 zFNB%KgPtt{YxEcHG85|p(lnt`ShqJ=PtXIW839k<4-16V8VDA153Erp*wp@@!ErFs5Bw7z1LIx74}iy+0BakH z2ZLN)a53lu3I`4AR1KEw9<0<{(6Im0!;zqgi?HQz_rusZ(CN#dQ|n=LKUj?tG#!17 zzC{zz6p-vE^aGrq(Rb*5K=yic7Wk1NXm2zKj=|`B`0fiT0R6p#m4GHHA&%&T2jP?O zrT;zoI`AevaSOZ=Rw4__fVuC58CYU1;6r|czk7||1REKJ?gHEP9xVio_JqGL0KIvJ z<$|TPg$Sh|9E0#-5UCvg&yHo|i6G5;fQM+XnQLH05Ihr5{Q;2q2UcDWxN(H_>x4Ui zm#l_w?}5}-04AqlOF?I1VJ;f5A0+&hglqMf4z7{n?l99{AUSuCogH{rA+7~0{0Xk! z56B(}7S$EA!vrw*60n;jL?gT4u61x_7)bsieiyKM1oVF-tSpKbf^B#NsJMw;$F70y zJ^}V8#!EmSYw<#`nn{4E zI9TZnyc{rX1=iSsAc(*CQ_#6cm@fy?&xL2_!}_1b%fO=TB{B(?a3VXCUZfo`$GN?Rd{tJ{`x>?^t8iZ4gFk1pYqM^BKc4YDeL`BV)MF{3DXUYu zrd~+P|0>T6&t9FgtuU#q9lN^uPSX%I8TSbTXu1t3-nux?5F%|Na z+sC??FBnO~cAbybU9(z^sxwtjRkv09R5MhVYJL0hwy~{A&2^2f^?9|4)h{b!%T1-H zO70eSE$&jhuQ;H@wRBclLHX6nv(<^Uwhi~1B3nDCJhhVz-^|<4Rpe1#hKP~-S=!n@ zaJcJCx_xl}>M_xCv8S8oDUWpbbhrDiLtTD4**f;O?`}(5KeTXGtdZUlCGab01-TTf z=kA;D7%TLPbzWLKO;7a}Rek&Z_F?Va+dH+pwe#9*+TOPvX`9;S(re~K(5y`{rt zz2s{7enpPL497pkRmBiRzI>WIRpulcEuAjuCjKcLD7eW}(POAjL_a(e-GvO{LfM(- z%O=`%z!+du89o~J8hRVd`ec2AK1c6hSZgRUOg7dU_nAD*ugtyJS8M14R1JqJ#GBuW(LM^1`QiCay zdPD}0uLu|72*jMzz=sY;e zJJbZ)Oz&q9-dtWP&xe1J-_GwL2onSgc!Es+PQE)ojyIfF!JKD?GCKMwjnNyZ7V-e; zOEwTMh+W`8eF+`d+aNb~W7LLio{-*z0 zpI!5_`RBasZodM4&;Jwi*CqE!-m3i7g{j4p%KBDD)ZDIjZ2rzzXX?r5hAtd zfq1zjP->E%k_qL0@~-kS*%DcTv_?`cP7s|It`ltGzvX%GzA;CcRm^B6kZGe2(0{2i z@&OTwC!pa-85?7MWok4|Ft!`M7~TNd;tj_P-iGt~N}aFnwANNzsnKXwX-DfW>b;D$ zrZ?;nWE{pP?vV<50<(xWliye1AZ!)B6KxdBB^M=HiLW$7DwW=r=*4_-fpC@J3$L91 zN4~+Yqi4A|v(glANY#7jf9Y=PF6fTx?&uPAQvGy&hQ6Pn&~V52+@v)h=cc2x@lE6o zdO5G7AV$cCkuxQorG2EH(q_p6$yiCF__R1e>?T%I;SfOte>LwO zqo>2@msAL4Ny(@{Y7X^`@}hs!Cz)`bj`xcHRB&53T11M%1ZU_t^q5}JoLV;e51U%` zp8qoaVTXIMw}0MxeQU?9>o?=CORj1!+MK7)?msj4+}g{QcRD<8__!~tU+L}k0IHvL zd&f6Dq6f|%d2~wu`6Vm1Z#cd+IEsU#G3sd4uBeLt-XDlMv1R$%tBcF0%SZ1VIJo<< z4xg(TUhbO@<)9JmzJE8oRswCb;6~Or#{5L+wnHy?ap`8<8wbhNL`tE z=g;#3w#==jp?-eT>t?Qbb#tGlZw+hfuhvbeyI(iEeo4cp#v#q>mcwm`Dnfl-(@AG( z*k#(pk$3>zF6b>YSt=b4yY=ug`bPKAhI|;1JUD&W?MQl*YUJw3Ps7|JiU)f16Zd)? zDDe&Oa&iCYptHOoc|;r7PiohOV`by>vVV+9#}YezEPCho_S>7|Z{6O9#3y_@_vLl6 zEIs<$+8>vG+vPbGT`b>N8{h1$`Dp5aPvGgqMT%CdPIfyS~<+rB3G@Pdco# zA8O}qYh&YSJ=W^JrL*OA3kQo8${UJf@|iNBG*Ns}^j7FA#D&(v3Bt?59APt@ONB=S zE_?^(Jb4xy#3dVpbw5-OS__+YHyo%_*W9R%s#;gMvSLyBy0V+44yA(9U8Rr8wpN&` zsJeZP<60M}qxBZ-5ll;23(CZPax05VR-bH6*@+xFI<`7abK2$cSh+&BM?6WOWLgM0c7uCh?qK2>!wqjiPp$POx(B+YI&WQ-_OdooOKNj8zcf7U zNo}NVsD6}TlCi%@WPV_FU>CB-*~e@g`;QfJ%Q%+HM6yvUd?O*Gp3)0>Qo$8rp{P)N zSVBmLN!LiDq`Rbhq?e^nr18?*(#g_%iCBV*PYQGSUznYgoH&mvxqGHHhGROpwoqNJ zLRCH64}*6;)!MsN-s;l2t#we_)b@GH$H8T7LP+?SKF2&>sY5iNhlZBBB^l7Tc5?H_$4fQfA|d=N5&3${UzpJ%%7OZ*ZSA})Cl^uo=`02V zd-qrvC2p3wE6r9D?G4V=9>UJkea{8X3Et4>d1(0nVOZn9r~$9~#rOW*qpP2|%W;o7 z$3W}NvKW3A{>5}u-J$6~)$O8-f6r%1QwJoRe8-Eef7$;K`I>pm^8kAIo(w5~~= z13I1Yw0FPdGRjHhP-6SodX{Cj!XzyfMe{e%%Zcl#71v;LH|FZAb>X^r?Lh4(O?S;n z^(WPn_K3C%E%%#FG_0>XT4ShctXx*PzOt(Fde!V|i<%QPB{j~qdusdEO|LI%xYV?@ zWl!5XRfIOkaM!#Ry+Z!uq2e@|%p%K5W~;J0?oj54I_EgAa{1&E<1)f!pYs|gSI0~C z1-3t}H(7pBe3q^dsd@7#7OUgNn?sE^^+R;7+RmEk>VK*`st2lCRj~S$x?J5&vtQGy zS*Nwq{nEYEzcZ8>JVv?B)On>G*Eu_6E7xFK@9MdB2x$o=%)`E3m zr?byk3AYxql7o=D>mn_`e+t>T>GiQOtH zhMw$p`pJc1w@RO(pDTaI)@?_ft*?4}hDMH7&8%HYt(R^M`wv$wQPokkQJGOkqOSZ8 zXY02uTR&$>(6nB|7xfP7+-&oVDbUJm_T_E)_A8+{_RmwngKc+HZ_m5^_4chhX?H!M z-`+p-u>EoO=kYOr-<|l9mf`qUSMsoavHG1kfGA<|1d~Mlh7tLG1PZaDH z&69MKeU{fME-I6i*OigV?#heG_ZCmA*4bt|JayK5MwIZBQ*}Gc>FNb&HuY~B+7#N<56}Yjj(4 zd$>AUL+IA&b%wX56gCv~CKl3pd_VC_S-7&u($}V|U9x?X!+FPe$JLIv9M;&@SPcdvJ>XVO){nEqqGOrruMqF*=>8;IE&CO;$w+bLcqbw^4jh*eJUw3FS$JPVOaND7!BuVeffCd{wkc*iBH!i)D7x!zepajjJIW zaUGoi$63hhe!zC&3yJyUVXBhe#9J=7FA_;DJw`G#wYw-i? z8#69-JKuP==BbWg$5$U;e#+(|aVP9mM2ab2(!PU#&!t09#PF6G z@0Y*bDA=A4NV^mD{y&_xMjeXU_CLfmZd53WUQ_6Oh(xtM})Y6{igDcCcv+8OZYg?YQqnZZoBK>W{dE*3AiK&}; znfa*sx%ngLZJPO?*_}PccI0BXzDO+O{(Yc|(@vyOKN(suRrE#TD34SQx5TaY+9cRM zx9ed)!2XNfCtH7;UREi}LfIPeUVdk43mRv#)YY|*Xj#!1SiiS6q{gdyOx3H(6_sx* z?^cbid02P3QP+~7O3~SwkDw?ujvp!3%Umsrtti`vc5m!QIIM99cX(}|Za2ktxiw)K zr06J>ix_?n`V!%R{oxLo#~b_TM{6IcN2tQu@3w7dOKZE;-k>_IS)!Y4=wZUx%bW;} z#OC1>i2zbg@n{cb4ljn^AW#eMh{{DzMYzZ;c)^e071D>PMdWsKv>Ros6a< z!;vg*A=k_vWIfqpbE5gPx!f#ZJFvd2ge@^&GS4;lFngHY%>&JQ;VYMcOk*`92~~ z=}5&v%Of`7_8%PoI(Kyqa_#P%XIG#cF7V^BTE3SI|8X(l&&w^*d#;^1?{kVccID8M z{p_AAyQ+7%?0CDQe%GA+MaLX3^?mT<{qP?VRW9a2CF;Fx;K50o7SC8eW!wMl)wrlR zQDdSi|9ck`C5;;V-@B<>@2}R)4vm}@+{<&2;xQs?%E=#(%bCgo znXBZk@E89T&zmRV4S`(IR(_zML2y;LU-VOaPMR&>Y4O~8nf)DScaJNba=hPl^9qy( zNrSoIbHOb^!tPQ(LziOD2B!tq$EA0e=g4oJU2Amhrm}na)_>HQ!_p&?44>wHIQjNg zTyE^jxO;E+#oHtXfBld>s9<_kR7(#-H+-aEue{#+yknBvfsUBBMYnqaQ9aJ~j1M*k z2Lz7^ni4p^+oCS9o^zd}Z9dE8!UA#@a?cp89izI~x}^D8V`M{c{iZsHx}J4k>ps-$ z8s;|PEgxHNwO>@f)oS%)O!wJXWGprma#v>{(>)%83LlCYAmcGgxvg_gi!ErhV z4?=#M-szh)%T=A)L@gdoOBxjQu66OXX|-W>R`nAbWKH8+eA+i_IvZ@*j@V$TFP{}f z%3PImEUm2rZOUzIZOt|(ZGKq4vl?xAMj0*NFC8H^3J&uydM@!Ewc$>fdKr4_qBTd< zm8xh}imHn`U;R;2q3xo7WC%9pn-_6~h%?kZ!-$@wj4FoR&^SiMd(Ruo|HxPK8~9K8 zKK#wRqs)4GEY**UB=$ibaX)ys`A{v&$Hb7?lS9Sg1{RKGKy9@WV!>^W{7vITvGRpTAVq0|cc0CSahoxe*E4*9_2 zqAucCae(BYBu(;7a#zw(vP3*XARl3NIwo*CvX<`VOE$e7|t z8$w|YxF2Cpl2irtm(FIAdFlKDfrV&+_?@Ihs+21foZ^v^Z-HB+DOV^vD%Fawia5n7 zMMp)JEL*&g*Awlb`CPLyuXDP~+n9%q*XEv!J>he-`q0FKy$-D1uicls@AUq*gUQDp zoO^il_A{S^`fP{lYU48LaQDYOo)0OS8oPAIM(_X7ri(fpbuB6;>QdCN|2}h3o43qb zeR|%D@gai>dQ9p#%sQ6VYhtUyb9m`PKOB0|?Loxt&)5C0UAUHbO%#b-0Cg#9FcrITe=vRTr@k`H3FsF&!zaEb7)aFi%g zd_ZE9X2@xaXI6J@lN>0QN$xQn%wAO255A;-W`K3~Pu=snPw75AFy4PjH;b-uoqXKy zI`~>5;-Ta;Qxt^l9m|=5^MBYZ`wU*{t;Di~w2u?wUw>%);Pi27LQ>+&v{jjp{}>C+ zRdZWD=pSN5d|UYx>llY&u92R9I^}m+;xoNlyx$Oip?_|-93QE7Vy9M*RF`fJGpwg5 zrir6?Dk2^6H~ScJwF=E271w^CeM$SB_COV?#xxSGjgHfO(hrBcor5vTh?y>!x|_e7 zz1UE;%4}u+ZtP&_ubZj4r5fG7y3Ma`ecRyn6RN(Nk-BGwk!C*f9a~5i(^h<6VF$65 zR4+?XEVlS&S!lJ>`iXU<^$e@;7Izgj(s!cn{LR!I>?f-POK@2g(6+K=d~S7UF}T=M}o zn)`^nMvq~mp;Gmlm`v)(ZIqGPNlTd9jFLBjH=j3*=MHoHh57eaP0ZL%GjfZ=?{pgs#H+;#&L!;Yi*f8EOJ`lFFe* z(Dn3vh@cI;<9w-Lwcwawn!wCI$DhRS%OAqu0ygHIpjJ3eTq{{7OO`KIJd|IPT;gp( zj;eN6b;{Y3`t?ol5ACZ zY~L`yU_j>K&$D9tK8e5Aa%=U?xSJbqKfCAmXy5biuMfU^@v-2`iB!+;%YRM%mst9< zHl*#DVI3ytg@{{ZJ(VsNP0DJ;W%)eWR%yB9j-*8LSvp)kT)D(@we@)0Q2PkSmCl!4 zGu+!fdv;pcd7t+XpR2xmx;1wD+0CNcTc0HFh|b+Q&T_x#lw~7Q>=P`-O@2y zUipGQjaeTu_NE1vXj`C;cY9Nq^E{4?C4>#^pw} zVX7fPKU8n8AFOZG^Nklx$Jk^f6t5tkF{=b}@o1@=e4(PNa;I{WvWN1kVz}bIyik@R zohNxCN)z1Rb*5JmV^EacXK>YW?SosLn(sFjHKa87H?ocTCZ@%sbyC~Ic1QIS&19XM z!Ob+5{fVr_{izaWp5V18Ub0#CL;h63Q`RchDYE6B^1ZTBsUM8KReVTvRhT5u@oo7w zynpm2iXxxkyRp6KQ>2ZX$knnB*c0q-c0TLRR+x{QdzHP9_l_@YmRTv=r%w{N>Ja z+qh#~HrEeHh2EV{XbuDM*9h_Qt;}|-|Vgk<{1CgyA`g>GJaY5X5MqJ zM;q_IkG^$Z^r-Er>eYg`_dhOAEKZ&LP5jgH@3eerX|L+)#st+cqZdk0sl0IE3ei~6 z5MdqvF)xRi&GciAFuQnT1uY^w*#>2e)oi;K$DOV^kDi@|bP4idyX^`%*q!T<7*rG# z7F5+eJ)phY?yg(B(mnb)XWQ(O@8wIdG5Vb?h1D;LC+8B`Ip02}y-SWueDP)f7q7(G zN&YF@(#B@I&b*WDmov9uNLfJ*)^b5Rhx4QFiFa8{u@gA2cDv*8)3ZZ|3eT>d{vL?? zJy$E2aZd9b`q-JRcUhJxgfa)Qji3uNh&+w)ks`CFNpDza7-qO{2sc`rRHnD)A?$hf z3cHA<*^TBjQ@hc^7-qPvch}eJ3cyDO>-X!k^n8Ptp_gHRVWQy>)S9Llg{C%>2Ya1c zgs#A^l9_ZfFGVn1G)VkTd_gP{2Z;I!`w4>i-aJdDnfgjzBNpJUSRCTV9RSaY8Ul1t z8jUKcy`*hgo2ad-wXD_9IX;t2g%ALJ;mdM-u!HO4w;8dL`uvjjQjPu z+AEp_b+}rt?x5bIw$(Iha`33D0zu|Mt&r}!;wHfAdf-M$U*W2Sx@$% zEZ7yejtp&Ptjed*tEgn?;uu7ha$3 zaK`ua_4V)5BQyAOh+V(*(AfU(`p1X9@B68DLr`RZrO&ud z-fnN~i!Gjuaj4wg)O2Y|t2|p+`KLOQO&gOW{OtN^??*XfB60LPtU(! z{yi)HUJ+E6)qF}l#%M;?Q}+bBrFF_r){S;E9etd~xD>m5b#ZkeoUb^#JH*&6w+*%F zWj(-Zj^$R1OUgSCeVmrfl&ZvIMLPwTd2w_b?0L$ev-dq><|4WM>^8HFX|`dFZjNS> zYFgWw7PR?&V|K%chOmZr4R;%BnpU*nZO_^#szusV-4Vk?(;#*-asg{4`q686+XT}@ zc9NUYeAz8|wfvO)xvaNzq?i#N;aSqzL?IS})^h3WAG6jJU|MfXG4KpS^=ov;wKp|i z)Gq2;)gbjajZintP-!~OIbb6QKGlu>O6SvOXh-@k6-FUc5m^g4%X*5XLwOtd69k_G zF9mZ22L5rr7ykv%mv@D6WM0#2=^?ZW-9%lYJgL)U9-+aDu`OsZ$79`0BMnz{p4vJ! zt6HZTt9qiEqh70dr|qVH1sR$Lkds`9+hV-3Y-QHWQ|U2ATe~cB^KqI!(1gwN{m`nyU8Jbk#1@ zrRe(@pP9Va1DqNeh@HVxhz1g+P4quz2T#u%&Oge};H&tkpq77wAHmP&jpoHb*GYGJ z4fT(lM>;{r7D8H+gUGGqC)oRqr)~rGI7$og=Ur+GHIfRZTqz3*r>X#>L&-G4hd2ve ze-EIa@ho)LkB9z47B@qOYajeNrh>k`0^|(zHXlOXAX4->dKLSI%gIP;1O1G#vt>)T}v)9-^vHM|VFPl%>8hZg^-{1Tw|8?;1tK6&qwii4r8dtipBBwgIes0t7)|_@q6Rj=OCF|cBgr8GiuTV|j=#T}${kzZVmeaY!O`nR`ex0}8rMZ{w!LikjYEq`S(%=)VBL;Fa_El#9!wNn?TMu&;^H*C$;&#ZDR zcUj)BG+55Fx@mRXN@tmCAy$5t5fXc$CvP(K4quGU;hvZSOhty>dO|l;GgCFPEx2Vs z)4qld^+9#9wNGkwwb6BF>i;!NYw~Lu+;&Cfp-t4UFqzmD=so-zIha1j?BqG~H}Dhq z3c+51yD(pPK@=fQ61R!(iGPWf3m@~JFv*k>qQ|??Lp~GrfNu5v=rlMwqq)cu1V?T{ zJn6+ba=p3DTn1;2j7C-gqaz%tf$xv7=ghlJV~rMuFS?~#KaCIcr1_}^sY+G#>Vw+T zdd3vXZbu^tG5wt9CLAg5B2APj6#bNgExauAEZwXqtErZu79SM_vPTlWNY4L2jltWw zT2og;l~%7lqPpB3+CHnjwf(*7qq-gIRBZRfW z-lCqOdSNf&1VInJnR!Vsr}~mX#AN&tW`RXRPnZ=-LWP1xF?cl~7SLb24m#c&QAg;2 z9R^GVB~}F8r!!G&^bIlrDd+Zb-dsKO0bFIH!MYFResbH8A*e6rg?AtrvVc5AMbZTG zoC)Q<;#u&w0dltp>IDOZvxU=zZo;<$JHcrF2Iy&NpeNCJ)Fwb?4CzDeA>QLT7!MnT zCPF7Wj{Jj~C4zKBCV^Bh0Y|_AJp^5^r!g1kdY(;~iR<94GpWg70Rx#e%ozqO0<)1f zo&Q3xO0-MzQua?#Xz{{oxXlgQF?RNLgKd^rAd+m7HqZ@s3VwZi9v||&?_K%T-RE0R zA3AySc+=72NB$mmJd$~|=Sk-L!|SIW-F>(0Tep%f>LdJXPS^Zp;ZMhpo%d*!Y|H=8 zu-0tXZ}b13@9es1*K(KH&&Op(i2LyTj(9lRbP^?_85&{3x6+Hb#vcJ0ol`$2{YqSv zG$N%_`l4?Kvbtt>`+fS)jK6>W`scLd^vN5UuP?MMT~qP5T2|lCII1PA4O9J8*J?Ky zc9?C@L8O>JQqro7wLRrL+0)p0U^iL!u;8qa$Nl2^7Yxu2AP2}oyY!hDd_BSx`*CQX}32r}S>w-3nvXz1k%W6PtUsxv2@A%FtxiAQ+*ge(}}|YsCUtfjn60 zZE@Ek!{U@hCyTAhyNZ+Yk+L5WZ}Ax6WPT81BA?^H3gXt8HO3-CcSE_p2BPAThV6!% zhP#IAhFgYLhHOKPA;)ml(9`fwe^dWa-`&77k|w#CHOI1jU}~!Uj-(G z7wU~Lu=nFk%S^pZlS~PwNszg6;W{Hd(e9WNaD}cA&g63PJo$=DAuC8T=|V+NyQml{ ziMmPkp`JnC@oeG|UJfV-L60K@a*hk)O4ysQU)>L{X>2{~%FTj04~2|HZUgUQK6K@e zgU;(N&_A!mrx2+`M~ELuYCV-fF|-dol-@)~(+#vMGle<8JY_yJsmwFL${eN#!_nX9 z+w>uNKOF_}=s4P!X6Rh%0_6?0(qe)~_~N6no#SK&{{`g9hE;hZKoC-@MZTjF!=>Vu~Ka@!*YU!w|t!NHr_)QUbp(+(e#=(?;eP*jyZku z$ngW{{^R?99h`c!=;Va+jaTp7UH8=E4f|zFR(R3U=5bh^#i~xXdhd*!H7jA|lmB6K zYSgT#_^9jKr*Hnfnzv};^qXVE5i9!?`=9Al>Xd0|B|b%VFjMLwjda!U;t6@1f7|~Y zlEr4WW;Oi$^qZeMHeXcqrFcq-sW`uARN?OYpLqv!*_`>gAM)z+(~E|d4X(Od7ucNB zenz*-ya)S6_Z3yjzgSm0hI&MIF6?%{Es?|VPPvYvf6e;fKeD)Zit>%T_kT+HuS z@}BYnyy*g&=#jXi^t4PTpQennK&*VMBW;%2 z9<_UGpW{&OnBX+uInMcsvzxPr(?y4ib`CbamIZPL2~Y5h3dFvfuj{kb%i0zp7}8JDAhoADcSH#|5A5Adq|^EH>$U3&S+8n6T<|Ph<(USMXhlY zQAcGmhxj@{kf^8FTf$22OAXR8X{fZLH^z0ab+qoS0U3>7gz%)egBNzn{wHSSe9D^wGDDoCT z(b4E_v=rD2G}wt&VAX^Hqh%3fmI7d>IE`M<9N;bIdkNkOItX_N(}e9poiJ56OZY}m z58XcBm=km`^@~`Gdt=V%5abqAQZ};Rp`N+Q^wZee_z|*8{SC9B@)%`YV%lzg#j@NO z^gh;xTa!+dhWZRWzY}=Ad=so!o*+}O9rgrM`Hy%;umh#^23ku^qV|wCh(uuKtpdK( zcC-sB0!G76kWDCIO}Q}r_yIzl=(NOH_EtVhS!uD;%F!myHs7w$?x)Q^3>mg*0xRSmMpqArE<73bYS3QuX)ZJt)5D5GwrCaF;X?5 z@j_K-$@70Cz3>1}9#J1Z>>&fQ_N;~FP-=Tzq*E}1R?u4`RaxT;-#IcGcO*p*qiDsn_anV;ArvxVMW zUDRsT{Gs7~T~5u=YEhM@R3k23=jp2bkL(ZOJK>r!jSZ85+yRQTG$QY z=tqcmGr3ka#k|GjZEVxG>O6JNwI{T{w99nE^&Do+IL*hBzAd(~r=r!0_n~46!Uc zgSbKVr*;FQ!9>m?KM)~=3i!}C(T}(c+1MO1hPq2{U@Ukuc~f|N-WKLL{eg-mw-K{& zU=9MyVHVN}u|zzP{>Xe}C7gapDa5TFkpInQb?kKTpp{59+JdR@f5crfoQi|Wi<$aO zZKi~5wofG8k@dYI>UCe|THCved%ze#+%p=X4%zw-a*iO(-Cq=D* zjZ}`GCb~fmX(~n1PwBBt9@B$28)`rPHA?IQ{O{&_8hW@ENkjD_3vYIC87qc6__n*7F<3ubH>BdXC@Z&ynF_<9luJ`{lLJ zz24De6Jil2E$17E8?2Kqy;a%}Tz#dyPidDD*OG4~PfEv>jVfDMI;VJGfnV;nUkRCe zzAjAtkbEoIloFjj=6lUgi=51Y`m(jPYg!Ci12>uZBMq?eb-C4XtWW>IVZqn>c=RX3 zTm~&0oH^Kk@ZRtb17iBl2>$Bt(&f9GuU(ovpPz(ZH($_QQ=MrIXzty(vOcyJubEZ# zuVQcc_Oim#_)^QVk}_?1XyuJ6b+ucqr0!82Q{St8Mg8k~&xZF6CmN%hEL-wg>)S&# zIlAx0uACLVfTo1crNI_UZM+;JoikidxIgvq@f_@ld!F#fb#HZh@7mL4rjwn+LR)96 zk%~5PKmHOj4w-0LrL$B|XbWn2&~&4*sbOnF_Xf)b*M?aQKN^-d_J^*y$t}BEU$*78 z8&y7 z207zo(@t|2_9<&(RqQ8-@$A?JbFsP7tTyx6UhFou6>1?PkU{7S$jm&1zBqqs54D$C z0)8?Ss(i<&WWbIE?Lm9e&a@rPqbsSW)DY?y83YvuF>woccYeSZTnkl(end2M)^#9< zlN-oK6`~!{*}!>h1iNqwScYA} zg4DtOuY?#)-Xed&@rs;7nuwhQ2|1k(_$OcxYk^076OBQe(B8n;ltZjBlrRxb$gxxl zb%OS1egn&+060yP_?v*qbdG^Q;8kqN$Pg?}x1_x?%Q?ax;gmxC@# zuYSA!_}22f0ry8d8uaXDOwxNIdFu~l(aFX^Y_#NsbD{65zWs;UP2kOxEeKe8Xa%wA z>&nl|=_Oa@J)M4R{Nv%b2eQ2e1$_2C1U1Pf=SL1+w(ge8WnRLi)IQ{eVUqewOP|J~ zy7jd`YbMpCRbQ!kSdm<+E?k_q^7rm6yNvg#Pm?<&+oeoQdyw%Z>(K9-yz1h^RlgeV ztLx0usdRCLm3nq=>yFOc&p*^ADtB1BvYu(uVsL{3|tuC&%tfo)R=jxHwMO723VkoJ(@6m*|2B}!>P?IORh{_cN%fcXGKr z;Bnc5^yujB=vM1;(wXNJ>fmH|!uqU55BUZ0U%nlE8lQ&TFpoBF(6?ygG_Tcls{X2X z?cvag8r^odZ6_QX+Qzo^YIADyZJW{dwk^25p#7R^mwKz_j#j1HXb3PNYzcQ8odi+q zX{rPBoaZBWF7y_^kl4t^$o+t6m7v%TnNx+FmA;e&i=%~d5Q`$qh*3m7Fm@*ae|IoG8#>3+ae^2K-thu)1*#U|pu?$9MI4Fiumczi4DCwr zxh_y|t>iS|;ewFa$N{KN3V|aViz2|DjsqOuhW_?UVmD;0+o9eeWJWRDn4QdaW-b%L z@R)r18DzHC(i5TXLeqb!2h=L6C#5H2$+hr*A*2zbi61bVSHM(%i%vz&$P0*2x*>c- z4|l{7BiF#a<#up^kf*xME@vmPYuRt?Ag%`LuGYYG^nm|uz!NypEIu6g{x$!PrLzEw zDsB7t%$akhXXq3GQ9woP?(XhfbJtj1b?xqU*I0AawYxhpuv<_>#R8UeXH_9}9TdvvkG)weej?qxsqe%I%FtLz@OC;FUnAytd&S8ct!%P)O?9dv)#>JisRt{nMc zc=XVL1NZj+)MZ86`pp*BPp)~o+OsOfq5DG`1-Gu)Gq8_eYp)?L`P%6s*u&%~%*nfy zPY9EgZclYi-7kv_mOTNg+QTB%Fyi ze?R&C>-Sah=MpOaNJ@H~5}Ou~`6T;O-t407ruz2QigoH_gWPSm*ZgwR{Fervs-OsZ zSiupf2#obVRek{#S#sY^-d{aa-8Z`yJB1ipX;-Ms;!D9U+wRz6PqF=G%eRiR-m=)t zHO-Su=SoXUx|SR%HWW`QdQfOD@GEGXKRYic_hxQd?)Ym$kFC0c3x6(!5a* zRKHiXS6x-QE2q)1C6690!9sI+U)e^-5Bmta5{vZ;8OyOY$==ky*#6R9)A669yljum zPrjAT9+T)T;iveOjv0B1_Tm;XUi6jvN^7Z3@usSIqH?IxU-?FwAytqf#NlEFopdVF zJ76nS(R#G!RCz7APHrOK-jnVTlI! zRSBrSIw*UK+O9sSIi_{e#~b3EcDjsm9q-~}Oi@MHALj4<(KE*P(c)`6Pj^3Z`M}fz zcMt72R^{~7^LdwFT;CpX@!q{h{x4g^H2jvHZY{Ykt#P{&_`cey2HvgwJ6-7UwC|XK zlLn^@el$ou;9l>_-S)IU)*`uKPVM^Dg|JRlo>kUYnN?+4m6eq{hMWz$QvR`51DAia zb;Y^%Rily$J^qfM?nZP@F+z_)(D{h&s{uR<<|Hm!WLa(I>JRTfpXR}Be^sCuHxyU>=w zrV91^TloI!DY-Rtu4;_bXX>WwYUAzsO}kFhQaw#sRh%pzVpmz#m)Hs><`!ojO8YnY zTjKKg9p7qw9sZ@xm%U#$f6e=LH2&Yj$4R=>Dd}mMdvng^H!JRFzHJ|;2vG0QKXmTy z9^~ce)71Bf?>yfmABB(E%j6m4xyhpgRd^bYkM3*SweCaQ{&XGYQqlQ4nFW987wUf3 zHqsQR7AZ@`eu~p_NjAX1Y{ztLS0DyF4j(M0RfGs|=rv?DXF=mS$GXZkoFz z-?eCcNrFjbEwx2B#>yQ69gdWDRedxWS}HXS8;$Lq?l~!){ise_==8#9HMkpE=|||+ zX^(4OtG%hP2vvPk9#M8zzLPv87xAj#DR1EDVEfH--?X~)LCO4*VuqD@uJ zBh9m@`aevTMmI~k%0Yn`aytWVWv>9^^h={9LKnyD&h zr5`AID_k#0akU*Hf8@!?ss`m)3#yEAeV3O_Q!8UAim(R89Z~&mkA(yyChL z3-5)>`aAx$=h~*({E<-!)-ex5gJqhQwd1r}?G()|s@^{~7jQ~CUo-RZWt zh!;I>3m1gr83!L8P#=DJJp1hQE8A}UxHtCEFV7~t65l@hVEy(kwN*iiy|HeUmrunR z;eG1wZZ^HmhYoq2-*jEtt!B4JT{?HV(k`r(rOC9|BYOCvh ztn;x}a(Ji8oh!`u8SJuH(?xK#J}MrTKPCHSdSdeagu*XxKWuzE{?(JG)`uhS*NfZ` zIsL(o$B&=ieADy&vd)yq~=y}sKgsOs`UIwq3 zo@YHSyKkf}>6LR8r&flBI;G~hay583MCM~JZ*635S2}>0@0|QAx$Zd^vsPwa$mozA~ONjyAd&j~m(;qVR#;C0@~2yHn#(|EbPa^-yh8o{-LA$u1DW<;RHd7_4Dr zf#~Tqa=XY>bhkLWq?hTA*~i+|*2i9({%hN0_2>xHo*pm>bXTgSn5u|V^cL@nUQm8p zddn!KC~+;gS%X(gCl1BKG+zo)#wZu6suH6K)&!ArKTLH^idTdR=ZU{W*n{kMs9ae< z)z4M?cMZinuP?tre7E>_z`yGwIheNgp_ zQX}0aj{TkTWnV#W618Kkqb||nBDqpfKlu?|sji;BojzRuLpM#Aq#dk%r}&L)h$)M z$WpE*Hd6d9e4#I*8`VK4iSMN%F;1b?=g=>1k)pHMLt3d!S1s1`(fvlec(6-L*EKHF zjVsmvIfTM#$$7CipSndjU0iqS{_(9R!q4ouc6?PKIZ5f0lW)g={hSnA?QP1d z@z2wqtbaW9@$x6Po_%+Sld+VMX?ao;)pInqKaZZno zUdAd$wNr$%yW4G#soo!bANz&)r}@_n2nvYzKj;6Sf3$z)fE@vG0kHv{sb%iyciU&P zXRPZ1qgqP`B$>`)C~lf}Dsximi63j@+kVUZ^6!_LU;p{GK0YCFQ1Z3ZFX?A88)mP| zxt}Y`A6{TD%qk8yZL=8d1JGs~ahNnjX~3Q=qHeOB#-Qz?i`D;QoZ~#%b)0(}PqWt) zp98*Y%BlQ<{O*?f;k(Nx-7DT>y<4txsIj|ljk-iSq1Y+E>`1qHS-YC2mR>3ri#8T? z&mWq1C3kpkzubkn-*SiLN%@cRj~DDJ++4JUL$$f=9-Oy?!eGn~6Pmvesaw9?7bX|*xVP|nZ?EqDwJyIVb; zi0);vt>T*8M>g7i*eY25GL0`iT{666Wrq)8)QD`=@2eKM_-|Pw%(Z3Yqv2&)GDzu&4U7dJEB*O;p!R(dKJf zY5r5Yp?x>2Myq^OThWqQskyk8IMNP!dpglou0URn=-FoUQ!pCKrkF39#WB(?a_swq zKZ=y$=-5!z7yAA@ld2%6`p~ON1O9#hw{-`Fzy4qUw^KxR`pMfP0h;n^LpDnrI+OL0 zPm^yWb2u5^=*TBCg|_tQN+y?Mk@yzN_@Jc03b@97eDLpisEUa#ufZ0N#uE3$5}!?v zt!G5PI^um((=TruJ=l`z{@F&JC)-aZhg$Z+vDY!jG25})@rnq@f8hOn@_KaPT1G73 zxi|q|grt(IMU7l*(kANe=%*UK8|21!Sl&^3NpH|)5dnLsl3__XDX$Yh_mD1-Gud8I zSty{c=(D|t-Njy)-V{w8&N4N~|BWz*ZmFG+u-8PHG)3|P{fO#jn%&wE{S|}RINNEb zFlf@!=O|qsG2}{7L<7Tw;$@ zb@uT>Z)>UIn{JNVEZ^6G!$N9>)vhtQ_LsWL>-TBUwn4x8Tk3YN{i4Q(@WQaRVJE_L z;q7Xq*E(6(Qh#y7*oJo-1lP0FoE&zmQk(MAJ+2sjS4KLbOzR5YL;x z%4+ytD-hQyZ3+qla=FI-QGp3TV=K)Ht{Ac|LTk&j##R2Jl zIX>GxGhOY*SK2Ac1bHjl`OkNUACW)0C)G^up0X%4A}u=oMn>Dr zwV69JPiMwucFM}idYxUIGbm3Yvh}g}TWPLYWvl2IC||CKkt(RyYm4+FobI_8-TQdX z^j_@S)$e8bc>fgvy8^-jD*12n+veNY`-X>?+brh{!y;Wj%|unS^rzTF;VIG`Kfu)c`x(6=IQgt=I7_%EQlzS6)!1i zXR2cvY+L7ul~)mGDqmoadm6qPM>|h(OMmKt+kCcHPww(W0m)$9+D(I7gym09|yviC7&xh z?Fe#wv|qMgvnODcmpDGkp2;^5B?{*Dlyl)Vn&IWVPk% z=%v^NuXz;xEz8jvw=G__aD|g16Rnvg1S{q$e=#OYnjwk%D^wV zR9q}xAcJf()nCX(kF#V4zX*V*xxR3cWULu+GU zhv1K`-i3Y^I;oD-o|xewDGYz6pnjpgsIIKqq(l61!i^#bR+UONAd6%U2>30qjbO|9*9 z#?@O>KePU?^_}Y3YOkpoP`!G!(6G8;f38r}%>6k~m43q|Vljax%Kz_H61qw7eoPH0V`D z=U{X2p%C}b_Mr_zABH3cFR!#es8`_b@&|o~dwq5baIUGZq&AAlj@On;C9ew_=2p#m zk{+7YI#rh1J+(A7J1sr^UB)zWn2%)k&HS1%H6t{`JEMO_W=3qLd-jH$26?vp*utpd zU*jac$9~VA&OY}VA%z`!`j($!_=VkRq^;Dzrv*aFL@=o zEpw0LG|4H<{*i6V?vQggXMAp-ys7yy1rv*!l+-s3w)|@=cC;nS@o(iwb(*H3uA@HO z@YOJiN`Hk@L#JU*)3Mj5I1O=X=@j5(H{Lc*rk~a?hFx^$IH(<~aaSKy)|PfEa^wnG zs%@{Ooykz*Q?$2We|~s=NdAiaY6V_}I(Ys@ai5Zx)IrrVHN-Pl!Me%5kcZ>L!{b%_41rwhlJuUR?>j%;p=;7>k@LyIANL_}1l_^8ly4 zWTu2_m#Pz#ZKR8e#`I~)chqtmwzsuw>^Y$NKznce)C=vy?Nz8@-)ZYbi^12{!_+`N zv^KMSAsX1yao+LC@!9dj5s5CfI(o|DWGCh4sG@b1nkpNqs^N{gt?8+~p#7qa)1KFk z(Uxld(8Lf4-j9EOv9f@;o0}9(7vE)KcQG5gBnqT5L;e`w`B_J2hl|5ucXM>XbAH3| zj=Z=;e!lXrd-Nkb%RN&a?y^4QMrX-J(dT?8mBSXrez6I*ysNSo9{RtPr<74jy{fBf zzp7BxRlQCfseZ5iLB#Ex`VX~HeOT38WyWu5R@Niy?38LdIcjs2Yq9>X(_?fFz0$EN z)7#U-dEe)Dyao+vFOuYvSZPs5e%~&9at!dg#wnc&03s`YQI@ zb4vcsDVIF_bJe#)o=<-G{NBL3(RU*w_dFDyZg^4e&9}D)VvoeReAg#MribKJD4pck zsT^qN?Dm`Y1;25D*DJmaxm2Zlwb|8uYRYO=ueH2pr5ZiM2Zg<^qNviN%Gs)xYAOa26ECVZ>XtYSb^GDz?_1)xHsF4R%N3gkFAEtK8XuY(IwG`b$c#!ggBAv?@%zO` z=Xun%j#H#=usTy*C-=7BGS4kpT3D24%K0ZdI_vMO(^b#9|GL(nA zeRQwoIoPY4x7B-;&m5mdK8L-pdTsJ-?O}GiPesEO=g&?Cr~bwRhD5!q-bEL$S)$H@ z+Gi?`$?rQp*}hudQxW^Q$cW|cktfd$$oV&Wc=qD##Oygam2wkuPv`B(KUDC!uu1Vf zx?NPXBw4rHtI%IOM#xoUh_|K5AjQ=xSM`2%Q%#I!oHkWER+prkq_^qUV#`l99^*CC z7-@K>U#fFx`lwGR-KF!2mBKFhH(5_vlw*QJ?%0hjz0nqH)mZCTR+)|F43p73)vU6d zvh=h*wc4z?)&tfK)&$ExmR6P=^FH$={B|-+j-|Ejy?ukMy^yJxBt22)sS4B&G_$lW zaC(L74QCDa4UY^L$cO7@_(JaED%}a~Se9w|laPp0S}be~Sf%akbO z&;@#{5J+X>CD{YVar;)=3hRHCH1fDY%oWUkn3K&*Ey32u)(JKj`xX0OqDeFHZto$Q z6iDxaNk@~h&Kzx-Z zNim|Y*hVp#yzgS!SmI=t@#7tFymmMo^@&<7lC7XWT7SBvnoBWPxTFihTC*2vM(zT9TE9p?xu$AKihVD z3RP^riYR(kPE>c)me*f4+%WDm-q0UZs|6QR-R$-W-QNHH{8;3(Ta9nLzu|s6=)Ux{ z_|>3yNguX+-uf`8J8)Nz^h@*WkxvFa6Wn$5&nW?twO^>+69Zj$-#b=Bf`elyjbsh}_LJ=UIjMPV>Erj&zD(?=jdx0R5A)gQ*E8Uk3ZH|DD_*D+ z6x=b`BX}veT^H0KFx=l>F4pIk*KLnTx4SOeoH`huYU`^vNJ_;H*=qYoYlJ1xV#OY9 zXbG`gHb_&o&#IO2Ff}fDcal2EHECDJvX$jzTh-Ysr+ zx5@6Y?%p0ckG<}9+!ndUIhPpk=m%*pt5gzm4IC?N^DT!>`qIP2^NLm%zA5NfkePpk zzD=X^$LIfguoe{exY!S=$jMZJo9l=LqhU}|gjw|uj#x7M&l+6LIu?CTv}Wa0Eg zo2~dLc2&lx#%c<+WArEJ4m#7x>@>`Ip7U5|!Feba{5Hc;{YBk9ZLB6wT~$3+wO9Ec z{@tg7hkS%1*0$Sv)Z%T4HRn_7cYq$dMyuYcunKU$#d6ycX8FbZt7%=Sy(FomRjH{o z&h*rL*s_@F{PFhv4wG!2Ac||GB&^5x>KR16E^F87X6PFlE|c-P*dQk=9HVQhJFL}f z7if~yJ=Dj^epyL|n7cBRimWl%XaUMoc>5ZN-4zpr_44bokB)ElC$?j(D$Tsgynybc z<&iXI%P8wBYk!-`_Rzk^v064=K1LWtC!E%jO1THSdoIx{A9Y=|v--TM3AMYwQuVJ= zS|p{iA-OoE%CV|gRcrMwy7ji#{7F8TCy}iLm7A)bvZFLe9HE$wRk0F3;yHW1ZK$ot zdd0fSdfXaEAEASwjzjivbo*$ThVJS?ZSv#SgrE0AVkt&OQ6}$0ZOu@dmMx^hJ ztQMW*y9sZE=6DPakeRcPZt<>65;(}LhIaJ%kHACmT{cY?F7uJKknN+UxrQ)9;UYyS z1J&E`WWEp`j;1Dc-piC(UoXT=ebwRVUynLIQa|bbeC+GzZym7@;&Q(J6aP9|24aDFh@peaHuv^k6Mf2+o9?%yd^`U~{ucin|Ly*zU7Jn5ZcA*Xv*W~8rKJk`Q4tmQ1`(sjjY z1YrsV!YH`b&#%*HFXX2B08;w@vKqr)ZJ-=Q?yfk=M!|mHqq5?Iu(Co-DkTup(5js z>tYwHQ!C>b{Q~V8^(N(B@ur}VFLuc)aekUDrBTI*tx|ZH2GFG`HuJ~~A zw&I9lQ*kHqNWYcTE!|UUDeYvMZrWMpTZM&Ul2n-vg>y9v zwC$-dz=qb>(HH9W=$aGZ`A^$V>!LlR3DEqZ-mN;TJS1%uHz;lhmGF3920w0>&jv3B zGBx0ctfMT_5$afI|77b(mHu!d;C4DSO|d3gXW8UbTsL=!vRCBKbif8~z)X*HeB=w5 zfAUV$NL{5()Hm7i)wfd4CucNAX;9+lcg3b-VygR z<;GWhf`1@X5lzp26YCkow36<4r`ORlK2aXXjDeHP6AB@_W|JaPkxHhk4|%h7#HL~w z;scAslj0XF<3OU{{*pmbNd-)zxrYtDR$NH#+ag}mxJzH+gOd1wh*kr*_dYWO8VK=B z9%xB^N|~>H5ff@Ak&%9ti6IqP!&YVsIOAKK4*xx83P-qN1eWF-MG)7_U<%ApsYq&~ zT&aADC0&nPoVltas&A@t>h@GbH^kR|OEsDPcXyN{l?LTwqIG-1?0kbR?=VQD)X1klR1IvCo)r@7ZYmgGY98ap$gu^_re=RCF!uT zzWTK0v9^|OrFOFVrud6vOX;QD{;2`qUw^Phd%dpvvgXTkuNp;-coz|CjH~fg7k?|U zYjRfVt&I2Cee)|6S2S0(+vF>x^Xe5kFXJrd%dVf@e|SFf9_72Y+(f^ZerbO4@I+zr}<0jE{t?s zvGy>Bl-4d@Qm8LT$ji^Ikvl!-RQCI6?=44nhW@koae#zXDnVDh8 zFr?Q=JCb@Vb$psReN5K6+`fg&N^`7z~C%R zts^bf%uXin(w-$ZiaQlsitZI1EZSFezUXa{t*A!vl;Tfx$?+*oq(=3k`H{tB?QOs0 z(8!w!ofP%qsY6mlE@Xhsg#5(rKPGOg*>2~8p{Z?Dm3e{e$-UDRL z9VY%Ulzyy7@sh`qvC0>s0p&=i`aokLj&RrZmRLB3*e0J=3a1)cbUpDTHJvD?=n8Z^>_zI<1L(wB)dgs z{|$N|wNxFWDrKP3Pdp;~YAG!W$+4u!;$uH)-+zu?9`z<_%iF>4pL`tkCF{HUj}OV- zX;Q|y%<*(eJC@(SsCVfE%R>7&d8l|+8K{}1dvB=eyvFsW`$^BX-hcYE^?mN!pxo_p zC;h7Wj|uEp@pwqPs<*;l*Q{7)P2K3a33VRT+Ejgh)d#^h0{4`Q@NDAR%owSSRSlB{ zDt5_z>7x9rEzp`_eqp*)x~pU~*{JIZOnFmtrJVRIW!A>bQJJeU?`9gas%AN7ZOe?# zc#-}*&6avFH8J&h+L(-eSqpQ&6dWkoW?AB>qgbvSsd=osVrcF(%DK7AbC+N`Sckb< zT<*9Wa5?Uh?lRKV!oMW6m8|B8Pbi&Wq^`N81Hcc1x zMddYdyU<)#Y`bdNMb3-7cz5BNg2(w?^Ih^Sc~$bKbaFcDRL%J> z=U8W%i{NtKd4%&_r*clcj7tpL^#ABqP|v$meTD4rQ|Q5p%2eqB{W0{?d@+Koj&1T` zvKkIwyQ?k0+Q>4|e9zR59Q13YdrP;|dHinar_wwI%LMT53R4u3yz}_ma*5@Qw)xp# z+c!DdF`j3?yn?V2`q7b1z8#O~I5Cl!xdysy2u+SxThtRZS2bV2qY;|*Os0@)ZmMUf z+o?U&spzc!)Hv;=ZsVIYj~dI}%!Jv&6t9V(gTc^ejO>N%J-IVlB4cClIz41w-vg?R z8}XYlOv~8hXzOsobKr%9*yhM`bd%kXRi>WHmuh4g+D4P`Jil?lUSeG77Ya$F~!p>p3yT*XnWlRyOj?cal z)m%kn0KXL;@tZ6BJO|gC$%hZcb3Tmxpe0NM?8o#UPi7HyBpX&FVs8~!O3q9b@mDQX zy~lfAL)~0mU#-S-7ewDp3(`!Gwjdc~VmkG#qR4bVX6@|7JKaoC%o;ihW^#O&AT#U8 zYci{EBlEC)c=vbu1|DKkSGMr~8T>=Zs%wwmuIa-A|=nklMSws7o1q<}`BS};tdAA+z^zipP*XcvJ6*e2yGnbQ2|!bHHTAxR0ArX_E$0xI0+-FMF|MCn zSGan(E_BIo?%;gIDa7dv(;>bX#u%>Zzvv!lmuM`i9?B`=O5u$~CR{W# zd6{aM#+z=KJk7(+>&#ot)6BJ~r5s{PDE+_~4lA(9oUk-=F;-TiSK@DBCvM zIP$u(tw*i1=)ye2+R>`CuCZiMyB%jbXgXywnO0GqQpf5`o%RKCzM>pMWF@kr@{vp! zyQ*kTF02RKb(;LpLaCUTmYO^=df_R1;)gz@d{5n@jF_>Y3ZUP~O4VKb(bcJ=nxO8i zP9xK8t@5s4CmH@z;qL-CXOUwNk8S%gVUmg)*RPar?W4^7{e8kN7L2&zl< z^op*)N+o5c^o97`A!#-eqOKGIvacisAt|z%7PTGxJV0zsl*g*2=2^L3`PP3l7rrq$$3qLiu81F=l|iz2p>Tba^$hhC0kE7>W1=4RMq(N zQ-^NQ2ap~^n8p^)WUO{bqmI%Ja7jK`rlL|qp6z5X%Pr(Vb)p34zyx;{MsW;yAx%_D z7Cyg@l^s!3CAVM=w#z_}-X5w9>NDSK789~km<9M9-@OC;bR5gSi2e|F<*l)(h7rpe zC4Lk8NSCE#dMD*k`O`pN-@e)WYjI}Yn5=-bNlEJx_I-?QTHCVnSVv|)PV zOhfjm9Jjnt`KJoJi_R6#DeXa5xD?wKM;m#XupG3yof?@-+P3Kf9xXM!;%k6gS45nW_D!o~fQ#_zJw`gZkv!e5b1qF`$w7k2y z+j8b-Z_UzX6=qJ%8j&55Gbe9O!NnqFX;1T1>lk|l*(JG;qM=xhsH_4>@2@P8UQ@aB zQVOE_f10Y3x*?cshO;~hhg;TQd{y6#$U z&2!Z}y8VAsoDlXgkJIcJ=J-T@R&8pxs*!8G-~PjHbX0Pjw=OhUWfw(p?F!3z625cqZa98`CVcWl5ny~Z(w4lB?2 zU2l6=`vm)8yP4|EWO96}QY$(dn){upqGQAxXx&fbdu#wn4#(!~1m%i`HTBbn&kmpuN>{TF zgB4TIvZt9-r^T)xgU!BGJi?mqf(>?p9YVw;u+4Bqm?D75cs&(!`D`?wtt*Zr%Vs+G zq8gcc7G!k1;u-m?%a~rmU}mI$HrLTZmq?!r{xt)O}>IX&O0 zU#~zI!4fsoz;y)OVEUu&)q8iJq z9sbdOlpm#c;wFWUFhRD=KFsQDzE|>3(b0mEyydy=bNXhV${Lw9gosss*2e7Lau(-a z&MVEYSlFVdOYwk`5vAizQ_U;rHhIH#(|&|3U@um%S{S1kA8M%`k4I{xc7 z&OKZs+}u6dc@FgI?j7KB&nLvUlW$$$c%R>VPI*7~y5YIXqm_HA>n4{L&Y}~=WBLNJ zh3jZXYj&y=S?MulIpr+rG5hVQs429RkCaVwthTR!kJea@m_M5;m}Znll{BL&Yk0A9 zaWppUm7@HjA;sy%>r0xKmXt=CwwQml)V8Ku_uJZ2S-ISy!TWL%&r67WI6C7k6KGrD zp@|_M;=ZCgvxR??Qlv4|Ah)5)H=nLHzpM98sK zL{^8US<#N&^e+0Y=dkU zop>Dh2<9?1_zh3c3uIY=JhMXd-F~7{^~nl5A-zGi=V0l^g7Eeda~?`9Xbm)>KbbCh zAmrs(qq#(pdMI>?cjU*dW!_{bXf;6aF55T836)ruC7w?96nkW2M{0m;} zg7!l~)Oe}5B{MzzN;!L6A%XTPd zHu7g1Qs@nxxciVDBGIX00#l*aFj;#a_3P`zkz!A#RktK7X9#>>W@iuk$^XN7&z~na zK?Xn@p1>O)yprqQ0tdAOKUk^K^8i6KWB=<4EbxHpcZApA_D*06#ORCdx_L^xUeFdsmKUpW);%(K*ikNJlME{v~_7?bO z=G)(p8TA-j?1`)$GeSp`t@K@SPuwXjQI1jdR=3wQB~MtRf3BZs$Tjpgo-k$^%Q=P8 z#pjl>oAC)9v5xEY`ag8fwav8eHCr{yH1jo!G)us?lQli?BY&W#zr6asY6?}&kBO&7 zOZB9c)Erh-EEclxYh0(k@wlU%Lx76CBOJ!qN8A_W$^1oZW{x1W`=qp${ikt{1#uV+z78MLvF#FtIr& zHXlF9J@Eq-QQyQD;NDeuge!}7DET(n>;Qap0N#Jg?DnoyGbU2s*^@}`Drw`-+^@}K zOjea%aqbz4Ine4>u;F)lE$m}T`&Im}cbQom!QT)0^Nf5i@1N$KmtY;jN<}<~>xD?m;VFL`pmmAEO&DL&-CsY;Tb0 zd&NEQ>R)`XCjRZW!Z~Jq&qVJH#;ZP^doJXzeOW^ds5cF~J_QT3HQIP6XnhFOJAwJ` z|G;~DdG-@jiQnZp)5)&w%XQA8_wF*Kx|l56PH5rL%&wfly^gZWpNIm8qLQpyD;Y1A zpZ`{1p_eG+q8FBbM|^0*c@eS0kLN%?UnYlkx?&JK+Y}CNfel}Yu;V-YbTg5etyyC? ztoGko?=o_3|7G^=0XpLxM^@ZsZ?56Zn~x{04suY*?CBz61g}6%`;Z!^@lB-3b@1hA zR(%(lBSS-lbEl!KcO|H86*Hx4kx!EbB~{@`<|-EOEF*b$iQ+#n#Z4j%QJ|1G#S6t* zB;jwNfroB5@QA^-0tla%}ONr}lFF+9^oW(0)F z^JR}^C&-^(f}R=4YX~*NBj`5Q4&4(Zt4N+>W2ysM$-;;W7CF+$N%}$_R307Ts>lYS z(LT{1t_#zVPmptMWG%ljr}+*u-77JPdN#d=BFN1wLI)Vg91el2`ip@bAB(i;nd^uQY8u)hyXL$&Vas^uLcVzzn zv~x3gxI6?KEl6ITKaE6fa%JhVkG!6s=}r(2-77ml9A_Imw-9Z7os5vS=*39#qUv*> zOYE?X*UGR2d}> zMl)Ap_PLdBq{D9)&~XE)wEPC;cE{@ch$i05Gt2?)9YRjLmfs+Iygxk~(q#{buKkTR zUL@PdzaGebV6SWBdY&bWtn*Q1bIs?ux50H5x&;msMsZ5R(2UFRTfatEH$Xm}r$+rT z8u@p)#viTZiw>+#=Os^kS>Jitg%IX;H^8^`0dD#KiP4*gP>;k0?a!a1usnZ(pIhQV zcNIkJ4jXqXB&#(J{C*Q_{gymM9!8zZL6H1d!JpoS5xib7!(Id8_#GsDleytJ&~H7~ z5Q@5t zR)s1&sr0!GJ{!lkgMaeoYrJ9CkzmK*{4-$m$e(`v4al$s$j8&{NQvM94F#c@)3G^j zA{lPNSr4G8bioVc-yclSm^t=ugumfeGZOm@Px1lF-o{TNuWT%UTF9AMR1a*zN7xU( zD+XVDVGr^_^9uH;0u$ex@hYSo|FLIZ6)-8vWCC`_0TM3R3-8I#?adWX!oIzE2yAQ4M_V9 z()+29Of1z4`mKm}wFwBT2Q*s`4G_pXb?~*012JEKY97IxtC@}5n$HDbYbk%?#wS>e zOW}+bti{akoF-1Y7tHwSCl%jj&z2$Sw&KIt0T<5Ve>MVQz|G9G`4dF*3?8hHk9IlwNrSxhMshbpU;K_n zsm=eiOlkkjmD-~b;?O=fx!+V!UpSoY3V#Q1!t;q^KSG{AW+i)|1&#c;>`&P^*&5`4 z5)Hf^4N?Lsj{r~X<5M;wSZR2QxAN(GbVLgT6+{R@iizyU0$xX{bLj>8u1y4?4ZOaJ z(+S`-`k<%P%$^T{hipQ5RyZB(TZj(r!6zm$m*z0L_YXQ|E^}(CkVU#5tlAyfIuzf- zL%9;Y*$!%N03KN-e4^sKIvn%~4!l5gLC(|qDNG>u&8(*p2)HJno5^mT;JSz4)RSnH z801ib5DmxP;;g^m(@tdVW!%+*yDWe@+s(%6ZWv6?%r<@xXNwBFEibLhGTR9gk)QJYmZXBt=MpJ*ox z>QN)D-*HmwS??$$b5m>|jiAH+sll#-6B2Vt}6GfEq zp$PKHM|vCJwE({T4(+}JM4BS6$l5mI3%$t>971MH6Q(dd^B;87QQk=c!Tmya!3AKS zW^X?9PtFu}7~tv)?!s zW-&p;Xy9bC@s1AHBSE#Ph@3BTJdTJ$`}edsHsR} zPp3fpgW#4XoNpi!)SokJz)Fwtycf8i3B4aH_viWdBTJaLE!?E9(=PmiB08!id(;h^ zHW9?y0=@qZ+;ofch~rfLgZmPN#>fVymas3oK{d;vI5}8Vk3=n}_`($zagL9`n6J_7 zGqDIdBh#w0g5glgUL;~8_U0qB-EHEU--FEKY^ELIzEe7>fACxciV^*&c(a<3#&F!1$2x(KF!X3WldQ~sHmT^>LgNa2xpUk zjJOPiM4`dYfyjQ7kAwd{fd)jP_Gh7hcf{p`-jdr0f_nVEb z3LuB@JZE1S`nZlH-3?EyQT&a5YpGCy;mWX7ee`TkwAxARGYh-8mfcDs22#fPS%N>* zJQ%8yDefahF0toEGE#<3M_wuCj0fug&iaq0?2;WaXBG(M4Z`7$`W zE=VASD}I1FJUQ<-TPzUry>aSNsT%FM=YEAm<-&l_`8b z0YCO`xTiT%?=e)I2jy0Ui~o?<#bT)qzK=r2Z06bDaD{*2{iejAe39N&*`@F3n+Om} z6W*VIG;08!n1aNNhHGl0;hxitsT8VT!}_Wdk#=w<(X3@ZyWJaV>;sZHkK{cC$L#-K zmFjWiL2X3=&yWL0SAhCzqlM;j!tWFhv4pEA?&00`pr>gZ`YlUd4ohtAPmHji-Pq2q zTw%4>*~@)A%N9 zP;m)<_2bnInk)h^^thixl1jCAWZ6Yoj%8LB$&AG8vw`%=K5W);&B^EO#nH$X}t` z5uDd->_8A9(5THOe3lpvQcK*LIGs?Y zxIr%+peA?d=p$Sppi>q?m)nu(&5>IJiM>2SD<0+D+3aQ!xwLllb!X0eB4^(MFJT)f zX&;|7ptJTs-z!=5UhX^$>oW(BHr(hIQSBuV;g8)ZqR4 zyz>ovsED0e3Fj?EBAkGtYC*+Y@Y0;bs}aB%%w<39LOXbF1bE$zz1G7cW%&0ayD$o= z*by0D=5;v3pFP0ppRof}(CB4s+cN9#3_Q31j+g;WWMN^S( z1?Gsr@0iBV5BwAjxpP?*wFnEbHJVhfI1kp;A`ACp2`}T%I9BV0bkfHJ=p^M{4&&rcFSm4o353f=f5^?HN342RNfFmKMa{-H?e#;f;65j_c?UyU+@) zxrlvl#WRlsYo5k}XpAh6K`I*H?=S3AH~3*XRFlqgenJkfM_2dZx*dMviKSpQH{lUh z{aJM7JUTXa1d*;|&lj?uX5`kLhjzS#vTDv?B*+=AQkJ(DgZzu)@3DNQ4w|PFNirJT z;mdQDA(S@9J9nTw@% z9tyF5v_~Rg@1x1qqSYE;r3^%xHbKffK*KNM{2RgbGOW8Y3BQN6odprBfzOAs<1>+_ zr=i-JXf!_}>8`A8Kk?6U4oMjNP&&%@hc#G;2 zJ)FT+u5$NyFkz8g$qA2Q-#;PopMeSwfN5$fw&MBoMT2SZ*S$f1M)GqN{r?A8r4>KJ zq5P&i-DBvpAE)&gU&1ORM=h>kMZ-6M!bcMoS%TcF3wry;p6!4FviV#n)gaNt4GLsI zWOeOC!fK#HPo&#J_T>x`r8aAi;l!LlDW%|^=j_E_oJnnD?`QdY_QwbfP39cS@RSTm zFcQ7C3E6*3k)`nYnR8teEi7mKUT9(~R#G?Cun9`*$9XT|DESp)J^+I+(8hq!v03dpXhT;NmCjwHt#J3={AF__dx;6 zkYF1?TK|%9RsjsTl~r#;nnds%wBYG8HTzAuG-DsZX>pEnV-2xgc7JN z3M<1CKADXiJcI=6&NJ^u8~z|p*cdOSgNn74c<@^AoZH#kd#ox5z48Q{Ra*=aze1yZ zII#v?qYd(?B@|f}#dtxNj5umsFQ65cqDlJk`w(QS4QydTV+Zh!ZqUncxH?2(hL0bB zf1a{`Gq9GD@ETg=?cwwU!5R814-dD4hR49qK8la5V;b@$oIOs3f6Vf_$b%?!dS$NV zgiU*ua~aQ${lZzy;@_Lt_b9H^i~WiP%PPbyr2Yh~&L8OFBRui$pIYZGlDsl;!ZJzz z2T$dWJS#%_T;@6z@L{DwW4-xg9D1S#D{7BaGT@;)4{a=iCYSQ(5`H#w0x#LAFRWxa z->A;FeemEFL#c82fouPi<>t$+~t(+LKFY7zs-@8nxC1>Rrxy#IeCCH zwF%+uz%Y1vIy!I-=UHa;M)JKw>~Tk)M}r9nU|Gz37T<5{LetkF9=- z9cu~}-U%hY#p?dTTFWHWA!L7hc*8K zs%yyV8*%3bXmuI))}bASpjF303Ep6bTU==w{88qex`sCO;?oT|{cL`-8P4g!-snJb zPH_2e?B9AQy${^uhOb=!fqEhVLXeFCaI;D%WcThP-yX4#GO%GN{)g`9>Fqr0V-P|F zPf=E{IRXxB!ZS~XBhv9P)Z?7WVGX5la&bIwGH3dYf5q^Q3Hq(1}dXnCA5(m-CY^& zS&3&*3jk$wu1qMv3Xj9TbeB`O0`h(aiY)Uu=gW1-vU+gdIC%LrHbNOz)S|Ur+0jm5 z?r`v93Tsb=gVa!FbxvXi^n4NSzJpdcja*oZ<;_e)Ys-1}^JZ0@s z^yI1lu3X0cK4!nl=(sHI8V;`M0DZKBLi#}kt69@Yq|F{A-fFbaVtB4IHd8KI`W_T; zgFhd#<09wN2P`)Xs_{oI#X#$4;LFY6kRJG8J;5S%(ee}6ozWnUf#}rV`S&kmP1S+7 z$~^cc^tcV1p&mM7E>ut!Roo9fuR=B~LxwNn^R2PQ4Cu+KJk4TCYV*Xc`DulgTEG*2gZgEPGC2^#)82z3PO+amc^!o^KKy+0)=>OLZ1Vr$!?wt5 z0qfg?6ZGdN7+KpF*){g(6AnOQdnn#Pvt#f8HGtMDfeb1`uYK6-GHY`%PdA_6UuT!T zvO7PJf~iO*HCJoMzK;Lt1zv^^cqtO#2;BbwRD1~RIUecI2HDXSYiu*`y->V_HZDLV zi;#T=^u$u0vKBhEJa-L;a)-hrtI#(4*sopKP$SW@{!p$vT-SgTp2#{bK`&*wSk3WT zjNnv9V=46Ilxtx_$>H&6R(h1ZKE&?i!);xV41W;4T+FGjLbLS4J0L3luR}X#X($Hb z0Ioh4!7or0Z0q7sx;dy=sHlTO!A-kbP|(2-U=bAcBM2f?9M!3~mZBo!(4}q)Lh%cT zf{0S|cO~TIC66SR%iaGjm)F6$3*4^adr34XEluD+VDu(BR;7x!@O+nHcNI)$Oj(zv{+4m_eC-k*Nmad@ij`dV{VT*Qf!C2vAoXbbnwo6a<`Da_^ zT<IC$NKK|WN90PMJt#U-z&hNF-SD3 z%)zN)v8HD?4>xe?LA?JRK4i$%5?bPh=8}aAzwl8G&+=5uwc4F}(;4Mg45Nh0WzQKp zK90vJ=#+=Baq`QcsP+NHI^^&Lu63RECrMzz_lUOtXzBKB*efaevpdtq bDH?m8{auqb;C0!a&6(+o)oAcMo(BE_%r|@F literal 0 HcmV?d00001 diff --git a/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/elliot_speaking/four.wav b/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/elliot_speaking/four.wav new file mode 100644 index 0000000000000000000000000000000000000000..229edcdf28d0ee8d33418b4d6c74c0159b931069 GIT binary patch literal 42054 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

HY#W}D|5UtFU3FXM(ZNgb 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

Otg)DMeE632jPp{VU(-zM;0J&PRQTD<-W+G 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 Q?a>1xiGq&6a_cDje`_PGu>b%7 literal 0 HcmV?d00001 diff --git a/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/elliot_speaking/nine.wav b/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/elliot_speaking/nine.wav new file mode 100644 index 0000000000000000000000000000000000000000..7d59567881380210250f5e6363107144ce62374a GIT binary patch literal 56390 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 z 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 literal 0 HcmV?d00001 diff --git a/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/elliot_speaking/seven.wav b/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/elliot_speaking/seven.wav new file mode 100644 index 0000000000000000000000000000000000000000..b8de24b261738c7b19df4ba2f1d24369dae1f5a0 GIT binary patch literal 45126 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 literal 0 HcmV?d00001 diff --git a/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/elliot_speaking/six.wav b/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/elliot_speaking/six.wav new file mode 100644 index 0000000000000000000000000000000000000000..8094999078638f369c4284475361f4851fdffb46 GIT binary patch literal 48196 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

I?S(d}J=WgE9%3H|c8OKCg|^MM6x&<4I@~_S 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 literal 0 HcmV?d00001 diff --git a/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/rich_speaking/ten.wav b/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/rich_speaking/ten.wav new file mode 100644 index 0000000000000000000000000000000000000000..ee41707084e77c8a708ea3427ba2278c14dde02e GIT binary patch literal 18604 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

OI!5`prlrYQ^P{~sttnt<|C zF%FaV2p9B!9yDr_TO^Z6Zkc|~B#A=*H(}BtdD{{X(wc$#GVKeZY?ISSLlV}AJEpk1$vetk90i+;ymIt($K`irq?H>C`MSK zeyCqlGMF(MmFY#TVss`RO>a&UN8}9~8ZXr#9wMJ%;!D%dlV(pjDM8Q8(7#}00Pch( z___q4YI+}=I3)}dp2;tfaFB|W`Q8l*SJ9&>A3}6uj?u&djn(7=g@zN<59WWbkTjrC z5bnAI=l$RlIT&7%18~o|!4W3j h!lEft30L(&xRUQKagzykf-^ynU`Ns{#2F?Q{tv;rOC|sS literal 0 HcmV?d00001 diff --git a/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/rich_speaking/three.wav b/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/rich_speaking/three.wav new file mode 100644 index 0000000000000000000000000000000000000000..7a4842059e9b2bd3d59cd8f8791466f58e8f16eb GIT binary patch literal 15724 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 literal 0 HcmV?d00001 diff --git a/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/rich_speaking/volts.wav b/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/rich_speaking/volts.wav new file mode 100644 index 0000000000000000000000000000000000000000..e33e9108649f0ec90a3f009270ee6a4f94cdf3cb GIT binary patch literal 24044 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 NLH5RiRwO5OK7W<)`r-fp literal 0 HcmV?d00001 diff --git a/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/rich_speaking/zero.wav b/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/rich_speaking/zero.wav new file mode 100644 index 0000000000000000000000000000000000000000..fcf8c6deccda281d389051624ee99d9770294d03 GIT binary patch literal 22124 zcmZsDcYM>v`>>|>NNgvz6K4}35D0s(QlRXzHLZwh9SOkY)18@K^f*TU&PZ-7t7$yRcVhTtoM?xd0 zOySQ<{dd%u8mxo1MH2p!bHjB& z&gd>`J889Tq?tB9HAq)0gaAhe`|ngIu^O_Kz8aQ-Hs2z!d?a=F2f4 z6+{i^rv=IC%g92!{6aOVhqOJwWyCckZ^Yk#<_5+H(qN zvkD+UwG5MBVt=AB3V;&?&>BJD1rLD3e?&PKfJ3MitRNXPKq<(nOeg|*6$$x5iBKq% z`^$3Sy2yW>2WNCuBIF5K!Y3g|_zdvLpFY7k3!ck^(p<=)W4>P#J_+xIcfwoYjbC>% zgl9sg@KpF9>=)9Yt(U@JEE%w|3R{IL;i~YD;1r&K7AUa_!3elJ1Rp$K2=zY*HE<;e zTA)@58bSESFouw(vN`kM0JqP2J{p4=YL}R-eQUT}= z(gS28z8rHPm-B!207(OB8M3y>E(CG`ONFF_$`O3Yqdt&5tM>PSo(Vknr5<{s?7!O8 z{?<@QHNcm-IbdZFw^3Wjrl5O)oEv0=>Z2U$A@D4^Mw$`Oy}%LiFfdOb8-uJ?z?ubk`(<|E{Bt$ZJIt>c3cpN{jv!4z zRt)6=5SXo{|CJ!wnLv_tAtk~w!Ed<&b0xA?|C27VYN7Cy)^FbeZ6gbbK|*8U%j^@t zETF|-coX0tk^<-F0n&hgY%2Xc2yhi~xe^k(i&8+&|C61~KR!?`#3>{pG?uFW8%?NR z#4}V*`+26rWSAVrzQm8U7A#*VBn6}(u#X}*qLCT6LN<|x+AOpv16x7EeZ*@S06Jq} zBT0V>NCSsDC>OAl=qVl&1^U5*MREzO-~}sX2e5*jLNt^D#U-E%`F^XI2e$4LST+Qo zLF17%d<(PWI~WUZ;rIqpnjhZ&cTR({H*gQZJK+_i*Z%8tIHH>A|J8d7Exdy{Hxtg8 zep{LaS05l{L*Jjk&Z7Ao&GQA2M^|XhMWgG>+>cf_ffWwI8_mKfA-M$BFoD$yl6PQ+ z42=K4D(lOP7nt3W{+qozg9Yje5IAY_K8;T8rUOM}2Ai}{2)S@2;oMM14*>KJk9s!qc z3nu|~2rGrn!a89!oTm%JgkC~tp@Wbh#0e3CR*(U3d?jDNXYh|8eS}m7kPf+zaLnP0 z;i|x2RtfcL02toEyLpb62|YXW+}X zfcr#%1Ad+)1ARyRl-|e6Fa{IhF3g4HV|FYKPsBUmgYZ^(SG+AAhbKU41`vk_;dOB% zuE3-49IOax=U^W(60R%ZDj#_H9Ju@saB&0hY%$gcWY`8c(*dMy6Eu+f2Q=&?aN-8w zx?1=a@ct3_kSH_(8Ze+GPH^-8@FL+697BbR{9gVOe;bZDzyXGj6JGP1`R7n_26$5m z{CdQ1;E(d_Af4k617|)$%^LnLztU)tCGOxiF6bsEja%lcj zKw1DAGYGWfK4{5D>^jB)Wp+#ouWyx@5mH^CHxb||HWcp#JeUaiLHKt3HvSYpjGw@B z@VWRdIIqLCL^b{#UrBKI888HU@qh5e#8oIIiJ5pJ@h!BYC33J1z}-2})=+#3mVj>t zZE}Hh@&TU=7y%i=Q_!=Mf*s2S4LXX+K#muMG9JUu@LlYYE0{Qro5GKQvWwhm{v${7Px&$~jeE+k;N1LE zZVI=7cX7$wT)6i;w^~x4gP@NM{3q^5K9Ro&z2tNE`ObU>w?IhaLInrh4F&z1 z2~w#6ZJYvnewe=q7!MP+!)QssE&>l3;T&*Ci(e#)@!#=O;#*=l!4XGD8QFz&li!hM zay1!8z9;n*Ppaq!)Ys$#Y5>)RT0-q0o0B?f7TJJKC2vsCWEk}Wz*uS$b&%Fk^=LgE zMm3_$^mY6VC8ujJF|DV@;QOdPn3DLFP85uI3-M{+cf>(z3@^nah>QF%VFP}P+l=RP zcZEtUk^9JjCE-%ox@D93-)Ckmr)Jl)Ex9@D9A7fqof`*F&R}2pa(vIcBYf4q)2zX#=KA>lWEXIy><>&= z&dWHN3ic(_jeX`F#rT-9UIY6TJAv)QG-bCjqr3yzQf7j0o^PgaHNT82;zkPRgztcc zY1of=G_eAYAfw4jVlZ`|m`hs7j^vMIJ8BI1n4ARXAIasUjXXk*AzG2QNs3%aDajwG zO8hQafQ#UGhHQo%B&QHN1TiVaW3gqRw;1Sk0iJ>N!a3m;)>jB6La~WL2ciQ$SJ+E* zN1BMw11%hZKf(^DG%@N?Wy(l_N2NG`F{3Z_AK+Y@X~C1=B!8X)q2}A zb~ekq#(UcL*t3>>#$5H4cvi7{*n^&jOrhroZ;5vT)6Nsi9%puYe`7}Yf|;(q#_VzS z0;^_gxN2WKj43T&&0ps+VHGxAFo7k#C_KkQ@y)oKC?-gJA^A07B(lj9xSr(6<&bMj zh7!xEr}z{imzqW7;7Y0u_JDjugyP?VY)@dzi8DkGLW=3A7GQ}^kUPO9n{hocm-pg! zp*i*wo{X)-wqRGV-q?1b2hj=E6&LWw!Ys^*x5gf0vxuR5FJeEw3j3YFiALB~;(KBc zwwuhy7lSUO5Cr*wI7GZ9N{HrUcd`UG(iuc8K8CtPwj;kLFVI?Y8?~BlPj05lsb$m{ z>MyDdeTaHZHWO_pIdTC^>>cR#qRy0^9wXXB3N$V`h4&LtlDF7YalF_iycOM}PT@Lw zGW|0?jG9fq#72=nQfINZf}K9$Ym6VJ&azwiG_pB6fICNQWzVr<{GoTQuN$+_SLCI9 z1QW}}vW>kkju?jM*EcOv_Xw~;rJ>Bu&94f7rK zjPxF1c6$c1Ma&y_1Q*8i@r1Gq*fiHPW+g{@eq=xSzGbenCs-*P>N~-X@cqax<4$rr zxC3B8dkI_lC~PFGl9I7dT!ih!{~;2vy+kwO9I*kPLcRjod`He9Nb(c88Om~~?}%Gi zH1&$yiAR$n>MD^)k=SbL7P&;|N`(?DhW>qGk*Zj$J0T2-wH{D0*k^=Loe5fqvRQWA~}&t#45>i zpdk}QdvGPagC>bo5l3c-o|7v@UyG9{Tr!tlOxr{o#1qM>k{yzKoR_B&FQm&QyQm21 z3p#>cCmu$xBjP08u@3Y_n4=a@7lr2JRelc4G@rNx-vO?XkncQ44Rjm1GT&y#%N+G~ zW-6IB?!(MeCf`%z{>Rtdo$LtpO?HoVA98i|ZFhBdk7g2>(T*Ti#58mD1lw2TO7^Vq z7BRoOUwMnXg1fsX%Ik9MSddc;)|(#qBEXAO{8=1--#vS(ZqhNiztFRif^FWlDo*$SOL8s zdqhlwdE^mRmoSks zDQOv1EIuF#B43E3>AggmIE^U9>r(f9$*^KgXH7Us9Q88%6wc@?V~f~fywx>@>C1O@ zJqONSa3wI;>_gf1wJX@h&e86xY?i&st zlQhE0FM*y3tLXbwXWY#X7SHA8fFxb83jLNa(pP=?0 zN1EHt&i5Skn0#}63z)m?O1>5U+*ihZhxdZ_f=9$h;uEYJ%gC89H%y^AQ&T90T1`!- zcTnk6U!t1oK~DpH(NYU=l5R_Q@zvxW>=yAHR$aI7SLAIW3HwOBgK>0@_y^xAOu?^` z(LyK=YX|Boe+#$KZH08+E$SdN5@h0hT*me?!Y zB|d_s8U$9S12;=_7~4Rc#yb$#Nd=6O+w^m=BsR%u{ER4pIzYD-M-gQrhh!DeNHR%! zMlx7(TiQtSLKG~;=z8)>@h4PV;76*^#l){Nm_d5_!j*-nnhj(N@%-hI|p-c9z;PTbPQ8E=1IU1e7|_t(~1 z4NisUtvSkRazC?vWAnMY)mm##J3G52wWnPN*l)cR?oZyM+~1zH49D-_Gkkr)Mohy( z$zh^u;x;u^)J2p?trU+GRf@)lIKXreJ(1chx(=(SyYx{?OZ-E-h@sd;avb(MF2!F9 zpYR3v2H`Z31aJ10#0w$c_Yc_TGQJhr3)X84*%l}9VsbOAG&#}>t9*va$Dd;dNZ=h7 z3af(ycxPe|yiIK;D#^vzYW_5_2XDfkz*f_%u>DvD&5*0`WkfZ7pEAN|*(+w~ndBvD zJIP3Ds^q@7o}`ZKjO@JJsfdt`lvw1M(vIRaa*y&mNhA4I#X5;w^slUk=tp|4q=sxu zbrE%k5q$zI%t#@Wy~=m>^>Hs|F<(!|2m3{KjzeNGF?(E7&E2dsJ>n{hWp-`Dn%>nX zD|9vEtGZO^Ea6tSd6#*J^-QJ3yt{gA^-tB`TOZm}9G@MpT-`kv+?(8wyg95`NCa6< zq*Fyp#L=QzlFO2G=@0TH%H4qFRHaV2QGQI;PI^w9D&8QriEQG*FeB|HhT=iOL|E%$ zSOI*qT`hdg%eY5ABe%@gi@VQtfqP>3|KcBbKinbQf;Y;ZV1KW}xYz*e+`iOzWMA?q zC8nQJBk9}JE=orIPBO%|N<6m-b`0hAL#|+ z8{&?Vj*^iwgQ~acin=iPnmSvas{Bb+Po>c2>&9sw2K}b8NzcoJ6$9kF?7d>6G>7U% z2T?iLOkWh1APjXsWe#%+7hN;j^|OODpRXQoYi&7JIm2?M;%f1RvX$l0rSl7>mDH4C zMWYLv6@M(6SAZ4oEILqfxXf%WsXlA5+VX5S?ThRcZWr@fh$H`@)5W-SiL6}uQdy$@ zCHO0Cd`Ozsp!I66X}SfU4~hx;L$zCZPccarCS4+SQ+@HSSSulcxBCvWdze+;weBou zlyi@>yQ`B+aJpO-Zl8Omr@J?U>ERp0t>jaMp+qS8h}=M>(?Q}RNRy;@r9VmcO1ek~ zNRCLNrDLQHiA>@U-3H5lf_MZ_Ml6F-|1Hc3cZsglQ+lzeuBa~EoE|KCEu(`kX!nG) z2~lf8f>MH0v^j>6kprR@MDK<(-8pBs}|FCJ^IqqcV zn%aYwdSjj#79nTdtRTRi@=^6SvvKO^W_E@znlrvW7Pixhhcl=!~(Awf<3UDQAj^ylq)O zeaOuye|PNd%C!9FJ)aJF-2O5BbpNwe&(=P(KQDg6X3Z>MiZY7JiYAscsp{^Uh|{XS zgJXhQsGkKj3&A3Pjo;RAZKEp{nVaff*51KvO{a&4yUs#%7KmTG;rg@ILlDwv#8PY#wptdHoNd#V} zsNw0RE1NHF`gdb>!xjs7zYxqiS$)@~k zIc;*b=XTETT;R=Lo7X+BLxBnGLAH5DO=HI<_fV!6*9?c%iNvY+KKQe)t3Jxe7_W!T z3a@K=ZMqS$GD2(WZ0sL8T6-s`w`!827*>(n$pgZDR_z_($9G2zKrGX3eqR0oqm4h@x8mjcY54%D#{ z3sdq^8b1E|ou*(``HqU|W$w~Cmc`5tXRd$M@K>RYgPX_{#58Y< z+8tG6Dk@7}6|~RE%Ph#4n||)~#TWgbxl;S2_Duc$>A=U4_jM`X+#CDg(324_Q_}{2 zoLBgRrM}DOEOIQhcVJFXZFIe3o;7@uc)Z?p80ANzAJ)@0o8Bh3Rrf|rRE4%gIa_{E z79+1CT}}37SZm!fZ{daf{Cq`$vEWtylf1ukLUQ)x{FytkuzA_B>SV_WSS78%?6{F~ zh%YOLhF~Uh)cEMWk%z-age8SxrUj8rqUJ{2G7Q%YR%D3pQ?1Blcq8FDd%<$|~R}H9sZ~1JS?=tzS$$BbNXoQI|9S!dqemlmL*s*o*PCs-~ zwdI<$Z1}8xr-q45UbLub_PN2jsIRo&$Z?o4PD;{gr4aAxS3R=ydclSKdHEyqU*;_R zl>6b=jQ8*K8MEGvd^<92V%o0PZQpc#UH!`RYU0bqFYCU!l(Fb@YE`LsC}9(>x}CN~ z&T~RY(8`#GiJy|_1Z_l0NU1i-P#zcGsG{+xgxlfUlzXWRE|J~tGy0UiM31NDWTmn6 zM8W?2fqA3z9u+2(4zA=aXKSw17;1j9R@7egt{_?{T53CoR)loZoL4Ujx}v>rd>y$w zx^C3BVK22eRVA`$sZC-NPZg~oBZPeBkZTdFCJU?Cs!7#9Sw360*{rtDwnMhzwSPMv zdWyMqq+W7Fo~;}gEDfDv8Wuad?!fx-4Q3{OXuP>;LbI+-cQ#IG@KfEd9&h2(g$f6hMjX=#@J!>n}d zRn#-zllo5|rjCAQf3e{u`DR~6a=}YW8M{~Lz}Y<`JSVxW(s72*@kL4Aq)v&d_+gP7 z!gW!{Vq@w(i^n2ELe45SlXp3Vr+ux?ikp|0^(tLgGOJ`)iM=o?|4B~x=UaKVOJ7>A zdv5caG4w9gms~A2sCI^EO_@>cVm3zgh_Htx8&dRhLObbdgAM8%@^nckt;MhVCb<8s z&9?C7M&>T&CFXMTSTkO^x}sj?gDSS>m2*4uiEl=P(j&zVX{zF&dbp-2Bq>}M`z*oU zK20m_<+Tlgf^J%HXW67gVPkOv* zm~+aql24Zu$R>)flN<1ANYvy+lf{kqC-AY+ z5mycKLg$2j(oZwY*L!t81h-S3k!Fh?QJcx@L|^z;dzf3rdOdwy_3e|a^~~b3(M8P) z>gU(bi_iHrOP5jhD*tJVhy7Bz-8+9*b+0RS=TB?%o)?WQ8*iRm6XNE$6O>NYTJv{8GEzto%)`7ztky!`KCg< zTm4=hCdnXs3D=n_SE>EH?XmS>HDB4Gd}xWbD7LV)a9YXb3fA(MgY)i!FJXsii=>NU zxVoigf=(JbRDakY3R@TcV}v_uVO&YQu8Cw)pQMz;XZ36`D@}t8n?jyw=V>McuL;Ui zH&uVH8moLOKPPPssSfn_jI(%37itwcH4q=-OLqk7nI|YBE+9mr)+l0~H zJGJ8K7v+0P6HA+vIm&Y@XH^}m-eUQ~Dz|mB8{nJU0Uw6_NOln~lm`c0(WMynhJP~c zFm(+#8V~EI=!*=SO|xPq*InCSPGUvF$b`3bPDafQn;cRb6shE;kHzOi*&?MRQ@Tbz zN^u9~o&(f#^{gB6KMjZBG8>fed| z*4R*Q1BboRK-47N9jVz3o#>FO)JU1!ZhYD$4yJy3bN!t z;fTV@qM$NIWk>5T_7m=%>@eX3F_)eyJ}K!TeJ$N0v&nJQ+aRwtRKLtv6NZItkBNwhhq zmUqqTmxX^U`S|eDt=y}HO-etOr&o5V+E{(hBCi=}J5?L&Ft|wXMD9D%A{(gvJ^Y7Q zL%ovv&U&ZnypBo;TcsPTmcf^o9O@CF#xDvR_zm3ezM1SR?;>|k$HJQFRrldd)n2@; zk~T^uPc(t3KjQMZ`G}X8U{U6k5cohTGeoMOiZ9?bh zlMPr{aadgVfv~Q|milC!MsrhbQD!P;D>f=J6?%C0f2-)G_*Fhuc23en^bx*x|K*+R z=x4oLSy1}4XimZCyp}n?e(Lsd>brzDInR$jIsahKy)DUkch26u_^{(kMW(iNyQ2a> zt%%nxGfWG+8#WS|DR#kAdQ1!9OU9}7N_G8VF+TPAzJ)?cEv1IzK?5z5Owkq_h zL1S!W_&W57wq>wa)l1n%aZLWTyd2)?7D>BHo`|Zcm&A1J6W5--?)ll3>^NzkY-j8X zohRHwmF5j;FUOhGVJ8i>|gP~XT6AX6@ z4-CH;O7zyyKSOX`lIE+R;i_edC$g`lW#ZGK>9mUanfMFa#Sei0MJ~8!Is4ncvCXrd zsje`GR5mYfRob<mO=H7Hg>^K_4G%&ah7j5c^+Wk8(NOH9*HL?? z>QLE-qLhO61(L#NMe(KA%4eHnEasX!_9L!Y-e}(e{vDP>WKl(;hSF#9XDWkcX~;f9 zO!#?|JffYcci2yQm9Br#&x(hV?sPNw=W!utVJ*x?<{VRxwXpxfx1FurLarY7!gtZ9 z=XCsS!G-Uk=84D2>MNhAyJ=48%%KwF+pu8MLDP8C@bG)aYx;d5yR})tlY<(o2~~=s zzPydJLNtwfhYu4tUm0WbG;%L-7T5>Z@-;85C6;=YxlQJ!tfbkzZx2bHr0+(ua#}5UU17@y{%d0Pl`6>56KJ3pImspq+i9Qs-La@ z+Q!-+IO@1k-M77AzEu7?o<^x96Xb=er5Z!%7UQp`eUX!*E=B%edShsyhdgGFv1izS+53>TvLjhByNl5=m%Tf@dS()P1GX`l=!epuRfU@Kp??^E4&P|X zHk~)cn5KrW3H!x3z`%$85fZLDujv!)RR5upDBH``(pB*9-88Hf*M&LnzU1ufSZL>K zQ)`daE~#x-TWA|)J5_VuI^J@r>QrU7@--#v3uol@{M;t1>xX&oylMAekA8){n)2G7 zo|ySZetBiKa}Ksmx;v@*~4C4*`jCoJA^x!BwVub~X?s5*c4y$9^vE$hYb~UryJKodWJ=m4) zEO+j3WxET!H+C{uV3=wuggG`Wx@pv%2)*f#umQ$}hPV3O`hB4X;fqv% z4G}a!xk|Q3Jelf)kL1^}VsE*tpL4K-wd);Q9CBxG=hx0uhsFM)cC78awSi@6Rc583 zBC_mrv8FIDw`I2JqxY@$&EXegp50BI`y6|->BDdNL#ldvmXYff25pG`jUmr4$&jZH zH}p1s6Mih>ag;u0YRuH=!IAaC3qv;rN6Al4rH`BObdnoQ!t zI(EEws;7aci>JBgy!*VXoio*bq_$4&RA_65v!7=r+ff)thDc(SYcwVLH>UFFw{eZ) zW$_#1>cmWn{5Sj$qX9IiTj=l*l}@FZt?s7yEEz$!hyP+4a2?ryy$e12+%mVt)!bd~ zKJS_3eeGTDJ>nVZe(W6UklS^&;WoVHtfjnaY~|##O-1eVMtn+o-!o10a(n9QCwHG{ zpACAw_QUW3bM+R+Ac|Cf6>{E?X*_SNXDl~tG`0xe8qqYmOKj`78?l$8r$*EohG?%S zDyZhZ82jYPcZKb9)SnJz9m>9vCn?!hIo9f_rJOR?4%bia2438kD$Jo)Nk6MpI*XxE z#E$6qv2Wwr#ZfVmh^6|sLC>Tbave9```9(s`LAP=L+4m-e_U&}wYE{Vt+w3S*3Rah z4EB-WC09sBD`#uY>z9~zN8gS+7C)vgRrgYzEwR~Ag{I)JvHB|Aub?&Kl!s)W#ck+h zVm>yN-|B0?>X@nC*52mcC0>VjCDV$1!ODC*+mG$R1bffBN4j**%l3A)<7>XL6q*am z$CiW_^!$9~Lrq%Fi%(A{K5q4xe0uIh{JSAJcPcEduH;K)osdjpJFq-v7~Mac%1x&t zQX_9fS)v+6g-4VaPlbdBwUOpvgWbPWk1dYP*`Mk95Ry4AJ3Rkh$wu?rns1!9LDp_= zKGvU{DLO5!P|OG#sM~GGG#!c7#odeR5_==^C!@DQtFoF$ zRsCG8vwCXY*6wf|aml>Bd>61HIz@gnc!<8AsY`T3oTJXx_(}1r>kNoH5;Hbxqe*V8 z(g{H=mCa;(#C>4*Kp%XJfb+S&slJiEGrqapR(_WNyTf4r!D#Y2`H&n(4keyqTX~sp zI!I);gSS0^Z<=43ACy~5HWku&A3p8*a5eqW%loM{kHwEqJX!X9Px{jAH)Rp7X4D@+ zW5WhVzm97j9}z#e&XL##(f1+>!!8-_h34r9?S!B|6tBb@+~PTA^^~OK{QYrG#?Xvq zAAbAPKA$LKEkC(e3VTFW`6l(V;3~}%?QY#4A;Ef!!5MbPG&|z0=~`GP{dtW+xnK07 z@WTC5P4CLuk~Kwm8XKsLnL9rk?&)4@pbAk z^~Tg|5T6@kj(BN&7IHRtzjBlG0zCqDu`!NmXXW(z3`BL(!G|pL4C*X_?dBm!|#mGU@s1 zXM10aOI!PKQGu>H*Xt6E)ocv^HzvDIqq@i9d&J43w}cz?GqnAK>Z?X8ywZ8%G_sZO z!W(9Hn%UwDx$8fz&AgsDFS~KRP5Lty%72IAI zsXu5e41XNaE$WA8TXaNB@90L6t;5gjKWm!?T~KV2&J)cc)%a?mfDeNId|Kiwh&k|& z@?^S=$R#Qg|0z*RlO-C-HBmEq6FC#V%Wq{jx>b(HHQ|=vs>n)1`J&R=;)ccDisXeu z^1V6jvrU;jGp?r}P3xN8A*0Wy?+b@lFZAZq*Mi0x!=gsUejRr*_CeIY;V(mf2(D1P zlg<~H(jVYIqIbAba4`3rs+!@I^-JIjZSJ2rZSsy6eP5Yc8{tc#dMX-fhJaXcr>j{0Q&|h>0&2jY~ibGP6JCy=EW#WX# zu#0nv&<8t#7Xe31R1!6g97lA;?+cH)0Y03a>vgyXxMCblYg^Z}vrMWAul%K~Tgjcm z`uXc~_J3OR@j}Mocc|!Ma^U-y)*0xxQJRHICV~-qv>3QMMM&BVMtv3f3i6 zs#>j8zc1`TczL)!oHf$MZiY+x7=1~|uexyUjNmuwA*v8Xe`%Dc6!tyjavObd07rb^ zaYuL~_7`pp?XkF}&eNcJcX1zU9u4Znts zH@%JUM3k6%hno#eL$7H22N$Z=E5c5Ns-dz=AO|7-K4zi!HeENdSpe_k+tbM7Spxvf<8N55lqgtwzC4H)5B09aoR-;r-f;J9YL+wi0WmrM6mC{Y%yGssUBAtNy6^t*S-U zV{<$6!OFafYvuLJCX~D>iZ5zf^i|QDqRAzBWlgKj)=u*75?0Z3WVOmSL1#7JXswzx z!L(YVm>_K_w$jt+chqV4nz#v9V|!uNj%GT#TRVo^BCX$87FtTI?P`}hZJq*O5)FJS8p;66Hz5|OGuBehXRs5kSRb(j|Dn7_&NSjGqqI^1p?o1_TB8u&sLWz;$>IFlj#%WEkZ%`0c)$qXTr{n*ZdA&N5Re*)R{PkNX=`EM=UnY+?o(rv$sywJWo;B8szQ}U{YI6i%mYe0$s5Z*%hd8Y@;&ko z@>+R&`F>fg)GA4XZ3_?EM(yvv_rGouiShx8=NfQN^0FtP)T0rsAKApA?TR5lU)HUzUw3 ze_P(KVm81J6_FKnDn?a)Q+3l)QmgmqI0f-UG*31U{{PMj&I^7LRH*8vcqSbp{y@DV z*5f0vBe2_ECVb@Y^E&>Z&&IU&E_cVcTEm-89f#R*!&MHeUrOjqOru9jPRYh8wkb8L zSk->zO~s#bwS1ARrL0OSku{Vpm93ZUmnF-t$hyl?r1hmkB>Cb}aeqm&(pGX9&a94 z@mtxirLfW}nOw53B&%e0=~rd%%Z8UfDTjBhihdRQDlS#7smio0u?=vZ@lx=ncu4e6 z+EejR@RvK*(ReER>frHaAk#}jp7u{X**@#1I(Ar09v2OJ^-WujvD zG^|zdNkSNx$(-@*bM0{4scmh$X`Nx|SRGR(hmreL#g+2*<-z4m%Xfn`pH*zDoMGn8 zYpPCFx3;Qmp4wc;5_fZEI!L1@`5S#jyh!>^)(!B9l8=*(lM<5eMg8ga)KGE|F#^8; zzF9lK+hqX1guCdou!GsV%wXng<`^@WZRMNA;jokaFX93&cDUUu|1z-dlsMKUw(dQ`L2<-&W12$~6CGZfwr1yi)mF<&4UO zm7UBFs(yw4AR^xhYr@`6pc^-X?7*n< z{l@arirf0t20K=|+@5u81O5=U6L`N}lqFs(sg--( zhx(BEH}yAaD^O=u_E(-#T!C@AO4>&fE4I^F)D!X@AtL(YM`7$=6dDMZfrqoWyU_Y9 z_6Tq>%-hei!_B(}xXwFu&Li*z;H*6czUz#y4XeFr`^DDJ*1{HU>u8&5yJMSP+rl2~ z80FNtGd%}kXL=7lU08wFCnr#yXdgXOv_dprG)`m?U8lRlDn~)>A>+x@L@dZJ8Fmye z5MBUv3trfL#{m@(nnKJ;yBcj`R$MuOwTXnU0Q*2lnwG8@;`YeG7ae?B}@S z=;(axZ0)+_GP~Nj2e^m1$GfMxm%A^yv)#d-g&vtVmiLR%m+IGj}rTdzrh3I1hENV1u>tPM|36H!wy;vA>gsZXksU!Cg+pw zDG@CdH4~4JOps2HO^`Q+8R8ePjc=6umE)8tU;{hJ+sHy-<^Pvx4n35LB`fd~uu>hy zx8u6_TCrga?v;7M-2Gf9K`#3otsP;IW;=2nQ=Mk#8dp8|e)cO^=hg59&Fpo1amMCN z_g?lM^X~JW^xC}RnM`Im+Y59jn|s0E5axkr!gcT;TSXKBegeEBCIhB(0N*}D8-PB< zIASfx=^bGweBi0zg`@ybgZ$=@Uh+CMjgArtqAGEk^C`~*rvFq_zT`<>npa& z|AIB^HOY4I3ctn6fi*)c!~-R-B;BQZr0=8^(ht)8QkY>S zv69i^RigFu3Th@;0V8e`GQbKv_Pu7!Ofb_MzP{=}Hoe`H`?c#|*A1XTs9AFv@VYCbK{Yej^3 z6|4@MNoGpsOZrO)$sw3k`-^^~FHnDzS7DuY0lNWj`MDh9YXTlQw;4V2tJm#;wKv$d ze?b-p-Irm6M|+lg-g`R2=%~Y-VWQc+tOG{IR^MHp#TN#1NHipzqX6Q#Ufgu<7+1`- z1=-XEFW6YHRcd@K?!qSk_iKm{kW78D4N#>934MT3ltMg&a~4qwvUvzsuZSm5`h)=d z;JSurMy?=>$Ufi+6%Ufqh?a`3iLykWMXyAEih7FDUtC-Eo2`?oLnfSSOo)`cy`z4$cHx6b5x@;T`vW2q?0NQuB= zp9XB3k@=u`$fn)GcY=LxkDG7}yzR8aN8_u&ij;zM*Td88$?aercJSa>F5Koht{u16hr{@x;4OSSQx7yx$wV;inCZ+eCYx!%u4FUV zdO*nyuvlM%KHcYRFg_yqj(lIfEkHe(jVa#E$)GIms1rs54@0^BCreX0n2z;u@r$sHi2Z~aUb>xs96Di zz}%C1b)3M0I#m#wWS76a5eaxqN4&p z19>m@0c5ltd`WwPS1F1y6^Nx13s=a~e+0CR{KS*M6Wa~m;rGFVc&~6kI3gSq&cOHb z+WjeS!K(;Nv}4SORGhz(}Dvc*M5_o(u!ug4O<( z7y(6=Y6G78{h`+pz~4UpXaghQJOOlLF|26<`t%%p!SaE>;DHD60~W(w6qleS_|Yf$ zDKJ4qjLzUoKNO^e+UNtuKv8;PfodDjb{BlCc7Y%I0?@*B zU~i9s|PZ0(jqm`zR_BiU@+@jG*`zD7ru@a0+?&e}pGd zY!MW50mT(Uu{=<$5I6uvDCP>HIuSVB8309B=nM(PRzPuwP`s7|xbEZEwsAn|P@uIt zU~Pi8Efno55CsawS3!{k)KDIXcfk0g9H5v^sX)VPz^T9=1p;A#@Q8xCC@unu>ro8! zp$Jf^Pzy!(Kv6tUqzM#d;v+2DCp z3-K}#qY1^VKrtr}M*~r50x_si^b#qQ2jWs7oeuCR7wAOM9}s;gatVr4f;0lf$*2S@ z5iP~=EaD@IKNg6+hWbW)LeVnhOi*G286wTS3o=An;D&mEC|4TLKL>C$7bKGo$6Vk6C#a!SL|YP^5#<3r zLVAFBk0QAQV%DH|NC>-JkSx+1q#=mA0S!Vp+n_#b`w_r>zx>fSK@mv;k(7{3knRQa z14TJOqbQ(RDDDtyJD@oq{jH+D(I`T4Q2<`WaQ6k!g(ypfr;+X;xdn6^#dtxqqZUw< zvs}0z7#~P4MShJa0F05$k@g03FEA#N)XM%(KU)Pg`(CV2^t1nLnxEkmM^$@@$5JN9eCvfkJz9QWJ|36fYB#&$;(s>kJCLmG7 zB~*?8S;Ii=pfAzg0;Q-t5SIqsM|LE@+dyA|7QV!)L1n17FMJHtK}SRly7PsFWNUx_@ zOLg4N=vCg?CDfw}dK#f4$EXS-5`TO~ZpuBm=sLJ@v*5%{8A-a4d?Rgbn;|n9F#a#J zqhmW@&i3b~2Y5euUeUu9avO3-zv++Gy8h`=$$V;vpgm-x9easjva=*39XKW-D~V8& zip=uzit@Z6KIIG^;%5sZQLdIc=6hpwOa9n#lrMIOk@o1@avv>vj+lI}&Z9C{7)i;{ z@?FVi-yHG%V97oyMGM$z64jEUC3&r;M!r_fdDcl|Q{=A6R$ByfYXN=B=Z~3z?+q!l zr6YJ{e~w^3H6^p~3%$|EH2=vv%NZLVK3Tmg)Mp+smuPnhh^~41ulXnAFY~OCly>Rj z&&ZOt<&#~TXrCSHxMi>WkTbuKPrm7VZ{I>Zeo*!u+P2a%=KZup!}@ChZQF#EoU!Bf zZv;u-%$PNMrX4%NTE|Q4=4)G{RwkJ-<6Y(5Tat9Mo?0j2&bOqrjvDG{Q!T8W=d7|e zkUN$2GkjW3TY6jPCuS~3&irVm=-GFAPck|!a|CTyWAkNsD66uD!MEZY`PYz5*_4;^ OT%O7!zco5C`ThZyo#VFv literal 0 HcmV?d00001 diff --git a/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/talkingVoltmeter.c b/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/talkingVoltmeter.c new file mode 100644 index 0000000..f1f82e6 --- /dev/null +++ b/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/talkingVoltmeter.c @@ -0,0 +1,125 @@ +// Talking Voltmeter Example + +#include +#include +#include +#include +#include +#include +#include "pinDefines.h" +#include "USART.h" + +#include "talkingVoltmeter.h" + +void startSampleTimer(void) { + sampleNumber = 0; /* back to start of sample table */ + TCCR2B = (1 << CS21); /* turn on timer clock */ + /* Two clock options above end up ~8kHz on 8MHz system */ +} +void stopSampleTimer(void) { + TCCR2B = 0; /* disable sample-playback clock */ + OCR0A = 128; /* idle PWM at mid-voltage */ + lastout = 0; /* start at 0 next time */ +} +void speak(void) { + startSampleTimer(); + loop_until_bit_is_clear(TCCR2B, CS21); /* Wait until done */ +} + +void updatePWMAudio(void) { + OCR0A = out + 128; /* re-center for 0-255 PWM */ + lastout = out; /* update last value */ + sampleNumber++; /* on to next sample */ +} +void unpackByte(uint8_t dataByte) { + /* Select pairs of bits from byte, save out */ + differentials[0] = (dataByte >> 6) & 0b00000011; + differentials[1] = (dataByte >> 4) & 0b00000011; + differentials[2] = (dataByte >> 2) & 0b00000011; + differentials[3] = (dataByte & 0b00000011); +} + +/* Timer 2 controls sampling speed. + ISR reads new data, loads PWM values into OCR0A */ +ISR(TIMER2_COMPA_vect) { + /* Since we can decode 4 2-bit values at once, need to know where + we are in the 4-step mini-cycle. */ + uint8_t cycle = sampleNumber & 0b00000011; /* keep last 2 bits */ + uint16_t tableEntry; + uint8_t packedData; + + if (cycle == 0) { /* at first sample, re-load */ + tableEntry = sampleNumber >> 2; /* where we are in table */ + if (tableEntry < thisTableLength) { + /* read the next byte from the selected table */ + packedData = pgm_read_byte(&thisTableP[tableEntry]); + unpackByte(packedData); /* split up byte into differentials[] */ + } + else { /* at end of table, done. */ + stopSampleTimer(); + } + } + /* Decode the differences: current value = last + difference */ + out = lastout + dpcmWeights[differentials[cycle]] - (lastout >> 4); + updatePWMAudio(); +} // end ISR (TIMER2_COMPA_vect) + +void printString_Progmem(const char *stringP) { + char oneLetter; + while ((oneLetter = pgm_read_byte(stringP))) { + transmitByte(oneLetter); + stringP++; + } +} + + +int main(void) { + uint16_t voltage; + uint8_t volts; + uint8_t tenths; + uint8_t vcc = 51; /* 10x VCC, in volts */ + + clock_prescale_set(clock_div_1); /* 8 MHz */ + initTimer0(); + initTimer2(); + sei(); /* for timer2 ISR */ + initADC(); + initUSART(); + + printString_Progmem(PSTR("\r\n--=( Talking Voltmeter )=--\r\n")); + + selectTable(INTRO); + speak(); + + while (1) { + + ADCSRA |= (1 << ADSC); /* start ADC */ + loop_until_bit_is_clear(ADCSRA, ADSC); + + voltage = ADC * vcc + vcc / 2; /* vcc/2 to make rounding work */ + voltage = voltage >> 10; /* divide by 10-bits for ADC */ + /* "voltage" is now actually 10x real-world voltage */ + volts = voltage / 10; + tenths = voltage % 10; + + transmitByte('0' + volts); /* serial output as well */ + selectTable(volts); /* 0 points to ZERO_TABLE, etc */ + speak(); + + transmitByte('.'); + selectTable(POINT); + speak(); + + transmitByte('0' + tenths); + selectTable(tenths); + speak(); + + printString_Progmem(PSTR(" volts\r\n")); + selectTable(VOLTS); + speak(); + + _delay_ms(SPEECH_DELAY); + + } /* end while */ + return 0; +} diff --git a/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/talkingVoltmeter.h b/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/talkingVoltmeter.h new file mode 100644 index 0000000..6014a3f --- /dev/null +++ b/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/talkingVoltmeter.h @@ -0,0 +1,91 @@ +/* Include file with DPCM data in it */ +#include "allDigits.h" +#include + +// Now define sample-table names used in digits file +// From here on, no matter what you call the samples, +// you can refer to them as "ONE_TABLE", etc. +#define ONE_TABLE DPCM_one_8000 +#define TWO_TABLE DPCM_two_8000 +#define THREE_TABLE DPCM_three_8000 +#define FOUR_TABLE DPCM_four_8000 +#define FIVE_TABLE DPCM_five_8000 +#define SIX_TABLE DPCM_six_8000 +#define SEVEN_TABLE DPCM_seven_8000 +#define EIGHT_TABLE DPCM_eight_8000 +#define NINE_TABLE DPCM_nine_8000 +#define ZERO_TABLE DPCM_zero_8000 +#define POINT_TABLE DPCM_point_8000 +#define VOLTS_TABLE DPCM_volts_8000 +#define INTRO_TABLE DPCM_talkingvoltmeter_8000 + +#define SPEECH_DELAY 2000 /* milliseconds */ + +/* --------------- Globals used by the ISR -------------- */ +volatile uint8_t* thisTableP; /* points at the current speech table */ +volatile uint16_t thisTableLength; /* length of current speech table */ + +volatile uint16_t sampleNumber; // sample index +volatile int8_t out, lastout; // output values +volatile uint8_t differentials[4] = {0,0,0,0}; +const int8_t dpcmWeights[4] = {-12, -3, 3, 12}; + + +/* These arrays let us choose a table (and its length) numerically */ +const uint16_t tableLengths[] = { /* all sample tables are 8-bit */ + sizeof(ZERO_TABLE), sizeof(ONE_TABLE), sizeof(TWO_TABLE), + sizeof(THREE_TABLE), sizeof(FOUR_TABLE), sizeof(FIVE_TABLE), + sizeof(SIX_TABLE), sizeof(SEVEN_TABLE), sizeof(EIGHT_TABLE), + sizeof(NINE_TABLE), sizeof(POINT_TABLE), sizeof(VOLTS_TABLE), + sizeof(INTRO_TABLE) +}; + +// Create an indexing table of all of the start addresses for +// each spoken digit. And then store this index in PROGMEM. +const uint8_t* const tablePointers[] PROGMEM = { + ZERO_TABLE, ONE_TABLE, TWO_TABLE, THREE_TABLE, FOUR_TABLE, + FIVE_TABLE, SIX_TABLE, SEVEN_TABLE, EIGHT_TABLE, NINE_TABLE, + POINT_TABLE, VOLTS_TABLE, INTRO_TABLE +}; + +void selectTable(uint8_t whichTable){ + /* Set up global table pointer, lengths */ + uint16_t pointerAddress; + thisTableLength = tableLengths[whichTable]; + pointerAddress = (uint16_t) &tablePointers[whichTable]; + thisTableP = (uint8_t*) pgm_read_word(pointerAddress); +} + +/* Extra defines for the non-numeric values */ +#define POINT 10 +#define VOLTS 11 +#define INTRO 12 + + +///----------------- Init functions -------------------/// + +void initTimer0(void){ + // Timer 0 Configured for free-running PWM Audio Output + TCCR0A |= (1< $@ + +## These targets don't have files named after them +.PHONY: all disassemble disasm eeprom size clean squeaky_clean flash fuses + +all: $(TARGET).hex + +debug: + @echo + @echo "Source files:" $(SOURCES) + @echo "MCU, F_CPU, BAUD:" $(MCU), $(F_CPU), $(BAUD) + @echo + +# Optionally create listing file from .elf +# This creates approximate assembly-language equivalent of your code. +# Useful for debugging time-sensitive bits, +# or making sure the compiler does what you want. +disassemble: $(TARGET).lst + +disasm: disassemble + +# Optionally show how big the resulting program is +size: $(TARGET).elf + $(AVRSIZE) -C --mcu=$(MCU) $(TARGET).elf + +clean: + rm -f $(TARGET).elf $(TARGET).hex $(TARGET).obj \ + $(TARGET).o $(TARGET).d $(TARGET).eep $(TARGET).lst \ + $(TARGET).lss $(TARGET).sym $(TARGET).map $(TARGET)~ \ + $(TARGET).eeprom + +squeaky_clean: + rm -f *.elf *.hex *.obj *.o *.d *.eep *.lst *.lss *.sym *.map *~ *.eeprom + +##########------------------------------------------------------########## +########## Programmer-specific details ########## +########## Flashing code to AVR using avrdude ########## +##########------------------------------------------------------########## + +flash: $(TARGET).hex + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U flash:w:$< + +## An alias +program: flash + +flash_eeprom: $(TARGET).eeprom + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U eeprom:w:$< + +avrdude_terminal: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nt + +## If you've got multiple programmers that you use, +## you can define them here so that it's easy to switch. +## To invoke, use something like `make flash_arduinoISP` +flash_usbtiny: PROGRAMMER_TYPE = usbtiny +flash_usbtiny: PROGRAMMER_ARGS = # USBTiny works with no further arguments +flash_usbtiny: flash + +flash_usbasp: PROGRAMMER_TYPE = usbasp +flash_usbasp: PROGRAMMER_ARGS = # USBasp works with no further arguments +flash_usbasp: flash + +flash_arduinoISP: PROGRAMMER_TYPE = avrisp +flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P /dev/ttyACM0 +## (for windows) flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P com5 +flash_arduinoISP: flash + +flash_109: PROGRAMMER_TYPE = avr109 +flash_109: PROGRAMMER_ARGS = -b 9600 -P /dev/ttyUSB0 +flash_109: flash + +##########------------------------------------------------------########## +########## Fuse settings and suitable defaults ########## +##########------------------------------------------------------########## + +## Mega 48, 88, 168, 328 default values +LFUSE = 0x62 +HFUSE = 0xdf +EFUSE = 0x00 + +## Generic +FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m + +fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) \ + $(PROGRAMMER_ARGS) $(FUSE_STRING) +show_fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nv + +## Called with no extra definitions, sets to defaults +set_default_fuses: FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m +set_default_fuses: fuses + +## Set the fuse byte for full-speed mode +## Note: can also be set in firmware for modern chips +set_fast_fuse: LFUSE = 0xE2 +set_fast_fuse: FUSE_STRING = -U lfuse:w:$(LFUSE):m +set_fast_fuse: fuses + +## Set the EESAVE fuse byte to preserve EEPROM across flashes +set_eeprom_save_fuse: HFUSE = 0xD7 +set_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +set_eeprom_save_fuse: fuses + +## Clear the EESAVE fuse byte +clear_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +clear_eeprom_save_fuse: fuses diff --git a/Make AVR Examples/Chapter19_EEPROM/eememDemo/eememDemo.c b/Make AVR Examples/Chapter19_EEPROM/eememDemo/eememDemo.c new file mode 100644 index 0000000..df219d1 --- /dev/null +++ b/Make AVR Examples/Chapter19_EEPROM/eememDemo/eememDemo.c @@ -0,0 +1,39 @@ +#include +#include +#include +/* #include */ +/* #include */ + +#define STRING_LEN 80 + +// Define EEMEM variables +uint8_t eepromCounter EEMEM = 0; +char eepromString[STRING_LEN] EEMEM = "Welcome to the EEMEM Demo.\r\n"; +uint16_t eepromWord EEMEM = 12345; + +int main(void) { + + initUSART(); + char ramString[STRING_LEN]; + uint8_t counter; + + while (1) { + printString("\r\n------------------\r\n"); + eeprom_read_block(ramString, eepromString, STRING_LEN); + printString(ramString); + + printString("\r\nThe counter reads: "); + counter = eeprom_read_byte(&eepromCounter); + printByte(counter); + + printString("\r\nMy uint16_t value is: "); + printWord(eeprom_read_word(&eepromWord)); + + printString("\r\n Enter a new introduction string below:\r\n"); + readString(ramString, STRING_LEN); + eeprom_update_block(ramString, eepromString, STRING_LEN); + counter++; + eeprom_update_byte(&eepromCounter, counter); + } + return 0; +} diff --git a/Make AVR Examples/Chapter19_EEPROM/favoriteColor/.gitignore b/Make AVR Examples/Chapter19_EEPROM/favoriteColor/.gitignore new file mode 100644 index 0000000..c286bce --- /dev/null +++ b/Make AVR Examples/Chapter19_EEPROM/favoriteColor/.gitignore @@ -0,0 +1,3 @@ +*.eeprom +*.raw + diff --git a/Make AVR Examples/Chapter19_EEPROM/favoriteColor/Makefile b/Make AVR Examples/Chapter19_EEPROM/favoriteColor/Makefile new file mode 100644 index 0000000..3d9e544 --- /dev/null +++ b/Make AVR Examples/Chapter19_EEPROM/favoriteColor/Makefile @@ -0,0 +1,196 @@ + +##########------------------------------------------------------########## +########## Project-specific Details ########## +########## Check these every time you start a new project ########## +##########------------------------------------------------------########## + +MCU = atmega168p +F_CPU = 1000000UL +BAUD = 9600UL +## Also try BAUD = 19200 or 38400 if you're feeling lucky. + +## A directory for common include files and the simple USART library. +## If you move either the current folder or the Library folder, you'll +## need to change this path to match. +LIBDIR = ../../AVR-Programming-Library + +##########------------------------------------------------------########## +########## Programmer Defaults ########## +########## Set up once, then forget about it ########## +########## (Can override. See bottom of file.) ########## +##########------------------------------------------------------########## + +PROGRAMMER_TYPE = usbtiny +# extra arguments to avrdude: baud rate, chip type, -F flag, etc. +PROGRAMMER_ARGS = + +##########------------------------------------------------------########## +########## Program Locations ########## +########## Won't need to change if they're in your PATH ########## +##########------------------------------------------------------########## + +CC = avr-gcc +OBJCOPY = avr-objcopy +OBJDUMP = avr-objdump +AVRSIZE = avr-size +AVRDUDE = avrdude + +##########------------------------------------------------------########## +########## Makefile Magic! ########## +########## Summary: ########## +########## We want a .hex file ########## +########## Compile source files into .elf ########## +########## Convert .elf file into .hex ########## +########## You shouldn't need to edit below. ########## +##########------------------------------------------------------########## + +## The name of your project (without the .c) +# TARGET = blinkLED +## Or name it automatically after the enclosing directory +TARGET = $(lastword $(subst /, ,$(CURDIR))) + +# Object files: will find all .c/.h files in current directory +# and in LIBDIR. If you have any other (sub-)directories with code, +# you can add them in to SOURCES below in the wildcard statement. +SOURCES=$(wildcard *.c $(LIBDIR)/*.c) +OBJECTS=$(SOURCES:.c=.o) +HEADERS=$(SOURCES:.c=.h) + +## Compilation options, type man avr-gcc if you're curious. +CPPFLAGS = -DF_CPU=$(F_CPU) -DBAUD=$(BAUD) -I. -I$(LIBDIR) +CFLAGS = -Os -g -std=gnu99 -Wall +## Use short (8-bit) data types +CFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums +## Splits up object files per function +CFLAGS += -ffunction-sections -fdata-sections +LDFLAGS = -Wl,-Map,$(TARGET).map +## Optional, but often ends up with smaller code +LDFLAGS += -Wl,--gc-sections +## Relax shrinks code even more, but makes disassembly messy +## LDFLAGS += -Wl,--relax +## LDFLAGS += -Wl,-u,vfprintf -lprintf_flt -lm ## for floating-point printf +## LDFLAGS += -Wl,-u,vfprintf -lprintf_min ## for smaller printf +TARGET_ARCH = -mmcu=$(MCU) + +## Explicit pattern rules: +## To make .o files from .c files +%.o: %.c $(HEADERS) Makefile + $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c -o $@ $<; + +$(TARGET).elf: $(OBJECTS) + $(CC) $(LDFLAGS) $(TARGET_ARCH) $^ $(LDLIBS) -o $@ + +%.hex: %.elf + $(OBJCOPY) -j .text -j .data -O ihex $< $@ + +%.eeprom: %.elf + $(OBJCOPY) -j .eeprom --change-section-lma .eeprom=0 -O ihex $< $@ + +%.lst: %.elf + $(OBJDUMP) -S $< > $@ + +## These targets don't have files named after them +.PHONY: all disassemble disasm eeprom size clean squeaky_clean flash fuses + +all: $(TARGET).hex + +debug: + @echo + @echo "Source files:" $(SOURCES) + @echo "MCU, F_CPU, BAUD:" $(MCU), $(F_CPU), $(BAUD) + @echo + +# Optionally create listing file from .elf +# This creates approximate assembly-language equivalent of your code. +# Useful for debugging time-sensitive bits, +# or making sure the compiler does what you want. +disassemble: $(TARGET).lst + +disasm: disassemble + +# Optionally show how big the resulting program is +size: $(TARGET).elf + $(AVRSIZE) -C --mcu=$(MCU) $(TARGET).elf + +clean: + rm -f $(TARGET).elf $(TARGET).hex $(TARGET).obj \ + $(TARGET).o $(TARGET).d $(TARGET).eep $(TARGET).lst \ + $(TARGET).lss $(TARGET).sym $(TARGET).map $(TARGET)~ \ + $(TARGET).eeprom + +squeaky_clean: + rm -f *.elf *.hex *.obj *.o *.d *.eep *.lst *.lss *.sym *.map *~ *.eeprom + +##########------------------------------------------------------########## +########## Programmer-specific details ########## +########## Flashing code to AVR using avrdude ########## +##########------------------------------------------------------########## + +flash: $(TARGET).hex + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U flash:w:$< + +## An alias +program: flash + +flash_eeprom: $(TARGET).eeprom + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U eeprom:w:$< + +avrdude_terminal: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nt + +## If you've got multiple programmers that you use, +## you can define them here so that it's easy to switch. +## To invoke, use something like `make flash_arduinoISP` +flash_usbtiny: PROGRAMMER_TYPE = usbtiny +flash_usbtiny: PROGRAMMER_ARGS = # USBTiny works with no further arguments +flash_usbtiny: flash + +flash_usbasp: PROGRAMMER_TYPE = usbasp +flash_usbasp: PROGRAMMER_ARGS = # USBasp works with no further arguments +flash_usbasp: flash + +flash_arduinoISP: PROGRAMMER_TYPE = avrisp +flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P /dev/ttyACM0 +## (for windows) flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P com5 +flash_arduinoISP: flash + +flash_109: PROGRAMMER_TYPE = avr109 +flash_109: PROGRAMMER_ARGS = -b 9600 -P /dev/ttyUSB0 +flash_109: flash + +##########------------------------------------------------------########## +########## Fuse settings and suitable defaults ########## +##########------------------------------------------------------########## + +## Mega 48, 88, 168, 328 default values +LFUSE = 0x62 +HFUSE = 0xdf +EFUSE = 0x00 + +## Generic +FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m + +fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) \ + $(PROGRAMMER_ARGS) $(FUSE_STRING) +show_fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nv + +## Called with no extra definitions, sets to defaults +set_default_fuses: FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m +set_default_fuses: fuses + +## Set the fuse byte for full-speed mode +## Note: can also be set in firmware for modern chips +set_fast_fuse: LFUSE = 0xE2 +set_fast_fuse: FUSE_STRING = -U lfuse:w:$(LFUSE):m +set_fast_fuse: fuses + +## Set the EESAVE fuse byte to preserve EEPROM across flashes +set_eeprom_save_fuse: HFUSE = 0xD7 +set_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +set_eeprom_save_fuse: fuses + +## Clear the EESAVE fuse byte +clear_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +clear_eeprom_save_fuse: fuses diff --git a/Make AVR Examples/Chapter19_EEPROM/favoriteColor/favoriteColor.c b/Make AVR Examples/Chapter19_EEPROM/favoriteColor/favoriteColor.c new file mode 100644 index 0000000..53032f7 --- /dev/null +++ b/Make AVR Examples/Chapter19_EEPROM/favoriteColor/favoriteColor.c @@ -0,0 +1,38 @@ +#include +#include +#include + +#define STRING_MAXLEN 0x20 /* 32 characters */ +#define STRING_ADDRESS 0x20 +#define COUNTER_ADDRESS 0x10 + + +int main(void) { + + char myString[STRING_MAXLEN]; + char *eepromAddress = (char *) STRING_ADDRESS; + uint16_t counter; + + initUSART(); + + while (1) { + // Read from EEPROM and print out + eeprom_read_block(myString, eepromAddress, STRING_MAXLEN); + counter = eeprom_read_word((uint16_t *) COUNTER_ADDRESS); + printString("\r\nYour old favorite color is: "); + printString(myString); + + // Take input, store in EEPROM + printString("\r\n\r\n Type your new favorite color. "); + readString(myString, sizeof(myString)); + /* pass by address, function will change its values */ + eeprom_update_block(myString, eepromAddress, STRING_MAXLEN); + counter++; + printString("Thanks! \r\nYou've answered the same question "); + printWord(counter); + printString(" times. \r\n"); + eeprom_update_word((uint16_t *) COUNTER_ADDRESS, counter); + } + + return 0; +} diff --git a/Make AVR Examples/Chapter19_EEPROM/quickDemo/.gitignore b/Make AVR Examples/Chapter19_EEPROM/quickDemo/.gitignore new file mode 100644 index 0000000..c286bce --- /dev/null +++ b/Make AVR Examples/Chapter19_EEPROM/quickDemo/.gitignore @@ -0,0 +1,3 @@ +*.eeprom +*.raw + diff --git a/Make AVR Examples/Chapter19_EEPROM/quickDemo/Makefile b/Make AVR Examples/Chapter19_EEPROM/quickDemo/Makefile new file mode 100644 index 0000000..3d9e544 --- /dev/null +++ b/Make AVR Examples/Chapter19_EEPROM/quickDemo/Makefile @@ -0,0 +1,196 @@ + +##########------------------------------------------------------########## +########## Project-specific Details ########## +########## Check these every time you start a new project ########## +##########------------------------------------------------------########## + +MCU = atmega168p +F_CPU = 1000000UL +BAUD = 9600UL +## Also try BAUD = 19200 or 38400 if you're feeling lucky. + +## A directory for common include files and the simple USART library. +## If you move either the current folder or the Library folder, you'll +## need to change this path to match. +LIBDIR = ../../AVR-Programming-Library + +##########------------------------------------------------------########## +########## Programmer Defaults ########## +########## Set up once, then forget about it ########## +########## (Can override. See bottom of file.) ########## +##########------------------------------------------------------########## + +PROGRAMMER_TYPE = usbtiny +# extra arguments to avrdude: baud rate, chip type, -F flag, etc. +PROGRAMMER_ARGS = + +##########------------------------------------------------------########## +########## Program Locations ########## +########## Won't need to change if they're in your PATH ########## +##########------------------------------------------------------########## + +CC = avr-gcc +OBJCOPY = avr-objcopy +OBJDUMP = avr-objdump +AVRSIZE = avr-size +AVRDUDE = avrdude + +##########------------------------------------------------------########## +########## Makefile Magic! ########## +########## Summary: ########## +########## We want a .hex file ########## +########## Compile source files into .elf ########## +########## Convert .elf file into .hex ########## +########## You shouldn't need to edit below. ########## +##########------------------------------------------------------########## + +## The name of your project (without the .c) +# TARGET = blinkLED +## Or name it automatically after the enclosing directory +TARGET = $(lastword $(subst /, ,$(CURDIR))) + +# Object files: will find all .c/.h files in current directory +# and in LIBDIR. If you have any other (sub-)directories with code, +# you can add them in to SOURCES below in the wildcard statement. +SOURCES=$(wildcard *.c $(LIBDIR)/*.c) +OBJECTS=$(SOURCES:.c=.o) +HEADERS=$(SOURCES:.c=.h) + +## Compilation options, type man avr-gcc if you're curious. +CPPFLAGS = -DF_CPU=$(F_CPU) -DBAUD=$(BAUD) -I. -I$(LIBDIR) +CFLAGS = -Os -g -std=gnu99 -Wall +## Use short (8-bit) data types +CFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums +## Splits up object files per function +CFLAGS += -ffunction-sections -fdata-sections +LDFLAGS = -Wl,-Map,$(TARGET).map +## Optional, but often ends up with smaller code +LDFLAGS += -Wl,--gc-sections +## Relax shrinks code even more, but makes disassembly messy +## LDFLAGS += -Wl,--relax +## LDFLAGS += -Wl,-u,vfprintf -lprintf_flt -lm ## for floating-point printf +## LDFLAGS += -Wl,-u,vfprintf -lprintf_min ## for smaller printf +TARGET_ARCH = -mmcu=$(MCU) + +## Explicit pattern rules: +## To make .o files from .c files +%.o: %.c $(HEADERS) Makefile + $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c -o $@ $<; + +$(TARGET).elf: $(OBJECTS) + $(CC) $(LDFLAGS) $(TARGET_ARCH) $^ $(LDLIBS) -o $@ + +%.hex: %.elf + $(OBJCOPY) -j .text -j .data -O ihex $< $@ + +%.eeprom: %.elf + $(OBJCOPY) -j .eeprom --change-section-lma .eeprom=0 -O ihex $< $@ + +%.lst: %.elf + $(OBJDUMP) -S $< > $@ + +## These targets don't have files named after them +.PHONY: all disassemble disasm eeprom size clean squeaky_clean flash fuses + +all: $(TARGET).hex + +debug: + @echo + @echo "Source files:" $(SOURCES) + @echo "MCU, F_CPU, BAUD:" $(MCU), $(F_CPU), $(BAUD) + @echo + +# Optionally create listing file from .elf +# This creates approximate assembly-language equivalent of your code. +# Useful for debugging time-sensitive bits, +# or making sure the compiler does what you want. +disassemble: $(TARGET).lst + +disasm: disassemble + +# Optionally show how big the resulting program is +size: $(TARGET).elf + $(AVRSIZE) -C --mcu=$(MCU) $(TARGET).elf + +clean: + rm -f $(TARGET).elf $(TARGET).hex $(TARGET).obj \ + $(TARGET).o $(TARGET).d $(TARGET).eep $(TARGET).lst \ + $(TARGET).lss $(TARGET).sym $(TARGET).map $(TARGET)~ \ + $(TARGET).eeprom + +squeaky_clean: + rm -f *.elf *.hex *.obj *.o *.d *.eep *.lst *.lss *.sym *.map *~ *.eeprom + +##########------------------------------------------------------########## +########## Programmer-specific details ########## +########## Flashing code to AVR using avrdude ########## +##########------------------------------------------------------########## + +flash: $(TARGET).hex + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U flash:w:$< + +## An alias +program: flash + +flash_eeprom: $(TARGET).eeprom + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U eeprom:w:$< + +avrdude_terminal: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nt + +## If you've got multiple programmers that you use, +## you can define them here so that it's easy to switch. +## To invoke, use something like `make flash_arduinoISP` +flash_usbtiny: PROGRAMMER_TYPE = usbtiny +flash_usbtiny: PROGRAMMER_ARGS = # USBTiny works with no further arguments +flash_usbtiny: flash + +flash_usbasp: PROGRAMMER_TYPE = usbasp +flash_usbasp: PROGRAMMER_ARGS = # USBasp works with no further arguments +flash_usbasp: flash + +flash_arduinoISP: PROGRAMMER_TYPE = avrisp +flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P /dev/ttyACM0 +## (for windows) flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P com5 +flash_arduinoISP: flash + +flash_109: PROGRAMMER_TYPE = avr109 +flash_109: PROGRAMMER_ARGS = -b 9600 -P /dev/ttyUSB0 +flash_109: flash + +##########------------------------------------------------------########## +########## Fuse settings and suitable defaults ########## +##########------------------------------------------------------########## + +## Mega 48, 88, 168, 328 default values +LFUSE = 0x62 +HFUSE = 0xdf +EFUSE = 0x00 + +## Generic +FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m + +fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) \ + $(PROGRAMMER_ARGS) $(FUSE_STRING) +show_fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nv + +## Called with no extra definitions, sets to defaults +set_default_fuses: FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m +set_default_fuses: fuses + +## Set the fuse byte for full-speed mode +## Note: can also be set in firmware for modern chips +set_fast_fuse: LFUSE = 0xE2 +set_fast_fuse: FUSE_STRING = -U lfuse:w:$(LFUSE):m +set_fast_fuse: fuses + +## Set the EESAVE fuse byte to preserve EEPROM across flashes +set_eeprom_save_fuse: HFUSE = 0xD7 +set_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +set_eeprom_save_fuse: fuses + +## Clear the EESAVE fuse byte +clear_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +clear_eeprom_save_fuse: fuses diff --git a/Make AVR Examples/Chapter19_EEPROM/quickDemo/quickDemo.c b/Make AVR Examples/Chapter19_EEPROM/quickDemo/quickDemo.c new file mode 100644 index 0000000..3184ee1 --- /dev/null +++ b/Make AVR Examples/Chapter19_EEPROM/quickDemo/quickDemo.c @@ -0,0 +1,19 @@ +#include +#include + +int main(void) { + + // Store the 8-bit value 5 in EEPROM slot 0 + uint8_t *address = (uint8_t *) 0; + eeprom_update_byte(address, 5); + + // Store the 16-bit value 12345 in EEPROM slots 5 and 6: + eeprom_update_word((uint16_t *) 5, 12345); + + // Store a character array (string) in EEPROM slots 16-28: + char *stringPointer = (char *) 16; + char myString[] = "hello world."; + eeprom_update_block(myString, stringPointer, sizeof(myString)); + + return 0; +} diff --git a/Make AVR Examples/Chapter19_EEPROM/vigenereCipher/.gitignore b/Make AVR Examples/Chapter19_EEPROM/vigenereCipher/.gitignore new file mode 100644 index 0000000..9b3c2e9 --- /dev/null +++ b/Make AVR Examples/Chapter19_EEPROM/vigenereCipher/.gitignore @@ -0,0 +1 @@ +vigenereCipher.eeprom diff --git a/Make AVR Examples/Chapter19_EEPROM/vigenereCipher/Makefile b/Make AVR Examples/Chapter19_EEPROM/vigenereCipher/Makefile new file mode 100644 index 0000000..3d9e544 --- /dev/null +++ b/Make AVR Examples/Chapter19_EEPROM/vigenereCipher/Makefile @@ -0,0 +1,196 @@ + +##########------------------------------------------------------########## +########## Project-specific Details ########## +########## Check these every time you start a new project ########## +##########------------------------------------------------------########## + +MCU = atmega168p +F_CPU = 1000000UL +BAUD = 9600UL +## Also try BAUD = 19200 or 38400 if you're feeling lucky. + +## A directory for common include files and the simple USART library. +## If you move either the current folder or the Library folder, you'll +## need to change this path to match. +LIBDIR = ../../AVR-Programming-Library + +##########------------------------------------------------------########## +########## Programmer Defaults ########## +########## Set up once, then forget about it ########## +########## (Can override. See bottom of file.) ########## +##########------------------------------------------------------########## + +PROGRAMMER_TYPE = usbtiny +# extra arguments to avrdude: baud rate, chip type, -F flag, etc. +PROGRAMMER_ARGS = + +##########------------------------------------------------------########## +########## Program Locations ########## +########## Won't need to change if they're in your PATH ########## +##########------------------------------------------------------########## + +CC = avr-gcc +OBJCOPY = avr-objcopy +OBJDUMP = avr-objdump +AVRSIZE = avr-size +AVRDUDE = avrdude + +##########------------------------------------------------------########## +########## Makefile Magic! ########## +########## Summary: ########## +########## We want a .hex file ########## +########## Compile source files into .elf ########## +########## Convert .elf file into .hex ########## +########## You shouldn't need to edit below. ########## +##########------------------------------------------------------########## + +## The name of your project (without the .c) +# TARGET = blinkLED +## Or name it automatically after the enclosing directory +TARGET = $(lastword $(subst /, ,$(CURDIR))) + +# Object files: will find all .c/.h files in current directory +# and in LIBDIR. If you have any other (sub-)directories with code, +# you can add them in to SOURCES below in the wildcard statement. +SOURCES=$(wildcard *.c $(LIBDIR)/*.c) +OBJECTS=$(SOURCES:.c=.o) +HEADERS=$(SOURCES:.c=.h) + +## Compilation options, type man avr-gcc if you're curious. +CPPFLAGS = -DF_CPU=$(F_CPU) -DBAUD=$(BAUD) -I. -I$(LIBDIR) +CFLAGS = -Os -g -std=gnu99 -Wall +## Use short (8-bit) data types +CFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums +## Splits up object files per function +CFLAGS += -ffunction-sections -fdata-sections +LDFLAGS = -Wl,-Map,$(TARGET).map +## Optional, but often ends up with smaller code +LDFLAGS += -Wl,--gc-sections +## Relax shrinks code even more, but makes disassembly messy +## LDFLAGS += -Wl,--relax +## LDFLAGS += -Wl,-u,vfprintf -lprintf_flt -lm ## for floating-point printf +## LDFLAGS += -Wl,-u,vfprintf -lprintf_min ## for smaller printf +TARGET_ARCH = -mmcu=$(MCU) + +## Explicit pattern rules: +## To make .o files from .c files +%.o: %.c $(HEADERS) Makefile + $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c -o $@ $<; + +$(TARGET).elf: $(OBJECTS) + $(CC) $(LDFLAGS) $(TARGET_ARCH) $^ $(LDLIBS) -o $@ + +%.hex: %.elf + $(OBJCOPY) -j .text -j .data -O ihex $< $@ + +%.eeprom: %.elf + $(OBJCOPY) -j .eeprom --change-section-lma .eeprom=0 -O ihex $< $@ + +%.lst: %.elf + $(OBJDUMP) -S $< > $@ + +## These targets don't have files named after them +.PHONY: all disassemble disasm eeprom size clean squeaky_clean flash fuses + +all: $(TARGET).hex + +debug: + @echo + @echo "Source files:" $(SOURCES) + @echo "MCU, F_CPU, BAUD:" $(MCU), $(F_CPU), $(BAUD) + @echo + +# Optionally create listing file from .elf +# This creates approximate assembly-language equivalent of your code. +# Useful for debugging time-sensitive bits, +# or making sure the compiler does what you want. +disassemble: $(TARGET).lst + +disasm: disassemble + +# Optionally show how big the resulting program is +size: $(TARGET).elf + $(AVRSIZE) -C --mcu=$(MCU) $(TARGET).elf + +clean: + rm -f $(TARGET).elf $(TARGET).hex $(TARGET).obj \ + $(TARGET).o $(TARGET).d $(TARGET).eep $(TARGET).lst \ + $(TARGET).lss $(TARGET).sym $(TARGET).map $(TARGET)~ \ + $(TARGET).eeprom + +squeaky_clean: + rm -f *.elf *.hex *.obj *.o *.d *.eep *.lst *.lss *.sym *.map *~ *.eeprom + +##########------------------------------------------------------########## +########## Programmer-specific details ########## +########## Flashing code to AVR using avrdude ########## +##########------------------------------------------------------########## + +flash: $(TARGET).hex + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U flash:w:$< + +## An alias +program: flash + +flash_eeprom: $(TARGET).eeprom + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U eeprom:w:$< + +avrdude_terminal: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nt + +## If you've got multiple programmers that you use, +## you can define them here so that it's easy to switch. +## To invoke, use something like `make flash_arduinoISP` +flash_usbtiny: PROGRAMMER_TYPE = usbtiny +flash_usbtiny: PROGRAMMER_ARGS = # USBTiny works with no further arguments +flash_usbtiny: flash + +flash_usbasp: PROGRAMMER_TYPE = usbasp +flash_usbasp: PROGRAMMER_ARGS = # USBasp works with no further arguments +flash_usbasp: flash + +flash_arduinoISP: PROGRAMMER_TYPE = avrisp +flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P /dev/ttyACM0 +## (for windows) flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P com5 +flash_arduinoISP: flash + +flash_109: PROGRAMMER_TYPE = avr109 +flash_109: PROGRAMMER_ARGS = -b 9600 -P /dev/ttyUSB0 +flash_109: flash + +##########------------------------------------------------------########## +########## Fuse settings and suitable defaults ########## +##########------------------------------------------------------########## + +## Mega 48, 88, 168, 328 default values +LFUSE = 0x62 +HFUSE = 0xdf +EFUSE = 0x00 + +## Generic +FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m + +fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) \ + $(PROGRAMMER_ARGS) $(FUSE_STRING) +show_fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nv + +## Called with no extra definitions, sets to defaults +set_default_fuses: FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m +set_default_fuses: fuses + +## Set the fuse byte for full-speed mode +## Note: can also be set in firmware for modern chips +set_fast_fuse: LFUSE = 0xE2 +set_fast_fuse: FUSE_STRING = -U lfuse:w:$(LFUSE):m +set_fast_fuse: fuses + +## Set the EESAVE fuse byte to preserve EEPROM across flashes +set_eeprom_save_fuse: HFUSE = 0xD7 +set_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +set_eeprom_save_fuse: fuses + +## Clear the EESAVE fuse byte +clear_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +clear_eeprom_save_fuse: fuses diff --git a/Make AVR Examples/Chapter19_EEPROM/vigenereCipher/vigenereCipher.c b/Make AVR Examples/Chapter19_EEPROM/vigenereCipher/vigenereCipher.c new file mode 100644 index 0000000..267aa15 --- /dev/null +++ b/Make AVR Examples/Chapter19_EEPROM/vigenereCipher/vigenereCipher.c @@ -0,0 +1,146 @@ +/* +Vigenere Cipher encoder / decoder demo +And an excuse to play around with EEPROM memory + */ + +#include "vigenereCipher.h" + +// -------- Functions --------- // + +void printFromEEPROM(char *eepromString) { + uint8_t letter; + do { + letter = eeprom_read_byte((uint8_t *) eepromString); + transmitByte(letter); + eepromString++; + } while (letter); +} + +void enterText(char text[]) { + uint8_t i = 0; + char letter; + do { + letter = receiveByte(); + transmitByte(letter); /* echo */ + text[i] = letter; + i++; + } while (!(letter == '\r') && (i < (MAX_TEXT_LENGTH - 1))); + text[i - 1] = 0; +} + +void displayCodes(void) { + uint8_t i; + for (i = 0; i < 4; i++) { + transmitByte(' '); + transmitByte('0' + i); + printString(": "); + printFromEEPROM(codePointers[i]); + printString("\r\n"); + } +} + +void changeCode(char codeBuffer[]) { + char input; + char *codeAddress; + printString(" -- Choose code phrase to replace:\r\n"); + do { + displayCodes(); + input = receiveByte(); + } while ((input < '0') || (input > '3')); + codeAddress = codePointers[input - '0']; + printString(" -- Enter new code: "); + enterText(codeBuffer); + eeprom_update_block(codeBuffer, codeAddress, CODE_LEN); +} + +void selectCode(char code[]) { + char input; + char *codeAddress; + printFromEEPROM(promptSelectCode); + do { + displayCodes(); + input = receiveByte(); + } while ((input < '0') || (input > '3')); + codeAddress = codePointers[input - '0']; + eeprom_read_block(code, codeAddress, CODE_LEN); +} + +void encodeVigenere(char text[], char code[]) { + uint8_t codePosition = 0; + uint8_t textPosition = 0; + do { + if (code[codePosition] == 0) { /* loop when at end of code phrase */ + codePosition = 0; + } + text[textPosition] += code[codePosition] - 32; + if (text[textPosition] > 126) { + text[textPosition] -= 95; + } /* keeps within printing characters */ + codePosition++; /* and move on to the next */ + textPosition++; + } while (text[textPosition]); /* until zero at the end of string */ +} + +void decodeVigenere(char text[], char code[]) { + uint8_t codePosition = 0; + uint8_t textPosition = 0; + do { + if (code[codePosition] == 0) { + codePosition = 0; + } + if (code[codePosition] > text[textPosition]) { + text[textPosition] += 95; + } /* keeps within printing characters */ + text[textPosition] -= code[codePosition] - 32; + codePosition++; + textPosition++; + } while (text[textPosition]); +} + +int main(void) { + // -------- Inits --------- // + + char textBuffer[MAX_TEXT_LENGTH]; + char codeString[CODE_LEN]; + char input; + initUSART(); + + // ------ Event loop ------ // + while (1) { + + // Menu + printFromEEPROM(welcomeString); + printFromEEPROM(promptText); + printString(textBuffer); + printString("\r\n"); + printFromEEPROM(promptCode); + printString(codeString); + printString("\r\n\r\n ---------------------\r\n"); + printFromEEPROM(menuEnterText); + printFromEEPROM(menuCodeText); + printFromEEPROM(menuChangeCode); + printFromEEPROM(menuEncode); + printFromEEPROM(menuDecode); + input = receiveByte(); + + switch (input) { + case 'e': // encode + encodeVigenere(textBuffer, codeString); + break; + case 'd': // decode + decodeVigenere(textBuffer, codeString); + break; + case 'n': // new text + printFromEEPROM(promptTypeText); + enterText(textBuffer); + break; + case 'c': // choose code + selectCode(codeString); + break; + case 'x': // change code + changeCode(codeString); + break; + } + } /* End event loop */ + return 0; /* This line is never reached */ +} diff --git a/Make AVR Examples/Chapter19_EEPROM/vigenereCipher/vigenereCipher.c_outline b/Make AVR Examples/Chapter19_EEPROM/vigenereCipher/vigenereCipher.c_outline new file mode 100644 index 0000000..c9c1941 --- /dev/null +++ b/Make AVR Examples/Chapter19_EEPROM/vigenereCipher/vigenereCipher.c_outline @@ -0,0 +1,55 @@ +/* +Vigenere Cipher encoder / decoder demo +And an excuse to play around with EEPROM memory + */ + +#include "vigenereCipher.h" + +// -------- Functions --------- // + +void printFromEEPROM(char *eepromString); +void enterText(char text[]); +void displayCodes(void); +void changeCode(char codeBuffer[]); +void selectCode(char code[]); +void encodeVigenere(char text[], char code[]); +void decodeVigenere(char text[], char code[]); + +int main(void) { + // -------- Inits --------- // + + char textBuffer[MAX_TEXT_LENGTH]; + char codeString[CODE_LEN]; + char input; + initUSART(); + + // ------ Event loop ------ // + while (1) { + + // Menu + printFromEEPROM(welcomeString); + // .... more fany menu printing + printFromEEPROM(menuDecode); + input = receiveByte(); + + switch (input) { + case 'e': // encode + encodeVigenere(textBuffer, codeString); + break; + case 'd': // decode + decodeVigenere(textBuffer, codeString); + break; + case 'n': // new text + printFromEEPROM(promptTypeText); + enterText(textBuffer); + break; + case 'c': // choose code + selectCode(codeString); + break; + case 'x': // change code + changeCode(codeString); + break; + } + } /* End event loop */ + return (0); /* This line is never reached */ +} diff --git a/Make AVR Examples/Chapter19_EEPROM/vigenereCipher/vigenereCipher.h b/Make AVR Examples/Chapter19_EEPROM/vigenereCipher/vigenereCipher.h new file mode 100644 index 0000000..aed537c --- /dev/null +++ b/Make AVR Examples/Chapter19_EEPROM/vigenereCipher/vigenereCipher.h @@ -0,0 +1,50 @@ + +#include +#include +#include "USART.h" + +#define MAX_TEXT_LENGTH 256 +#define CODE_LEN 64 + +// -------- Global Variables --------- // +char EEMEM code0[CODE_LEN] = "ettubrute"; +char EEMEM code1[CODE_LEN] = "attackatdawn"; +char EEMEM code2[CODE_LEN] = "theraininspainfallsmainlyontheplain"; +char EEMEM code3[CODE_LEN] = "ablewasiereisawelba"; +char *codePointers[] = { code0, code1, code2, code3 }; + +// Menu strings. Why not store them in EEPROM? +char EEMEM welcomeString[] = "\r\n--== Vigenere Cipher ==--\r\n"; +char EEMEM menuEncode[] = " [e] to encode text\r\n"; +char EEMEM menuDecode[] = " [d] to decode text\r\n\r\n"; +char EEMEM menuEnterText[] = " [n] to enter new text\r\n"; +char EEMEM menuCodeText[] = " [c] to select your code phrase\r\n"; +char EEMEM menuChangeCode[] = " [x] to modify code phrases\r\n"; +char EEMEM promptCode[] = "code: "; +char EEMEM promptText[] = "\r\ntext: "; + +char EEMEM promptSelectCode[] = "Select codephrase:\r\n\r\n"; +char EEMEM promptTypeText[] = "Type your text: "; + +// Given the address of an EEPROM string, prints it out +// Used for menu items +void printFromEEPROM(char *eepromString); + +// Takes input from serial, stores it in the text array +void enterText(char text[]); + +// Reads code phrases out of EEPROM and prints them. +// Uses the codeBuffer for temporary storage +void displayCodes(void); + +// Changes a code phrase, both in EEPROM and the current code +void changeCode(char codeBuffer[]); + +// Pick a code phrase from EEPROM +void selectCode(char code[]); + +// Encodes the passed text string, in place +void encodeVigenere(char text[], char code[]); + +// Decodes the passed text string, in place +void decodeVigenere(char text[], char code[]); diff --git a/Make AVR Examples/LICENSE.txt b/Make AVR Examples/LICENSE.txt new file mode 100644 index 0000000..c9d461b --- /dev/null +++ b/Make AVR Examples/LICENSE.txt @@ -0,0 +1,24 @@ +MIT License + +Copyright (c) 2014 Elliot Williams + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +Have fun! + diff --git a/Make AVR Examples/README.md b/Make AVR Examples/README.md new file mode 100644 index 0000000..f48a201 --- /dev/null +++ b/Make AVR Examples/README.md @@ -0,0 +1,107 @@ +Code and Examples from "Make: AVR Programming" +============================================== + +Welcome! +-------- + +Here you'll find all the code (and more!) for the Maker Media book + [Make: AVR Programming](http://shop.oreilly.com/product/0636920028161.do). + + +Getting Started +--------------- + +* First, download the contents of this repository onto your hard-drive. The easiest way + is with the "Download ZIP" button above and on the right-hand side of this very web + page. Extract the zip file wherever is comfy. (Feel free to clone the repo if you + are comfortable with Git.) + +* Most of the projects share a common set of pin defines and a common simple + USART serial library in the **AVR-Programming-Library** directory. The + makefiles I've included depend on the directory structure here by default, so + don't go moving the folders around unless you also change the path to + included files in the makefile. + +* If you're using the Arduino IDE, you'll want to copy the **AVR-Programming-Library** directory + into your **sketchbook/libraries** folder. If you don't know where this is, you can find out in the + "File...Settings" dialog within Arduino. Now you can link your code to use this library simply + using "Sketch...Import Library" and selecting the library from the the menu. + +* Now you will be set to open the code, edit it, and flash it into the AVR following the directions + in the book. + + +Repo Layout +----------- + +All of the project code is organized by the chapters in the book. So if +you're looking for an example of some SPI code, see the "Chapter16_SPI" folder for +SPI-related projects. That's obvious. + +But a bunch of the projects are interesting in addition to the topic covered in +the chapter. For instance, "Chapter05_Serial-IO" includes a project that uses +the serial communication between your desktop computer and the AVR to turn your +computer keyboard into a musical keyboard that plays notes generated on the +AVR, turning it into a serial-port-controlled organ. You wouldn't think to +go looking in the Serial I/O chapter unles you were following along in the book. + +So for an overview all the projects, the file [allProjectsList](https://github.com/hexagon5un/AVR-Programming/blob/master/allProjectsList) lists them all out by name. + +setupProject +------------ + +If you'd like a blank template to start writing your own AVR code, +have a look in the **setupProject** directory that I've included here. Inside, you'll find +**main.c** and **main.h** files that are essentially blank and ready to go. **main.c** +makes use of my simple USART library, which is also included an linked in by the **Makefile**. +In short, you could copy this directory, rename files, and start using it in your own projects. + +But you don't have to do that manually. Running *python setupProject.py +myProjectName* will create a directory called **myProjectName** for you, copy +the blank main files, renaming them as appropriate, and set up the Makefile +accordingly. All that's left for you to do is the hard part -- actually +coding. + +If you use this setup a lot, you'll want to personalize the **Makefile** and +the two **main** files to suit your own preferences. That way, whenever you +start up a new project, it'll include a customized **Makefile** that has your +programmer, chip type, and favorite baud rate already set. + +Finally, if you like to map out your pin definitions in macro definitions, run +*python createPinDefines.py*. The program will ask you what you'd like to call +each pin macro (e.g. "LED0") and then which pin on the AVR you'd like to +associate with it (e.g. "PB1"). When you're done entering your pin layout, +it'll create a "pinDefines.h" file with (I hope) nicely-named macros. Move +this file into the right directory, and include it in your code. Calling +LED0_SET_HIGH will turn your LED on. + + +More! +----- + +You've read the book, you've built the projects, you've worked through the code. +But still you hunger for more projects, more examples, more, more, more! +If I may toot my own horn, you should visit [LittleHacks.org](http://littlehacks.org) +where I blog about whatever microcontroller projects I'm currently up to. + +In particular, if you're reading + [Make: AVR Programming](http://shop.oreilly.com/product/0636920028161.do), and +you're interested in fully-elaborated versions of the projects with more +photos, videos, and explanation than could fit in a book, head on over to + [LittleHacks.org's AVR-Programming Section](http://littlehacks.org/AVR-Programming). + +Once you've exhausted all of these resources, you should *definitely* head over +to [The Cornell University ECE 4760 Final +Projects](http://people.ece.cornell.edu/land/courses/ece4760/FinalProjects/) +list page. It's an awe-inspiring collection of applications, and sure to spark +some creative thoughts. It's all well-documented and there's tons of source +code in C. [Professor Land's links section] +(http://people.ece.cornell.edu/land/courses/ece4760/#links) is also top-notch, +and his lectures on YouTube are also worth a look if you're getting serious +about this whole AVR deal. + + + + + + diff --git a/Make AVR Examples/allProjectsList b/Make AVR Examples/allProjectsList new file mode 100644 index 0000000..8a8436e --- /dev/null +++ b/Make AVR Examples/allProjectsList @@ -0,0 +1,69 @@ +Chapter02_Programming-AVRs/blinkLED +Chapter02_Programming-AVRs/blinkLED_AVR_style + +Chapter03_Digital-Output/povToy + +Chapter04_Bit-Twiddling/cylonEyes +Chapter04_Bit-Twiddling/showingOffBits + +Chapter05_Serial-IO/serialLoopback +Chapter05_Serial-IO/serialOrgan + +Chapter06_Digital-Input/avrMusicBox +Chapter06_Digital-Input/bossButton +Chapter06_Digital-Input/debouncer +Chapter06_Digital-Input/simpleButton +Chapter06_Digital-Input/toggleButton + +Chapter07_Analog-to-Digital-Conversion-I/lightSensor +Chapter07_Analog-to-Digital-Conversion-I/nightLight +Chapter07_Analog-to-Digital-Conversion-I/slowScope + +Chapter08_Hardware-Interrupts/capSense +Chapter08_Hardware-Interrupts/helloInterrupt + +Chapter09_Introduction-to-Timer-Counter-Hardware/amRadio +Chapter09_Introduction-to-Timer-Counter-Hardware/reactionTimer +Chapter09_Introduction-to-Timer-Counter-Hardware/timerAudio + +Chapter10_Pulse-Width-Modulation/bruteForcePWM +Chapter10_Pulse-Width-Modulation/pwm +Chapter10_Pulse-Width-Modulation/pwmOnAnyPin +Chapter10_Pulse-Width-Modulation/pwmTimers + +Chapter11_Driving-Servo-Motors/servoSundial +Chapter11_Driving-Servo-Motors/servoWorkout + +Chapter12_Analog-to-Digital-Conversion-II/footstepDetector +Chapter12_Analog-to-Digital-Conversion-II/voltmeter + +Chapter13_Advanced-PWM-Tricks/adsr +Chapter13_Advanced-PWM-Tricks/arpeggiator +Chapter13_Advanced-PWM-Tricks/dds +Chapter13_Advanced-PWM-Tricks/dds_interrupts +Chapter13_Advanced-PWM-Tricks/dds_saw15 +Chapter13_Advanced-PWM-Tricks/dialTone +Chapter13_Advanced-PWM-Tricks/fatSaw + +Chapter14_Switches/dcMotorWorkout + +Chapter15_Advanced-Motors/hBridgeWorkout +Chapter15_Advanced-Motors/stepperWorkout + +Chapter16_SPI/spiEEPROMDemo + +Chapter17_I2C/i2cThermometer +Chapter17_I2C/loggingThermometer + +Chapter18_Using-Flash-Program-Memory/progmemDemo1 +Chapter18_Using-Flash-Program-Memory/progmemDemo2 +Chapter18_Using-Flash-Program-Memory/progmemDemo3 +Chapter18_Using-Flash-Program-Memory/progmemDemo4 +Chapter18_Using-Flash-Program-Memory/progmemDemo5 +Chapter18_Using-Flash-Program-Memory/talkingVoltmeter + +Chapter19_EEPROM/eememDemo +Chapter19_EEPROM/favoriteColor +Chapter19_EEPROM/quickDemo +Chapter19_EEPROM/vigenereCipher + diff --git a/Make AVR Examples/setupProject/Makefile b/Make AVR Examples/setupProject/Makefile new file mode 100644 index 0000000..5c588dc --- /dev/null +++ b/Make AVR Examples/setupProject/Makefile @@ -0,0 +1,196 @@ + +##########------------------------------------------------------########## +########## Project-specific Details ########## +########## Check these every time you start a new project ########## +##########------------------------------------------------------########## + +MCU = atmega168p +F_CPU = 8000000UL +BAUD = 9600UL +## Also try BAUD = 19200 or 38400 if you're feeling lucky. + +## A directory for common include files and the simple USART library. +## If you move either the current folder or the Library folder, you'll +## need to change this path to match. +LIBDIR = ../../AVR-Programming-Library + +##########------------------------------------------------------########## +########## Programmer Defaults ########## +########## Set up once, then forget about it ########## +########## (Can override. See bottom of file.) ########## +##########------------------------------------------------------########## + +PROGRAMMER_TYPE = usbtiny +# extra arguments to avrdude: baud rate, chip type, -F flag, etc. +PROGRAMMER_ARGS = + +##########------------------------------------------------------########## +########## Program Locations ########## +########## Won't need to change if they're in your PATH ########## +##########------------------------------------------------------########## + +CC = avr-gcc +OBJCOPY = avr-objcopy +OBJDUMP = avr-objdump +AVRSIZE = avr-size +AVRDUDE = avrdude + +##########------------------------------------------------------########## +########## Makefile Magic! ########## +########## Summary: ########## +########## We want a .hex file ########## +########## Compile source files into .elf ########## +########## Convert .elf file into .hex ########## +########## You shouldn't need to edit below. ########## +##########------------------------------------------------------########## + +## The name of your project (without the .c) +# TARGET = blinkLED +## Or name it automatically after the enclosing directory +TARGET = $(lastword $(subst /, ,$(CURDIR))) + +# Object files: will find all .c/.h files in current directory +# and in LIBDIR. If you have any other (sub-)directories with code, +# you can add them in to SOURCES below in the wildcard statement. +SOURCES=$(wildcard *.c $(LIBDIR)/*.c) +OBJECTS=$(SOURCES:.c=.o) +HEADERS=$(SOURCES:.c=.h) + +## Compilation options, type man avr-gcc if you're curious. +CPPFLAGS = -DF_CPU=$(F_CPU) -DBAUD=$(BAUD) -I. -I$(LIBDIR) +CFLAGS = -Os -g -std=gnu99 -Wall +## Use short (8-bit) data types +CFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums +## Splits up object files per function +CFLAGS += -ffunction-sections -fdata-sections +LDFLAGS = -Wl,-Map,$(TARGET).map +## Optional, but often ends up with smaller code +LDFLAGS += -Wl,--gc-sections +## Relax shrinks code even more, but makes disassembly messy +## LDFLAGS += -Wl,--relax +## LDFLAGS += -Wl,-u,vfprintf -lprintf_flt -lm ## for floating-point printf +## LDFLAGS += -Wl,-u,vfprintf -lprintf_min ## for smaller printf +TARGET_ARCH = -mmcu=$(MCU) + +## Explicit pattern rules: +## To make .o files from .c files +%.o: %.c $(HEADERS) Makefile + $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c -o $@ $<; + +$(TARGET).elf: $(OBJECTS) + $(CC) $(LDFLAGS) $(TARGET_ARCH) $^ $(LDLIBS) -o $@ + +%.hex: %.elf + $(OBJCOPY) -j .text -j .data -O ihex $< $@ + +%.eeprom: %.elf + $(OBJCOPY) -j .eeprom --change-section-lma .eeprom=0 -O ihex $< $@ + +%.lst: %.elf + $(OBJDUMP) -S $< > $@ + +## These targets don't have files named after them +.PHONY: all disassemble disasm eeprom size clean squeaky_clean flash fuses + +all: $(TARGET).hex + +debug: + @echo + @echo "Source files:" $(SOURCES) + @echo "MCU, F_CPU, BAUD:" $(MCU), $(F_CPU), $(BAUD) + @echo + +# Optionally create listing file from .elf +# This creates approximate assembly-language equivalent of your code. +# Useful for debugging time-sensitive bits, +# or making sure the compiler does what you want. +disassemble: $(TARGET).lst + +disasm: disassemble + +# Optionally show how big the resulting program is +size: $(TARGET).elf + $(AVRSIZE) -C --mcu=$(MCU) $(TARGET).elf + +clean: + rm -f $(TARGET).elf $(TARGET).hex $(TARGET).obj \ + $(TARGET).o $(TARGET).d $(TARGET).eep $(TARGET).lst \ + $(TARGET).lss $(TARGET).sym $(TARGET).map $(TARGET)~ \ + $(TARGET).eeprom + +squeaky_clean: + rm -f *.elf *.hex *.obj *.o *.d *.eep *.lst *.lss *.sym *.map *~ *.eeprom + +##########------------------------------------------------------########## +########## Programmer-specific details ########## +########## Flashing code to AVR using avrdude ########## +##########------------------------------------------------------########## + +flash: $(TARGET).hex + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U flash:w:$< + +## An alias +program: flash + +flash_eeprom: $(TARGET).eeprom + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U eeprom:w:$< + +avrdude_terminal: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nt + +## If you've got multiple programmers that you use, +## you can define them here so that it's easy to switch. +## To invoke, use something like `make flash_arduinoISP` +flash_usbtiny: PROGRAMMER_TYPE = usbtiny +flash_usbtiny: PROGRAMMER_ARGS = # USBTiny works with no further arguments +flash_usbtiny: flash + +flash_usbasp: PROGRAMMER_TYPE = usbasp +flash_usbasp: PROGRAMMER_ARGS = # USBasp works with no further arguments +flash_usbasp: flash + +flash_arduinoISP: PROGRAMMER_TYPE = avrisp +flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P /dev/ttyACM0 +## (for windows) flash_arduinoISP: PROGRAMMER_ARGS = -b 19200 -P com5 +flash_arduinoISP: flash + +flash_109: PROGRAMMER_TYPE = avr109 +flash_109: PROGRAMMER_ARGS = -b 9600 -P /dev/ttyUSB0 +flash_109: flash + +##########------------------------------------------------------########## +########## Fuse settings and suitable defaults ########## +##########------------------------------------------------------########## + +## Mega 48, 88, 168, 328 default values +LFUSE = 0x62 +HFUSE = 0xdf +EFUSE = 0x00 + +## Generic +FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m + +fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) \ + $(PROGRAMMER_ARGS) $(FUSE_STRING) +show_fuses: + $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -nv + +## Called with no extra definitions, sets to defaults +set_default_fuses: FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m +set_default_fuses: fuses + +## Set the fuse byte for full-speed mode +## Note: can also be set in firmware for modern chips +set_fast_fuse: LFUSE = 0xE2 +set_fast_fuse: FUSE_STRING = -U lfuse:w:$(LFUSE):m +set_fast_fuse: fuses + +## Set the EESAVE fuse byte to preserve EEPROM across flashes +set_eeprom_save_fuse: HFUSE = 0xD7 +set_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +set_eeprom_save_fuse: fuses + +## Clear the EESAVE fuse byte +clear_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m +clear_eeprom_save_fuse: fuses diff --git a/Make AVR Examples/setupProject/USART.c b/Make AVR Examples/setupProject/USART.c new file mode 100644 index 0000000..7e8139a --- /dev/null +++ b/Make AVR Examples/setupProject/USART.c @@ -0,0 +1,137 @@ + +/* + Quick and dirty functions that make serial communications work. + + Note that receiveByte() blocks -- it sits and waits _forever_ for + a byte to come in. If you're doing anything that's more interesting, + you'll want to implement this with interrupts. + + initUSART requires BAUDRATE to be defined in order to calculate + the bit-rate multiplier. 9600 is a reasonable default. + + May not work with some of the older chips: + Tiny2313, Mega8, Mega16, Mega32 have different pin macros + If you're using these chips, see (e.g.) iom8.h for how it's done. + These old chips don't specify UDR0 vs UDR1. + Correspondingly, the macros will just be defined as UDR. +*/ + +#include +#include "USART.h" +#include + +void initUSART(void) { /* requires BAUD */ + UBRR0H = UBRRH_VALUE; /* defined in setbaud.h */ + UBRR0L = UBRRL_VALUE; +#if USE_2X + UCSR0A |= (1 << U2X0); +#else + UCSR0A &= ~(1 << U2X0); +#endif + /* Enable USART transmitter/receiver */ + UCSR0B = (1 << TXEN0) | (1 << RXEN0); + UCSR0C = (1 << UCSZ01) | (1 << UCSZ00); /* 8 data bits, 1 stop bit */ +} + + +void transmitByte(uint8_t data) { + /* Wait for empty transmit buffer */ + loop_until_bit_is_set(UCSR0A, UDRE0); + UDR0 = data; /* send data */ +} + +uint8_t receiveByte(void) { + loop_until_bit_is_set(UCSR0A, RXC0); /* Wait for incoming data */ + return UDR0; /* return register value */ +} + + + /* Here are a bunch of useful printing commands */ + +void printString(const char myString[]) { + uint8_t i = 0; + while (myString[i]) { + transmitByte(myString[i]); + i++; + } +} + +void readString(char myString[], uint8_t maxLength) { + char response; + uint8_t i; + i = 0; + while (i < (maxLength - 1)) { /* prevent over-runs */ + response = receiveByte(); + transmitByte(response); /* echo */ + if (response == '\r') { /* enter marks the end */ + break; + } + else { + myString[i] = response; /* add in a letter */ + i++; + } + } + myString[i] = 0; /* terminal NULL character */ +} + +void printByte(uint8_t byte) { + /* Converts a byte to a string of decimal text, sends it */ + transmitByte('0' + (byte / 100)); /* Hundreds */ + transmitByte('0' + ((byte / 10) % 10)); /* Tens */ + transmitByte('0' + (byte % 10)); /* Ones */ +} + +void printWord(uint16_t word) { + transmitByte('0' + (word / 10000)); /* Ten-thousands */ + transmitByte('0' + ((word / 1000) % 10)); /* Thousands */ + transmitByte('0' + ((word / 100) % 10)); /* Hundreds */ + transmitByte('0' + ((word / 10) % 10)); /* Tens */ + transmitByte('0' + (word % 10)); /* Ones */ +} + +void printBinaryByte(uint8_t byte) { + /* Prints out a byte as a series of 1's and 0's */ + uint8_t bit; + for (bit = 7; bit < 255; bit--) { + if (bit_is_set(byte, bit)) + transmitByte('1'); + else + transmitByte('0'); + } +} + +char nibbleToHexCharacter(uint8_t nibble) { + /* Converts 4 bits into hexadecimal */ + if (nibble < 10) { + return ('0' + nibble); + } + else { + return ('A' + nibble - 10); + } +} + +void printHexByte(uint8_t byte) { + /* Prints a byte as its hexadecimal equivalent */ + uint8_t nibble; + nibble = (byte & 0b11110000) >> 4; + transmitByte(nibbleToHexCharacter(nibble)); + nibble = byte & 0b00001111; + transmitByte(nibbleToHexCharacter(nibble)); +} + +uint8_t getNumber(void) { + // Gets a numerical 0-255 from the serial port. + // Converts from string to number. + char hundreds = '0'; + char tens = '0'; + char ones = '0'; + char thisChar = '0'; + do { /* shift over */ + hundreds = tens; + tens = ones; + ones = thisChar; + thisChar = receiveByte(); /* get a new character */ + transmitByte(thisChar); /* echo */ + } while (thisChar != '\r'); /* until type return */ + return (100 * (hundreds - '0') + 10 * (tens - '0') + ones - '0'); +} diff --git a/Make AVR Examples/setupProject/USART.h b/Make AVR Examples/setupProject/USART.h new file mode 100644 index 0000000..c3f18eb --- /dev/null +++ b/Make AVR Examples/setupProject/USART.h @@ -0,0 +1,44 @@ +/* Functions to initialize, send, receive over USART + + initUSART requires BAUD to be defined in order to calculate + the bit-rate multiplier. + */ + +#ifndef BAUD /* if not defined in Makefile... */ +#define BAUD 9600 /* set a safe default baud rate */ +#endif + + /* These are defined for convenience */ +#define USART_HAS_DATA bit_is_set(UCSR0A, RXC0) +#define USART_READY bit_is_set(UCSR0A, UDRE0) + +/* Takes the defined BAUD and F_CPU, + calculates the bit-clock multiplier, + and configures the hardware USART */ +void initUSART(void); + +/* Blocking transmit and receive functions. + When you call receiveByte() your program will hang until + data comes through. We'll improve on this later. */ +void transmitByte(uint8_t data); +uint8_t receiveByte(void); + +void printString(const char myString[]); + /* Utility function to transmit an entire string from RAM */ +void readString(char myString[], uint8_t maxLength); +/* Define a string variable, pass it to this function + The string will contain whatever you typed over serial */ + +void printByte(uint8_t byte); + /* Prints a byte out as its 3-digit ascii equivalent */ +void printWord(uint16_t word); + /* Prints a word (16-bits) out as its 5-digit ascii equivalent */ + +void printBinaryByte(uint8_t byte); + /* Prints a byte out in 1s and 0s */ +char nibbleToHex(uint8_t nibble); +void printHexByte(uint8_t byte); + /* Prints a byte out in hexadecimal */ +uint8_t getNumber(void); +/* takes in up to three ascii digits, + converts them to a byte when press enter */ diff --git a/Make AVR Examples/setupProject/createPinDefines.py b/Make AVR Examples/setupProject/createPinDefines.py new file mode 100644 index 0000000..e0f555d --- /dev/null +++ b/Make AVR Examples/setupProject/createPinDefines.py @@ -0,0 +1,61 @@ +#! /usr/bin/env python + +## Given a list of names and pin defines, runs through a routine that +## sets up a standard set of macros which can then be cut/paste or +## otherwise included. + +import sys +try: + outputFilename = sys.argv[1] +except: + print + print 'No filename passed, saving to "pinDefinitions.h" in this directory.' + outputFilename = "pinDefinitions.h" + +print +print +print "First we need to define macro names and the coresponding AVR pins." +print "None of the names are case-sensitive -- all are converted to uppercase." +print "When you're done, hit [enter] for the macro name." +print " " + + +nicknames = [] +pinouts = [] +while(True): + nickname = raw_input("\nPin Macro Name: ").strip().upper() + if (nickname == ""): + break + nicknames.append(nickname) + pinout = raw_input("AVR Pinout: ").strip().upper() + pinouts.append(pinout) + +output = "// ---------------\n// Pin Defines \n// ---------------\n\n" +for (nickname, pinout) in zip(nicknames, pinouts): + output += "#define %s %s\n" % (nickname, pinout) + output += "#define %s_PORT PORT%s\n" % (nickname, pinout[1]) + output += "#define %s_PIN PIN%s\n" % (nickname, pinout[1]) + output += "#define %s_DDR DDR%s\n" % (nickname, pinout[1]) + output += "#define %s_SET_OUTPUT %s_DDR |= _BV(%s)\n" %\ + (nickname, nickname, nickname) + output += "#define %s_SET_INPUT %s_DDR &= ~_BV(%s)\n" %\ + (nickname, nickname, nickname) + output += "#define %s_SET_HIGH %s_PORT |= _BV(%s)\n" % \ + (nickname, nickname, nickname) + output += "#define %s_SET_LOW %s_PORT &= ~_BV(%s)\n" % \ + (nickname, nickname, nickname) + output += "#define %s_TOGGLE %s_PORT ^= _BV(%s)\n" % \ + (nickname, nickname, nickname) + output += "#define %s_IS_HIGH (%s_PIN & _BV(%s))\n" % \ + (nickname, nickname, nickname) + output += "#define %s_IS_LOW !(%s_PIN & _BV(%s))\n" % \ + (nickname, nickname, nickname) + output += "\n" + + +try: + outfile = open(outputFilename, "w") + outfile.write(output) + outfile.close() +except NameError: + print output diff --git a/Make AVR Examples/setupProject/macros.h b/Make AVR Examples/setupProject/macros.h new file mode 100644 index 0000000..7987b22 --- /dev/null +++ b/Make AVR Examples/setupProject/macros.h @@ -0,0 +1,26 @@ + +/* Standard Macros */ +/* You can totally get by without these, but why? */ + +/* Make sure we've already got io / sfr / pindefs loaded */ +#ifndef _AVR_IO_H_ +#include +#endif + +/* Reminder: the following useful bit-twiddling macros are + always included in avr/sfr_defs.h, which is called from + avr/io.h + + bit_is_set(sfr, bit) + bit_is_clear(sfr, bit) + loop_until_bit_is_set(sfr, bit) + loop_until_bit_is_clear(sfr, bit) + +*/ + +/* Define up the full complement of bit-twiddling macros */ +#define BV(bit) (1 << bit) +#define set_bit(sfr, bit) (_SFR_BYTE(sfr) |= BV(bit)) // old sbi() +#define clear_bit(sfr, bit) (_SFR_BYTE(sfr) &= ~BV(bit)) // old cbi() +#define toggle_bit(sfr, bit) (_SFR_BYTE(sfr) ^= BV(bit)) + diff --git a/Make AVR Examples/setupProject/main.c b/Make AVR Examples/setupProject/main.c new file mode 100644 index 0000000..4e08b2d --- /dev/null +++ b/Make AVR Examples/setupProject/main.c @@ -0,0 +1,22 @@ + +#include "main.h" + +// -------- Global Variables --------- // + +// -------- Functions --------- // + +int main(void) { + // -------- Inits --------- // + + // clock_prescale_set(clock_div_1); /* CPU Clock: 8 MHz */ + initUSART(); + printString("OK"); + + // ------ Event loop ------ // + while (1) { + + + + } /* End event loop */ + return (0); /* This line is never reached */ +} diff --git a/Make AVR Examples/setupProject/main.h b/Make AVR Examples/setupProject/main.h new file mode 100644 index 0000000..d505039 --- /dev/null +++ b/Make AVR Examples/setupProject/main.h @@ -0,0 +1,19 @@ + +// Standard AVR includes +#include +#include +#include +#include +#include +#include +#include +#include + +// Standard includes +#include + +// These are optional, but nice to have around. +// Feel free to comment them out if you don't use them. +#include "USART.h" +#include "macros.h" + diff --git a/Make AVR Examples/setupProject/setupProject.py b/Make AVR Examples/setupProject/setupProject.py new file mode 100644 index 0000000..5bf6c73 --- /dev/null +++ b/Make AVR Examples/setupProject/setupProject.py @@ -0,0 +1,41 @@ +#! /usr/bin/env python +## Simple Python routine for creating a new AVR project +## Feel free to extend this to meet your needs + +## In particular, main.h includes nearly every AVR library you'll ever need +## which is no problem, b/c the linker will just ignore the unused ones. +## But if you're not using them, it might cause confusion later. +## Trim them down to fit? + +## Or, if you're feeling DIY, you can just copy the Makefile, main.c and main.h +## into a new directory yourself. The other files are optional, but handy. + +import os +import shutil +import sys + +## Get command-line input +class UsageError(Exception): + pass +try: + newProjectName = sys.argv[1] +except IndexError: + raise(UsageError("Please specify a project name on the command-line.\n")) + +## Create new project directory... +## ... in parent directory +## relativeDirectory = os.path.join(os.path.pardir, newProjectName) +## ... or in this directory, and you get to move it yourself. +relativeDirectory = newProjectName +os.mkdir(relativeDirectory) + +## Files copied directly over... +def copyToNewDirectory(whichFile, newDirectory): + shutil.copy(whichFile, newDirectory) +## ... these ones. +for filename in ["Makefile", "main.c", "main.h", "USART.h", "USART.c", "macros.h"]: + copyToNewDirectory(filename, relativeDirectory) + +print "Copied Makefile, main.c, and main.h into %s." % relativeDirectory +print "Time to start coding." +

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 literal 0 HcmV?d00001 diff --git a/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/elliot_speaking/thankyou.wav b/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/elliot_speaking/thankyou.wav new file mode 100644 index 0000000000000000000000000000000000000000..07c9f90748f87c17d3fad8c551cee48d0d919668 GIT binary patch literal 45130 zcmXV(1$Oq@h2ri-3Z>BE?oylr#odb2Qrz8XOL0q(03k>` zIsN`~`MBRDmv`^&&W_LQ?9j4F!-jSDDoVRLZ5#CYVQ9f{MNw2<^>-@D%=W6HDd9@9 zCaqfM;Chp98a8k8O`Wfud>-1b$DjeDejKJKy?YGpp)kTV?UHs(JI?!zc3wNJozM>R z>ALn*i_>0cG1`6YiS|r;&HJ%-O}nfe)edTFwFTNlZIbqzwu5JGXpgkFnoZBG7t}5N zg?5q=PHFdeHdedK&*z$=do`aHuRY}Nhm4i1c{DxnFH=k4%0+DtV@=b>YSXo)+Inq` zHiysSw1wJkMmwkdq5aO)jr{ygTcnNV+Z8}@k@q$rS)gsu4rphAe6O~SXV-A&8f`VN z{n}OSy_TV=x?A(}Q`M81?J{GYXVsUObt`x7<*p}z)yA@p49(CDVAJ$4J-=Q-|3a^? zH`hDq-SrN7L%pJ2lB-dy=eBl)d1bD(yjJku0S-?v@-bk!p*>(_NzCcg^XUcjXgx?z z2LsQUKL&iscZP2A@@bjiN7Ze*0+cRILVlgz}F+~CU`i`ineIWc&!BX zLxDA)b0S7Nj;aIgL~6}>nRjU(FA87S?l=#e$PYG6L9?*xc`0tcDE)l6=1F+%oz!_ zTtMSvMyKupvUDH|hfA_vCG;xHS6eRyobptG0K5eQpYpN-MNeg&nw}l36#>eEtRxb= zBtwN~+AU@kny-e_4}iZcDqV%UUcensc|GK=$6)Okyu1Pa-x}b?S;*%EWN0!!CkB2_ z(Z=w3yf!-^VO!wa)!ey;CzkSkAFYMHi#AXjs?F6FGsk+qS*!i3&0^-MT-gIA z&uf3Nn)N{YCnMcroljVeXqhK`j^!1j-GMI;Anzh!@)j8r4X_DGTL8Rcc})VAsf;Tt zoycoE+G8H;*#QpLX}_RP#%oi!YYZA=JTUBrzpo%gC$$UkaWb%*;QkG>-i6K#D6mKml7W}Ae5lDVfa&jf9hHiFsLq5017-pu_| znR%4<1GsFW)zxZi^|V@A4e(n>Yo>Jolf9Xz2e|4Uz-o6sHDS(@T4AlIRu)P$0g9eb z;XA%*3Ou!;Ol_?)cNEb+0k$5jY7&@`b&uA5=H5;`(H+Y5=ZR+AD|6N5Rg-yZYYljR z&a;tPkmgq%no}#JRpW{Ntg*M&8ko9h!?cl%IfN@cwN}hoK`W*e&^`n99@-!Br zgc=LM)Ud$3(*x@q4xHaIpWI!9c{;N4soXu0XGVje>FDj1U}Y1u6urEL&+B=u1fLuE zypD0FFy0I_+n-S43>>l>dMx4USjHL)*Dem+yDq@DGK#!6@uX<{m0aC{KD+>hFY@~| zTy`lSEBpCo10%^@3!v0UICBcTDbKD6aMLEn6%La-Hu6)fkMNxE=jy=KtUHz?h1-Da zDq29~?gf1M1j&m*lY7xG>HKvWDZIcP7m?YetVZ~644lymsp!i(CIZ1E-t(AYE8}g@ zmIq+p0wl}9>E!>*=u|jrk~Wj||H(R@F;^TjJ!J;bqnEIU0^Kg=i9rsg58Zl} zmG5NCC5-nw5_B3!{$%u3+WY`FifsPC=p%t`98}o`#OINS%RGA@EAt;?o`eF&v8}rT zxLAe6&E%=(@X?p>M0+@LG`QRn(2M7}_as<3$4sIHRzfL}$+65anbivi2#3z(@9|(_ z61H2Yk);u4GWKR|J9uBglfo6EEmre+Lx65s93nIqdaMdiW*uYwKbqkeuKl-!z&|*`!T#m zGr~;XBayE@NYqb^`U{lW$n!^-Z9g+F2lk2JsXsE=9*OJ@wtMok9q&HeFB)$g>k`au z<+X{?WktJyM(7|G{2Z$|&3GsHycc*UFkd^ZGx}kGHW(_*W0p-onFXsz$6Uso%*@-k ze>*D{ZTbt>*8trNKF?*2b#Tjcs5yf1CIw_$^zJz1Nk;F0%nuB3?+mU9#mDia=%-;^ z?+Wx?upe#FYE{uf)wQpIryDrv9MCLdSk=-1x9`ALlb1M6?ks|TZqzMICK zqtQ@3d9ni|^aD@bwQtZ+wc*VU=)u`Qy&XQ<0M^9<`~Z9{(V(^9-&$zIn%r3n8`lvW z_hp=K1A14k%Qs(YU-1&XD;zvCfR`+}70De64SE96aMra14%!CoHp0s@pvW|?Y=Fl^ zTPzE3fmk7tp7mVa0?x;>igsw+-sn=XNK*syF^=og1M;*5URlZ~u~}KxT6E_e@Ge?u z6Yq75E3&bcnb#pFqE&Z7>-*@1*XX0?=m_x?Mf;2f(l)HEUcjPv4d9^@cn}NUJfM;K zz!9B!_2sYL(54gk{1NV)_z-5M(hP{ zgfsgF{D|7%uoGkUWJIBIPpIDk$DTt-M}c|4Q$y_td-SU+Y!z%R=xc-=J|H zFj5Q}S@iLJKF47JJorL(-50O}8eX7@PBwJ$>^)qQe{Q_qc%He5-r5D#1goOo#8a37 zZbd5!-!5Z~qrvp3fG;DF)MY4q9$7vX&=8^ro z-TB-TiuU4DXXL6ryif(oHerEV9Aw-q&tet! zWNLs$6QTbv@NG|YSY>>_FOf3QXq5xf+8#`IWyY?ocntC)l!4`;RFd9?{>_wSj# z3-imo;_o%WrxPf9GpcCkp74}dk132W4&5f7CNukBM(e_zvik2BSG>r6U}_cewLQRT zivxW5dw`Bpcyc)KG-sBE=*}*T+&X}h8emZ(hz3A2l)ENDjke&b7O#3hRfo0I;j?(L zf^qpNc&f*Bp+pwWYBRDxItgC<5qP@6E2EJAX#v=O1=oLI^_KFj_^eF=Bgt6RwNhFx zElkUeb!ovW+C!-t%+-d~jpXi`c$lI$Hp2IGed-2SKH$>x32=K}< z;P1-QKQsFruKW!By8&AtetyfyHJPCU*S>@M#Ges^Cnxr6QU!j5QPv$Ws=!go?HKzB=n{1=dA^M578M9l@GlwKIL~hILJrr)D-UP#mHg>+rcfhv3bRSsUT1l2d@0!JeakObmz z^_hBCeW*TH-D-B$P?Gx!@kGG@W;FiE>dW!Y6Igv&R#XH0lw`(eR$mm#e96oWnXMeN z6%0I|m%9rDEN(6CEzVs-jZvwn&D#v|Fi;bqZ1f}@&XOtg^Ld%;_MC?}dl zV%fUjMZ77YX&+u)dG0HoD93z-p|4O*JcY_&urBuuN8iliJrdlBuOa;S6Wl30Iu-d4 zUve^kiL6S*EBsJ{IqC$wy3Xja?|7y;FjQmStZ2G6Ba7Af5qf94>#xq*+M$0ZqYXq? z%nn$$CBQxuUYLT!i*1seoJ0Xzxze9GWyT(iExzV-G>_yP*P=~kFpgwOS_dr4VAe0$ zPKkeKFyc?FNA&wpW|FvL2G1PA3LfI=6=>zdSjMN=$NN}G@k8S9Yp&q^|H1ex&~sye zZw9vackW-0hLad;Ki?k*GKti#GuBqLlK8h0JFEaUvD>S#zz^|hV(}rL1w5wP%()Q{ zWj62)L{=+FsQT7J>HyL+RVCJ*Xc}D;jVoN2LFcv&aXPx5t36xu) z=P97s&UjPdD9N~t!*&Yyh$@oD2(?<5+P3AN!dv}(*gc_H) zS8@^p^BzXO#avIoy5#xd_$2xG3*hqv9D0qv;sTjD8#&OzdRhGL+GK4TkhA@aTx)J} z_0F&_FcFd+FV*;NqUlW~1n}^Ie3VXBT6O|tH$x#~?t(5)(HIgb zz7OQp4g6zOmwg$Xy$+2`sAS*ofVq=_m8?Ra97o=+0K;1NX9N-?`mqgs^)paz1xnfJ z5N>+M{IZV`4^3s?M|}8;JTF}Odw{aX;HOmquV@SFk?2lhvpuZyG?;u$TqT@%3H+^Q z{Sti)gO}&>ym-mOn6rIA8%Xpmp1$}$@_R7YkbH>5d<($SQgG8f;Dd`tDZZw7S9Q5k z2kliH3n_k1alEbSd@okAM!-90%;#!Y(Y#t2u1g#&^K@bSh0y;buYKTK{B_y)k~l*2 zcL$&nZ(uZkFNDW7vo?vdBun%=^j!zd`*Tk-AgLMf^dzG^3;i$?e9BXj&FIP8VrwNw z(;57B2EVgdx#R*Q3n-aS$ySZVB8=qsGG>u@ZaH(#fMY~6NX|ua1&agRCRS!0&xp*4 zcG?`!kCM%pz$oG&imq4+q}v%suqJWZL1=LaeH^2u26Fq!@X7;dDSF{wXuS>`kHQX! zcInHkE1|GtyZ6DlvjSsE#$YFsClRScqLPVU%lkObi^ShSo1Q>cB+`>Tt7F_H`+K6v z#XiaY;~7Sj&;M}uv%pKD?N~VXZ@v?0klgKlMtlX7USNF=2VGz+$)BxYEvvx1?Ae^) zw`8znZNGyt$()dCAC%d}n2A_j2tN-wD1XB3=)UHUNcWt9I~>Xv~uVoh&;zqPfJ1W$Cai zyD$1dcv{BY3~Z7$nDGCX_(rmOB={36G!DsFk0#&7_zMHFwvQ*Kv;M3&tSi>HGjb{V zV;y&l#s3tqNObMUz?!ClACaei0Z+68(msSa=7TTsn~s9v8}Q$2?3$&2hP73s}uDC~=gllHU~n^z}%<+^Zqb)o{%Vztq=;&%+>uJ(ND2qYtbNA#3rtowK%xSXrYU?H43#C9-If_7e#pv{&SpJZ zq0t1sAI8=ByoW;5v5dbQzF7elWzT;-bGPE2-++Fu>hU-7J@It#Z1xQI_VktW-}O&b z%Bz2?Uon4*)?DAOd-Nhk0i%S`*jQtDjh^Ou^QIYNelRmlo0ZSXZ$(*m%vok}^P#cG zXl-QZi}X+Q_vos30gosZf8rJz;TNL699jbL;c@j>wW;b=4k@dYHOf^bMEzEssE$?Z zs&AD|%1Y(FQbnDv{-*X*i>MEkgUWVgm-44_PI;_EsojYW8-t%<_N;^SSg0zVNe3-O z{Xwn36Xmrp^isw;V~a7+Xkqj;h8j7H0{T96q~i83R$i-J^v=fb#xTP&=HoR@B*ITt zYru~U^w#X0yS2*tI{l$OOUJ)co2#qTR``g;@DZ-EisJeheT%+EpQ{hod+C+&xwc~e z3TxNZp=t~D7quXiTB7}}?onR*?TSk&f(D87D7tm zp#CoPNAeB-X@jWDcnHT@WDZKeyN!_h74UaU?YvrBEer$|pvHJs7HU*68u2P@JS4Bn zUY?q)%u-G(%hm1LIQ=NsP9oVQ;En|CGxq9dXvft^^@?Ju>%hf-R3Th$5b zO4ZIfq`Ko25)eU@xC?(P9_~(6Z>q(S{to(JDgyel(loU*zLEH_myn6laA$Kp%qVXR z(7oycCCxuT*`i+7D(SbFKRfcjT+eMB)_>E!Q|~I3)lao5`W-z(f23d5-{_wigN?q1 zi^_$ekN#F(nj*5cGCystHStiB404$@!i)s5$RjCM+`td3GY$HqN^6TcvH z(;3~+7nyBrTg_isgFowcd;ndF57|Xw%T56t9O9ADj47D z!qZpLjoEm8r61AD8a0iZ)O>8h2f4460+)^TN>n;jrPAV4JsEm@qW!6UrG~0G)xm0v z+7_u#03&PlG~K6f&@+kP6{5>&Xv}x$gI;({KcNXyf$lkavz~rN&u-*4ey5H?c3IzO z1&IoJ>(i0Zqxuxx57nJ;z(7WAt@kHZ*bPrqMc!NJPNTh1#+Ze~^npL}Lywc{0(GH! zOwCk3L7T*Ai}jAiF=K-9mwuNKR%qF&4!Ns6P~R(Cl!od&?S?+bSYQ+}PUwH>!Ny4A zH=~$QMt`sVr&LsGEBBOt)U(7<<Jw`vSx6ogp_hs*P3(p)t!uO%6#y~64SpR8-^d9;& z{Uwq4Yu(Tx zXTZ;TupEOOi-&F!TRW*+DGXIJv4D%w?~+~X#!Rx8EV0jD&?A&uoNwWeDB#$^To*Kl z-cg^UZ`9}OKSTSrdRHKAsh1=BewpvZTe?DJRSnjBNPn!~(+@(qc5p{dtm`gtP)w7| zVScPgUsiJwn^_SW)P&l>+;Iup&=E*lvdUn6w0==f(p`F-evbJ%Kx-GUi~n{O{`Y{T zN^o5r{Tt*Dxj61^v19-<)a+!^#FlQ(iudYUX_QS9(d zyb~ul@2HPOk8jaW!LbgbD6)~=c&q;brUt`X6ZvkwK2mRkW_yFxl$_^4@URXaCkR=e zs_#J$oraF<^!567{V<>Rv$mgz)N|{%;okaGn7l#8-;oK`fIm06(8gHofk?wt{2Ym9 zB*v54fJt2I3T}&#S1N?>@d=sVMD>jNyShT%r2eH|W2HJ*yTe2O5~-Ge>$>Vc0>wCe zh~5egsSce7paG`wcL!jojpk_&cejNHijXgOhlh3!jk1i{`VfhI!91Z@zI)(*sX7E} zTwD#uBI|0HT0*U__Eu*x?=v+N{n#1!q#kiC@-+xtcERJA2X`DH7LkfNiL?PK5NU^y zi>RVEW9H#tat~Y{WK=S~G)khY59s6J2}}PMIHcl5vT+jKpFk=eB6Sb(O^zU650McK zOZg6-dWuv^3_TgVW$jUaP6XS8$aEuIZt0)veZcxD{hEFY8tg-puEzVA!R!N(z}CQ$ zPxrtXk9frf;s}Yr60u?>;LacQg~;GN-K$5V&np>ujgQ#q?#SaU_(}2*lhH6+fGG~D zmkr>xB9fM!YPn)?aandr-Drrt+}j(^uPnYmF+9jRfqjbpaGmT%NY3sOx}g<(5~t@u zH`X-j;Y-!!Q*3w)aMF4GtbPTIZG*;xkk2}L8FbnmV3Ep#@o;@j zEbMxVuDgP)Jlv7F^epFrjqX~E||6rFJ;pNGW>H#q2*K&g^v@W>W0p~tPbA+?vd; zX_6V(@d(8_7K2BtpdmyiFJiR{k+JH4=IM)$X@jn;7pOY?65ebJB!lp#ChD8936Vxq zV-!ByS>uC|-)v&`Hv5|2nkCF6k1Fu=jTS;Yf0naZY#U40;rF zFZguGFQK-uFTzTOZ44b4QaWgwZMf$2j7}+@@b&YV4;uYj`s&W}%9-A$&Yfy-_S(g2 zH$v}hep2z3{lnhW1lJYcP_?E$)7WErtyT7U&U3-euu>6EBHu(+%l0@bN7T2GPa{f2 zwuzdR{Yb8Tc}o{MQY>3(PuXui^?i1)^3l&*d_JL4=}&+DWNz_O1-j?D6+Xf7Tx;dc zmRTyTd&>98uag!gRY^LQSR}FY$4wu6@BevU=0k~(D-z2muS!{$S|lxh+Va%tDc&S! zqVmD8^GDSfhZ`7uq7~MvgJLzlt7^H#u*ve3^NV zCtcU#O0ov>(3lZvvr9q7v4DZMDV(xx6XOaG0xS_J5D7i!8y^n$nmAU zk5$q5O{zMPQCtqiTn6u4NmdoT!nKJZcrT zRku~Nm9!PJmA2Kf^|tM?`D}IU?d@KSTMR802rQk-k-r*KJ0Eeo|k6E}V(2 z?}J9_!tWK>o`QJ6QYAJRIf}${?uAY|u6Hut8Pm;LR;*RoR={@NYG|D`4O2C4YbR7y zouK4W=J|{I(|i^Di~QI8=lp;9v zdht?TXus)IjUGlR{IjLTx8^Bxtoag(yfnI*9nBj?6Jv%k%Uoc^SpBSbX1KN5`qv7v z{-zlGE2#FhxyV??Nd1hJX1rO>9AU&5ovf9%9kvupwcW8V4;m5DBV=;$f5FwmibQ@9 zWkqfcS0cOTh>E_Fw|;bs+|6@O$#pR7rwr@AwL9<4OP#3v|MhX|KO6u4w~(={f6=7o?1t4^_U>A}@5TO;dk3{!S?Bv=-ON03XRk#Z|NPMNW3w-PcJKJ> z_i1PSE7cpG`^h)o42`Y%=+uL>N6ns%elz{!nAFDUh0`h}@A}X=;g>g~UVRmJ@8#H+ zbzU5fZU1D>!{i5d9-n-1^}|eGf$#@~2UHqbw|>(G-@I?yu)*)u_g085K0jaaT+STJ zbDYifbM*auUlb@+U_idF^Nh){CbCXgx8M}V2iy17XfwmuWArkL8y>XYr}|K}j4x;A zkfg!!D`J1X_wHu4%eT&5JDYLdakbCC-#mQ&BJzDw>J#@7|7CRqo=``%m9o-5!XKtI zQe(99MvPU>u`%d*$lkD&@SPDE5or-uA`V7mi>w~iC;Q@Dlk&zFY+3BvQcXWuUG~u@ zf0XK0w01rvd$Zse{aa6+wA+cbKIDJ@>3iS%vLA;e&QI!+d?Wcm^5SGyQt71fiDf=k z`!L}B?RPWYO?`L&-H-2!efal7!;cd_j{o@0$3h?NA3J>PnD}k-khFEKeg3*;hOnF{l8+UQNMXby9y-zVKJ@j&g;i*G=yJ;l*3e>$h=dU!Hmy{OZ`7W$$VyKYH=r!`OcJUKY|WO8)si?rB`tFBR= zLu5jR`qI34ympVrWp}mCOwZ6VXJ`KCTI#;wae1@*3o1eC9d*1`0x5SHJ*^Vldzo#!uaCw~<+zwR-9 zw@TT+b98j3IjaYi2)g6!gAr7wd1~dwexlJ_|FnLz0dquG{v5A(({$J-abF< zaE^WXZWZ~nqwrac`N5zo^M6I&iUf<*3SD~bgw*>a^K5YIY*Uj*CITj&w|$2+nV{c9R7Zu@~%x8 z$I{28A5O26@g`$>=KIXF%wd_WGUlf>NZFeB;eES=g7E`i_kZ>2tG%z%U!RC~B@FoB zOk=S_nbEzCSe+Z$c)9Jq*7aQ8zLovSGxlFg>YCC&(SS=i)>cZ!HB-$mBOM!!+@%N&=uzdXAfs%XAb8k zhs$oazp)mYg^YFDr|KL372gwYsJD~nApXL4t~Hq_Gj66oPm4$!oLV@wV(Qt{f77~W zv~bPz-0@{sbLsnyH|7#6*?Mc8w?tp}S;d5MdP78_-9vb{>@cQ7L z!PkTT4PG4V35p0(o$>Y?wk1|I^O)X2%cce?4u7c6htE>RJ>T`YE8JDeHN}<9ece6P zlifSOJHgw``_l83XPZ0By~nlI72_J`?&2BmJ?o29+M#QH)t4Ge%`w*3wpX^!_8s;Z zyW4Jn_dE6@_Nn%7?HRV|wj`jNjBb3Ot9mVM713OZlA%<`Pp(Doq$OVTSuzwY^mD|2 zP1G66Gyf0%f_{}_Ecx+YHu|0Dr)Fw2an}~THU9VrGu7;4J+XS?`|Ppz;>g5E=XvJ` zr#+}#(D0z-po75&L*hcC!plY2BG*KokE|PcI{bJ@to@8SJfrlx-7%5>{eJ1<$+|}- zAF6ibuM@WOpI;kytL1}nF~#EMzAc&POfTyV)(hDG3ECU-d&t$GgZBJpsMbZzd}6hC)85R98}(w& z^Ha}5Uw-+@`^KAKesm-kO&gh+&l{wcGP^itg-nbH&7PbyId^DuljxW{X}Qnm>Xh?i z_PyCoMKz788?`E`X0{^PtLB)H^F}T+PkNqV(L59X*?Ut<>(uU$#$zehFP4(KuW094~Vo%N3t%R<1vCuFWwxd#!B6 zqq0R7i>MJkH0(fVP-w4^tHGs$X9it&X2S7zY*Q`GY^RS)JJ&PQeZw^j ztJ>GK+;!QNdYY?vgnw^GIef*A`b(ce?wCXNWhqZ@n+wSK439AK{Pn zo%5aa#reMRKl2|^_Ni3$;%%gu_s~7x*yHU39giJV&~gWy7o5AD?VOh#c1N^5Cq*c! zMu^cwzd)|0BiX!z>|OjymbnnSII3}q+|YjQf;wOM#DB#**3;WP+I2T`Vdmk?_O7n( z^`30LdHyJMf_6qfV)Qldo7Js7=$uGm=UB&S=eVHY;BLW_g2xAs;=Mljc5sQ1*&&5P zUxucH6_4l^Suv_o)U}9(q4^!7)tGeiU0m$ByD>MvxZ3GT1V+k5Bu=4tP2A?U7{EFe_3Ert|Ae0oWGbGwHVc{wJ>wpCpaGmT@U)q z+0C|1-{rsOo}b}O&6ct&X=GxPkE!pMz561e(Az%oHRCVFyWZY>=l{?&>HCyAX(!Ti zWVUi0aCh={@n2J?8sFINI&KH$2w4&`Jmh8Ym%)dEb_O*MJ`s`>b~N&O_UpNNN7u<$ zCx89?!}C3hewce`&iHJNBKL-s3_0hVY5&<;W4N>p>U3qZKh9U*_pA4c=Yo5H>r%#x zv^Ob6a`VLZA2Qxgct7*K@?rmnpFY|WMvFSu&RkD-5t-3`AMF+MUbGBa{#WLm`I@UdY} zL&^jXaqh7P<5d+jGPMjf9}&c_{=2@SzVE$%c~afw-2GfDGVf;O$mpN`ByDh7*)&(` zf2q4tXQd8F?UyRoLnIn(yW661&wZxk>m zkzqMxEwatAuXOBkZVwtC92W9j$f%G3Azy@~1g{SMH26f&mqDAI@eaTJm2J1x$BZ@} zX(!doNlm7->zRzFTKM44$dH!~l$!wn9HFb4z)1>W*4-;P|9Z#v0 z?r_C>Ci{1*-|7pDiDn(^mel~Ox6gLocE^@vD`+2O_uG#<);m`REe;+XQZMvvXy341 zVcWu5gslo)9@0MeopX#sx39C>nz@XR+G%x>($)WkuadW`=em24yN!E*d%rt}XQn6C zQ^H%X%n_Be04;D$bylJ zBHDy^30)9$-&R>);w_q9_2Zy7lb@G*`tPHykET4y`Rra?wuA>C8>cKuotx4rad*PN zS0kPsfAZqd50AUXw0JrBZEE7p^ogGH{@bcfhVOy#oweLPIA}`f%!trzaoPPjM&{g@ z^L5UJxngo}kKUJWRDsO}Zx?(~;GcY#^VH6HIZBUc7nT+}ACI&~WD6|!jmR_MKZP`L z>@pfDKY2!Gb|dQFlzKF^M%v4?dFcf+R%PVLoRgW9`H8Ej>v3lD%xM`j(|e`WPHmGC zo17!XnR+-)$=u_f;480A*ZZ2+Ej&EDz?+VN&ay#4!TCbI4DAutJ^a&%a}l{COB02z zj3^W_FFYcASy+XzbD^z5{|%`TGB5Z7Hu9C@s(qQQv^B%nrfpDW`X+kTyCO5+rPoi- zlin%)S^A8OTtKovb5~~j%m*2tXUs`|oz_1sSDHJuc-o}2==A65|7OHxM!UNb7driI zl?5v2O!RM!S4I!>npxBO%lgvxuWg7ux8qMoGv`TXsi2`jTY}C7{Sov_P@SMu=Xz&T z=L<(q$7OpIS+)_@V)8q4bSnMToyuK*Hh)LoNpDr}W6x|)D^Cv3ZTAd!DfbcA*RGdD z!VNOL8HX~4WK_#2oKZPrTt-U9vdlrQ{_c66tHAQP(m*Z69_C{9aAzBjj687rSo4UP zW>&U(S`)2})^)3>ZK18O{jj~gBi_-|x!JkGS;x7~@zS2({=Mz2Ro?p3{LcK$ENCVe z6OA+2tMO_P<)LrAccJHmJEwa)aO81$Ge2{!cC~Sbd#-w#d(U{oe0_ZfdS4JT z+a_3@%(liv{S`YkQgba;xL>kc^()!-X38{lXkFh6?=kNm-V5F*-bAnI3-%T8ed258 z8|FLc%jTcwFQgn%TB!f2&DnALT7RL>FupJo%#~I}+j83#a*3mCIcx{4HddJR)VyIn zGefLa)=cXUYp*reYHY=u3B74dpCa3-+Z-lBxHqDeN?U z!7d6r$$A^(u2Ie$h#nti)-xUERVpM_8mo*A#tMF}Gmeu*cbbLF5c8=qja>X}_IiG% z3V$ng53SX<>Tq)K5$sCn>_3G;Z<{&7d}a0}LYirF*oWBH;;l_2vs%~Q#6HRXjJ(BN zbjL_X5&LO#xYpFSIrCY{>W^LCEq^=m?d^p2ABHDgOg){E-Cf_4$J5=_Fuh=M|M!RA zOn%wn*_@b(F}0rUc-bvJ;ltt7e(p)i3FDFNx?_oRg!2HDt7rRQ{>#3GSKn(Cvbx(# z2Mr2+7SS&I&|EL`^vruDZ{EDW=INX3P44UX(>N};Wa*DVp!MDcumCxhd;H~LB?kVEw;-2i9m$@zDMfwlvtGo_XteW~qoCtY`yhKC`xyHl_J8a*?X&Hgy{@gfRnyFFJfrU8H)V-` ztM9Hir+1|1m3yQ+5<{ERi`3IbtYF4zy zSr;t7mDgso-LP6)+sq5bIsF86E{fVidFr2o{ci3bNJjdc|FJ*D|BrtS_T1&0=5zQa zd2M*x`8?-`J4LZ@?>qIzA|LRs<9vVt$tf? zX6!N&jc7C43^(JAoA?^XjR){nQ}Y+|k{M^l0%vveAUjo;+4+?7iFJ6@W|yf7`*Js^ z7${3M#XB{by|A3@OSPa@;5T*{?@|q1gN*oXJr`N+k;Z1@wxO7zrb_;Mq0yWQ2fINE zj{Rzfk&QZm0_>4_*jI|-{f-^H3;HkYzq;7J9L%0>47;>L)L!a$R4}cfrXoglaQdVV zRRd?(XD`6s-B@Dozo^`}s^4d)FG*Jn&4?ubUd3o;^fm?<{qdyg8>Nj${Y#(8sZDp!9w*Qk{RSUMJ%(z@y5Qx z_QIT|A5s4Do^v(H7?-v*b#ZFPv_t7VGeg`zc{+QydRus#dUm^}XSh-uB(MJX_4}y_ z6W{iF+d84;`+A9YQubwh@7dsw)|RoaIEx&}NM)-p(rb8DyA#}s_mZ!q`c8jj9dPsx zJ`lP$yg;NDRW@p0X2{)0uciw(J zr~j1y2gR!lBJ2APdzX9Fc~EIFHliW8UPe_>cJr{=gjg%n%7%6DSC6)@GE6Pdby7GbQz$K~^%V<$^@TZXI{|2XAfrF!{ z^J!pop$4z3Q5%lGiQH76R^~g-uPtDwI+D`+5Gwo{s{_HpUQT~)!;)0RuFX@bfxTVq zb+lw(tt#4OwEwg}hcc9%?ox2~F*Tmrgp=yeWVc=^7nNi1_!}iBmS`i@7T;3w^GwTz z)bxgMKVV9P{;ji_aNZL5#qEXu1W7Y$EBW#Jb7WN7DvDl{j?Dy@lvRNz58fHnD5Ib+0exsGwhru!1*yUe<QY~jlj@*B=&@7O^1PW1p$lk;W z^$+OMiwc8l${eM&QdeoH^rR~BfbyRbkJj-hVd$dzYCGsK4J;f`FRSmVzH7#eUTuJW zSFdD@HFg-+@kcX^NYlwq=3{Vw)^L$YdTh3{u32HWdbWuyf6y0CKx07t?Qg0G*SONcP{{#OSe{272-xP0c zPpoT1X3-2ay;Rz^)M=?FQd^Qq8k^zHTzV1zuhk!m?Oqn27pwW$xN-(9P0MNS`4!TW%p2H(tr%igKM zaPz=GbY&a0>|EeDntW38^@8OIp+jT^=pCo^DI&(34sUKOmrr`ZEcIfl7Xa6Z@ zyqci5Yv8|pNv%#(Y_C)#-=WG_PXCO;f0<1Mmz*k)YOMLxBaVWHq<_ltz?IqfJOlCa zrT)JQl$6s$S?AS;@@X1!DZPfIv(Gj($S5KjuX>w0v%BCW51iH)ujL|DkkYduh1x6W zwDW}d_uwy70;|7MV_ijcQHec8>8{jL>MMQnhDu{iUMznF%xL_P0+UQTMk7c~1nsq0Y zTkrahW+SdOobwwiA!cv``e29ij(0?zE+lFWpgPsF$_OQ!a@gO^pV$Avch&d1Z>q0{uaU2g?`vOw-yGiwUpzYH zD}35s*qvHfpDO-({%`qvkbjE*kUz;^2Od9#y|E(^)u^2723K}a8>#iMWIY31Ya+M5 z;s*smzXt5JbfBiJ1O90hbaMgf$3DZ4YD0bQG^(rq(Ld@T#8kzRdWUfx&S*{*Wd-UJ z=jk`8;iyUUdjSus0rA;rJm0zID(dgInj6g3Xp3>^$QF3Pjj5L!jCEQEAKpN>zQaF` zG0&Sj&B@$R%v8)<;CMaNy)CiCx2a(tMNJm9@VtBQ>J2Y8p$asFYR7Z%(rBvwq+5*i z%c_K*_ZDj~gOz@Q&AzMbhT1x?$I+P+xi)&-Nrz zHjJyEq9NtPeNDdq5vx24`5Q*{s&pif^TS7}dVhiETs%PIDb%1CnjX$x0htVgijnUK%22|BIC<0LQde2B0a{V=K;c?^*oH ztI#4<2~~^2W7Y8vd#JPVMp9JiWzh~;&oFn%Ko7wN)V_{jt*fwW+lZ`AQ~9|fVBt*t zJ$_CM*iXa- zja;3oT6s01Zm|n9wn3815anbr`c>@c@8E4IdU-Ncp6$@2d8xejQwgcD&y|X0x{Zf_ zf~@NARJW{vU$@{NolwtFw|o+Nc9!=MzFUB;>p@1R3bJCU3Gm=GY}F~{7Pu&_b|#Md zm3VC}-tl3)%)jZ0kf?^heTAtQ%T$x7-M3R`Y@*}*Y9Zuj8QG>xYEs(6bHZ`=;G;MA zmJjhOe+3U+dG*CBUaeo(?bxLy*tY^^Cv%bc7uw>qxzAi-jxpPs70DIbh=~2{0KYK) zHSQ3_DP*Kdp-W1c+00b@xOsT?HH>o9iRLq+jr`R3mgcjan$a`*N@B&Yz~l!s{lA>s zdrS@L>A=ZC>FqUyGyl?0pe{N_s%FEqH1#!>;TgHA$6!wU(1Z9Ng12>eHtTsU16${~ z$I0p|pdY?wwLOUGD-el3#9uiEUN3^x{oK2R=LBa5xps-sKBx-zz6g4!Fei{gG&ebc z80LDw`w6o?<*!)Y^7{!H^;n>|1q^!_X)+#14>ZkiKJUlhc*HYtyl-Pu4)Hp{3|E-< z0N(ONo=##eA6(#|ABJ>>5`RPBt3u|ehG?iNUQcVxUbmY^xoYa~?z(uY*)uN8W~mPTee z^6d|Jic7Ip=di~Q$!2~e;`Ng~lAlQdpJop<|BWigpBPh4X32T=y zrN`hYci{X%YyO^31=%h9oELaH*TB1+Up))AN;g^Q273bCa}1gP8(JiC!drUc=E7U6 zhJRL_*egGO+jKcwE*r3YBI+E$Qnir>%$b z*BUIDbSiijI2-T?3`PIcj$>cdkPO|KJwEGy_ePVNO)JyVoQ&XP1s{OgS-unT8l?A5baWx ztbZi<_NW%Rs5sGnQDXflbW(ZrW_ze2U3t303(~!+Arugw>nr3!I(16Vvv0Xt4NoT@ z5>*1QI{5LSh<0E*%x))6qgp3pfdMDOa`gTerA^j;5 zHR+LEj5Qj1EOK{-XAht!mgC>anfzhQ{WTm>1WuBEOFiKM=>fWmC}<;i{S}EGiwyT+ z1zmyhdwfW-1LCPRL!zY*k952F25nkC5bKra^8l=lz`8%+oeB5E0F!V`PB^0#QrQ{% zUmKk$G|U5?ijys=$(2g1!GNaHwfg}wl@5hmcn-e*x7BJgYUt8(IA;r5}cL zjg+1!a`IYw(F}wOgny+MRX4m?>1^AH&sisWmjan|F_AtSqH&}bfb`Y8#4KJd0zBpi zXOi8i2t;4-I~dEFB>^wNtMn&-f!28iKBZ5^Qn*4+R!bK~Iccp6KdW!&SNvT*u-EhytNBVbplAtR`QXEHaF(1SlQ>m+hDl%L=3FfZ$L2?a zmtx%L0A$ktswUbz8++ClI0Lp&T@=vuH?Z690{)M1bOA;!43A0|zG`?B`FK_${1RNv z^3}gXDs~gyO6T#H$lB{boEr>o3n96mpPoRi z)9|45J-r71$Z6;;aG!Lu7OF|_sZvP2#y-ex;+ms)M2GRCt`qaefWc>I;&{4j1qHBG z0AJFDW{=_h4qw)UzD4oBTR1)g{d zH{A{B0$HE*&Xs<5awbu7G-HspUc97>cqJ%b8|~HU`@L4NiSm2EOXH{CwNN!zXIuQB|WaB zztC-PzB3TvNyo?`;IJO^N>8R{Je}2jU?;SaldaN$Dl11MnrkC79)dSdK`ZI3AB#2; z+az7w<>cEdxbFg5Pv|MUFTE{x1+9(+x^=w7s9|1zK8@CuU z51ifrS(5HXc>`E4#R<)tT&auQtsmIYD@gyIWM+&3j>BL{x;#n0*=b;JAb7~?byx}s z6YsAGb}kJc;|bht;aNyWZs|E!2(2fb=W@W;WxzmvXwjZL{gMFA#ZFxa*dpnQJb^jZ zaQzv)kOvLX5F62*$f_p3Rw&R&*OfSM@&cP+$NQ4#Q@YT9z++d5m*0T->tOW=>)ph< zv-;3T*UK#1uz{Ww?+xC9 zbT9hA=hMWa(nnRgxk&e)G5AcAi1wu)n{;Pc6&OuAJ<0znF&fQK7SAq?XvM@^%Onyy z%IgYRJrbKK8PYOX1o6sBgSmo8o7gMqL@C{hy98u%0JBUW_c0ldK)OfHVdkxH%weed zH!>mrbAkM?2=9@UYd|O(GD`=DUJ$QZPJhb(=CB!ApTbK{OG^Je$qGrgWARUVAn`vj zhvL?)b| z;vmpcpU&A(sg+y*M#2E z;p`$S{D)EE;C_oU@p*uv5O9=4f934EG_el$blK*aPVep(|eV-tQCM%JWnoBaP4@{fXgKFOK=;^>fC=!>tB(qde{ z6IlNhq|&2h=erunu~YvK$R{Ho(kE&iQZfO1@IAPeek#&md@U=K|IbBw1fAfnAK;P> zaQjB6m5Rq$66%?{oW}hPevtp|;0RK-3|u_WqR|rrcy(Ys&*1DW$U-#mv}PUc$?0wa z;}z6WzP+w@={eJX&lu&Irf#!tI%|gP4`~)W%Td`XqkEM{{%P!g)=>JW{q<<;y1k3@ zrK6%v*N^#bx^uWUdv5rr=%=mY_NtB^_KQ|d^ERHVoO9lQU0I`cij)W02WMZ4+^MZ!#p0)M|Lz54j$JetZeupHl_# z8a=oMjL*Psz0!(N8FPr*il$^XyOR5S#ZJ~l@Kqhk%l{h^0i8OLu^U5dHjb0rt+6-B z$j~_`lCBkmi#ihdPUQ6?)fKgQt_6E3Q@DEsd!^zt$^U^;9ehi7hN8L~i8+U~o<#~J zwm*k%`d>?D0T)&F_VKwfb7ue%I|)(IwPS5XRBXlWHL&AvtzD?t-HL^XfgP*3sEA_6 zuAM6ec4DB!#J%tLjIZ+{gyG(Ep7X@-$?E~V>JiVAsS^=%*0=Hbf}4LIA*UCyvsaPU zNBq?i&`)k6Mp;rxv{F2>TMPcG#QA@7uO=AeSc|jvgbzQ#Z}Dh}f6)oA`6|%H+Q!;mi!&!E`Q==6i(NJO z5GDB_ZI&0&{V~T}(h_EQZ%$X2DB02hlWHo*?>otHO1#>StiXJ8Ve>@w3Uag>l)jdz ziZ2~@o}9sBrgz+9zDEOfp>h@->SVCEzE(8q~jM1rfE zvF92{WMgR6m2=%iyhCIJD791x^Z^f1PNLgF(Qzk;Xbd5G_?Encq<%;C_YwE-RZd`iDuI`pqcQKo{l}DG zssi_r6Q|!E?9>)Km5lKmz0n$_O z@cze@4Y>sT`5Tg7i=9{E?w2{+cA%Kb_y-Hn!ruI}8nP#*x?F)T3dk4ngz{m_+L28W za~QS}M>~PvxlXE0_G$sApBrhoLcGh6R?F3h$t5#Ypo$VLCriUkmvn!Zx6|S9aAoN2 zrH#sBbE;*I7N)hc98+J)Eu`wEtA^7!YI-k?QVLKHP*)4lc3AEbJ&&RbBNoe7Remdt zk*_I-&C9h1)Eh0fmeIzTQUwKel zC#%QU&qu81Fu35IJf3Q*8tgO){y0G#ClDlG0nNJvODd*M#vrrP!E2ACf#ixxk_Aj4 z-;y6b>cvTB!v&fW2i{*p{@+S2GC^V@9+iGQ+2sgjr!2{PnOyZ0y|)!!98Q+xB3b6e z?BF-__gW$i|6o01h*u0i7Y!nxW>O7oWpj9aDX)v@^T9*{&JqWIOMGw}I>=jjgROYX z-uJVIsjTs>+zie21}gcI)xAYGenT)%UZg1qU3niny%Q?mFy8mv<_a;MbaJ0@xv$D^JG`CGqo?$m@1uHRaKoH?S;1 z$GpTo41`AUoYO_wj|!L+EXoyZ&U?;(Em$-Hts6uA#%`{-7XDp89HBc`{3M5<;Z_n2 zDxqA%5;o<`dSDA)$o|McJUF#wmt#vXvD(=w%k1-W0zeUarV> z@=_a7j=H}+AdKe7OcU(HAo#iucWBLDO~W2ORdP{((uCT#Lh21{V0n<1;7>2A0m9W< z>MQuaGHbsG&7MM$k=U7gaDEJTZ-zbl`Y&UuJDs+grEYEJynBva8=r?j6 ztdpqv@l(?HNi?g71Ct6b(t-x9!>P>!4V_{A%b@)`DAg2SyfL!>UG5B~`h<49h~8)o zM)3yoyWm%Psi3xaD&%^s_-hb$C(eB`QSAUQ&<5;dV*-avz*cfPoZQEG;tu*DUK})Lo190`Glc`WVGKu>@W#ko+kUk$^Oq!h-k4*`43qU zd4V{n`#_dJBz@ufd7M@|*7J;A4&AXMMMz?rUBz z(Ko`!7asa%^xg<8gm@lCEA(pw=vO=)?KN7aEV`j5lbj|%hv{g5KJaI0_|3*kJVjDu zZ1SVkYQmdC&<4kmqQ`LIYG@;-i-qFR&P5;XK$rhbeTp~U+gPdxHc{VsiVDyBOlsPI z9~r2oK&`^cHgx=B^5;j%^3_99^Fo7IG}>tVrXKPV=`3|QbB#)dL%*wU(-2Z6a|P%(_1Q*E(`}}Njw2^IlluDs z)bsS_e=$5eq7bNW2KT&-WO&0ho6rwQ>HvBirciPE-6CrlmPhnPEw)5}t(IAK&^PzN zQbcQ`MQRD!9nG%gwbr%vv(B?_w8mQ3Q61dPTFUxP+og@t>M<>-pcbSx)#hnuG_y6Y z)x&y)pPRHrR1R-3*JPT`b}F{|GUuo^odh~{I4h9V!tmz}_+kp@DuXCjGF#Ll?KAbH zPAQGPiS5P=V;HzB9PD4+$VtCws{UEm@FGg_|4?@|S|=*eyo~Ss<{4cR@8}0?X2cp2 zl}%IVHR>hGi2upT@rDG$*_CwPg8+6H(tmP#p;>cG0DU_)PH zMMV{L6nhg{^d;C7W)`7^LP1IS(3_z|6?URUAMoy{*tvaZ=-;p?ySbN`l02LUTupbh zxE4{N`Dj-0tiB~g==!54%MlS3G3LDPO0->6_8ca+@?G-c=at!OJ>F4}O!iH(RkPVu zI3Kg9P(6!3k(V8f0s}20wmcfW+=Yl!C=%O*JC4LcZb7#_hKk}jt&KP#k?jj~NAg5n zffJn34sCIXBzH^f-5OBJ7HT4+`Mg}6uSPJvX)RveTeUbHSa-}dENkc?D6X~F#%YVS z`S9#4xcI9!zdd|2+CV>ubBOabItKTa|^e(PG zbhzKQ_qW&K0c0M5%(Y+Vq(VJ-$ z!JdhpL0${Io_P7^sGGw#$7Qb?UJE>rd)%?zu*PYVsJaeOM=2lB35U?wCE$fUSfUHy zGjFAr9! z)&N@#TNPUY+b8R8YgcO;I?GFop~u*6zDM^+BHdfbRC1l+`(5T))FYdj`O}w*!6f1^ zva%7p{0fd8LXDk5W%gmyI;Q`QqB^$@`qql)_|y2v1n7OnRQj;LQ61Z#4i<;&rRxzN zX8J`2={xjqdP8G@anbl}xOjauZu0*5Xs9Cl`yk6mV^`!fU1_eaS3jy{&Ew7MS^sJCSw2qD>9W_nj;_%G=Jw_$=7#1_ zzV@ZIK7xHMHLsry`xs5uGeZAhD^jBKSFzKqadAC|sWjY)g z1CiZx64hx4CYggpeL%eGGI~5vIY*47D7IxR6_nqpB)q|%j+$0etvrRD%%DoU6VuCIl#ZbZ*pXB^ZpIL&O2&6Q0_SX@ z;%YwCa3iR|71lNY9lj4l)qvc2D!QUB5ytZP^#RP048;nDs&)8(FcsUwv5V9Bm`xwW z0V?a?s7}?3v-36kQCVm*Kc~WVFfxjGClWD`u7|eN$W{j9o77Y) z-QuZbi$TL5g$6mf{vOq49!uSGYs(&{)}6QXw5(!6okf`>eKoe~39crt9I%Z#XWV!xg?nVwN#uQ~# z)Ymz6`||8&SpzcfWjxCmk-0Rhs6E}`aOE)NmR~Bp%wsJ1k<_l5k2Z&1kVp7=&F~yF z?BG=Os(G*$Wc%bX+G|&iG2VB*Q@j^=E8ZP*9PkS8O7>jkIfswao?krcc<~OevtBp6 zu6QMQE%)l>mB;If=Lk;^&-EU;J)&&>%=j8<4YJ16>5>UorxC%IBcgXB(;JAW>Qfv>fS@i zDIAmhv5@&dh_%%h>U48n%R=TmwnM9b)q<>ztWB&nt%clE758hKwLRK7X1Hk9vh)KF zwNAFqvQDJuwFxN8uHDjNz*9}J4XKum^tokIliHQu!3209fL@lJU{^6q`wDn?BG%ML zzC-ojASwvGq?@LxbQ_$dBc&ozdRsrBuhpm1$u?i#qMy*OGe;#|cTh-ar^f%H9!1@M z6+NeJxGZ`}y&E`GHU=RF9jIfkN}b7VDF;?wJS|N;=`)aewo=@03Z6j#{?~J*I*8~F z)wA8rbEuk)HE-l&6Mai-&`-muy6*=!E;nzd>pjt3TYH-Cwwh;9$!{~?q_=u82)ZLP z8nf{ClZn|*0^4i{b!?F;GgEseRnjG>VQ-H1nZUjl(((D#RFbGx0GiujG7&+};FM>% zt0cFZo?=&i2MIrt{s(?osC>jj?+t2O4Bcv}?}!Jl0uhM{mi?gnZ%Sh_KY?^%9z`Q% zo4qUrEVAV`9R-!mA3+tviF|mgY3%YTU32L~`HP^RMxm>=A-&;9^hd5T0nZ=}bT*Xy zup-|lt~Q%_cD`h)~0mhpb-JJd-5?F+p!gE z;-mw3iRpnUj}%N)Zw^_eWMck@sF5BFGOQ;x;pbv5@qMX0S9~vr5DQZ23)x6*{70r! zHllld1r}i~Cot7Kn*aOJZ+4vZ&UGWB?bJF4VPpO=ds`Y?M$pwf%2L~s#*+(bnp3E( zZ-tfohq&8Ze6cx1)-Hi<8-uDYFyq96e#)c^Xdn7(FmxTI#;Jxn*IdA|k3O%Q+J0j2 z$JCn2I&{rsy${n>7CO&4d$>yL#f(6cmvmjK0oKdS41?vShQ>>Js2?KK^Hoh$SMrbqG@ z^#M~b@_RJ%)V!K_DPEmC`+9V-b+gXboR-s|zFt~&YbRTbN1A8F95uc3=RB3Oj88A0 zFrTcP!*d?>{*)tsj&QGd&sLre=DhyR#Mk~FRXu!|8kK50XIp5iZ+nK8aWbXAuuNxm zNR+v_IUZenh4@lD`{*XcnVutMWA$sU#;zC6WL~LGPo_ou>Dupl>+;Y|`gPYJ*HdR@ z=SW8^GoE^8o3o#0rDWyG9-OV(FEL|hpEJreh_2WfMk0t|FWsIMjQ4sRa~H$)VMt@T zJ_2-c#uOv*EEHv#+6xbE8NIO;ncG@Kdv4ij8P56TvV7!86nQzzx0YerN9LlPW!}XA zTMY9_p3_mBXq#*+Y};=Qv8FI5rh@j8`3fy8UX~Q3aV`Ac)?Ae5R?Nfid5Is?6CeB@ zQC?xglcYb%?;NA+G1ZuE1RDS9Q}w#KC!K@O!9v-tqV&(M(Erh2;fp=glfg=J^)Ox2 zkGdwgdb#?$7P{h@3=ypF0~;q85(ij-9jmP_ zQGYUX=|6KTv|lQyu!Z)gHb)yvZ)!g6mF0wGxuqXHXFl{Ln)vL;_l?05<1Di|r$O{i zW+4GxsN6rpMCGdL3$7Xp4*E>IWI44i>3AXQ(QQ+a(dKmaRgy|eo>B@=;pk5$F%#QA z$na&p>`Pvsb*Ju2@6!-EpSl@A`0Cg6SoEZ-pLA_?U3XR159@V|SH>aJZfU1HiaxET zXvF{25_C+KLGqSkw|nDBj>2y|qc$_=WByID*2DVVI@0!o$(7SRT6w&%wX&VC7PU^% zE?NAU&R3WI+9L2;ah@hp-rT`Fl8ojEavOK)qbsUj$4|49CrF_)!i7GZNdHj=T_v;e zJ34?po3h$^MjeoAMWeXk1Bm#kXXpz4w69UXD9lF%BbdE(C92TVm}VR@GL2?*4B1Ts z=&Wdk|M#7!O;TevKQYP&P^xpe0we8Hk- zX8bzH=hgsSMd4NM2W_oD(N25x1YZ+cmRS>2(RJx;< z1SPKmA@?B`5lnt>0r|!!Aiqb**>|HW{a6#oYbD5SiSd?TtyS^klZY`V$yxNr6)}Yx z^O{D^)qvdmS`Qc;+o5nVNtb;+F&i7 zd8K2mFReY8rBk12Ft?bnmgq6s!`ow>t)y+cwX}7cRzf>sY00Fa?RW*%;1NGQ0+>sZ zNpI$Pba+3o;S&7i1!TAvNZE7|Jj5@_011rHTk185F?H65g9sKdonop!nb#tH4fEF4 z^Rpg$CEZ)MyMDUfxNf<2xaPUWxmLQ)xxDoD`a1nRGuSQ}ZB3V%rMQB;M=9cTbCBW< zAS zEGzM~5#8A#yu|0)rivhZo9P>P{)Dj$uY4ojR|kx9V4FOq_B?av6_~yU*_i|~Jf(;f zZX%}oQT8H!-3=a3z@tdR_7wnak7j^B?AL_-Y_BISt)81y1{e-oyHI zyqe7qi5E?P=e^ZCL|*z6Hw+*nBI>^`let?&R3(fEi7a2IW23#4iASQDRv5KFYA={) z^`5yTt+4`T@XSH_%PWH+j??W_fWIk9&(3#hR@Wi-<&c!RcpzVx`v-cl@~7oNrq^1o1=|@l0C-EF zrn;tFCc|(TK6D(0;XB6D$5j>7BD&+nQ*BeJyFE*}TH z)XF3p>w(S*C8M((|0aO7|cAIoTgs%nBO#IG7F`u)PQIGlx1!~ zIc(en5aeg6E_po{HY!!=LpOIgn!6SFAxF$CM%1MhQI}w?8u8t{Onvuf=6ids zuQo^PNlbYJ-Vl$nhY%pxDiAc)%BO@ z{TuoJ+TFq=mNe5#e6mx-7)Bted5Qd90SB)!<{6VfKhuev>;nm<8Qwfmrvq`LXn5)@ zJ+1rL+gjvy2fF`(Nv02~4}Ca^?5i|qv4Lzz3K&8`-s&R3y@_v)LynV?;sESV2p)Jj z;tLvh{ywNZj;Q{6v{XF$}PhjY%u(|eHRHCV7ISg2-Dy%HF`GuA7Ti05pg&$I9nCxPahaTbA6Q7T>n zdHLhvbil41<*F{^sxdjKg+y6Jh37HiL<$~WPyChZ7Ny(tjZzebAym$p1_t5|oq7&ujQiJS+G)Hc5q6 z)zQ_>$;mV%2PK}7@&=BaPkziy{nI35x*!!gPP)8Hz(s>u?ICIc$`KtFIj#)Wn4eWP zK)x!FmHI}0_qIE8beeq3YuQYcxfIu}O(c9G6ul3XgNThZLZ^oCwJsGP3c1+LoK!FB z8%0ltA2FP2M14b9S6#A9!=b=7Vp+?P>;B}Ns*p#O@wXlk#T<(SzaT0z89iQ=DI7c^ z07T?689c$I1RlAF&0KNEn;Q^iUW?qG$3lr`Mr}jNBG6&txtmjnIE((cXb{9WGTiOS z9*y94(L}QBaw8%-ACy|4xAR0P3s9fr>z-@y42?RP_`iev&~oxc1&OS_Ko^T=>3YEZ zW%*f8xUeJpr~n;)p#N8~;z8sJI}#z6s2n&4x=v*Mo8S;Jv1kJP(-iIz9f0X{0A2z; zSdg3q=85zpZu?WNPSwwTvQn8mQ=vGof>cx8Be%T{T{jF0mQhsYJv!I`Ya~l z+#)0Jg1p9VvR>_=?q_saUp%Y(^sp@?s@03m!+KDw7pI$qO)rE_9|MI%H->l$@CE24 zp2D}3I;9Y-&`&9a744xfRdn;FkfErL_P#9VBF^(C8g~sR9n0OK$@z>2FNS~{3vp(j z$yco7&cCB`MSoki#K26hR|TJNGG4%0yjdHxY69K*pugL}S0ZCA`V5|uuYL^Qe#A29 z*o6Rib|O;zg$kWIX#dW{#fGQ@&_1o*u`wrSCh{MQ1Tj0 zSjl|y-pTN*=r}q`c5yM*u0EAd*+}{!xW73T%>o+rB~Cm-T17XkAvJ(s_QLyLSci+V z7PaSgDqS9t*?Qv6sTL)IQJj~^On*TR#FHskA=Nv%gLtBsc;4#}&hyvPm?N>Vk#OKF zemWSrt0|X2!{o=}iVj-4BxZNrgW8MGBaz_Yt@Ml@MeC$MKQH1jwXwmGXbkc6+>>N% zPr~1#YWEYe8Hf}O!~*WYc79_Hl`s9tdBKLC`2Q)+Xd4-;L@F)Pz-prQLWY}M{O=ag z#QFSX6YQ@^c}k9UEqNO8qB6LdUBtG~C9lVEpY$a^;da7AU;&_e{h9LrstrOB>rMO(|SbL^JU~d zCpKO@YdajuiYK65<$Nl$hHca&h-p69)B=fopbRj_TVu@6Z|-EwGD1Dt&mzV5-fWx^pRScB+w-vmVtLYced#1yLR{Mc1R zcXfg2R0*etpf~kg{do0;6FZ}I#EgkR-j|0C&}?>ekw{V$JDkXVXQ0Uv*ynM6wun8) zve&!3=MDX5xjBul;F0xcZU-LFK+y6b>J~G=u0dFYl1%OK#zMR&T6~u{Wc=^eaVjaFbC-|Ty_9zcg9|+(tE7-b?R_WGDqzWbC2>7*Y5*I z?jRn1hSgk!{vY8;|W}oMO5)OtZD;yC0BFS zFZ$nlaZZ!mwHHUoH7;zOJIWGL`&62>$2-I5&y@v}AN!64vnpSx@oLge_6k zO!Bb%iTn*kgLI)4wag+@_(rV@nmy>4C$LxXH0@dJU;*4DqD#-P8=|wY5IU$0dGKk(uE$|z>cbfs*rl~lw+(zM z`ez#;hh;ch@l-D-l5emU5dm+DjLijg+`vv{z(Fc@-UZEWAvYJ<<40ca@B}X42a9f; zWcNoRXSfsD6whEBg_fv?#j_#bzvd%|&!WGuIQOhg4^Cqu#eeedKO0F!MMZX`kO%mH#(#$0f5jTIv7*JGb!TKC5=tjiaa0IzTHvi> z=mH05;4r(dgl1okmU{w<4#)mC!uu%)I?W>$l72(FgFyv#>6U0mo^%#E^>1|Q1El<| z^a+iY5BUv6cg=^Z9-((sPNWW)c`uQ24P4ZonEQFvL<}s1skhC{wW!H|s~#c_R-Nj! zJy`clPOJ+uXU8WL6Rb|rU;mVzippGd1~k}%O-{g~9pEMU<)W~jJJC>4+;b@QJ2w^J zYmms2Ak_cJ^V}e^n1ekGX70sfVlFdTS1EkIC0Mx~aN8oJaU3-158WE0w_AWsM&lh$ z21$%STQr20@35ZYIrb0H3}QBlC-jdXzjzuOk%Y`{MW#c^X6=Ss3^d;uuv2-kd~T># z3V(hb^$uB*M7^{R8gD3aB%a+Ydc@Dc$3>{z_=9_iUi*n4+b*o35>bs?AdfI8VWPYD z2l`X^*keFM$Fby(S;-SPY9;TG$keSw(q?jETags;L_`nh)dGt323K}R-}VDx_Jmg( zz)kJIv(a#-PL*spQnLd}L_vc#N=Y>SOAy{+=(-v!Eh?lk(62$*1#cwcDSmh~F~;9n z(HU%NB+|VOyy^`$7Eiza4~{bXaixZ+mM&? z2Sw!pm6yc}8U}{Rlv;4Aw~6^yWo`4J@dfPDRdl-Ou@JKy8e);fq=g?`H6{K0sYOvR)wG;%<@Nc z)>-WQDkwCAY>k)-kw&zp4Qo3HcK#{nM=C^Z+j4BeWUf;St&zf-r*U2lupTCG_(Amf z9_aQ%DnfKR0@|xkUG|G;b;KviQvls)0iX`IFdd~z>V(httQC+Fcb=A(1Jf}u;& zeNcjP(A4)-ON*&%1K3v`w;lNx{j?aVX@dlR0|{>+LN}f3ML^+pZvXThlfY8lb0fXb zwL>{KJH29JlI3OOuM~E9AYR&BES;E)S09_16U$r*Em4|P%g9x%<{w8Ick4$9|PY`}RUd@5IJEK<-|+EuuG+ZG_h= zp7=Wr|L+zx=Kpa1{a9~Pblo3F;2V&Lw|pF&5Qe_AF z*qw$(tO?%=j-HPU&vIAE_Jkvp7NX%xn4VRU$$h7pcWgI1$rrun`v@{z zcgRb(C6e(O>pBb#{hgIvLf-!ZoAkwFa*V1~{CO4QszRsy14_%!DfWg-#aya&_zRQRe?Mer zF!*32oe!r#9C7@1CP*O^%dB(yV$R8RXtN4zJ`io$inFi9M=*M`9J)`!o_J8<)g4*A z4(|rztu8_i67e*W_&OO4Q?}`>W^tG(S1V$>rwyYtf5e={2fG6;nUrk74c{U|YIe z|6r1TSvrB(_?Ac*1UzeCtIF|BkjnovAfc`W#;5Rsi^Y?zoN zI2)b651aiCEK{2Z*nX--oVcP{+&zV=v;-{S04#786chH^#ZLMoGhgB3(_}I)!_g8b zauDd@htvRT^-Qk7T@vx&1F0ix&V2Uz%$3WjKBq=^6xQG;KE+aat_HgFJ)YPpxbzNL zqGJ4PHS%sICfka8P6h4lXZ06&i5?P>M;nDME~{u@kez5aANdw>iYQ*2Sk*NwXf-%% zKbpcH%oXd7BK&mw8;j|t$gNz%SF1^EAdwRYM;rK&UHpf7!O^C!c*^NauGRO zicSecD)wR%q&Sw)!cS@)Y!5hSh8c&nxmL_Am59cks7}zWWlb$RG!z6Qd{rJ|BfXOOb3) zt1A{i5}h~`>7Iulv5V{Mgp%{nu#2%8Tj8T^d=~w68~FKbctK1@XvLkHf_x{sIZez4 z5tC*`zVj@&^FC|z00)-^Rr_HR{P-;GlL$cS$_1Oi<2M(Bf)5fO+VkB&>*df<?ORxAyj@s95Tpio!#G>P3E<_@VyLpl|j z`N2gcm=f~E9cS4NcTQkGO?kJNqSOd(3&K*B=jzkoy4&ctbTG3OYSsmDwsoJmCo88! z6Eu*{dQ-U4IjFe{N{Y^yGtmD(eB}(RjS5C82?808rCvhRWhyp10u4JJTw0so{a}{| zp?+^@T^6KJ6pif1+AF~uVro_&sNI*}ipcCjx7W53UI}MsUHIu>_ix2Sj$Z6koJ$XW zI)puoj)D#F&UXAf!8Z|DoI$*A3>e@j>oY)Y72x17^nExQzB$^!m($2*4aA$(t%m5H^9F1HBiD)OVZKt{rvi>Vhcpw=^fa+-6C;vJ*8ikKrMqMgDX z_2m9ycFQ5?^#t9RhiF1k@QUWTNd049> z=(?-i@eBIB8hT(LXs82wD2P0YzN@pG#&qu207PCJTU43Y$v5=U8E{MzpT(4Fjh(ck zx_>(Rjc4Byav~-GHwPWogIhiDy{|#R@o+_9x82m-5jKH0i$Rx~$bjhSX$-y_i%mMi zo_??^8M|m^9d@X33kq$87UG%pqI;nRQlxS%8#}B7MiN(O&xy_Bl!T1Oux=4yI0=o` z6K$Krl?QPDD(*OJ0H4K7u-~x?1L4o5tnL*1EdXCmN3Z@%b)ie~z!&hvBM73}H!rsB zC!H5p(6sZ>pAFFl1`>9KJN%l-BDyV?!BdgMFxDY!NpMHHTYHp)LmR;FRpHY#BsP@@UoL&%_w9hC;< z2D8>sKG%bIw>Tj<70G|Kk)(m2XLI_%|3rJ}c^3;J;j`+HlcZeBv@o3!fScv|__CyY625VlyZ?AKu=UnRnpVPRH zm^0&&Eo4)K4<{xgnUO;sKjjVYd~O8B@A_+rSO1TgW?835ix`C4`?zJ-5Ck@ z2pugZ_+5s|7toq(IWaM(x)%7w4{0d`-G4ul#)g4G=a6f=j?ot`;KVT)!6MQUK@zu9VbtI030_6 zUMLC$A97CX+5ZsqMqTWc$YW4E4Hov`e_`mqgT1-zo2wz`B_r2ooza}}ugm7X}I6-77zvAzo;GGjeg0+yRqM(xE z(6fenT_LQb8PYO@Qx}=L73?UH)&I&%iV2v-SXF7(AardYA2zJcUF0C1J4b^bMxddE zH;a7Z+J=!wM=9`k~58BjRK=iWO57-} zG>3EA$a>=0*}tqQ6%NSeymCXKVpwz0S?c5F-Bh^gg`0bl(WFb@o9Wz1psPvn(R|i% zoWK9f9<01Xto$ufEG9KQLPC`RWiEEC|OKoYZUf5sSq1LH?Se ziGRJsxz^)^>)`hXyRk+P6c+iIiJZ<>?z@eZZ0EZzd=*+{2Ul6|UeOV_`wa3eQ06B0 zPiKM-Yr=yiutp`|#)3$Bb?z4q%J?-ea1-xb2<7I05@Ouf+QB^pJ!fIhI&%6bDP7vOYSrihMfGgjqvf!%lcP)&MbS7~oTR9wy=aP1CaOc*uHAfb zzip>ho!fS5+L6cgO-(>$@e# z9deUAC7($)u@f($7>1!3FUiHb&(ZQ0xk3(-bz}jVPnMHyWH&iL_LBWL4v;NmEtyCD zA!Ep&q%&zkT96L78bU^p0i+LUPa2UbB$~vK3ZxF6bR>h(auwM}{v#*x?kc=H553OC z=WO&pk1WLZQnHbpDWUHS*^GPB(EkFo-A;~^%b?~4-abgSk{zJp067GD_K=;RW*^SI zCBOFk->+SGvI}hv;@piM{zY#q@aA!H6;gNt3Ead;hwCZj;_pEw8L-Vjhe2)y>guOVb8uDb$HO-L(z4*;fSLM{i$MQG~@c>vko0Jfij zlRKbhKTxy`@>`6N_d`0zK&6VFgSb9~t1b9_5lFaK(soA)W{%;VgLrxkyxhhcYe3ad zP&gWBU5#E;{HvNg1N(UhzV?un=;tVUxl1mP6Zrif?y9oAkK-BcUc`vYOZc7%eXc8! z^k-Od3Q2>NrUPA%OU6I+fAV?)P27a#-76VErQ!<4TmjikEU}U8C8J*hpEtqBHfVn~ zq^4TXGU)pd#=8SasM@@YH+SLw2*__Z-d~DdRGXa+URFRVvmxmL;BHijb!;i&?hxKM zM$Q8X2_%(#g zp_gGmz)0}$FC@7SzT^hRxeS@^K#vQ7_E9B>8CZgtzTj;V_@0Z;A-K~W+>XM#i_vx) z`aFbl7kZyV#-ZgvXt_U7*Bh-yqt#rR^{POB0VVF@ArB%G8drAQf48vd~@##AkN z9Qybd7@3Q!A-JbfG8XjD$7c^xk5nf0NlVfR{nR4WF>Y^+x(ISm5pf*6Y=!)GLmuye zEY)kJ!)wuu1K#`&u%*iLE+n-9nwW!87Ng(kWGb%KL+Yx>+yQy2Hmf50Hmvvv?reb0 zPC?4|;0ZQ?tI3eDD*IhP!FjZL06S6fdJ|(j#=BQB!d_6c2b3Jesd~OW=;>U^=#SCv zDrnsax))*m{rL5v#K(REy~*%7UQo;dO)_xhB`ibZ+75ocf+lsO`{>~^5V{XYRK2De zFJ2&meTO~$fIa;HYQMmX-v>RHFy?*o2_DTu0^qCTafC3&k_h(^&yRz?-9Xk&#M7^k zQX<|?Ck2SM>gWt3!sCZBaq#%D_~scaMtKf79tB66z~doU!Ml>kk%7^3@SYLzAP#MH zj2eNTfV)HB^&q&v4~u$)-zPx%VT^hRx>DoVb;O$t@RyFUf1v;GX!iiJK8p9&Lq~If ziEXgsH;_^)JaQVwalzEw;OZr~S7p5&J?=w~+tK50aHaaRCwSu*xbS02gZelorX)KE z1Z4z>@Pb1QS2SdyN}Og`ToJ|viK|a2+$lyD@g4jlcV|YDV(5#1~wJY~SN~ z8jfT2z>^;$a3oU&SK)ZZfSX`k#UesSF_oEm zOk=cDpZS9KIHqFB6$f8c47q#)S85jY2 zR~RCmMs6){$9$%rbI9Q0od8+igO?gnOd0y_tR=mWUgi(@Cy zbPR}l0{yBnO7$ggfl@V-yauVMlDmo)YPNC;tfh9>B>_*KsF5qexj_r`;YQ)jW@X3pD z?+SU1@$Y~d)yo`$4etYud+_U2$w-eN#q+qo3;uC0z7OL0R1S6e-A9#Wm$?zCnh27pVFKX{gwtO6<~&mNIO@4{c+B`6zr#z@Qzm z&3AL@nI+EAcR@7x6&qE?9pM#t($V3GB-cl=w3SJk#L1Jp5A} z`VB_!Dpu7oBJint+6Yjr#sC#Kn(zy4Ve@t1UrGVBp?FdY9%wK;QaAVpBkYSX0iZpugc|j&IM7)N6hz~Q zfuHceU%!InZ$OW#m%9i1`2d-v!$Tzl2MHt*GW-sme#NguXe$**BJTf$uGJ@rXs7zZ zXiyda8FA=UrNs}?k%MHya2?DD@ZUM;<0&HDK4b@KcJ%<`xZ(4|ODI%*SShqL;4L+> zE9f;3{U;!Hrz1AVuu)awVI}c72csu}lAri|1B{%3cT)4U%dn}05=vj;?)4JR9+jX- z%{SF~#vx=ZTVYkVU?n-go11XZTog1GQ!;)eG*b@T1OY94i3HvM7Yzky+6GCe{!X1e zzk${N&kj`|n1Z`MaDIk7ufj&v%yBnPb*`X(Z^4zC52-Wm8}OGd5)1uS#yCFUx-$H8 z9C$Z^il)F{UECERwerwteSDUIjyo`Y;jufG`270Nx*FrkV~*Jrt!tE^%@=r%1N9O3 z6$Wn9jHV)5HUUan0$UAmQ~{DaB^pcz=P^um+*4y=bD*g;uIrZct42&!170FPIx2eo zAPv=?5`h>sZWlswY7V4Yl@aoa2PLX*WI}L{Fm8CK?~sNn{o^Gv_z#@FDv24{B_7KK z`Ky^&0$Tnr%TO}|7VpZiMg^WA6ywICS2Z@p0VnDkpFqKn60P5a|5Ej>W*HfHLIZhf z7848v$rwRJzZz>)G^z9y;N9!c!X89}o1jF+aArwt(&G&~P?n5-tawjFAcK3skY)W6 zi&SUwzUVs|`cPwWbx`C7ZrzBK>Ck;Te2q{Nzg5dp;WMnqiIhX-j5TH7(5nc>J#Iz#iS@2LXn8^d>~UZFIuo1tAZAfO@cwnP3f zl$pTHW#%x`nITNq5>zw>!c?!+1m7*twk|Xs171~s5?jKj>WfvXqHw6bB^E~{B9fXB z=YqooU?vqB@(|Vgs}W1V@&9uqRZnV;Nr3-Ia8bVmjj9h+eQ--q(I5182aUC01?`w# z@Nj*YPN1eXuo@06`2cF0>S}?F64a99WOP@|}tb*s(*ngJ^)p}E|{e*MmBT|SKEJw|*&LFQ_jh5;h@h+&k0uQgo&t%Ye5^+wgV6Mgp z_wb&b@X)mC0crz<^`O~M;8M*HLZDweEF~Lp;R@un9g*S@dN>A}R+L1LjgaVCXp&)O zkQ8dXT**_(9q+j-zosj(;hdRm!oFahGGXi@HjxeBqPSFc2>Tou9?iU9sl$R=|Stf_s%-&)@fKUj70$M=*af$H*Bv4`q5nFQf(16LXm_qyh7QY00i&d$FgPTO^YnNLQqt z)FG-qRhLSn6#6Hu#*cm_m+~r}1@dt!8Wo_$)Mj~t_oTPF(t~cptYHh;v#f!g&-7%@ zGb`BHTqV8>|AVW*9b~VtE4lA{toTOUBR&)!^OgB>{0x2@^H(82UP?@x) z%(6r7UP9{xQk^zZmy{ZmA2jin++fzS*=#%ZArWZ15SbBnxT4zj0U zi<^PlrF0@a0J-}GW-cq^?kXmdbOS0MlFv+i_6B^lYTJd-%P8g&Q;O}+{$z%brqp2h zlb2HV(!1D?{2v0(Z)Doh-Ki>cH)aCYm7l}y07B#FRdfq@hiYUGy_;S^Ol&W15BG@e z$OMzybQjW+NryksFjdHT`ZgViT6j0q2LFP8nZSHu5}2ikR|aG;PE`OZ zy0ZCvM=@Xco8Q8=Wd6mf&~v&kU4dRq?F6U(e$PntLQjc0g%f!nJW!tiO%wNntl1DG1U(lG9Go9FY=t97( zZz^+#8N^H`OX)#$W3rby#-3(RGOb7(x;|Z&Y-94+6Wl~@0&68Z=?By*>Kyfkx=hUh zu1`_*;d?s3?-S%Ay?~RWbU*5-QmE9Vk(V-Cm|^4^)mAwqOG*byPaZP{?jSdvyUH$O z%8<9zXJwrd4xP3~+!#t`(3hz_R9B#I9OGiF%t2_b2JxXkDKF$v@+&z-X+h5jc(Nu;0-{A#RO%yO5hsw5k6;eNJ6~ZAF*}(v%umJ*yzW8XRs`>^M?UF7Y}!dD zP=8aSsVCGZ`Zp5C6f-M9w;x-B=}l5$_ghJSMrMYw>)2~-4%>>`!M)}VbADWPwk>lA z^52VmAqz7=iL9jC(L)iH>~s}GxE07v8ZsL&_BhP)2a!V9>Sx*q@$w9jm>H1SA~uut z<5=!7JCJ>kYaX-tcq*D6PWm$MnTHs&2eX-}$$Ht1+!Jmb zx00>J{73htPAUn?ONv5fI{+=3K|^WGEcQFNy~ws_7)s!fO zQzC{-1k{8GM+<340^Urv{!l(h;)4TUV{Qhz{l zT_K14^irTWjVXf+A&!k^o3TULIf%KT><;ALuYsXZSYsgW%tDsLAd^{wnb981mfkbp zVfCYd(|cSDZ|CZ8b=g0eL}X;@Z2K?5k((ts*n8N{L)d&L_9dIfPJ-=bAxHd5A3=V0 zk0!_*w;=lvfTd2zHy6TQM`NyOL!I&;_@8cArCba@b_tXyqz!YKiC`zQ$Jpnrovq5v z=?FwaisV%t#5mV%{utIR3pA^91FdByb{v)n7> zKj>r39tQZJprMCO9C?k%LY{nN(ihJ7#Z-&uetAjliM&}Us@NbovdLs zuccGc4r!@07udNhMQNUDc4&v`0`!yhQ}srDuoJh$r8Z>RIDSciUa>oU zhr7lN=S1!t`w#M_-`UE@oyKF%(hHHW1D#53rv9b&Q6J!q%+x()I}t6WyL zDXWz2@EgaKL&{2Jn9@kmD;`;=v{H7$msF&BQR~1%j4H@NfMBCY}FV1MAy!H@I;U1vC&?**x~;RkZp znO1bXJjpf6R==o8-m~n;%uyK!)32nD&p7w1TUMW(ZRVJQTSfD%4IFOQMsJpKhfctp zhb9Gz+cVX9&sw`EHvdv?c+SA=E!kUh`kD9U_buvcJ?W_B$xu!+eTB~&tA3qnz3*qg zzWyQp5q^t(W*F=1HQGq&gm9K`&3E9x@gId2603FU7-N7>h+lYsJ#cTZCxi)m6xJbp zQ~0*#kH*sZSCz19ZttA=Y8i-XNvQtbD;CKzS^YWL(o|?B>m+q&2s^Nzr%-F{Gr?IcGt})9n(eOzhqaUxktc}pF&{WgdB&TH3 zl+#qv7&Jd&_4{EHm!+H1F=?UH1F@wT5ofX(DjpC5g(>`X&IXU&7xPX%*@{_PGBuBi zK)mj)_$n^B5Rss@a!{#6U8fq+OAt$crwgf>*i$xNVU%@pW%-A9ySIlo(EHtU%kvoi zp^A5*mytKhO_gHhAk~<@NmndE+!s_Ql2F~4hrI93o1eoEK;bR^ATwlfQJhBM?(CJ%XqYVk4bV`dU^1_||u518|J zBNU>{KG^FgT8}*t>yW8TWW3B2HW_hyKNrbw<^zQB!XrT={w~fDH;D5Py?cp6#KEGk z7$LOgW|CL(U#`*C+65JIu4J@G4M>joS@Wm-vqsAP)avPJ8E-Q~b8^gs3Kv*4uEX+m z@|jy8tP*m$Byvu6IV)M;75rvioP9p?>aRb3&H5FXSvxB~dysi&!P(+j&SZHV+fcK{ zSjPW(P{+_iVcB7|!tRA!3~CXu$Jc5ctFNZ*Bk9CW@DGdNF&9fAT7!O!G2S;cAST!t z_AsJiRCvss*z$29ajj#&M!QOVi?|+kIm8(>H?Vy`Q~&mUoqenM*oYhRx)q69YU6POiGasNggp0@-7E0 z?`Ff+_1lMTS3fD7NxO;(H~o5zrPcu)=kI z9MAIyxYiuSy<;D+_u-pe$X7;k=QzT5;UGEPZUhEhiQEB%CgVscrL4-x`IyLdv1(+t&& z)U?%THRq+SQm(ia_F@%U3oh;nvyGbISzwon#^g%BW~Uf`R8HENSTAY%clVD)$q@!iRR**E!m5*u4Vq7*(vj7=JTwsId#l~^Y<3Mv?N$h z+Uq)pyGpx!hEpAES@epF>9ZxAtGnWT}=&2{~MO?jv&AquedNgD7c!Y0v9B z884c?`=t6__gmy28E`NlKY$H<9#B1?j(@UmE1x;W^ZFcZ7fqsgNZ7>R zBUJAnBimMY`Mt&r^b0eOjp4SV+V+~8$-PJ35y(^}4d`CfcxAPG(0j>q#eLRw%K5;d zacs9wx1Y8*azr?rxz@SOo;vbyWhB)S^X>7N-~B{|^c-e*4peWhQx2u2@-HGxYj3jW zKSY;O-rL^Y@^Ph*YD{)B-&h(s;zwb=NTlw_Z`UA4>?m2pN#X|~URcIExpl~`8bA*h zxOn~uA0r$QN{dIuGRO`Y#Q&=ruO?pmo7P{Ordf&k)mrJ3NQ*u~C|`zazz#>vr%KLxFxISOt^Rc;y;fRO>e`g&DUoT9GLo|YEHK&+%18OthKztl;eDb*O7||? zDE>y-GG#W$PK^2#9vIRp;Gj<%!$55T{A&{O$DQ0mK1oc}9x*chr-S=OJdNI8`c=HQ ze9elTDo(BNvD|^ORZ1_3NiJ0}Vs&VGP`iK)zORjnuDvEzDB`xTiOhYbE*r+x=IaUh zLRsWhO@s;jQPd*#va^x z`Kjh9xnpvQv;A_ibN)78&p%Prz*f#xTdqnzapfdIH`g%El3;S~f_ z_eLv~QDRJWe|Eih<~qV16YN>GCARLiLAL9*zwFH&ZJhtO_PBp~csW{;sJm26dMZ7i z9!yuGQ!w+6rgkV6xsp86d)ZURlkfiKW<9+<4$pJ%H`#|motS)O{J56ox-V0V?2XNWkI=-=B7cPi%q@J4E+5p{W-E{po zJ#Wa>Z`Et{Ep%WRMbP zCTjcYX6m}=a}kn0Z_etG;Y{tG z5}n-kXX1~DpYxJOrd7zgk#DxwrfKaK|1J^x3^u&0@AnJXzUQrU- za~GJ3WCk@?j_~wz_O^Afj49CNHOP(5S(!a3duaB=?19-ev%h6c$TDPo&9rAO$(o;S z&e?=IL%G5SMP-VAvldzZvQ4wKvAwefS}PZemJfyV3hL&2%-Oky+<7@YbN1&f%@y&-u0GovE0AlM zuc)`*khJ9AA5cLGNH{xCGvz7P(xEFsiQ zxrW>ht3WoT70_vBd^nkV%8wB|!T@o;*izghtmVVGUQ9EZRZeKYN3pmw|U=qs(Q}4`@5sv z`K|}9ldiL_U#>20+LP@Gk*6qDYC5qnow&9931OqyR=ObNNV(D*M34HI{Z$m_3UBxb zehQa~>QxU^nLe=#xgq=<;gZN}nra8=8tZfPeGFR-+YNskSi>CsJ6({jp|+tWTFMjN z^Iy0yZW$ZPCNbBTN2tWNX4j&InTM)rCi@6^~$6i4M@;Chft6aC0&I+wu zm$%7_F>kscr^#VTPgs>m&Br?8I=T#2T?a56dxUL*tfCG7fNvn|5enc_dx{INX15>G zt1YGrYlW^t71RX#3onJi$O4av9fk4iPbJ5hQ8YA%O6!s&ecAh=_j}KK_s0!if)m;$ z)&9{bSxS5P>p^Z>(Mx9$HANVs^B4{ohHI~KE985&Zuyy+38}+=_V~UmX;;$7@9%z4 zDOJ*sXYI%*_9IHXl;ztfd_vsM^3|(Ut!Axyy7G&c_iahV6)oEf zNx`H%y_w{$$hnj=E%%67%pX=TyRbr0yuP zkZ;TToOdX%PoBj*#~ft-n)^1_liS;zY~Gi*E&o+P)1q8Uk~P9{3RR86)F&pDKO<4P zOZw{u$#}`|RR51IQBy~{Ak5-1Pvi<&Ut~gSc}n~#MeD8@4*9(Fj|}b<782PkYE!fr zvpu?7RIkW;VQ-O@uJzq%%+#&cED+ygCGt16Ggg*88xgswz3c=}|{2EqoHziyfsxX``mB_7>hepu4AAs>{0jlE?()7^F4Q{4uS#{0YcUD-j8Vw!WD@JJl4$uYbsY-|S=1mvsqw-_IvI zQ|0twnJaScwctVp7jq5dNTl-|yi}8h}e1l#Y?g@XOc981%>gg|6 zqBB@Osi%IlPvwB^!H2_IMfQl=7j21FqV`5!2<;y5(y&WtN6mHawnXGd<^GqwIeU4I z(flKCLqWNsm6lJ%p|*bZLyl+8BQCFNw`+=XzCF7*p>R*$xSU;?gEO+ynxu746Vqce z7W_)fte-t3r*CdGbFO)PUcLNx`AZ5q7B(*GYMEJl$okaw(f-5n(fP%d>#pj(Adjay zlTz#%?khhAoq$^vX2f#G1Modl|gC zirRFsH9ws>Lb397caigx<4?zOM~u_x@^^=NWW)<2D$WM^E-F?pJTabr?pdyN&W(;0 z_Jy{&)+5C}#fg^C;zz}a)&}-Fj)tz;?nxf6r-8S+SL^-ddFuJ#N%FWnG&UPLJx-60 zw~sf``=9($DMKFzm(#iR{0PAv#G#2XPiWV~Y zkNkC1-8S%-Fv~wB^cI68v*gwMrfaX?uiv5DAx&pHdN&nYvYRCj`O^Ds#)~!2>%RQ! zZQ7>~iA_>IW^BlInWq-6vHs<{uhiuzjXya5q`AYscb6*EX9$TMKOBBN_*J_%FFu$O zdZ$p?mkR%ICQyHfmyL2@W<Y+Pw!g$8B6L=^^iFr5;9ChAd!qGN@eNB-QDWil0z-ZibI+W~S$BVp%~+UTCA~xX z&-9}iJAVC>**NP#Rxq-)?%AudOXX;DN19{us}@eP{Iu3|G1-1O#yb zv3~P>nwtJJrW+m_T!tmaZl?J@7T+`eYXV0E8$-K z3QZ|@J>}iiTq({Pt^oH$Pbt}}yrKVQF0g-dyOGH-Y-dt|+VB1BO1I}0#}z%uCwUrk zLGE6&F5gm6(X!b3$e!zb;2z}NC(lrllq-r!$@h-&oN^^O;_cV0H;OwKPcCj^oo{RC zsO;+InI&JPGKn9@2#3YT(qEcU8b;Gj>M1q=nr*De4#D24hFB5Y!an0#2yXGc=9KPF z!$)J5>55O3Z)@LR-!ndYl$nZ#=!d4(~;I zJZjxPsCmdereSBwan$5r(ptI!H9|Qk7khho6Fgfy8{q~1gXJeG<><8}ggwYr5tg9x z*hTY5BV#?`xW-r043rH;W$_hPk-LUf?0ohD_m+ znR}%8e_8)J?dhY(qn`G7HR|IZN$=7s<&wL-(vrGozAoC}smZO<9r3*w^dYQrsYB5|v9YmRqgzLI3*r3I zwEJ1B_qb!M^}pinHpV@J?kDlSmqNeAd??qgO4x4=YbMw1TJyngL#uVGe60M2GWBCV zMl26m7Le^@H6-X#wGDLX`dg;y{)dAT!goh4imh6DP-!WyXY`hct|5xQ&gZT^URy?* zC4A%T%q==znd-4PQ|-rW&27(YS@xdJy{^ITq3&g_Y{wVdrs88o^$OP&Oe=U<5LsBR z@MOXA{1@g`IegZnj52B6Q>rDu`Wc>VN|~M7AieUh%31YuI+=&&&nsMH8D}kLKkKkK zU%UL=hg=h#yX}LlyybgA_5410+w;m4uolI3(S4IT&DGY_HB9kg{XYc+1SJP`4DJ_f z4-zqF@8oyhUPyYy2jcD!&Sxtp2qdoP z4p))yAbb^XYwqYC8#b6Cee3$Y@yqm^=y%e0i_hPt%Em(2%zo_^O&-=$zhV8NgV+k6 zdE!=SlI9=nUfo^&HA7$Hd}EBUs^Ou|uE`TW@kwk1bBvxtZBWwW;n*Eu_I^X;uzJhO z)8quXy>d}8VTaBDsu`873{kGidU+!DAYS+E_Z)*o>AeHI54>^mbons$Qrwe&$PrjE zjX*79936)Jp@XoKtUTKuRmHW~2{MDL!}}msegs98HLEl)G(R;(np8xJf0GEG`|D1rtz^veTVHG0}M$L&? z9lI`ed`vtlZ+XFA{o{Q~8NO(%XkLoLgdH6IQjdD#Y2XaAeX_hP3b3p!{$iW!WIcsm z8UIANrH65?ut!-Fi=GtR&pVvkG5gG~)U=?Ktv?PXElBK_*eU-g;V*_x};66u{ZQPWjBLieA(wvqEGkV;_lTZRRb!gO zc8wh!vn?tlvTRsTaJhi3zH?1^hWGlim?K}&-PYaL9n;Oy)z=wy#oG7UEm}nrthpza z$J$wA#+SCp`JNi?o6bd!dG-@FVq0r%WR;7r6ptv@A;M0#w6)Z;bg>+a~%L>af%YPP|Wn{5vWo*6dWu5KaC%wpUh=AN|3U3ga3$el_ z-k`c5FTnE9-eyCGba?r6{HCmSuMTD}#r$0F9B_>cAb+c(H(osl-I z#(ZYJhSL;F72)3-X;Zc1b=kW5`oHyaarDqf=nv~8%qq%iip3Mc?>x(W#vYc+4exvtV*8LTu`6!|P{u({kzJ}Ng?TuKu4kjDQ*z&u2Ly_Byjyb+p+>rvm{EdC{i zVa3NRn8YsPZLzBqrYY9E)UHSE;+KB8A<#I+IM+DQIKz0?7>O0JYldms1n#-_vZZI{ z?ZocyWi$YOe{0=UoL!WW@0T+x?NMUQ zkCk4VUYva~`0eGdH`5{tJ9u*h*=X}8LE{61{EwLIy2DZ#VI%i}U5}j){jt_eSR*RG zzqn{|o;Crg`Lxg%rB=uFiBBv~SG-)ITlre?nWYnBe~%d+%|-Lkb)x%4cZ+@-^|n-n z$jI>2kes01fh_}_fd_*vp=%?gsJ!T`nB6f-R8(Z|(1<{*Pd!6sXY&Wd$tom)ItmEPnB!?4@PTP4%o%|5rtYNoTT8F$jUr~Z?oOYtPvNV%V~ zAobt0`{_M?HO!is^T}McAh>9OrABd7aZAhX!fW}n%{_9qWi8BXpIMMOE_;1$c>cS> z(Zz3V$*2)@@}zn(fh#JoKW`qq z@_Tdb!}7%Y8TE@+c)JMy7{>Zm@oVBUQol>Q!R%JPcrLn2d+vHEY6w}xw&nK;x5O-I zwDz?Aq3N=JwUCbyjbivRKjT-G|53iUoPYd<(gS11M(d*Lmr96y9hnrF9eFOYLS&r? zZTOqe%#ghy^+Lae^^aT@{UYvA+41EblH-_=a9M~#*pK|*+EwWI|Q8e>*CwR$7yQjQ`&c;pWT0a;PIfo!83!C zgDwOL0jyt=X`f+*Zk^_xSX;QnwPX{>DB7b;lkJ{W?lG=w&b7|x&i1G(C%P87PB{N? z?6JKsu5FPE+Z7rLLkjB_mM*+pkeI(euZ}r2=U4W$>aS7ak>-S1@7|5n)-Q1%QuwnbX8QS_X&zrTW2ziH?}eDGR-#S7)?f< zp^SdH?l0XYUA#U`f77tc*vj<5)X-;^&tacuK4u>Y>siG;E+ zj(pqy)$!T;@%Inr_p3iX_&Wb**Q~adYThSYo|ZG_8cOSy3n3)QbJ@|+#@Zg+%eeb1 z2bp$)RobTgQ@2z1ST|OmY1r;FD8Lx1EA=||dD;Et{VMuayj}jU_@Sj+#w;w=BO*7f zYM3*$Y}leOYgpg#qv7W8HW9v&lS=K19uhaB?4a_CEB2@~wBm$v>*LBtehZvn{7-Dj z99QD8FLyt+jG4v%693ZtKqh=q+9pmBCi7ddH}xN86a8Lp=+3dVE!t)7ne{n+TI$r4 zM=4d(8fC1{e3pGQ*K6L9w>B@sY{_-!)X903eKPxDc0slYSnQYGChOrZE~85tliDj~ zNy_omPwDBI$8zr%JSiUM7~tOF6_iw^J$Ch;#16(tdH_}*_9K6(fxlkpM|Gnd)JoEb zbBL?;yL`_EwF>`IDj?=zj1nzGHHruiH3m)aU*)^hrU_)SbU}4~yKx3e9zzx4zzE@4X zjZF=M^r^a2x)fbEeWrev!E9(_Tx2|MJZPMNorZf1l?`|GP4!!KN42vw!O{W2AAg$? z#5|(X5 z+h7~9zqN05v~WIg)`b0O5!;@-OQBYjfa>^4?>X;X?`N-0o`uz7ry^73v48CnTgc_} zZ-uEMFHMk=qz0PPnn28;u4&!cX1cvPy?&s6m;Qm?s_$v|Xc%i$jE79)ea84s_Uq#R z*8h$FDF5Yt1AMbgV~y1eWA)+sIQ<{`>-y=2>Bc&yXU0zY+Tu>iZFA*J`MLPx$rt+{ zAAIb3ar%=hN|$8W6AsZzH}mn+SGHzg;9O0%Zl&a9ssSKwcK!oJ?M z$MeivPEPT*@GkY3Jc|2oPiyZ$d5iLmiXtPK)2x@9EYy?cVr6!m&jtTiK_fyth7XNc z67e;BeAw=g>p^~jMgD#Khxvc?zl2>1?}NSu-wK%&>Im%>wlVBh*p0BAVdcVxhgJxg z9W*!~&$qkjyuO*XoU}q%g}?M0#T&7Q>9`muNzw?hsc?bI!(Z|&p<)%Ux7btQe(L($ znPIPOTU)HRq@hw%P*ADxTH(~9Fv|kVVvE+&xTtPn^MVEW-n_GU7V!RmN_yP* z9(Qk=3Z+ooWxTlSa2Y<_88&RVyN@BmeK^D2b-25?P@vv4jobNt?RVu$B{|7C=Xq|I z|6SB#jF4HK)~AuEiICYN2@a8KXXshE5rZvTd7yLuKGuLO;JE`SUyl* zm(Er{mHl01m#APWB55a{DY_|$gsR~#q2a;Nf#Lq1zINW;p3Ux(?x3rrdxiTakJt0e zyW7{_pXu)u7#kQGC>*%pukF8#=DR^GAjfmo^WIa(EAvJ8Cj?4{j6#&yD19kwqUfy5 zrP}Dbvbl1&VhUZBO4)Uy9YbV295hzreG_*%BywbAOyp?m+KBU(D9eB5!{)i>8s-P4HKy^VC=;4f6P6ta z&T&-u@%#I3Po~~pdOdhue0R_Dw8Uju+x;7)zp47DW=gmCmu0t1KJ)JQ^FJQXeK_>t z@JCTkjz5ihUgyP=m!sb7|1k5*p44$UKlv0Qi+sKE7bxE(%JSE6&vwkV&#+%~WV#0j zV(7gDqQk%7>b3Nu&>^_mH^4K@HH})Iq1nSSx1`6Vg;EBk z{FV}#+B)rNdi%_ISrw?c{+k%bob=AArXTj?3STpmDknJ-)ky=Bo+Wkv^5x5_uj7+X zee3gMb!wB0e%Tis*{)08)BZbwr-874l5dsgA6Klib?(I6L(XgN1-`>Ug{ZZ3xT1`D zoA#1^uW^F8NW@O-YqY|1+j!f$$fnktmd@t(Cc(JSlxvQ%9@HNS z(364{$>Q->*we*boaCd z%@5^Nd92hW`boGSIvKo1EklIA0oG<0Pg{3C*FGZa9i01|m0UMnb*S=a;@;*O@ANs^ z=IqHfWKGXdrk_jwoU%PdlA4tonLaY(De+Tf&N|1l+^tTFYlQ2)tGD~A`>}h1JIyu7 zRo6Ak)xo{qGtKupa3p+Ld|ftQ`AU688;@6W#$Y$xHFPta)ko^r>H6uG>ioK^`jZBi zah|z##7~iFwvN%wW8TK7W1q&9k1IJPML$*dN^8^B*A!O2P}Wy0lU>J?YcIT~PS6`zMFs5^?BU8(2W14Shx+lT9ZCt# z4Q2(J1g87R1kQs8CqVrT$$HHkz@28QjSZJ|Fx zTSDUSrf^r`CsA3dTT4lO(krq)ax)pN$;u*hUbR)!iP|7t?(b@k{nn%uC-L7@J?!6QJVt$e-TON?e zbn4RTc-cY!o~)@~Y;X2HY5d^Wy~+1$JgWZe;H$&${2z}eF8(Tf@08xp{?t`A;1q@- zCp*bbh~I~f`&@YPcXG-(_B*3|*TXAibJT_OlZ{@J-+Tt|W~p_qZEwu8f)k2dEMX{< zQMO^Z>@t>8o}#r2or$f7K4>2)*rH-v#aoNMD=8`$tgyb)_ew=8ov84n+_f^>N=+zH zs@UR$p7Cp9+uPF38Tu=lFRIC^?dl@BRmRQ{`)#kIhsRWo?i<<4JV!TCd0Mh6+&5tJ zZ9{%ubKQ3C$?fO}*!N~H$U2!hBy(5hn5>!E>+KzLmgdNFo@S@Qov%{Le!uheQ_}3j zd!P4wj!%>)HT<&SYff^L?`wZ(Q@5v$&gh*r(mvQx#M#aD*|p1c#o06Weoj5RE&H#m zP}XF--_h7D^?wN+5J$^nR1-9nb=_I->4q1E!o~r{xmaVJj2`+UGWDDF_lY=kFdek4 zh&&wqy1xkz~rG%0;R_)N1-X z|##XT2xI)6#p<+sxDEYE(z*F6`dPI)zvNam2@}cJN&yd zrhK~aEPQYM?bo*-+*|Uv-b>HB*Pokx?f32L_kUBSruWH?aq4~RLO#5vRB;Kx=kMZf zN?dM1*52$4M{)1$uv6Ak6JdxqWtj??YnuNw@5kn;AN?%uazgbIolEa4V=Z&JWJ=NE zg`#6`MVcd)S;kshMsF{;zv%hW6)U!=vahPF+SdQ2RbE*kx@=0xvc=yQc~dws{z6=n z*x6C1tW7NIOeWK9(^bp*$am2%3Op&;AwD{h$XKEUp@_s(gX^S3=FJ1e7NTFD;;lZPhN`TXuZ|a1!PwCCF{?1wB z%JkI?7nTf^zfcZQm(tWG6E#y^Rb5^^M4hCbrm3aX6JNWhKWsQk#&@=5y!DlBaEu{t zR{X-kUlPU?F&D`wY$)_RZhUP0=qa{3k=w14t%t0+*2a-@B2Pr7MVf6b(XHEUyKR5i zUPm6XX3`7k*2}b!s(SK7iJlnF7U6|3nmXDbT~$ZHhV3fO5^9Gh2mkX|^S$;Qa^G?3 zT%(*Pa^E|gIVEzA+t=DN?0@7`cZ406b2~ZLIww0*a}~MYa!%PdWnayzofVtaA?sPz z!tBZRWjW6rQfIX56Z+_!+k@RW-gAvA_Z06V-&y|}uvYd33xjAP{bCHns=8)hqI zn-ICgIt&j~ZhmgOZb;I%(JS;SeR29nE9g_uI;ZJv^Qj}$C8-fvO7^(`9K2ill4`@E z;^v~?gk51rXcSq8*TE~nlffgwRl$)&pu&MCfjxoAfewMlK#u>s|1W<>e*u4@@22mf z@0m~R|Ji@Z-#t(ym>JxKuQHDg;fLXy;T_@8;ilA>4GG^z!&*V^cp*M7SwVE?IXd>O zyqn@Y{zYr$7&@I6DyJ)ZE4wPYD3>bVQ4do^T|?7XyI8kE-;0{8>c;;W-x+EeM(F?1 zNpx$pUA3L@Q=e-~=!Wp9uQThy=+vKdeRUhCHS4M0&q^8eZFPTZ!+Nm7?RgjXH16J@+a2%ep8G$~$$Ax_1xEL){)W1@xU8$)*PVJJuG4sBCr*n!X4dfSD^%MPgfVGTNo;;**Mjrd{p+8)JJD>%8ZvS@sS);j;a%Wg-y`pL?-=%`hTrdN?W^PUx=*+^ zJKeb_a{tTyntLy|er{RENNR>n>8F46N}iH5_;Zg>oj%q1{3Ef{*OT9Bru3m+_-#h> z%t4u*Gb?7gGA?GU$QYB+EF+vgEj=;qx3rdNPtuebvaAdCB2E&iflET7q?CLqT~-h1 zHh(JHCcOa)1IXpl`BZBZQ)g@T=_(ukGTt<$nr#uIt+|oAqkfLL8GENd<2XfJSvt;g zqExn@t=X2+mUzo~OL|1_$YfiE=+ZG~Vv=Hx#FU5`5NOkkO()rkSc* zrZCDQWQV1XrNd;uP|se5daBFHvdR$X2!8Q=K^8jd-|iK8-nh!R-Z>vQuRE_gPdQIJ zA3N>vV@qFIWX(*?1DKy$NyY^dbaqS z{@ww>U(R3Hr}w^dpLAVzHgisLHg~OXm+%IBQNiiqkZ7!QHN62_@?%FT%^7uZ^(fUD zI`3XlkGNC$K=rG}pu3^(Z~SPgYN;KO8By4(v7V0@8exmLW@&GEh@9VVDr{P7)EPGz z8X2k@Ivf5q=*Y$$HNGHnRLVNsinnXjDZQhzXi#V+(V;g~x9Gy=uqd2D zq-a&BPpDuhBY1;s$g`j&G(A)xObA<0f{^iEGD-SHS{g*2rqu1H z>sqJIp`VQp@IS*;{TN+ity6tpm8P7a9IRZXOjk};jZtsYJizweuA4)2HK^0**Jv*& z>xD;>K%dPh`_t-fsodH++^*VgHg%WWA^ zQ)4`_MdDV*xe64CEfdutLNIL7EKgnX9&`S}KOiR!H89ei3r0-**#dDS{^+^y>o+0*eDL0)fD%z?8sqf54~r zsX-nn;_g5lQzfU6D^L-z$axWtpY3ewjB;9?rJRGDx1FP1E!|~3_dPDpX-|322Diz* z)K!j(f=+a8@AY)>h5So{W^kE4i@u7x(s5QyB7peP9ITaS>Azs$jF68}3|2N&Y1OaP zd(qUt=t`44-)bmjoNioAl}uMOR;*ELv>B@!ryB1XV@$2dM+`KzGu7mdPa4}9f8hCc zFqAe(43G7*^4y9h{EZ;(4OC zLPzj9I)^`o7KX}%(y$&D1!o7h1aHza8VF_uuLZ{k4Z%MH3hEGB`m6d|`xlUpY7#gX z_zA!HK`=T0@s8Ty&wL^wG(7Yw)S7JPFG3=bwojtQVEDWgmjRVWFI^(l$mYsK@+oq= zyg$8>rIhoPPUUZ^Y&waHf*8?WdqVq)%=1$AE0qk=a7|~;M9nSDFWOw~Upk|{C%SkG z9YTZj4qY|f80|ZH=|5|#Xn)gA)^54aX$B&>!J6r;7pNG=2di4 z57Tzn#~F8-vdzUK`dhb0uD4mEKG`g`BxMuUK&-|w$Cb$_}!dfiZ#wOR5$!g7fb=;4r5{HewwM3DbZNN*xT@{zM?Kk z(@TArT0o0ztfaiSifENkPKW?o=T9LhGy*TiLPgp4ur{m?*#j5->wROrLp=lBi(T)X zGn~Dh!<_S+C!AsD3RfFRjVAx~{l3xfgh5 zduRIo^6wA)8|)Q25!yt=s7fe4R5+vzy$D_;inKYjk8S{~xE?u?+cLc(MtPq8nK1Qq zqf`#!8Lc!TXuO|J3@*weEbxMc1Ve;D4Chv4jUtS@>CKvKx@`JvdTv@`(wQb;tF|}X z(O1{+z*?O^@4`w=RgFV^SACt1`P=G$)V$9>LfaT+J}uGwr!@GJTi1OI3j2b-k@@!UO+?4?+5kxl>;;A?yG^N{w-J| zv^?~Qy5L{Q^UMp+4UY>C4R;E6Rkt1YViLvu+jR!>varSI0QI;CE&nWY`BQ_^8^RP(oD znW(sLSWdmPk;&^5fBkGsI{j^SMvU{bf0?ixl*BgS1i#L;D7$Xj-ETX;I1}e4zE9ke zH1*5EuZhVAzME6+={4!zbhy5IErDLa3BjR(zI2H;arSWZ&G{?myyLcWlxM2{c<7R7 zq;#IV2z_K5)M=U(x^9L>CX40oh<(hMVK9lcFjYcoP3E zK~gNXc(vm5ij^)pDxrU&{sku&$cWh&eJm>3*1&cpa#UoG$c2#_+Y{T{sI2JEG5um& z#!ie$iP{_a-g3;iNVh@VOu1gZNmd!Wqn@%gpt{VEg}}BNC|N8%Dta#b2)_=U2o4K` zeFMEa+;@o1_Q+A%3uf=i`Zud+wkO+VPs=&&s77~N?c8$?drq!BE&E57E~``K!;Fa; z9W(l8Y@!coL1z1`_Srk^v5q6T4O}POUXS3#mhstr`+Ti@SVwpP^?fP6bbm8y9hZZ` zcnCDVw(=Q@)mT+c)XD0RnosmOH`bQXdgysxMx=AD=Bg$}dsll?Cnmf8pUG$`93e!^ zwjQ+hw4RK(Ww~s=XnJJKHIy(6(qGX1PxnLnNn4uwojK$rqUlF^V?2$eTEp;N*GxN8 zeMMPVaYeRO`V^GFYM`Cnmo%X#+9xdvdca!{YbQyDi|dMPf*XvG2Z8JUZ@zXuna|AC zUnj3pE+7w{4#tP#LXU$jga0DAO8D#gT6#z0k1Of_%XIE?9&{>Q$6f2(*F2?tm;BX& zO+p7lvqJV@v*6UgEPs8U%cJ#Vxet0&zQ6r(!Gob5LJiRS8c)pDi*tP*(6^@NjSsI{n|^f5g9hL0X21B?f}hP%4#5OM>l! z1&AaXh?e!D8qgl>5xO6$OKrecdb>Ib>x49+o@hR`wB!iHlc`{mgCaVX9{M6+-u(}x zh?epf@&SqzP^6A4Gn7VEB~=gV1D~m4K~P$ctoo+5z~!^(3wGf-x71G8p4Fyl6}nvP z`6=2W+8dfKV99KU@7t^EsvD_)R*zHfRllZp%LOjkOicr7q9pp2`g=rIKj;c*-zq;! zMhCmP_Gi^fJ@IW&^004jQp#nWbJ_wCqHW;VszkYgNRPoWDsy@2!|!#!y-2S9E%)2$ z?=64a`7tTEj~**~&EWTD8?kzFD$lS`Z&bvD`+lN4LOz|+`W zG5ez8A`4sG2CsIYdJ+BW1r?pZ<=UvMt@@L-w9;W&iE#n9q<=|zP_OVVyd-1`uJ+r# z%{&KOm7L1l(vE96XLBMQ=Nxl$JEGA>y5^E?+2lNxyWKG}XRLi<_K7TW)^?Cjx@9iR zOwOF0)h&Cx{bEk#+%3+atGFlZSwj?cx3_`!vZs{ihl<#?*rT1tgv6j}#9?H2?N*z?)SC_+T*Fk&*vYU-Z_?k>J<`SL59xaw${It)+tl(YEG;c1E&I%mO#d1?8lLKEX?LhA zf+SH=aSn8V*LdTf6tk3CFh+)e%CbUvi~iRuvYFCClI`TJKBLW&L3^?LQ~hNF7Xw4V zZ`c{Khf+hk(apoCrrPA+?Az?!>$wJ}FLrfzO?7>A{q8Q}33>uv8FjG71GMM_KL$ny z-uP|)dcHBmRGN&EZ60Qkhp`B=z=$*O}ADF3awdbvO%GJZFIOxcg6#g8uaV>+Rz)x!bu~yGpn(d(wPU zg9U^!;?f}94hKbWuMW@u+jGoGhz>ydu9E=hYvOGT{VnJGOYGU{2( zy#m+c&ct0U5FcA6x}NQ_^<~8Vh*)dDYOqP84n}>9`Zual)OK5f?NQ{_$ZwI=Y}2SE zh$2@qF=D*Ajj^77uC|G02{zqEwN^7pvy;B1%jzTW{tJ13S!roi@K;ksU8y7x3vuD} z;G%%rH_2Px(}B+W`!1b(r@J#%1f9Iay_3k@I-P&!wsh1(qS@>Qdr$jwd;6RdIl-Lb zj#iHTj#ZB5jyAd9bN4&@x{TBxq`6HVvFAVcWcSbR4(_Aw?w(fONxo11kwH;-nD8e( zyBT<|huQzOpuWa}DEA9p^;;CBmAgTz>aRKghSm~w56$n|W4a8z(I_*WH&rn=F^kP( zO%IGs=@&b0_{%WWFvGCLkY=EN%s9~$G>tGHHD5BXGM6&1G+i@3G@Q|I)~&>Id#Ki{ z$5L5-Q+b!J{feO8R8s|&Q|Wt8l;4-FlTMLL5N{B@5=sf1pz&|{G+vwD$z(L#reLR_ zBk%{(V4(jM@yf^Ek>0Xioj2%Fcq6G&ULruV3(oJ!?fV^L*M447#d!b9OOmcLop7`BCXhgx9qyXYk|gzCWgN5~Hp z0}t_N*d8t;)D`Lo?;aWh}!5lsg>dp>yXQ^DMYbvQY>CJe zY~%UlD3|>pqhQ90OnHvS)jV)ss0|isT~WJW8PCR?!5O_$s(vs2-TxycEk5gteYhh4 zwJ*zQVy~C|F>7%4Gy4}uC09MqId4aw!snwSH`Z0snUlNP8FJ~o^Ze1F>B0!{1<73L zM{o~+mx<-C)qoS;x@W==Z)IAQ4i(HPiYGgo&87mNf*)?h(u-SGISC8M*1=OCHmF+ z9r_dcm-;vQ=lnH6-&x;HKUBX!KTAJ~jM6(k_fA`0J4~}BA7AgRav)kDR%udt6|WT= z6txs*!8{l#J4ZcLeaRg0f6)1C&@h*Vi?bfe`mkif6_Oa^;+(e_z(N%2Sx;2heDw~;qG)d4+`B4Ho~4b z8~86!5Zn23=mnkEtH3R*3yNS_u^U{b$)W)u{3eNh!*xG{4EQYVBs&To!|%{aNkv~! z?N=)PReYtgzclEYMd)x|trV2MtInvLsxsh%a;Zfh)Kl^zNM?+pYwaxeEBtmq5wt zgMA_e(_)W!Cg}Y&#bMELy5^!pslr>~3o((xq9&q�O@AzW4{2@-67q{sGSLUg0*_ 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 literal 0 HcmV?d00001 diff --git a/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/elliot_speaking/two.wav b/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/elliot_speaking/two.wav new file mode 100644 index 0000000000000000000000000000000000000000..40a337398d52cec54b2313ab0480b015f40c1c74 GIT binary patch literal 45124 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 bIR*3;sKh!2)H4^DXF)l(5m?9N0P`pS#Cb+V literal 0 HcmV?d00001 diff --git a/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/elliot_speaking/volts.wav b/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/elliot_speaking/volts.wav new file mode 100644 index 0000000000000000000000000000000000000000..3bc5623a9999af07dbdfb3401952dd2f260f817e GIT binary patch literal 50246 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 literal 0 HcmV?d00001 diff --git a/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/elliot_speaking/wave2DPCM.py b/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/elliot_speaking/wave2DPCM.py new file mode 100644 index 0000000..f77df77 --- /dev/null +++ b/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/elliot_speaking/wave2DPCM.py @@ -0,0 +1,136 @@ +## Given a .wav audio file, downsamples it to 8000 Hz and writes it out +## as a ADPCM file suitable for use with AVRs. + +from struct import unpack +import wave +import os +import sys + +def unpackMono(waveFile): + w = wave.Wave_read(waveFile) + data = [] + for i in range(w.getnframes()): + data.append(unpack("h", w.readframes(1))[0]) + return(data) + +def scaleData(data): + scale = max(max(data), abs(min(data))) * 1.0 + return([x/scale for x in data]) + +def getDifferences(data): + differences = [] + for i in range(len(data)-1): + differences.append(data[i+1]-data[i]) + return(differences) + +def quantize(data, thresholds): + quantized = [] + n = len(thresholds) + thresholdRange = range(n) + for d in data: + categorized = False + for i in thresholdRange: + if d <= thresholds[i]: + quantized.append(i) + categorized = True + break + if not categorized: + quantized.append(n) + return(quantized) + +def pack4(data): # for 2-bit data + packedData = [] + for i in range(len(data) / 4): + thisByte = 0 + thisByte += 2**6 * data[4*i] + thisByte += 2**4 * data[4*i+1] + thisByte += 2**2 * data[4*i+2] + thisByte += data[4*i+3] + packedData.append(thisByte) + return(packedData) + +def pack2(data): # for 1-bit data + packedData = [] + for i in range(len(data) / 8): + thisByte = 0 + thisByte += 2**7 * data[8*i] + thisByte += 2**6 * data[8*i+1] + thisByte += 2**5 * data[8*i+2] + thisByte += 2**4 * data[8*i+3] + thisByte += 2**3 * data[8*i+4] + thisByte += 2**2 * data[8*i+5] + thisByte += 2**1 * data[8*i+6] + thisByte += data[8*i+7] + packedData.append(thisByte) + return(packedData) + + +def packOneBitDPCM(filename): + data = unpackMono(filename) + data = scaleData(data) + differences = getDifferences(data) + quantized = quantize(differences, [0]) + packed = pack2(quantized) + return(packed) + +def packTwoBitDPCM(filename): + data = unpackMono(filename) + data = scaleData(data) + differences = getDifferences(data) + quantized = quantize(differences, TWO_BIT_THRESHOLDS) + packed = pack4(quantized) + return(packed) + +def createHeader(filename, packedData): + baseFilename = filename[:-4] + outfile = open("DPCM_" + baseFilename + ".h", "w") + outfile.write('uint8_t DPCM_{}[] PROGMEM = {{\n'.format(baseFilename)) + for byte in packedData: + outfile.write(' {:d},\n'.format(byte)) + outfile.write('};\n') + outfile.close() + +def testWaveFile(filename): + w = wave.Wave_read(filename) + bitrate = w.getframerate() + channels = w.getnchannels() + bits = w.getsampwidth()*8 + if not bitrate==8000 or not channels==1 or not bits==16: + newFilename = filename[:-4] + "_8000.wav" + returnValue = os.system(SOXCOMMAND.format(filename, newFilename)) + if returnValue: + raise(SOX_Exception("Something went wrong calling sox: SOXCOMMAND.format(filename, newFilename")) + filename = newFilename + return(filename) + + +class SOX_Exception(Exception): + pass + +if __name__ == "__main__": + + ## Default is to convert all wav files in the current directory. + + TWO_BIT_THRESHOLDS = [-0.05, 0, 0.05] + + SOXCOMMAND = "sox {} -r 8000 -c 1 -b 16 {}" # for converting wave file + ## install sox, or use itunes or audacity to convert + ## wavefile to 8kHz, 16-bit, one-channel + + wavefiles = [x for x in os.walk(".").next()[2] if x.endswith(".wav")] + for filename in wavefiles: + + filename = testWaveFile(filename) + packedData = packTwoBitDPCM(filename) + createHeader(filename, packedData) + + ## And create a digits set: + digits = ["one", "two", "three", "four", "five", "six", + "seven", "eight", "nine", "zero", "point", "volts"] + allDigits = open("allDigits.h", "w") + for digit in digits: + filename = "DPCM_" + digit + "_8000.h" + print filename + allDigits.write(open(filename).read()) + allDigits.close() + diff --git a/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/elliot_speaking/zero.wav b/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/elliot_speaking/zero.wav new file mode 100644 index 0000000000000000000000000000000000000000..e4e59b2a133c8e3d603e5c60977666637556efc0 GIT binary patch literal 50246 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 literal 0 HcmV?d00001 diff --git a/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/rich_speaking/.gitignore b/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/rich_speaking/.gitignore new file mode 100644 index 0000000..96d2c0f --- /dev/null +++ b/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/rich_speaking/.gitignore @@ -0,0 +1,2 @@ +*8000.wav +DPCM*.h diff --git a/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/rich_speaking/allDigits.h b/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/rich_speaking/allDigits.h new file mode 100644 index 0000000..ef773b1 --- /dev/null +++ b/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/rich_speaking/allDigits.h @@ -0,0 +1,15353 @@ +const uint8_t DPCM_talkingvoltmeter_8000[] PROGMEM = {127}; +const uint8_t DPCM_one_8000[] PROGMEM = { + 102, + 170, + 165, + 105, + 165, + 105, + 150, + 89, + 101, + 154, + 101, + 102, + 153, + 150, + 106, + 154, + 102, + 102, + 165, + 153, + 101, + 106, + 101, + 154, + 89, + 89, + 154, + 85, + 165, + 86, + 169, + 89, + 166, + 150, + 165, + 169, + 85, + 105, + 86, + 85, + 150, + 149, + 150, + 89, + 101, + 106, + 89, + 106, + 150, + 101, + 89, + 105, + 169, + 169, + 90, + 166, + 166, + 102, + 150, + 86, + 166, + 90, + 90, + 166, + 153, + 106, + 150, + 153, + 101, + 85, + 86, + 85, + 149, + 149, + 85, + 89, + 101, + 89, + 85, + 101, + 150, + 153, + 90, + 149, + 106, + 89, + 169, + 89, + 86, + 101, + 101, + 169, + 150, + 102, + 90, + 166, + 169, + 169, + 165, + 154, + 154, + 85, + 150, + 86, + 106, + 101, + 153, + 153, + 150, + 85, + 154, + 105, + 105, + 85, + 102, + 85, + 85, + 85, + 89, + 85, + 153, + 85, + 165, + 85, + 169, + 169, + 150, + 170, + 86, + 106, + 170, + 89, + 169, + 170, + 165, + 85, + 90, + 153, + 89, + 169, + 166, + 149, + 86, + 90, + 85, + 105, + 165, + 166, + 166, + 90, + 165, + 85, + 105, + 101, + 165, + 149, + 150, + 150, + 85, + 105, + 165, + 165, + 150, + 154, + 89, + 105, + 166, + 101, + 89, + 165, + 166, + 150, + 86, + 89, + 149, + 150, + 90, + 105, + 105, + 165, + 150, + 154, + 105, + 105, + 105, + 166, + 166, + 154, + 150, + 90, + 106, + 105, + 101, + 101, + 149, + 85, + 106, + 101, + 165, + 85, + 90, + 154, + 170, + 170, + 170, + 170, + 170, + 170, + 170, + 169, + 85, + 85, + 85, + 85, + 85, + 89, + 106, + 170, + 170, + 170, + 149, + 85, + 165, + 85, + 85, + 90, + 170, + 169, + 85, + 106, + 170, + 149, + 85, + 170, + 170, + 170, + 170, + 170, + 170, + 85, + 85, + 85, + 85, + 85, + 85, + 85, + 85, + 170, + 170, + 170, + 165, + 85, + 85, + 85, + 85, + 106, + 170, + 170, + 166, + 166, + 149, + 85, + 85, + 170, + 170, + 170, + 170, + 170, + 149, + 85, + 85, + 85, + 85, + 85, + 85, + 106, + 170, + 170, + 169, + 85, + 85, + 85, + 85, + 90, + 170, + 170, + 170, + 165, + 85, + 85, + 86, + 170, + 170, + 170, + 169, + 85, + 85, + 85, + 85, + 85, + 85, + 106, + 170, + 174, + 169, + 85, + 85, + 85, + 86, + 170, + 170, + 170, + 169, + 85, + 85, + 86, + 170, + 170, + 170, + 85, + 85, + 85, + 85, + 85, + 86, + 171, + 255, + 234, + 85, + 85, + 85, + 85, + 170, + 170, + 170, + 149, + 85, + 85, + 106, + 170, + 170, + 149, + 0, + 21, + 85, + 85, + 90, + 255, + 255, + 148, + 0, + 21, + 85, + 171, + 255, + 234, + 84, + 0, + 86, + 191, + 255, + 233, + 0, + 0, + 21, + 102, + 150, + 191, + 255, + 228, + 0, + 5, + 106, + 186, + 250, + 233, + 64, + 5, + 175, + 255, + 169, + 80, + 0, + 0, + 0, + 91, + 255, + 228, + 0, + 95, + 254, + 16, + 22, + 170, + 170, + 185, + 80, + 6, + 191, + 250, + 149, + 85, + 80, + 0, + 0, + 0, + 191, + 253, + 0, + 11, + 255, + 164, + 1, + 90, + 170, + 190, + 144, + 5, + 174, + 154, + 175, + 250, + 85, + 5, + 80, + 0, + 0, + 31, + 255, + 128, + 7, + 255, + 165, + 69, + 21, + 171, + 170, + 148, + 5, + 170, + 165, + 90, + 174, + 127, + 245, + 0, + 89, + 0, + 0, + 7, + 255, + 240, + 1, + 255, + 169, + 116, + 1, + 175, + 169, + 106, + 145, + 90, + 149, + 90, + 170, + 90, + 190, + 165, + 85, + 85, + 80, + 0, + 2, + 191, + 254, + 0, + 127, + 229, + 166, + 0, + 127, + 229, + 106, + 148, + 26, + 229, + 86, + 170, + 85, + 170, + 90, + 127, + 245, + 5, + 85, + 4, + 0, + 5, + 31, + 255, + 0, + 47, + 228, + 187, + 64, + 63, + 228, + 107, + 212, + 26, + 165, + 26, + 233, + 86, + 169, + 86, + 169, + 151, + 254, + 21, + 148, + 1, + 84, + 16, + 90, + 175, + 248, + 2, + 254, + 71, + 168, + 6, + 249, + 6, + 253, + 1, + 186, + 65, + 190, + 85, + 169, + 85, + 170, + 149, + 170, + 149, + 175, + 164, + 5, + 100, + 1, + 89, + 89, + 254, + 192, + 111, + 148, + 125, + 128, + 191, + 129, + 190, + 65, + 174, + 65, + 174, + 85, + 186, + 69, + 170, + 85, + 170, + 165, + 86, + 170, + 111, + 80, + 27, + 144, + 10, + 85, + 159, + 232, + 11, + 248, + 91, + 192, + 31, + 228, + 63, + 208, + 111, + 128, + 106, + 69, + 190, + 69, + 165, + 170, + 144, + 90, + 165, + 111, + 144, + 111, + 175, + 64, + 47, + 224, + 11, + 144, + 126, + 245, + 2, + 230, + 94, + 240, + 7, + 229, + 95, + 145, + 110, + 81, + 169, + 86, + 169, + 90, + 148, + 126, + 144, + 106, + 86, + 169, + 87, + 224, + 11, + 213, + 248, + 3, + 248, + 6, + 164, + 31, + 195, + 253, + 7, + 248, + 47, + 192, + 47, + 129, + 189, + 6, + 244, + 27, + 144, + 110, + 85, + 185, + 6, + 165, + 90, + 149, + 170, + 85, + 169, + 86, + 150, + 239, + 128, + 46, + 5, + 164, + 86, + 164, + 47, + 144, + 124, + 3, + 249, + 10, + 148, + 126, + 145, + 185, + 70, + 165, + 106, + 149, + 170, + 86, + 165, + 90, + 149, + 106, + 86, + 171, + 225, + 90, + 91, + 240, + 7, + 145, + 85, + 21, + 105, + 87, + 229, + 15, + 5, + 190, + 70, + 145, + 95, + 149, + 169, + 86, + 165, + 106, + 149, + 169, + 90, + 165, + 106, + 149, + 169, + 90, + 169, + 184, + 85, + 145, + 170, + 184, + 101, + 85, + 85, + 85, + 106, + 103, + 245, + 110, + 5, + 185, + 170, + 145, + 150, + 86, + 169, + 90, + 185, + 101, + 145, + 170, + 150, + 153, + 90, + 169, + 106, + 85, + 165, + 90, + 165, + 170, + 150, + 170, + 90, + 149, + 90, + 86, + 169, + 89, + 85, + 170, + 86, + 169, + 89, + 169, + 101, + 150, + 170, + 154, + 89, + 165, + 166, + 150, + 154, + 90, + 85, + 101, + 85, + 166, + 170, + 150, + 154, + 90, + 85, + 105, + 101, + 169, + 170, + 166, + 166, + 150, + 85, + 85, + 90, + 106, + 170, + 170, + 169, + 165, + 85, + 85, + 85, + 154, + 170, + 170, + 170, + 101, + 86, + 165, + 166, + 150, + 154, + 90, + 89, + 106, + 170, + 153, + 89, + 85, + 85, + 85, + 85, + 170, + 170, + 166, + 150, + 85, + 85, + 89, + 86, + 170, + 170, + 166, + 165, + 85, + 85, + 85, + 90, + 170, + 170, + 170, + 165, + 85, + 85, + 85, + 86, + 170, + 170, + 170, + 169, + 89, + 165, + 165, + 150, + 150, + 154, + 90, + 154, + 89, + 89, + 105, + 169, + 170, + 165, + 165, + 85, + 85, + 85, + 85, + 105, + 186, + 166, + 165, + 86, + 85, + 85, + 90, + 170, + 170, + 170, + 165, + 85, + 85, + 85, + 90, + 170, + 170, + 170, + 165, + 85, + 85, + 85, + 86, + 154, + 170, + 170, + 170, + 153, + 169, + 101, + 145, + 150, + 154, + 154, + 169, + 106, + 149, + 105, + 89, + 165, + 165, + 150, + 150, + 170, + 153, + 85, + 85, + 85, + 85, + 85, + 85, + 170, + 170, + 170, + 165, + 85, + 85, + 89, + 90, + 170, + 170, + 170, + 169, + 85, + 85, + 85, + 90, + 170, + 170, + 170, + 149, + 85, + 85, + 85, + 86, + 170, + 170, + 170, + 169, + 85, + 85, + 86, + 90, + 170, + 170, + 166, + 150, + 90, + 89, + 85, + 165, + 90, + 170, + 170, + 166, + 150, + 149, + 169, + 90, + 170, + 170, + 170, + 170, + 149, + 85, + 85, + 105, + 105, + 101, + 85, + 85, + 149, + 149, + 149, + 86, + 90, + 170, + 170, + 170, + 149, + 85, + 85, + 149, + 150, + 106, + 170, + 170, + 149, + 85, + 85, + 86, + 90, + 169, + 105, + 102, + 165, + 89, + 85, + 101, + 101, + 165, + 170, + 90, + 150, + 90, + 101, + 165, + 106, + 86, + 166, + 170, + 150, + 169, + 90, + 85, + 165, + 106, + 150, + 165, + 90, + 150, + 150, + 90, + 89, + 105, + 106, + 101, + 101, + 85, + 166, + 154, + 90, + 89, + 101, + 105, + 169, + 165, + 165, + 166, + 154, + 90, + 105, + 105, + 101, + 165, + 166, + 165, + 169, + 106, + 150, + 105, + 105, + 101, + 105, + 166, + 150, + 150, + 90, + 154, + 89, + 89, + 165, + 169, + 106, + 86, + 154, + 150, + 101, + 106, + 89, + 106, + 90, + 150, + 149, + 90, + 165, + 170, + 86, + 90, + 106, + 90, + 165, + 105, + 106, + 169, + 105, + 86, + 165, + 165, + 90, + 90, + 150, + 150, + 165, + 89, + 90, + 149, + 169, + 85, + 106, + 165, + 90, + 89, + 169, + 170, + 154, + 105, + 105, + 102, + 165, + 149, + 90, + 90, + 89, + 101, + 101, + 169, + 101, + 149, + 105, + 105, + 85, + 165, + 90, + 170, + 165, + 154, + 154, + 105, + 105, + 105, + 165, + 106, + 154, + 150, + 150, + 150, + 86, + 170, + 105, + 105, + 170, + 90, + 85, + 89, + 106, + 85, + 101, + 90, + 170, + 86, + 166, + 85, + 149, + 105, + 102, + 101, +}; +const uint8_t DPCM_two_8000[] PROGMEM = { + 102, + 170, + 165, + 105, + 166, + 105, + 150, + 89, + 101, + 150, + 101, + 102, + 153, + 150, + 106, + 154, + 102, + 102, + 165, + 153, + 101, + 106, + 101, + 154, + 89, + 89, + 154, + 85, + 165, + 86, + 169, + 89, + 166, + 154, + 165, + 165, + 85, + 105, + 86, + 101, + 149, + 150, + 85, + 89, + 101, + 106, + 89, + 105, + 150, + 102, + 89, + 105, + 153, + 105, + 90, + 165, + 166, + 86, + 150, + 86, + 166, + 90, + 90, + 166, + 153, + 106, + 150, + 153, + 101, + 85, + 86, + 85, + 149, + 86, + 149, + 105, + 85, + 89, + 101, + 85, + 106, + 153, + 106, + 86, + 170, + 153, + 154, + 86, + 169, + 153, + 105, + 90, + 102, + 153, + 169, + 102, + 154, + 170, + 105, + 90, + 150, + 86, + 89, + 106, + 86, + 86, + 90, + 85, + 105, + 85, + 86, + 86, + 149, + 150, + 165, + 165, + 150, + 153, + 101, + 101, + 150, + 149, + 105, + 150, + 90, + 86, + 106, + 106, + 149, + 169, + 166, + 154, + 101, + 165, + 166, + 150, + 89, + 149, + 150, + 150, + 86, + 90, + 105, + 166, + 153, + 165, + 89, + 86, + 149, + 154, + 154, + 86, + 166, + 165, + 153, + 90, + 85, + 150, + 89, + 89, + 86, + 85, + 153, + 89, + 101, + 102, + 105, + 89, + 101, + 89, + 154, + 101, + 86, + 102, + 101, + 85, + 166, + 90, + 85, + 154, + 101, + 90, + 101, + 105, + 165, + 166, + 150, + 166, + 85, + 153, + 154, + 149, + 150, + 165, + 102, + 89, + 102, + 169, + 165, + 170, + 166, + 170, + 170, + 154, + 106, + 105, + 169, + 170, + 101, + 150, + 165, + 149, + 85, + 149, + 89, + 149, + 101, + 86, + 85, + 85, + 102, + 89, + 101, + 86, + 85, + 85, + 85, + 85, + 85, + 149, + 153, + 153, + 153, + 149, + 102, + 102, + 102, + 102, + 102, + 120, + 202, + 38, + 159, + 44, + 199, + 51, + 140, + 204, + 179, + 50, + 204, + 202, + 51, + 53, + 204, + 215, + 51, + 108, + 140, + 222, + 51, + 33, + 202, + 103, + 57, + 156, + 114, + 40, + 205, + 163, + 107, + 76, + 89, + 162, + 102, + 102, + 42, + 89, + 214, + 89, + 140, + 179, + 50, + 204, + 141, + 39, + 37, + 204, + 230, + 51, + 44, + 206, + 51, + 39, + 204, + 197, + 115, + 57, + 106, + 86, + 154, + 102, + 156, + 230, + 109, + 167, + 37, + 218, + 102, + 154, + 149, + 166, + 105, + 154, + 102, + 153, + 166, + 153, + 166, + 85, + 166, + 106, + 150, + 101, + 169, + 105, + 102, + 169, + 166, + 85, + 150, + 102, + 154, + 150, + 89, + 90, + 89, + 106, + 89, + 166, + 170, + 170, + 170, + 165, + 85, + 85, + 85, + 80, + 20, + 84, + 249, + 254, + 246, + 128, + 128, + 87, + 239, + 239, + 154, + 4, + 5, + 41, + 100, + 0, + 0, + 250, + 254, + 226, + 64, + 64, + 91, + 239, + 255, + 153, + 5, + 5, + 170, + 190, + 64, + 0, + 1, + 254, + 255, + 164, + 64, + 16, + 27, + 255, + 254, + 80, + 0, + 82, + 255, + 255, + 128, + 0, + 0, + 0, + 47, + 255, + 248, + 80, + 1, + 129, + 255, + 255, + 210, + 128, + 5, + 11, + 251, + 255, + 91, + 65, + 80, + 21, + 0, + 15, + 219, + 253, + 169, + 1, + 64, + 191, + 191, + 235, + 208, + 5, + 7, + 235, + 255, + 90, + 65, + 165, + 126, + 170, + 64, + 0, + 11, + 255, + 254, + 149, + 0, + 0, + 127, + 255, + 249, + 144, + 0, + 2, + 255, + 255, + 149, + 64, + 5, + 91, + 255, + 250, + 80, + 0, + 0, + 5, + 191, + 255, + 244, + 0, + 1, + 86, + 255, + 255, + 148, + 0, + 6, + 107, + 255, + 170, + 64, + 0, + 26, + 175, + 254, + 169, + 85, + 169, + 111, + 165, + 148, + 1, + 0, + 80, + 111, + 255, + 253, + 64, + 0, + 85, + 171, + 250, + 249, + 64, + 64, + 90, + 171, + 250, + 165, + 65, + 85, + 170, + 170, + 170, + 85, + 85, + 86, + 170, + 170, + 171, + 209, + 165, + 150, + 149, + 69, + 6, + 170, + 154, + 139, + 234, + 235, + 65, + 85, + 86, + 154, + 171, + 154, + 85, + 86, + 86, + 170, + 154, + 153, + 86, + 85, + 90, + 154, + 170, + 90, + 85, + 90, + 90, + 170, + 106, + 169, + 89, + 90, + 169, + 165, + 89, + 165, + 105, + 80, + 84, + 86, + 254, + 251, + 228, + 64, + 64, + 170, + 171, + 250, + 149, + 80, + 85, + 150, + 170, + 166, + 149, + 85, + 86, + 90, + 170, + 170, + 149, + 85, + 85, + 90, + 170, + 170, + 150, + 149, + 86, + 86, + 150, + 170, + 150, + 154, + 85, + 85, + 5, + 90, + 111, + 254, + 169, + 84, + 21, + 89, + 174, + 170, + 169, + 85, + 85, + 85, + 170, + 170, + 169, + 85, + 85, + 85, + 170, + 170, + 170, + 149, + 85, + 85, + 170, + 170, + 170, + 149, + 85, + 86, + 169, + 86, + 149, + 86, + 170, + 154, + 170, + 85, + 85, + 85, + 90, + 175, + 250, + 169, + 85, + 85, + 85, + 170, + 170, + 170, + 149, + 85, + 85, + 170, + 170, + 170, + 149, + 85, + 85, + 90, + 170, + 170, + 149, + 85, + 85, + 86, + 170, + 170, + 169, + 85, + 85, + 106, + 170, + 170, + 165, + 85, + 85, + 86, + 170, + 170, + 165, + 85, + 85, + 170, + 170, + 170, + 149, + 85, + 85, + 90, + 170, + 170, + 165, + 85, + 85, + 86, + 170, + 170, + 170, + 85, + 85, + 85, + 106, + 170, + 170, + 169, + 85, + 85, + 86, + 170, + 170, + 170, + 149, + 85, + 85, + 85, + 85, + 106, + 170, + 170, + 170, + 85, + 85, + 85, + 90, + 170, + 165, + 85, + 85, + 106, + 170, + 170, + 165, + 85, + 85, + 86, + 170, + 170, + 170, + 85, + 85, + 85, + 90, + 170, + 170, + 169, + 85, + 85, + 90, + 170, + 170, + 169, + 85, + 85, + 85, + 106, + 170, + 170, + 165, + 85, + 85, + 86, + 170, + 170, + 166, + 85, + 85, + 86, + 170, + 165, + 85, + 86, + 170, + 170, + 170, + 149, + 85, + 85, + 85, + 165, + 170, + 170, + 170, + 170, + 150, + 85, + 85, + 90, + 106, + 170, + 169, + 101, + 85, + 85, + 86, + 170, + 149, + 90, + 170, + 170, + 170, + 149, + 85, + 85, + 85, + 170, + 170, + 90, + 169, + 85, + 90, + 169, + 106, + 170, + 85, + 101, + 85, + 86, + 170, + 85, + 154, + 85, + 86, + 170, + 165, + 154, + 165, + 90, + 165, + 85, + 101, + 85, + 170, + 170, + 170, + 170, + 170, + 170, + 170, + 170, + 169, + 85, + 85, + 85, + 85, + 170, + 170, + 85, + 85, + 90, + 170, + 170, + 169, + 85, + 170, + 169, + 170, + 85, + 85, + 90, + 170, + 169, + 85, + 85, + 170, + 170, + 165, + 85, + 85, + 86, + 90, + 90, + 106, + 170, + 106, + 169, + 85, + 105, + 106, + 165, + 165, + 85, + 170, + 165, + 165, + 149, + 150, + 150, + 150, + 150, + 86, + 169, + 106, + 89, + 165, + 90, + 150, + 154, + 86, + 149, + 85, + 101, + 154, + 169, + 90, + 86, + 150, + 169, + 106, + 105, + 85, + 86, + 101, + 166, + 165, + 169, + 85, + 150, + 150, + 166, + 149, + 90, + 89, + 165, + 86, + 89, + 106, + 170, + 150, + 105, + 105, + 101, + 165, + 149, + 90, + 90, + 89, + 101, + 102, + 105, + 101, + 149, + 105, + 105, + 85, + 165, + 90, + 170, + 165, + 154, + 150, + 105, + 105, + 105, + 165, + 106, + 154, + 150, + 150, + 150, + 86, + 170, + 105, + 105, + 170, + 90, + 149, + 89, + 106, + 85, + 101, + 90, + 166, + 86, + 166, + 85, + 149, + 89, + 86, + 101, +}; +const uint8_t DPCM_three_8000[] PROGMEM = { + 102, + 170, + 165, + 105, + 166, + 105, + 150, + 89, + 105, + 150, + 101, + 102, + 153, + 150, + 106, + 154, + 102, + 101, + 165, + 153, + 165, + 106, + 101, + 154, + 89, + 89, + 150, + 101, + 165, + 86, + 169, + 89, + 166, + 154, + 101, + 153, + 86, + 105, + 102, + 101, + 150, + 85, + 85, + 89, + 85, + 106, + 89, + 105, + 150, + 106, + 89, + 105, + 154, + 105, + 90, + 165, + 166, + 86, + 150, + 86, + 166, + 90, + 90, + 166, + 149, + 106, + 150, + 153, + 101, + 85, + 86, + 85, + 149, + 149, + 85, + 105, + 101, + 89, + 102, + 149, + 150, + 166, + 90, + 166, + 154, + 85, + 170, + 89, + 102, + 89, + 150, + 105, + 86, + 150, + 165, + 170, + 165, + 150, + 154, + 89, + 169, + 106, + 89, + 150, + 169, + 149, + 89, + 101, + 166, + 85, + 169, + 153, + 89, + 86, + 102, + 90, + 166, + 86, + 169, + 153, + 149, + 86, + 90, + 169, + 86, + 105, + 85, + 150, + 106, + 89, + 101, + 86, + 165, + 154, + 89, + 106, + 89, + 150, + 102, + 105, + 106, + 101, + 85, + 101, + 153, + 154, + 106, + 89, + 166, + 105, + 150, + 89, + 90, + 89, + 101, + 149, + 165, + 166, + 89, + 106, + 85, + 169, + 106, + 90, + 165, + 101, + 153, + 165, + 105, + 170, + 149, + 102, + 149, + 90, + 154, + 166, + 150, + 165, + 154, + 90, + 153, + 169, + 165, + 153, + 89, + 149, + 106, + 165, + 153, + 101, + 153, + 105, + 85, + 85, + 102, + 101, + 101, + 150, + 86, + 166, + 101, + 90, + 165, + 89, + 85, + 153, + 90, + 170, + 102, + 105, + 120, + 102, + 153, + 150, + 86, + 106, + 90, + 86, + 149, + 149, + 101, + 105, + 105, + 170, + 106, + 153, + 165, + 106, + 86, + 165, + 106, + 90, + 106, + 169, + 149, + 86, + 150, + 90, + 166, + 101, + 149, + 165, + 90, + 150, + 169, + 90, + 150, + 106, + 85, + 85, + 85, + 85, + 150, + 170, + 170, + 234, + 170, + 149, + 86, + 150, + 186, + 150, + 149, + 85, + 100, + 86, + 69, + 89, + 47, + 170, + 190, + 85, + 85, + 26, + 169, + 106, + 154, + 169, + 150, + 150, + 86, + 85, + 85, + 165, + 85, + 86, + 234, + 170, + 165, + 106, + 85, + 90, + 150, + 169, + 91, + 229, + 165, + 164, + 85, + 69, + 85, + 21, + 91, + 230, + 251, + 145, + 85, + 21, + 170, + 154, + 169, + 91, + 209, + 154, + 144, + 97, + 129, + 85, + 69, + 254, + 127, + 249, + 2, + 144, + 91, + 249, + 170, + 165, + 126, + 22, + 169, + 1, + 80, + 17, + 20, + 127, + 219, + 254, + 64, + 100, + 6, + 255, + 155, + 229, + 91, + 149, + 106, + 144, + 20, + 16, + 21, + 127, + 159, + 254, + 64, + 100, + 6, + 255, + 155, + 229, + 110, + 84, + 106, + 64, + 80, + 0, + 22, + 254, + 191, + 228, + 2, + 128, + 111, + 250, + 191, + 70, + 244, + 6, + 164, + 10, + 0, + 1, + 111, + 235, + 254, + 64, + 96, + 10, + 255, + 191, + 213, + 189, + 2, + 229, + 6, + 64, + 0, + 15, + 247, + 255, + 64, + 96, + 6, + 250, + 255, + 85, + 188, + 11, + 149, + 26, + 0, + 64, + 31, + 199, + 254, + 2, + 128, + 107, + 219, + 248, + 190, + 128, + 164, + 42, + 144, + 64, + 1, + 127, + 63, + 249, + 4, + 5, + 10, + 191, + 239, + 153, + 20, + 26, + 90, + 84, + 4, + 1, + 252, + 255, + 154, + 64, + 112, + 47, + 255, + 245, + 244, + 5, + 66, + 149, + 64, + 0, + 79, + 207, + 251, + 212, + 8, + 11, + 239, + 253, + 189, + 25, + 1, + 160, + 164, + 4, + 2, + 242, + 249, + 249, + 2, + 3, + 199, + 254, + 191, + 15, + 1, + 80, + 96, + 20, + 5, + 241, + 252, + 248, + 1, + 3, + 135, + 255, + 255, + 94, + 5, + 0, + 80, + 16, + 21, + 242, + 245, + 244, + 0, + 6, + 15, + 175, + 255, + 105, + 20, + 0, + 64, + 0, + 91, + 207, + 203, + 193, + 64, + 16, + 185, + 255, + 253, + 180, + 20, + 4, + 4, + 21, + 126, + 126, + 125, + 20, + 0, + 6, + 159, + 255, + 175, + 89, + 0, + 1, + 1, + 71, + 235, + 251, + 230, + 128, + 0, + 86, + 251, + 251, + 214, + 128, + 0, + 0, + 81, + 175, + 190, + 189, + 164, + 0, + 5, + 110, + 255, + 246, + 209, + 64, + 0, + 16, + 151, + 239, + 239, + 169, + 64, + 1, + 70, + 251, + 247, + 214, + 64, + 0, + 1, + 91, + 239, + 239, + 169, + 65, + 1, + 27, + 159, + 175, + 89, + 0, + 0, + 5, + 110, + 255, + 254, + 165, + 84, + 20, + 121, + 250, + 246, + 144, + 64, + 0, + 86, + 239, + 255, + 250, + 149, + 65, + 90, + 126, + 189, + 164, + 80, + 16, + 21, + 171, + 255, + 234, + 149, + 85, + 90, + 110, + 125, + 165, + 80, + 0, + 86, + 171, + 255, + 234, + 149, + 85, + 90, + 109, + 185, + 165, + 80, + 0, + 86, + 171, + 255, + 170, + 149, + 85, + 105, + 170, + 170, + 85, + 65, + 85, + 90, + 171, + 250, + 170, + 85, + 85, + 166, + 166, + 150, + 85, + 85, + 85, + 106, + 174, + 170, + 169, + 85, + 86, + 106, + 170, + 85, + 85, + 85, + 90, + 170, + 170, + 170, + 165, + 85, + 90, + 170, + 169, + 85, + 85, + 85, + 106, + 170, + 170, + 170, + 150, + 86, + 89, + 85, + 85, + 85, + 86, + 170, + 170, + 170, + 169, + 85, + 89, + 105, + 149, + 85, + 85, + 86, + 170, + 170, + 170, + 170, + 169, + 85, + 85, + 85, + 85, + 85, + 170, + 170, + 170, + 170, + 166, + 149, + 85, + 85, + 85, + 85, + 90, + 170, + 170, + 170, + 170, + 85, + 85, + 85, + 85, + 85, + 86, + 170, + 170, + 170, + 170, + 85, + 85, + 85, + 85, + 85, + 85, + 170, + 170, + 170, + 170, + 149, + 85, + 85, + 85, + 85, + 85, + 170, + 170, + 170, + 169, + 149, + 85, + 85, + 85, + 85, + 170, + 170, + 170, + 170, + 150, + 85, + 85, + 85, + 85, + 90, + 170, + 170, + 169, + 165, + 86, + 150, + 85, + 85, + 85, + 154, + 170, + 170, + 170, + 85, + 89, + 85, + 85, + 154, + 90, + 106, + 170, + 170, + 85, + 85, + 86, + 85, + 165, + 166, + 150, + 90, + 166, + 166, + 150, + 89, + 85, + 166, + 166, + 150, + 169, + 101, + 166, + 150, + 90, + 105, + 166, + 90, + 105, + 101, + 150, + 149, + 105, + 102, + 86, + 149, + 150, + 154, + 90, + 90, + 150, + 150, + 90, + 90, + 150, + 150, + 169, + 165, + 165, + 85, + 105, + 105, + 105, + 90, + 90, + 90, + 86, + 150, + 90, + 90, + 150, + 150, + 150, + 150, + 150, + 149, + 165, + 165, + 170, + 90, + 101, + 165, + 170, + 90, + 90, + 150, + 165, + 165, + 169, + 90, + 105, + 90, + 154, + 149, + 166, + 165, + 170, + 150, + 165, + 105, + 105, + 90, + 90, + 102, + 150, + 150, + 149, + 169, + 101, + 165, + 86, + 165, + 102, + 90, + 90, + 90, + 149, + 166, + 86, + 154, + 85, + 165, + 165, + 169, + 105, + 90, + 86, + 150, + 149, + 105, + 105, + 106, + 153, + 85, + 165, + 106, + 154, + 90, + 165, + 106, + 165, + 86, + 150, + 105, + 101, + 170, + 85, + 149, + 90, + 89, + 85, + 86, + 154, + 85, + 101, + 154, + 154, + 169, + 102, + 150, + 150, + 106, + 89, + 101, + 165, + 165, + 150, + 86, + 102, + 150, + 89, + 86, + 150, + 149, + 90, + 85, + 170, + 170, + 89, + 169, + 166, + 150, + 150, + 154, + 86, + 169, + 169, + 105, + 105, + 101, + 106, + 166, +}; +const uint8_t DPCM_four_8000[] PROGMEM = { + 102, + 170, + 165, + 105, + 165, + 105, + 150, + 89, + 101, + 154, + 101, + 102, + 153, + 150, + 106, + 154, + 102, + 102, + 165, + 153, + 165, + 106, + 101, + 154, + 105, + 89, + 154, + 85, + 165, + 86, + 169, + 153, + 166, + 154, + 166, + 165, + 85, + 105, + 86, + 85, + 154, + 85, + 149, + 89, + 101, + 106, + 89, + 106, + 150, + 102, + 89, + 105, + 170, + 105, + 90, + 165, + 166, + 90, + 150, + 86, + 166, + 90, + 90, + 166, + 153, + 106, + 150, + 153, + 101, + 85, + 86, + 85, + 149, + 149, + 86, + 89, + 101, + 89, + 101, + 85, + 166, + 154, + 166, + 150, + 170, + 90, + 105, + 154, + 169, + 150, + 150, + 106, + 101, + 149, + 169, + 85, + 153, + 150, + 86, + 86, + 166, + 101, + 89, + 150, + 149, + 150, + 89, + 150, + 85, + 149, + 105, + 101, + 149, + 89, + 154, + 102, + 102, + 170, + 165, + 165, + 149, + 170, + 153, + 102, + 86, + 149, + 106, + 169, + 165, + 149, + 166, + 154, + 101, + 89, + 101, + 101, + 170, + 165, + 86, + 149, + 165, + 165, + 90, + 85, + 150, + 90, + 169, + 86, + 165, + 106, + 86, + 166, + 86, + 154, + 149, + 170, + 150, + 149, + 101, + 169, + 106, + 165, + 154, + 149, + 85, + 169, + 154, + 90, + 90, + 149, + 101, + 105, + 90, + 150, + 105, + 165, + 90, + 85, + 106, + 165, + 105, + 154, + 106, + 86, + 165, + 165, + 101, + 170, + 86, + 150, + 105, + 89, + 102, + 153, + 165, + 105, + 90, + 90, + 150, + 153, + 166, + 105, + 165, + 86, + 150, + 105, + 150, + 150, + 85, + 169, + 90, + 170, + 102, + 154, + 90, + 89, + 102, + 85, + 165, + 153, + 90, + 86, + 165, + 102, + 153, + 150, + 86, + 150, + 165, + 105, + 101, + 105, + 166, + 102, + 150, + 153, + 154, + 105, + 89, + 101, + 165, + 150, + 86, + 150, + 90, + 90, + 101, + 105, + 105, + 105, + 166, + 105, + 153, + 101, + 101, + 89, + 165, + 106, + 89, + 86, + 101, + 170, + 165, + 150, + 105, + 153, + 150, + 166, + 154, + 150, + 165, + 101, + 101, + 150, + 165, + 105, + 105, + 106, + 169, + 166, + 150, + 105, + 169, + 101, + 165, + 154, + 105, + 90, + 90, + 90, + 150, + 149, + 89, + 150, + 90, + 106, + 90, + 90, + 89, + 105, + 105, + 105, + 90, + 166, + 89, + 165, + 165, + 154, + 166, + 101, + 169, + 169, + 105, + 101, + 106, + 105, + 166, + 85, + 165, + 165, + 170, + 86, + 165, + 150, + 150, + 149, + 165, + 102, + 86, + 153, + 150, + 101, + 169, + 106, + 86, + 90, + 149, + 169, + 154, + 149, + 166, + 86, + 105, + 154, + 90, + 89, + 106, + 101, + 101, + 169, + 154, + 101, + 166, + 101, + 165, + 149, + 106, + 150, + 149, + 165, + 154, + 90, + 86, + 153, + 102, + 166, + 101, + 153, + 102, + 106, + 105, + 169, + 165, + 169, + 102, + 106, + 89, + 154, + 150, + 150, + 150, + 150, + 105, + 150, + 105, + 150, + 153, + 106, + 106, + 90, + 106, + 138, + 150, + 105, + 165, + 90, + 102, + 154, + 89, + 105, + 90, + 90, + 89, + 165, + 230, + 90, + 101, + 169, + 102, + 89, + 149, + 150, + 149, + 166, + 154, + 102, + 165, + 165, + 151, + 150, + 165, + 150, + 138, + 86, + 166, + 105, + 165, + 166, + 150, + 153, + 153, + 101, + 153, + 86, + 165, + 153, + 102, + 101, + 169, + 85, + 170, + 149, + 165, + 169, + 89, + 89, + 150, + 90, + 166, + 149, + 165, + 154, + 106, + 153, + 102, + 90, + 89, + 165, + 105, + 105, + 105, + 166, + 154, + 89, + 165, + 165, + 41, + 149, + 166, + 89, + 86, + 168, + 169, + 106, + 89, + 149, + 105, + 89, + 166, + 168, + 117, + 89, + 166, + 165, + 105, + 150, + 89, + 153, + 102, + 165, + 158, + 22, + 154, + 90, + 165, + 154, + 105, + 165, + 105, + 105, + 106, + 145, + 153, + 90, + 86, + 135, + 150, + 86, + 150, + 154, + 164, + 106, + 85, + 150, + 165, + 154, + 106, + 169, + 85, + 90, + 255, + 169, + 85, + 85, + 85, + 85, + 64, + 21, + 85, + 95, + 255, + 228, + 0, + 21, + 106, + 255, + 234, + 85, + 85, + 170, + 165, + 84, + 0, + 0, + 11, + 255, + 253, + 0, + 1, + 106, + 191, + 255, + 144, + 1, + 111, + 254, + 169, + 64, + 0, + 1, + 111, + 255, + 244, + 0, + 1, + 191, + 255, + 254, + 64, + 1, + 111, + 255, + 249, + 0, + 0, + 1, + 91, + 255, + 253, + 0, + 1, + 191, + 255, + 255, + 128, + 0, + 111, + 255, + 254, + 80, + 0, + 1, + 85, + 95, + 255, + 244, + 0, + 11, + 255, + 255, + 254, + 64, + 0, + 127, + 255, + 249, + 0, + 0, + 5, + 85, + 7, + 255, + 253, + 0, + 2, + 255, + 250, + 175, + 228, + 0, + 11, + 255, + 254, + 80, + 0, + 1, + 89, + 80, + 31, + 255, + 244, + 0, + 11, + 255, + 170, + 191, + 228, + 0, + 27, + 255, + 254, + 144, + 0, + 1, + 89, + 80, + 6, + 255, + 254, + 0, + 1, + 191, + 234, + 171, + 250, + 64, + 1, + 191, + 255, + 169, + 80, + 0, + 5, + 105, + 64, + 11, + 255, + 248, + 0, + 6, + 255, + 170, + 175, + 249, + 0, + 6, + 255, + 254, + 170, + 84, + 0, + 5, + 170, + 80, + 7, + 255, + 254, + 0, + 1, + 191, + 234, + 171, + 250, + 64, + 0, + 111, + 255, + 165, + 85, + 85, + 1, + 85, + 85, + 0, + 27, + 255, + 253, + 0, + 1, + 191, + 250, + 170, + 250, + 80, + 0, + 111, + 255, + 165, + 85, + 85, + 85, + 85, + 85, + 0, + 127, + 255, + 224, + 0, + 11, + 255, + 234, + 170, + 165, + 0, + 6, + 255, + 250, + 80, + 5, + 85, + 85, + 85, + 64, + 111, + 255, + 248, + 0, + 6, + 255, + 250, + 170, + 165, + 0, + 6, + 255, + 254, + 80, + 5, + 85, + 85, + 85, + 64, + 27, + 255, + 248, + 0, + 6, + 255, + 234, + 170, + 165, + 0, + 7, + 255, + 249, + 64, + 5, + 85, + 85, + 85, + 64, + 111, + 255, + 224, + 0, + 27, + 255, + 170, + 170, + 80, + 1, + 111, + 255, + 148, + 0, + 21, + 85, + 85, + 84, + 27, + 255, + 248, + 0, + 26, + 254, + 170, + 186, + 80, + 1, + 191, + 255, + 149, + 0, + 85, + 85, + 85, + 84, + 27, + 255, + 228, + 0, + 26, + 170, + 191, + 249, + 0, + 26, + 255, + 250, + 84, + 0, + 85, + 85, + 85, + 86, + 255, + 249, + 0, + 6, + 170, + 171, + 250, + 64, + 22, + 255, + 250, + 148, + 1, + 85, + 85, + 85, + 91, + 255, + 228, + 0, + 86, + 170, + 255, + 164, + 1, + 106, + 255, + 233, + 64, + 21, + 85, + 85, + 86, + 191, + 249, + 0, + 21, + 106, + 255, + 228, + 1, + 106, + 171, + 234, + 80, + 21, + 85, + 65, + 86, + 175, + 254, + 64, + 5, + 86, + 255, + 229, + 1, + 106, + 171, + 250, + 80, + 85, + 85, + 85, + 85, + 111, + 254, + 64, + 85, + 86, + 255, + 148, + 85, + 85, + 175, + 229, + 85, + 85, + 85, + 85, + 86, + 191, + 233, + 5, + 65, + 111, + 249, + 86, + 148, + 90, + 250, + 85, + 84, + 5, + 85, + 86, + 191, + 249, + 85, + 80, + 107, + 250, + 106, + 81, + 91, + 233, + 170, + 80, + 5, + 85, + 90, + 255, + 149, + 85, + 65, + 191, + 170, + 165, + 85, + 170, + 170, + 149, + 0, + 85, + 86, + 191, + 229, + 85, + 81, + 111, + 170, + 165, + 85, + 170, + 169, + 84, + 5, + 85, + 91, + 254, + 85, + 85, + 27, + 234, + 170, + 149, + 106, + 170, + 85, + 64, + 85, + 86, + 191, + 149, + 85, + 86, + 186, + 170, + 165, + 90, + 90, + 85, + 65, + 101, + 91, + 253, + 26, + 148, + 27, + 230, + 170, + 144, + 105, + 85, + 85, + 85, + 86, + 254, + 86, + 149, + 26, + 170, + 170, + 164, + 89, + 90, + 85, + 85, + 85, + 175, + 170, + 165, + 85, + 170, + 170, + 169, + 85, + 85, + 85, + 85, + 106, + 107, + 170, + 165, + 85, + 110, + 154, + 165, + 86, + 149, + 85, + 85, + 106, + 170, + 170, + 149, + 101, + 170, + 170, + 149, + 85, + 85, + 85, + 85, + 170, + 170, + 169, + 85, + 90, + 154, + 169, + 85, + 85, + 85, + 101, + 90, + 106, + 154, + 165, + 165, + 170, + 170, + 149, + 165, + 85, + 85, + 85, + 170, + 170, + 106, + 149, + 170, + 86, + 169, + 90, + 149, + 85, + 85, + 169, + 106, + 170, + 106, + 149, + 90, + 149, + 169, + 105, + 85, + 85, + 90, + 150, + 154, + 166, + 170, + 169, + 90, + 154, + 165, + 169, + 85, + 85, + 85, + 90, + 169, + 90, + 169, + 170, + 149, + 106, + 86, + 165, + 169, + 85, + 89, + 86, + 165, + 106, + 166, + 170, + 170, + 149, + 90, + 170, + 165, + 85, + 85, + 170, + 170, + 165, + 90, + 170, + 170, + 85, + 85, + 169, + 90, + 85, + 86, + 154, + 170, + 90, + 150, + 170, + 170, + 165, + 90, + 86, + 149, + 85, + 165, + 106, + 154, + 165, + 106, + 150, + 165, + 105, + 85, + 106, + 90, + 149, + 90, + 150, + 165, + 165, + 165, + 169, + 89, + 85, + 170, + 90, + 86, + 149, + 169, + 106, + 86, + 165, + 169, + 105, + 90, + 169, + 90, + 86, + 86, + 150, + 149, + 169, + 90, + 149, + 165, + 105, + 105, + 90, + 86, + 149, + 165, + 165, + 105, + 90, + 86, + 170, + 150, + 149, + 165, + 165, + 169, + 106, + 90, + 154, + 86, + 165, + 90, + 86, + 149, + 165, + 169, + 90, + 149, + 101, + 106, + 169, + 89, + 106, + 90, + 86, + 150, + 149, + 165, + 85, + 89, + 165, + 106, + 106, + 90, + 165, + 165, + 150, + 149, + 165, + 105, + 165, + 169, + 101, + 153, + 102, + 101, + 106, + 86, + 153, + 90, + 90, + 165, + 90, + 86, + 89, + 105, + 85, + 165, + 154, + 165, + 86, + 85, + 165, + 149, + 149, + 106, + 165, + 90, + 89, + 169, + 170, + 150, + 105, + 105, + 101, + 165, + 150, + 90, + 90, + 89, + 101, + 102, + 105, + 101, + 149, + 105, + 105, + 85, + 165, + 86, + 169, + 165, + 154, + 150, + 105, + 105, + 105, + 165, + 106, + 154, + 150, + 150, + 150, + 86, + 170, + 101, + 105, + 170, + 90, + 149, + 89, + 105, + 85, + 101, + 90, + 170, + 86, + 166, + 85, + 149, + 89, + 101, + 169, + 170, +}; +const uint8_t DPCM_five_8000[] PROGMEM = { + 102, + 170, + 165, + 105, + 165, + 105, + 150, + 89, + 101, + 154, + 101, + 102, + 153, + 150, + 106, + 154, + 102, + 101, + 165, + 153, + 101, + 106, + 101, + 154, + 90, + 85, + 154, + 85, + 165, + 86, + 169, + 89, + 166, + 154, + 149, + 165, + 85, + 105, + 90, + 101, + 150, + 85, + 85, + 89, + 101, + 106, + 89, + 106, + 150, + 102, + 89, + 105, + 170, + 105, + 90, + 165, + 166, + 102, + 150, + 150, + 154, + 90, + 90, + 166, + 153, + 106, + 150, + 153, + 102, + 85, + 86, + 85, + 149, + 101, + 86, + 85, + 150, + 85, + 102, + 89, + 166, + 106, + 89, + 102, + 150, + 150, + 86, + 149, + 154, + 165, + 169, + 150, + 90, + 153, + 105, + 102, + 150, + 165, + 170, + 101, + 150, + 101, + 150, + 170, + 154, + 150, + 86, + 105, + 85, + 169, + 90, + 89, + 102, + 169, + 153, + 85, + 106, + 85, + 105, + 150, + 165, + 90, + 86, + 169, + 90, + 165, + 106, + 86, + 169, + 106, + 149, + 166, + 90, + 86, + 149, + 165, + 166, + 150, + 150, + 165, + 106, + 89, + 150, + 153, + 101, + 90, + 149, + 169, + 86, + 153, + 86, + 85, + 169, + 89, + 101, + 165, + 166, + 90, + 165, + 154, + 90, + 101, + 105, + 101, + 166, + 102, + 150, + 153, + 90, + 105, + 154, + 153, + 106, + 105, + 165, + 166, + 150, + 153, + 102, + 153, + 89, + 166, + 101, + 105, + 106, + 90, + 101, + 150, + 89, + 150, + 166, + 89, + 105, + 165, + 90, + 101, + 170, + 89, + 154, + 166, + 165, + 165, + 153, + 154, + 102, + 154, + 90, + 149, + 153, + 105, + 101, + 153, + 166, + 150, + 153, + 90, + 102, + 154, + 150, + 90, + 90, + 106, + 105, + 153, + 101, + 166, + 150, + 165, + 153, + 105, + 166, + 166, + 90, + 153, + 101, + 154, + 106, + 101, + 154, + 105, + 105, + 105, + 165, + 149, + 166, + 169, + 101, + 166, + 90, + 86, + 150, + 89, + 101, + 165, + 166, + 154, + 166, + 149, + 153, + 102, + 101, + 169, + 101, + 154, + 90, + 150, + 101, + 101, + 165, + 165, + 150, + 89, + 101, + 89, + 102, + 101, + 165, + 154, + 105, + 150, + 169, + 90, + 86, + 102, + 154, + 89, + 105, + 166, + 166, + 89, + 166, + 154, + 89, + 102, + 105, + 89, + 150, + 101, + 153, + 166, + 153, + 101, + 154, + 90, + 90, + 89, + 150, + 102, + 154, + 105, + 154, + 102, + 150, + 165, + 166, + 89, + 150, + 101, + 166, + 154, + 105, + 105, + 106, + 102, + 153, + 101, + 153, + 101, + 170, + 149, + 166, + 150, + 154, + 101, + 169, + 105, + 90, + 166, + 102, + 150, + 154, + 105, + 154, + 105, + 106, + 90, + 89, + 102, + 166, + 169, + 102, + 89, + 85, + 86, + 149, + 102, + 170, + 169, + 85, + 153, + 166, + 105, + 90, + 169, + 169, + 149, + 101, + 89, + 105, + 106, + 101, + 86, + 149, + 86, + 170, + 170, + 169, + 85, + 106, + 170, + 170, + 169, + 85, + 165, + 65, + 64, + 1, + 255, + 244, + 0, + 1, + 255, + 244, + 0, + 2, + 255, + 249, + 0, + 11, + 255, + 208, + 0, + 6, + 253, + 0, + 255, + 128, + 180, + 3, + 255, + 65, + 0, + 31, + 254, + 84, + 0, + 191, + 255, + 224, + 7, + 229, + 168, + 0, + 15, + 253, + 0, + 0, + 127, + 240, + 0, + 3, + 255, + 64, + 0, + 47, + 248, + 7, + 192, + 95, + 149, + 0, + 6, + 155, + 255, + 0, + 124, + 47, + 240, + 7, + 129, + 255, + 1, + 164, + 47, + 240, + 21, + 191, + 208, + 47, + 128, + 25, + 4, + 63, + 244, + 3, + 209, + 255, + 64, + 120, + 31, + 240, + 42, + 65, + 254, + 2, + 144, + 127, + 208, + 47, + 144, + 1, + 64, + 11, + 254, + 0, + 184, + 127, + 208, + 47, + 7, + 252, + 11, + 144, + 191, + 129, + 164, + 31, + 254, + 64, + 91, + 144, + 5, + 0, + 107, + 255, + 0, + 62, + 111, + 240, + 31, + 129, + 253, + 11, + 224, + 63, + 145, + 165, + 27, + 250, + 169, + 127, + 64, + 189, + 0, + 65, + 169, + 191, + 192, + 47, + 75, + 244, + 15, + 208, + 190, + 7, + 228, + 31, + 208, + 105, + 7, + 249, + 27, + 214, + 147, + 248, + 2, + 248, + 5, + 1, + 110, + 191, + 64, + 62, + 91, + 240, + 31, + 193, + 253, + 11, + 224, + 63, + 144, + 165, + 91, + 228, + 26, + 154, + 244, + 46, + 15, + 192, + 47, + 65, + 184, + 31, + 224, + 127, + 128, + 188, + 15, + 240, + 63, + 130, + 248, + 11, + 208, + 63, + 66, + 244, + 27, + 224, + 106, + 70, + 249, + 85, + 111, + 66, + 248, + 7, + 224, + 105, + 7, + 144, + 191, + 240, + 3, + 219, + 253, + 6, + 249, + 42, + 81, + 249, + 6, + 229, + 90, + 70, + 185, + 85, + 165, + 170, + 85, + 174, + 86, + 173, + 10, + 252, + 31, + 128, + 252, + 7, + 208, + 127, + 111, + 64, + 62, + 170, + 224, + 111, + 129, + 170, + 27, + 144, + 126, + 85, + 165, + 107, + 149, + 106, + 90, + 165, + 90, + 166, + 229, + 90, + 168, + 22, + 191, + 64, + 190, + 26, + 64, + 165, + 7, + 235, + 240, + 11, + 155, + 248, + 11, + 244, + 105, + 70, + 244, + 27, + 150, + 169, + 10, + 229, + 105, + 86, + 233, + 86, + 150, + 169, + 86, + 229, + 106, + 87, + 149, + 85, + 244, + 3, + 223, + 208, + 11, + 148, + 42, + 106, + 126, + 0, + 184, + 126, + 128, + 250, + 71, + 145, + 126, + 5, + 169, + 106, + 65, + 185, + 90, + 149, + 170, + 86, + 149, + 106, + 85, + 170, + 90, + 85, + 106, + 81, + 188, + 43, + 208, + 170, + 154, + 65, + 106, + 6, + 90, + 166, + 240, + 23, + 131, + 233, + 11, + 149, + 189, + 27, + 224, + 106, + 86, + 229, + 106, + 86, + 165, + 90, + 149, + 165, + 90, + 149, + 165, + 91, + 208, + 170, + 75, + 129, + 190, + 31, + 65, + 249, + 47, + 129, + 180, + 26, + 149, + 163, + 240, + 91, + 71, + 228, + 31, + 70, + 184, + 30, + 149, + 165, + 106, + 149, + 165, + 90, + 149, + 169, + 90, + 149, + 169, + 106, + 149, + 185, + 90, + 149, + 165, + 90, + 225, + 186, + 7, + 145, + 189, + 11, + 144, + 184, + 27, + 144, + 248, + 27, + 130, + 244, + 31, + 66, + 244, + 47, + 70, + 228, + 110, + 86, + 164, + 106, + 90, + 149, + 169, + 90, + 149, + 169, + 106, + 86, + 165, + 169, + 86, + 165, + 111, + 7, + 213, + 110, + 26, + 84, + 105, + 106, + 146, + 240, + 58, + 3, + 224, + 169, + 11, + 149, + 184, + 30, + 86, + 164, + 105, + 86, + 149, + 169, + 90, + 86, + 165, + 106, + 105, + 105, + 102, + 149, + 106, + 139, + 130, + 149, + 110, + 10, + 85, + 100, + 105, + 164, + 126, + 15, + 65, + 248, + 126, + 6, + 145, + 249, + 90, + 70, + 165, + 169, + 90, + 86, + 165, + 105, + 90, + 150, + 165, + 105, + 90, + 86, + 164, + 110, + 102, + 240, + 184, + 107, + 71, + 134, + 149, + 106, + 89, + 252, + 61, + 6, + 225, + 244, + 90, + 75, + 214, + 165, + 26, + 90, + 165, + 165, + 105, + 106, + 149, + 149, + 106, + 106, + 105, + 89, + 106, + 85, + 166, + 151, + 225, + 164, + 110, + 11, + 86, + 84, + 169, + 95, + 195, + 192, + 125, + 63, + 10, + 65, + 245, + 189, + 90, + 70, + 230, + 185, + 25, + 26, + 166, + 165, + 101, + 106, + 154, + 209, + 165, + 105, + 90, + 85, + 244, + 181, + 106, + 70, + 130, + 144, + 105, + 107, + 241, + 240, + 105, + 31, + 139, + 128, + 100, + 126, + 106, + 65, + 150, + 250, + 169, + 21, + 90, + 170, + 165, + 85, + 90, + 230, + 165, + 85, + 110, + 110, + 89, + 85, + 102, + 166, + 149, + 85, + 105, + 111, + 79, + 65, + 160, + 189, + 126, + 6, + 67, + 230, + 248, + 25, + 26, + 155, + 229, + 148, + 106, + 111, + 154, + 85, + 86, + 170, + 150, + 85, + 105, + 189, + 105, + 81, + 150, + 170, + 165, + 5, + 85, + 126, + 61, + 1, + 65, + 246, + 249, + 85, + 10, + 155, + 249, + 164, + 21, + 107, + 170, + 149, + 85, + 106, + 170, + 149, + 144, + 165, + 170, + 86, + 150, + 244, + 184, + 25, + 22, + 149, + 165, + 102, + 230, + 229, + 85, + 10, + 155, + 170, + 100, + 25, + 106, + 170, + 149, + 85, + 106, + 170, + 150, + 85, + 85, + 110, + 91, + 85, + 85, + 170, + 170, + 149, + 64, + 85, + 106, + 170, + 111, + 95, + 85, + 100, + 105, + 106, + 149, + 145, + 166, + 150, + 214, + 150, + 90, + 90, + 89, + 105, + 105, + 105, + 169, + 101, + 90, + 150, + 149, + 84, + 21, + 90, + 171, + 249, + 244, + 5, + 66, + 234, + 250, + 89, + 69, + 85, + 174, + 170, + 85, + 85, + 106, + 171, + 229, + 244, + 26, + 90, + 166, + 165, + 84, + 5, + 90, + 190, + 254, + 161, + 80, + 85, + 171, + 234, + 149, + 85, + 90, + 170, + 170, + 101, + 85, + 101, + 170, + 170, + 90, + 150, + 149, + 85, + 85, + 85, + 86, + 191, + 175, + 149, + 84, + 26, + 170, + 170, + 165, + 85, + 85, + 170, + 170, + 149, + 90, + 150, + 170, + 170, + 149, + 85, + 85, + 85, + 85, + 85, + 170, + 170, + 169, + 105, + 85, + 169, + 90, + 85, + 165, + 106, + 149, + 165, + 90, + 154, + 154, + 154, + 154, + 105, + 85, + 85, + 85, + 85, + 85, + 86, + 170, + 170, + 150, + 169, + 90, + 149, + 165, + 90, + 86, + 165, + 86, + 149, + 105, + 169, + 170, + 166, + 166, + 101, + 89, + 86, + 85, + 150, + 90, + 90, + 154, + 170, + 90, + 166, + 166, + 150, + 86, + 169, + 150, + 153, + 105, + 150, + 101, + 105, + 89, + 154, + 86, + 149, + 86, + 150, + 149, + 169, + 106, + 89, + 153, + 105, + 106, + 150, + 89, + 105, + 105, + 154, + 149, + 165, + 105, + 90, + 153, + 105, + 86, + 154, + 86, + 154, + 89, + 106, + 101, + 102, + 154, + 86, + 150, + 149, + 165, + 154, + 102, + 153, + 154, + 86, + 153, + 105, + 105, + 106, + 90, + 149, + 169, + 154, + 101, + 166, + 102, + 150, + 90, + 154, + 89, + 150, + 102, + 165, + 153, + 154, + 105, + 165, + 105, + 106, + 150, + 150, + 166, + 169, + 106, + 150, + 153, + 89, + 90, + 105, + 90, + 85, + 165, + 170, + 86, + 170, + 89, + 166, + 90, + 150, + 169, + 89, + 85, + 165, + 106, + 86, + 149, + 170, + 90, + 85, + 106, + 106, + 149, + 105, + 90, + 149, + 169, + 90, + 150, + 154, + 90, + 101, + 85, + 165, + 165, + 86, + 165, + 170, + 85, + 90, + 85, + 106, + 90, + 106, + 90, + 165, + 105, + 90, + 154, + 149, + 165, + 105, + 90, + 149, + 106, + 85, + 149, + 86, + 86, + 165, + 90, + 149, + 165, + 90, + 149, + 169, + 106, + 154, + 149, + 166, + 149, + 105, + 86, + 165, + 106, + 165, + 89, + 85, + 165, + 149, + 85, + 89, + 165, + 90, + 89, + 169, + 170, + 150, + 105, + 105, + 101, + 165, + 150, + 90, + 90, + 89, + 101, + 102, + 105, + 165, + 149, + 105, + 89, + 85, + 165, + 90, + 170, + 165, + 154, + 150, + 105, + 105, + 105, + 165, + 106, + 154, + 150, + 150, + 150, + 86, + 170, + 105, + 105, + 170, + 90, + 149, + 89, + 106, +}; +const uint8_t DPCM_six_8000[] PROGMEM = { + 102, + 170, + 165, + 105, + 165, + 105, + 150, + 89, + 101, + 154, + 101, + 102, + 153, + 150, + 106, + 154, + 102, + 102, + 165, + 153, + 165, + 106, + 101, + 154, + 89, + 89, + 154, + 85, + 165, + 86, + 169, + 153, + 166, + 154, + 153, + 165, + 85, + 105, + 86, + 101, + 154, + 85, + 85, + 89, + 101, + 106, + 89, + 105, + 150, + 102, + 89, + 105, + 154, + 105, + 90, + 165, + 166, + 102, + 150, + 86, + 150, + 90, + 90, + 166, + 149, + 106, + 150, + 153, + 101, + 85, + 86, + 85, + 149, + 153, + 86, + 89, + 105, + 89, + 85, + 149, + 150, + 90, + 89, + 101, + 170, + 106, + 169, + 101, + 153, + 106, + 149, + 149, + 101, + 101, + 149, + 106, + 165, + 90, + 90, + 89, + 153, + 106, + 105, + 102, + 86, + 90, + 89, + 89, + 102, + 149, + 153, + 85, + 85, + 105, + 153, + 90, + 102, + 149, + 154, + 101, + 150, + 150, + 85, + 166, + 89, + 150, + 86, + 85, + 86, + 90, + 86, + 89, + 166, + 169, + 105, + 166, + 153, + 86, + 102, + 149, + 169, + 102, + 105, + 102, + 85, + 86, + 153, + 165, + 153, + 170, + 170, + 105, + 169, + 165, + 102, + 85, + 169, + 101, + 85, + 149, + 153, + 86, + 90, + 85, + 85, + 85, + 150, + 101, + 170, + 169, + 85, + 85, + 170, + 153, + 85, + 90, + 149, + 105, + 89, + 86, + 101, + 106, + 166, + 150, + 149, + 105, + 106, + 170, + 90, + 89, + 154, + 106, + 149, + 105, + 105, + 86, + 166, + 170, + 149, + 106, + 105, + 86, + 89, + 153, + 101, + 153, + 102, + 105, + 150, + 105, + 153, + 102, + 102, + 153, + 153, + 166, + 89, + 153, + 150, + 102, + 102, + 89, + 154, + 102, + 89, + 153, + 166, + 101, + 153, + 166, + 102, + 153, + 154, + 102, + 102, + 153, + 153, + 166, + 102, + 89, + 153, + 102, + 102, + 153, + 154, + 102, + 102, + 153, + 153, + 150, + 102, + 153, + 153, + 166, + 102, + 153, + 154, + 90, + 102, + 101, + 153, + 153, + 166, + 105, + 90, + 154, + 165, + 153, + 105, + 150, + 166, + 102, + 150, + 166, + 153, + 154, + 166, + 105, + 86, + 86, + 90, + 153, + 149, + 106, + 89, + 90, + 150, + 86, + 150, + 86, + 153, + 90, + 150, + 102, + 150, + 150, + 90, + 89, + 105, + 90, + 89, + 165, + 101, + 166, + 101, + 169, + 153, + 150, + 86, + 105, + 153, + 153, + 101, + 169, + 102, + 102, + 153, + 105, + 153, + 165, + 166, + 105, + 102, + 165, + 150, + 105, + 149, + 102, + 154, + 102, + 105, + 154, + 89, + 166, + 166, + 90, + 85, + 150, + 153, + 154, + 90, + 101, + 150, + 153, + 89, + 90, + 101, + 166, + 89, + 89, + 105, + 106, + 105, + 153, + 101, + 165, + 105, + 153, + 153, + 169, + 102, + 105, + 154, + 154, + 150, + 153, + 102, + 105, + 166, + 105, + 153, + 89, + 150, + 102, + 105, + 154, + 90, + 150, + 101, + 154, + 90, + 154, + 89, + 102, + 102, + 154, + 105, + 105, + 153, + 105, + 86, + 150, + 101, + 165, + 150, + 154, + 102, + 102, + 89, + 105, + 89, + 90, + 102, + 90, + 105, + 105, + 105, + 89, + 150, + 150, + 86, + 101, + 165, + 153, + 154, + 86, + 105, + 165, + 166, + 106, + 86, + 165, + 169, + 153, + 149, + 166, + 105, + 153, + 102, + 101, + 165, + 153, + 166, + 102, + 153, + 150, + 102, + 153, + 165, + 102, + 105, + 153, + 150, + 101, + 85, + 85, + 81, + 185, + 190, + 170, + 149, + 85, + 90, + 170, + 174, + 106, + 89, + 85, + 85, + 101, + 80, + 0, + 127, + 191, + 245, + 160, + 5, + 66, + 250, + 191, + 150, + 85, + 26, + 90, + 250, + 185, + 81, + 0, + 0, + 127, + 191, + 224, + 160, + 5, + 75, + 250, + 253, + 1, + 1, + 254, + 255, + 90, + 64, + 100, + 191, + 149, + 0, + 2, + 255, + 254, + 64, + 0, + 145, + 255, + 255, + 64, + 0, + 63, + 255, + 224, + 80, + 21, + 191, + 255, + 128, + 0, + 0, + 46, + 127, + 95, + 192, + 32, + 63, + 191, + 208, + 192, + 42, + 111, + 219, + 192, + 4, + 47, + 255, + 225, + 144, + 43, + 170, + 144, + 0, + 85, + 111, + 252, + 124, + 0, + 1, + 246, + 253, + 1, + 3, + 219, + 254, + 24, + 1, + 91, + 254, + 184, + 0, + 6, + 255, + 248, + 4, + 6, + 91, + 230, + 144, + 16, + 15, + 195, + 192, + 80, + 31, + 31, + 193, + 80, + 60, + 127, + 150, + 64, + 96, + 255, + 174, + 1, + 65, + 254, + 254, + 4, + 161, + 235, + 209, + 128, + 229, + 190, + 89, + 1, + 86, + 225, + 240, + 240, + 92, + 15, + 199, + 192, + 148, + 47, + 47, + 70, + 64, + 169, + 190, + 105, + 1, + 150, + 250, + 169, + 21, + 90, + 171, + 189, + 24, + 10, + 155, + 229, + 224, + 100, + 110, + 106, + 69, + 67, + 195, + 193, + 144, + 47, + 47, + 75, + 1, + 165, + 254, + 125, + 5, + 6, + 234, + 245, + 84, + 26, + 171, + 166, + 85, + 85, + 170, + 170, + 85, + 85, + 171, + 240, + 240, + 177, + 235, + 211, + 193, + 129, + 169, + 169, + 11, + 75, + 195, + 208, + 248, + 62, + 31, + 6, + 70, + 229, + 248, + 105, + 25, + 90, + 154, + 149, + 149, + 169, + 170, + 90, + 85, + 86, + 170, + 169, + 85, + 90, + 106, + 170, + 149, + 85, + 106, + 170, + 170, + 85, + 85, + 170, + 170, + 149, + 85, + 105, + 106, + 169, + 89, + 155, + 75, + 131, + 130, + 209, + 240, + 244, + 180, + 60, + 62, + 47, + 90, + 65, + 149, + 166, + 169, + 165, + 85, + 90, + 170, + 170, + 149, + 85, + 85, + 170, + 170, + 189, + 45, + 29, + 31, + 95, + 154, + 86, + 85, + 86, + 154, + 170, + 166, + 149, + 85, + 85, + 170, + 170, + 85, + 85, + 90, + 150, + 149, + 149, + 165, + 169, + 169, + 105, + 105, + 89, + 165, + 165, + 169, + 90, + 90, + 150, + 169, + 90, + 86, + 86, + 149, + 150, + 170, + 154, + 150, + 149, + 165, + 169, + 105, + 105, + 105, + 89, + 85, + 85, + 166, + 170, + 154, + 86, + 85, + 86, + 166, + 166, + 101, + 89, + 85, + 106, + 105, + 85, + 165, + 169, + 106, + 90, + 85, + 86, + 169, + 165, + 169, + 101, + 149, + 165, + 105, + 105, + 105, + 105, + 85, + 105, + 106, + 90, + 90, + 150, + 85, + 165, + 90, + 90, + 149, + 149, + 165, + 154, + 101, + 150, + 90, + 150, + 154, + 85, + 169, + 86, + 85, + 105, + 90, + 166, + 169, + 101, + 86, + 106, + 154, + 169, + 89, + 85, + 89, + 105, + 90, + 85, + 101, + 89, + 86, + 153, + 105, + 90, + 86, + 165, + 170, + 86, + 86, + 89, + 106, + 170, + 169, + 90, + 86, + 153, + 170, + 86, + 165, + 89, + 86, + 169, + 105, + 86, + 149, + 169, + 86, + 165, + 169, + 89, + 154, + 165, + 106, + 86, + 165, + 106, + 90, + 149, + 106, + 90, + 165, + 85, + 169, + 90, + 149, + 170, + 86, + 165, + 106, + 85, + 105, + 86, + 149, + 89, + 86, + 165, + 106, + 86, + 165, + 90, + 149, + 169, + 89, + 153, + 154, + 165, + 106, + 86, + 229, + 90, + 149, + 169, + 85, + 169, + 169, + 90, + 165, + 105, + 90, + 153, + 85, + 86, + 170, + 90, + 149, + 90, + 86, + 165, + 89, + 153, + 154, + 149, + 169, + 90, + 102, + 105, + 89, + 153, + 154, + 149, + 153, + 166, + 101, + 90, + 86, + 106, + 89, + 165, + 106, + 90, + 169, + 154, + 150, + 166, + 150, + 165, + 90, + 154, + 150, + 86, + 166, + 165, + 154, + 150, + 169, + 154, + 166, + 165, + 149, + 105, + 90, + 154, + 166, + 102, + 169, + 154, + 86, + 149, + 169, + 102, + 102, + 101, + 153, + 166, + 153, + 154, + 90, + 153, + 106, + 90, + 102, + 89, + 166, + 42, + 153, + 173, + 90, + 86, + 101, + 106, + 102, + 153, + 153, + 90, + 150, + 169, + 102, + 101, + 102, + 106, + 153, + 149, + 153, + 154, + 102, + 105, + 166, + 86, + 149, + 105, + 150, + 101, + 89, + 150, + 102, + 90, + 86, + 165, + 105, + 86, + 102, + 165, + 153, + 170, + 102, + 153, + 166, + 101, + 165, + 166, + 102, + 101, + 153, + 154, + 166, + 106, + 153, + 150, + 105, + 154, + 166, + 102, + 101, + 102, + 153, + 153, + 102, + 102, + 106, + 90, + 150, + 86, + 150, + 169, + 153, + 149, + 102, + 89, + 166, + 106, + 150, + 85, + 153, + 153, + 150, + 102, + 153, + 105, + 153, + 154, + 166, + 102, + 102, + 153, + 169, + 150, + 86, + 102, + 153, + 153, + 153, + 153, + 154, + 102, + 90, + 102, + 102, + 105, + 90, + 154, + 153, + 153, + 90, + 149, + 165, + 153, + 153, + 102, + 102, + 89, + 102, + 101, + 153, + 153, + 153, + 153, + 150, + 102, + 86, + 102, + 105, + 102, + 102, + 101, + 153, + 154, + 86, + 153, + 153, + 102, + 102, + 102, + 102, + 153, + 153, + 153, + 153, + 166, + 102, + 102, + 102, + 153, + 153, + 153, + 154, + 102, + 102, + 102, + 102, + 105, + 105, + 153, + 153, + 153, + 166, + 102, + 102, + 150, + 153, + 150, + 101, + 153, + 150, + 102, + 90, + 102, + 89, + 153, + 102, + 153, + 154, + 102, + 169, + 102, + 101, + 153, + 166, + 106, + 90, + 169, + 154, + 86, + 101, + 153, + 153, + 165, + 166, + 102, + 102, + 154, + 102, + 153, + 153, + 153, + 153, + 166, + 102, + 101, + 153, + 153, + 169, + 89, + 166, + 102, + 102, + 154, + 86, + 169, + 150, + 101, + 89, + 153, + 105, + 90, + 102, + 101, + 153, + 102, + 89, + 153, + 150, + 101, + 165, + 102, + 101, + 153, + 169, + 149, + 150, + 102, + 150, + 85, + 90, + 154, + 170, + 86, + 153, + 90, + 89, + 169, + 86, + 165, + 169, + 169, + 86, + 149, + 166, + 166, + 165, + 86, + 150, + 170, + 86, + 149, + 170, + 86, + 150, + 170, + 150, + 169, + 149, + 85, + 86, + 170, + 170, + 85, + 90, + 169, + 165, + 85, + 90, + 106, + 85, + 149, + 90, + 154, + 105, + 169, + 85, + 105, + 90, + 170, + 154, + 85, + 165, + 89, + 86, + 89, + 169, + 101, + 85, + 101, + 85, + 85, + 106, + 102, + 101, + 89, + 85, + 169, + 166, + 85, + 90, + 90, + 86, + 101, + 154, + 101, + 165, + 150, + 90, + 169, + 102, + 150, + 150, + 106, + 89, + 85, + 165, + 165, + 150, + 86, + 86, + 154, + 89, + 86, + 149, + 149, + 90, + 85, + 154, + 170, + 89, + 169, + 166, + 150, + 150, + 154, + 86, + 169, + 169, + 105, + 105, + 101, + 106, + 166, + 150, + 154, + 165, + 165, + 85, + 150, + 165, + 86, + 85, + 170, + 165, + 90, + 101, + 89, + 86, + 149, + 90, + 90, + 169, +}; +const uint8_t DPCM_seven_8000[] PROGMEM = { + 102, + 170, + 165, + 101, + 149, + 105, + 150, + 89, + 101, + 154, + 101, + 102, + 153, + 150, + 166, + 154, + 102, + 102, + 165, + 153, + 165, + 106, + 101, + 154, + 90, + 85, + 154, + 85, + 165, + 86, + 169, + 89, + 166, + 150, + 105, + 165, + 85, + 106, + 102, + 101, + 150, + 85, + 149, + 89, + 101, + 106, + 89, + 106, + 150, + 106, + 89, + 105, + 170, + 105, + 90, + 165, + 166, + 86, + 154, + 86, + 154, + 90, + 90, + 166, + 153, + 106, + 150, + 153, + 101, + 85, + 86, + 85, + 149, + 153, + 86, + 89, + 101, + 89, + 86, + 85, + 166, + 105, + 90, + 150, + 166, + 150, + 170, + 90, + 170, + 106, + 153, + 106, + 149, + 165, + 101, + 154, + 150, + 85, + 85, + 169, + 165, + 153, + 150, + 102, + 153, + 150, + 89, + 101, + 89, + 89, + 85, + 153, + 101, + 101, + 89, + 85, + 101, + 153, + 89, + 89, + 105, + 154, + 150, + 170, + 90, + 106, + 105, + 154, + 102, + 150, + 86, + 150, + 90, + 105, + 90, + 170, + 169, + 170, + 106, + 170, + 165, + 150, + 106, + 85, + 101, + 149, + 89, + 101, + 149, + 86, + 101, + 85, + 85, + 166, + 153, + 165, + 89, + 86, + 170, + 149, + 85, + 102, + 90, + 105, + 153, + 86, + 149, + 86, + 169, + 85, + 90, + 166, + 85, + 165, + 90, + 170, + 85, + 149, + 106, + 150, + 149, + 165, + 102, + 166, + 169, + 89, + 86, + 102, + 105, + 90, + 150, + 166, + 169, + 153, + 166, + 106, + 153, + 149, + 166, + 106, + 85, + 149, + 149, + 106, + 154, + 153, + 149, + 102, + 102, + 102, + 90, + 86, + 85, + 153, + 154, + 102, + 102, + 153, + 166, + 101, + 101, + 170, + 102, + 101, + 153, + 154, + 166, + 102, + 89, + 165, + 102, + 85, + 169, + 106, + 153, + 165, + 149, + 166, + 102, + 89, + 153, + 169, + 153, + 166, + 102, + 102, + 153, + 153, + 90, + 101, + 101, + 89, + 166, + 102, + 89, + 149, + 153, + 106, + 89, + 150, + 154, + 102, + 102, + 105, + 153, + 165, + 106, + 89, + 153, + 102, + 86, + 106, + 105, + 86, + 153, + 165, + 90, + 101, + 169, + 101, + 90, + 153, + 150, + 102, + 105, + 153, + 166, + 165, + 101, + 90, + 154, + 170, + 89, + 150, + 102, + 105, + 166, + 150, + 105, + 153, + 101, + 153, + 153, + 90, + 102, + 102, + 153, + 101, + 89, + 153, + 166, + 89, + 89, + 150, + 102, + 89, + 153, + 101, + 106, + 102, + 89, + 154, + 89, + 102, + 102, + 102, + 105, + 153, + 166, + 89, + 90, + 102, + 149, + 153, + 154, + 166, + 102, + 101, + 165, + 102, + 154, + 89, + 86, + 89, + 153, + 153, + 102, + 106, + 149, + 166, + 102, + 102, + 153, + 150, + 153, + 166, + 154, + 150, + 105, + 106, + 154, + 86, + 165, + 165, + 89, + 150, + 90, + 105, + 153, + 153, + 102, + 101, + 105, + 153, + 149, + 105, + 90, + 102, + 106, + 102, + 89, + 150, + 153, + 153, + 102, + 101, + 150, + 102, + 102, + 169, + 153, + 169, + 105, + 90, + 86, + 101, + 89, + 154, + 166, + 169, + 102, + 102, + 149, + 150, + 101, + 153, + 153, + 154, + 102, + 89, + 149, + 154, + 102, + 102, + 102, + 153, + 153, + 153, + 150, + 102, + 169, + 102, + 105, + 153, + 102, + 86, + 153, + 106, + 102, + 153, + 150, + 153, + 166, + 102, + 86, + 101, + 169, + 89, + 153, + 153, + 102, + 150, + 102, + 105, + 106, + 89, + 149, + 149, + 106, + 85, + 102, + 170, + 170, + 166, + 169, + 89, + 85, + 85, + 69, + 81, + 85, + 111, + 239, + 249, + 84, + 1, + 170, + 191, + 234, + 149, + 21, + 90, + 169, + 165, + 65, + 64, + 0, + 6, + 254, + 255, + 64, + 64, + 47, + 191, + 248, + 17, + 2, + 234, + 254, + 21, + 85, + 170, + 101, + 0, + 0, + 63, + 239, + 240, + 0, + 27, + 251, + 252, + 1, + 2, + 255, + 190, + 0, + 80, + 255, + 170, + 0, + 0, + 10, + 63, + 174, + 144, + 16, + 239, + 251, + 84, + 6, + 111, + 252, + 100, + 1, + 231, + 255, + 69, + 0, + 84, + 0, + 19, + 249, + 251, + 1, + 10, + 255, + 120, + 0, + 118, + 255, + 209, + 65, + 31, + 175, + 164, + 20, + 102, + 128, + 0, + 5, + 252, + 120, + 0, + 131, + 255, + 69, + 0, + 127, + 255, + 192, + 144, + 126, + 90, + 149, + 185, + 106, + 64, + 0, + 0, + 103, + 240, + 224, + 3, + 207, + 253, + 4, + 0, + 254, + 250, + 129, + 169, + 174, + 6, + 90, + 253, + 84, + 65, + 65, + 65, + 1, + 191, + 79, + 0, + 40, + 127, + 240, + 80, + 7, + 235, + 228, + 22, + 111, + 229, + 21, + 95, + 255, + 128, + 0, + 21, + 84, + 16, + 43, + 244, + 240, + 2, + 155, + 255, + 1, + 0, + 127, + 190, + 64, + 105, + 175, + 129, + 65, + 47, + 255, + 144, + 0, + 22, + 164, + 80, + 5, + 255, + 189, + 0, + 17, + 255, + 249, + 80, + 2, + 251, + 254, + 65, + 1, + 111, + 248, + 104, + 17, + 186, + 249, + 80, + 1, + 90, + 149, + 85, + 6, + 175, + 235, + 234, + 5, + 90, + 106, + 86, + 89, + 170, + 89, + 89, + 90, + 90, + 165, + 90, + 90, + 105, + 170, + 102, + 85, + 170, + 170, + 170, + 149, + 105, + 149, + 85, + 95, + 73, + 36, + 21, + 166, + 254, + 170, + 169, + 166, + 85, + 165, + 85, + 85, + 106, + 170, + 170, + 149, + 149, + 85, + 154, + 165, + 86, + 170, + 170, + 106, + 170, + 170, + 170, + 105, + 85, + 85, + 85, + 85, + 85, + 86, + 170, + 170, + 170, + 170, + 149, + 149, + 85, + 85, + 101, + 165, + 154, + 170, + 105, + 86, + 165, + 150, + 101, + 154, + 90, + 150, + 101, + 153, + 102, + 102, + 165, + 153, + 106, + 153, + 166, + 153, + 161, + 165, + 86, + 70, + 150, + 95, + 91, + 214, + 90, + 75, + 86, + 154, + 90, + 90, + 105, + 90, + 90, + 105, + 90, + 90, + 105, + 105, + 105, + 106, + 85, + 165, + 106, + 169, + 165, + 85, + 85, + 85, + 90, + 253, + 249, + 16, + 81, + 189, + 170, + 149, + 145, + 90, + 171, + 213, + 85, + 90, + 154, + 169, + 89, + 85, + 109, + 111, + 134, + 144, + 105, + 110, + 154, + 144, + 87, + 215, + 245, + 70, + 6, + 154, + 126, + 90, + 21, + 169, + 126, + 85, + 80, + 170, + 170, + 155, + 73, + 90, + 124, + 61, + 20, + 80, + 181, + 87, + 254, + 126, + 4, + 96, + 190, + 166, + 145, + 165, + 155, + 150, + 149, + 90, + 90, + 169, + 169, + 89, + 185, + 105, + 86, + 210, + 225, + 86, + 71, + 133, + 26, + 126, + 62, + 84, + 52, + 190, + 226, + 208, + 150, + 155, + 214, + 153, + 26, + 90, + 169, + 105, + 106, + 165, + 165, + 185, + 90, + 65, + 149, + 85, + 22, + 252, + 190, + 0, + 208, + 255, + 139, + 129, + 89, + 31, + 90, + 164, + 41, + 86, + 229, + 169, + 87, + 209, + 169, + 31, + 134, + 164, + 41, + 5, + 80, + 191, + 111, + 228, + 40, + 26, + 245, + 249, + 86, + 145, + 170, + 91, + 149, + 105, + 90, + 150, + 169, + 107, + 229, + 169, + 86, + 85, + 85, + 85, + 85, + 174, + 127, + 185, + 121, + 101, + 165, + 149, + 150, + 170, + 154, + 150, + 166, + 86, + 85, + 90, + 90, + 170, + 170, + 170, + 105, + 85, + 16, + 0, + 85, + 174, + 191, + 250, + 181, + 85, + 80, + 85, + 86, + 170, + 170, + 170, + 166, + 85, + 85, + 89, + 90, + 174, + 186, + 105, + 80, + 0, + 0, + 90, + 251, + 255, + 234, + 149, + 69, + 1, + 85, + 106, + 170, + 170, + 170, + 149, + 85, + 85, + 106, + 175, + 186, + 101, + 0, + 0, + 1, + 91, + 239, + 255, + 170, + 85, + 20, + 5, + 85, + 106, + 170, + 170, + 170, + 149, + 85, + 86, + 170, + 234, + 153, + 64, + 0, + 0, + 90, + 239, + 255, + 170, + 85, + 84, + 5, + 85, + 110, + 170, + 170, + 170, + 149, + 86, + 166, + 170, + 170, + 149, + 80, + 0, + 0, + 110, + 255, + 250, + 229, + 81, + 64, + 21, + 86, + 170, + 170, + 170, + 170, + 85, + 170, + 170, + 150, + 85, + 0, + 0, + 1, + 126, + 255, + 251, + 229, + 69, + 64, + 21, + 87, + 234, + 175, + 169, + 169, + 90, + 165, + 169, + 85, + 80, + 80, + 0, + 10, + 235, + 255, + 175, + 144, + 25, + 0, + 169, + 95, + 249, + 190, + 150, + 169, + 26, + 165, + 106, + 85, + 84, + 0, + 0, + 110, + 191, + 250, + 246, + 70, + 80, + 21, + 86, + 170, + 170, + 169, + 170, + 150, + 154, + 86, + 85, + 85, + 64, + 0, + 31, + 175, + 254, + 190, + 80, + 100, + 1, + 149, + 106, + 170, + 170, + 170, + 165, + 150, + 85, + 85, + 85, + 84, + 4, + 110, + 127, + 253, + 186, + 145, + 165, + 5, + 149, + 106, + 150, + 170, + 170, + 170, + 90, + 85, + 85, + 81, + 81, + 85, + 170, + 191, + 246, + 170, + 69, + 84, + 22, + 85, + 170, + 154, + 169, + 170, + 165, + 85, + 85, + 85, + 85, + 85, + 90, + 171, + 255, + 170, + 165, + 89, + 81, + 105, + 90, + 169, + 170, + 166, + 170, + 150, + 149, + 85, + 85, + 85, + 85, + 110, + 191, + 250, + 170, + 149, + 85, + 85, + 165, + 170, + 170, + 170, + 106, + 165, + 101, + 85, + 85, + 85, + 85, + 86, + 234, + 170, + 85, + 105, + 106, + 165, + 169, + 85, + 165, + 170, + 86, + 165, + 106, + 170, + 169, + 90, + 85, + 165, + 86, + 86, + 169, + 90, + 85, + 85, + 90, + 165, + 169, + 106, + 149, + 165, + 90, + 154, + 169, + 106, + 149, + 85, + 85, + 85, + 85, + 105, + 166, + 166, + 170, + 90, + 170, + 170, + 165, + 101, + 85, + 85, + 85, + 86, + 170, + 154, + 149, + 90, + 170, + 165, + 85, + 86, + 170, + 169, + 85, + 85, + 106, + 154, + 165, + 90, + 149, + 149, + 85, + 90, + 170, + 165, + 102, + 150, + 154, + 90, + 169, + 170, + 85, + 105, + 86, + 170, + 153, + 85, + 85, + 170, + 86, + 170, + 85, + 89, + 102, + 150, + 90, + 165, + 89, + 85, + 165, + 165, + 85, + 89, + 165, + 86, + 89, + 169, + 170, + 150, + 105, + 105, + 102, + 165, + 150, + 90, + 90, + 89, + 101, + 102, + 105, + 101, + 149, + 105, + 105, + 85, + 101, + 90, + 170, + 165, + 154, + 150, + 105, + 105, + 105, + 165, + 106, + 154, + 150, + 150, + 150, + 86, + 170, + 105, + 105, + 170, + 106, + 85, + 89, +}; +const uint8_t DPCM_eight_8000[] PROGMEM = { + 102, + 170, + 165, + 105, + 166, + 105, + 150, + 89, + 101, + 150, + 101, + 102, + 153, + 150, + 170, + 154, + 102, + 101, + 165, + 153, + 165, + 106, + 101, + 154, + 89, + 89, + 154, + 85, + 165, + 86, + 169, + 89, + 166, + 150, + 165, + 165, + 85, + 105, + 102, + 101, + 150, + 149, + 149, + 89, + 101, + 106, + 89, + 106, + 150, + 106, + 89, + 105, + 154, + 105, + 90, + 165, + 166, + 86, + 150, + 86, + 166, + 90, + 90, + 166, + 153, + 106, + 150, + 153, + 101, + 85, + 86, + 85, + 149, + 149, + 85, + 85, + 101, + 89, + 101, + 149, + 166, + 90, + 154, + 102, + 169, + 153, + 106, + 101, + 105, + 86, + 154, + 101, + 149, + 86, + 102, + 149, + 153, + 106, + 90, + 106, + 89, + 89, + 101, + 106, + 153, + 149, + 101, + 165, + 165, + 86, + 105, + 150, + 149, + 106, + 89, + 89, + 85, + 102, + 165, + 86, + 153, + 89, + 101, + 149, + 101, + 102, + 150, + 150, + 154, + 101, + 150, + 165, + 154, + 170, + 86, + 165, + 154, + 90, + 165, + 105, + 105, + 150, + 89, + 90, + 101, + 170, + 166, + 105, + 85, + 89, + 150, + 89, + 86, + 85, + 105, + 89, + 85, + 165, + 89, + 101, + 150, + 85, + 149, + 165, + 85, + 85, + 105, + 149, + 170, + 170, + 154, + 86, + 89, + 170, + 165, + 154, + 90, + 90, + 150, + 106, + 85, + 89, + 105, + 106, + 85, + 86, + 89, + 166, + 169, + 170, + 85, + 86, + 86, + 89, + 101, + 85, + 89, + 102, + 101, + 86, + 149, + 150, + 106, + 90, + 86, + 86, + 150, + 150, + 150, + 166, + 169, + 165, + 101, + 105, + 105, + 106, + 105, + 105, + 89, + 154, + 154, + 105, + 105, + 106, + 124, + 244, + 240, + 64, + 0, + 47, + 255, + 229, + 0, + 2, + 255, + 255, + 128, + 0, + 110, + 189, + 184, + 0, + 10, + 127, + 255, + 194, + 128, + 0, + 17, + 227, + 243, + 241, + 192, + 32, + 249, + 248, + 176, + 20, + 61, + 255, + 15, + 15, + 15, + 15, + 223, + 67, + 0, + 2, + 79, + 15, + 15, + 11, + 3, + 199, + 203, + 195, + 130, + 195, + 195, + 227, + 208, + 128, + 225, + 254, + 248, + 32, + 0, + 41, + 120, + 120, + 252, + 248, + 240, + 36, + 60, + 125, + 124, + 20, + 25, + 63, + 190, + 85, + 5, + 185, + 250, + 241, + 64, + 0, + 21, + 85, + 67, + 247, + 242, + 192, + 0, + 250, + 250, + 240, + 64, + 21, + 191, + 254, + 148, + 5, + 15, + 255, + 169, + 0, + 1, + 7, + 135, + 139, + 189, + 248, + 224, + 64, + 126, + 253, + 244, + 80, + 21, + 126, + 254, + 180, + 16, + 241, + 255, + 248, + 32, + 16, + 81, + 154, + 40, + 36, + 241, + 242, + 208, + 0, + 116, + 250, + 245, + 144, + 16, + 106, + 254, + 245, + 145, + 130, + 151, + 251, + 209, + 64, + 65, + 145, + 92, + 56, + 189, + 189, + 120, + 36, + 41, + 125, + 125, + 105, + 100, + 105, + 106, + 169, + 169, + 165, + 85, + 110, + 110, + 25, + 25, + 25, + 5, + 10, + 95, + 239, + 199, + 1, + 6, + 91, + 239, + 218, + 69, + 5, + 91, + 175, + 170, + 85, + 9, + 45, + 62, + 60, + 40, + 36, + 40, + 52, + 100, + 105, + 245, + 241, + 208, + 128, + 161, + 246, + 246, + 225, + 128, + 65, + 151, + 235, + 214, + 85, + 100, + 180, + 240, + 240, + 224, + 209, + 209, + 194, + 194, + 195, + 243, + 211, + 195, + 66, + 67, + 155, + 223, + 155, + 69, + 6, + 91, + 175, + 174, + 89, + 25, + 26, + 31, + 159, + 74, + 9, + 25, + 86, + 89, + 89, + 100, + 241, + 242, + 210, + 129, + 65, + 151, + 219, + 219, + 150, + 69, + 70, + 90, + 170, + 169, + 85, + 89, + 44, + 125, + 125, + 104, + 36, + 101, + 165, + 149, + 81, + 149, + 177, + 242, + 211, + 194, + 66, + 70, + 155, + 159, + 154, + 89, + 21, + 89, + 106, + 170, + 169, + 165, + 164, + 165, + 169, + 181, + 161, + 146, + 154, + 90, + 85, + 86, + 86, + 215, + 219, + 159, + 9, + 25, + 25, + 106, + 186, + 185, + 165, + 85, + 85, + 150, + 170, + 170, + 154, + 86, + 86, + 105, + 105, + 101, + 165, + 85, + 85, + 149, + 150, + 151, + 143, + 95, + 45, + 40, + 36, + 101, + 169, + 182, + 230, + 150, + 150, + 86, + 90, + 90, + 170, + 170, + 166, + 86, + 86, + 139, + 94, + 41, + 104, + 101, + 101, + 149, + 149, + 185, + 245, + 246, + 210, + 134, + 70, + 90, + 90, + 106, + 169, + 101, + 85, + 85, + 150, + 170, + 170, + 170, + 154, + 85, + 90, + 90, + 109, + 105, + 101, + 149, + 85, + 85, + 151, + 203, + 159, + 109, + 40, + 100, + 100, + 101, + 166, + 234, + 170, + 150, + 85, + 85, + 89, + 106, + 170, + 169, + 165, + 149, + 149, + 89, + 106, + 166, + 150, + 149, + 85, + 85, + 90, + 45, + 125, + 245, + 229, + 145, + 81, + 86, + 90, + 170, + 170, + 105, + 101, + 85, + 85, + 166, + 170, + 171, + 158, + 105, + 100, + 101, + 101, + 166, + 170, + 169, + 165, + 85, + 85, + 85, + 154, + 171, + 170, + 169, + 85, + 85, + 85, + 86, + 170, + 170, + 170, + 149, + 85, + 85, + 85, + 106, + 170, + 170, + 169, + 85, + 85, + 85, + 86, + 154, + 154, + 89, + 89, + 106, + 170, + 170, + 85, + 85, + 85, + 85, + 85, + 170, + 170, + 170, + 170, + 170, + 149, + 85, + 85, + 85, + 85, + 90, + 106, + 165, + 101, + 170, + 170, + 170, + 149, + 85, + 85, + 85, + 85, + 101, + 165, + 166, + 153, + 154, + 154, + 106, + 89, + 86, + 101, + 85, + 86, + 86, + 90, + 106, + 90, + 154, + 101, + 105, + 154, + 90, + 101, + 170, + 170, + 170, + 154, + 170, + 149, + 165, + 149, + 85, + 90, + 102, + 89, + 105, + 85, + 101, + 101, + 169, + 166, + 150, + 86, + 85, + 85, + 150, + 149, + 166, + 150, + 85, + 166, + 86, + 90, + 90, + 170, + 166, + 105, + 154, + 85, + 85, + 105, + 102, + 106, + 153, + 150, + 85, + 85, + 149, + 101, + 102, + 106, + 170, + 90, + 154, + 170, + 105, + 86, + 149, + 85, + 85, + 85, + 85, + 86, + 89, + 90, + 101, + 149, + 101, + 101, + 85, + 101, + 149, + 85, + 85, + 85, + 85, + 86, + 101, + 85, + 101, + 165, + 153, + 153, + 153, + 153, + 153, + 170, + 102, + 102, + 184, + 105, + 89, + 90, + 105, + 85, + 169, + 165, + 149, + 150, + 102, + 153, + 101, + 169, + 166, + 90, + 150, + 85, + 149, + 101, + 169, + 105, + 86, + 86, + 150, + 165, + 169, + 105, + 105, + 86, + 150, + 150, + 165, + 165, + 105, + 90, + 90, + 150, + 149, + 165, + 165, + 105, + 106, + 90, + 150, + 149, + 165, + 169, + 105, + 106, + 90, + 86, + 149, + 165, + 165, + 105, + 89, + 90, + 86, + 166, + 165, + 165, + 105, + 106, + 150, + 149, + 105, + 105, + 106, + 105, + 89, + 86, + 150, + 169, + 105, + 105, + 90, + 86, + 149, + 165, + 169, + 106, + 90, + 90, + 86, + 150, + 165, + 165, + 105, + 106, + 90, + 86, + 149, + 165, + 105, + 106, + 90, + 150, + 149, + 101, + 89, + 101, + 165, + 165, + 150, + 150, + 86, + 90, + 90, + 149, + 154, + 105, + 105, + 105, + 105, + 105, + 90, + 86, + 150, + 166, + 169, + 101, + 105, + 105, + 90, + 150, + 149, + 166, + 170, + 90, + 89, + 85, + 170, + 169, + 165, + 86, + 90, + 154, + 149, + 165, + 165, + 166, + 86, + 85, + 89, + 89, + 169, + 165, + 85, + 86, + 106, + 153, + 85, + 90, + 106, + 105, + 165, + 153, + 85, + 154, + 105, + 85, + 106, + 166, + 150, + 150, + 89, + 101, + 169, + 85, + 85, + 86, + 90, + 85, + 85, + 154, + 85, + 101, + 154, + 154, + 169, + 102, + 150, + 150, + 106, + 89, + 85, + 165, + 165, + 150, + 86, + 102, + 150, + 89, + 86, + 149, + 149, + 90, + 85, + 170, + 170, + 89, + 169, + 102, + 150, + 150, + 154, + 86, + 169, + 169, + 105, + 105, + 101, + 106, + 166, + 150, + 154, + 166, + 169, + 85, + 150, + 165, + 86, + 85, + 170, + 165, + 106, + 101, + 89, + 85, + 150, +}; +const uint8_t DPCM_nine_8000[] PROGMEM = { + 102, + 170, + 165, + 105, + 149, + 105, + 150, + 89, + 101, + 154, + 101, + 102, + 153, + 150, + 166, + 154, + 102, + 101, + 165, + 153, + 165, + 106, + 101, + 154, + 105, + 85, + 154, + 85, + 165, + 86, + 169, + 89, + 166, + 150, + 149, + 165, + 85, + 106, + 102, + 101, + 150, + 85, + 85, + 89, + 101, + 106, + 89, + 106, + 150, + 102, + 105, + 105, + 154, + 105, + 90, + 165, + 166, + 86, + 150, + 86, + 170, + 90, + 90, + 166, + 153, + 106, + 150, + 153, + 101, + 85, + 86, + 85, + 149, + 149, + 85, + 89, + 102, + 89, + 102, + 153, + 166, + 105, + 170, + 149, + 170, + 170, + 106, + 101, + 169, + 149, + 149, + 86, + 89, + 149, + 150, + 85, + 154, + 169, + 170, + 170, + 102, + 101, + 153, + 89, + 105, + 101, + 105, + 85, + 149, + 150, + 150, + 85, + 169, + 166, + 101, + 149, + 153, + 102, + 169, + 153, + 153, + 90, + 166, + 101, + 101, + 85, + 154, + 165, + 169, + 150, + 105, + 166, + 90, + 153, + 90, + 90, + 89, + 90, + 86, + 105, + 165, + 85, + 105, + 165, + 166, + 106, + 101, + 166, + 106, + 153, + 165, + 166, + 89, + 101, + 90, + 166, + 154, + 106, + 165, + 85, + 85, + 149, + 149, + 166, + 101, + 89, + 149, + 90, + 85, + 101, + 85, + 149, + 170, + 105, + 101, + 150, + 165, + 86, + 90, + 102, + 169, + 153, + 166, + 169, + 105, + 166, + 102, + 102, + 154, + 89, + 105, + 101, + 166, + 166, + 170, + 154, + 106, + 105, + 102, + 101, + 105, + 85, + 85, + 85, + 85, + 101, + 85, + 85, + 85, + 90, + 170, + 170, + 170, + 170, + 165, + 85, + 85, + 85, + 85, + 86, + 170, + 171, + 170, + 165, + 85, + 85, + 85, + 86, + 170, + 170, + 165, + 89, + 85, + 85, + 90, + 170, + 170, + 170, + 165, + 85, + 85, + 106, + 90, + 170, + 170, + 170, + 170, + 165, + 150, + 85, + 89, + 85, + 85, + 85, + 86, + 171, + 255, + 174, + 165, + 85, + 81, + 85, + 90, + 170, + 170, + 153, + 105, + 85, + 85, + 106, + 170, + 170, + 170, + 170, + 165, + 85, + 65, + 0, + 5, + 106, + 255, + 255, + 234, + 85, + 64, + 1, + 86, + 170, + 170, + 170, + 165, + 85, + 85, + 85, + 106, + 170, + 170, + 174, + 169, + 101, + 80, + 0, + 1, + 91, + 255, + 255, + 254, + 144, + 64, + 1, + 85, + 171, + 170, + 170, + 169, + 85, + 85, + 86, + 171, + 255, + 153, + 20, + 0, + 85, + 80, + 5, + 191, + 190, + 240, + 2, + 195, + 254, + 10, + 0, + 127, + 230, + 224, + 7, + 150, + 253, + 31, + 192, + 188, + 5, + 144, + 31, + 208, + 64, + 43, + 252, + 2, + 1, + 255, + 31, + 128, + 62, + 87, + 248, + 26, + 85, + 185, + 22, + 165, + 190, + 7, + 240, + 27, + 65, + 253, + 9, + 0, + 191, + 240, + 5, + 11, + 252, + 30, + 64, + 253, + 11, + 208, + 126, + 6, + 164, + 111, + 175, + 1, + 191, + 192, + 5, + 5, + 100, + 7, + 208, + 63, + 0, + 244, + 47, + 192, + 126, + 7, + 240, + 63, + 65, + 248, + 11, + 208, + 126, + 79, + 192, + 255, + 2, + 224, + 47, + 128, + 89, + 188, + 252, + 2, + 224, + 191, + 65, + 249, + 11, + 149, + 126, + 71, + 244, + 26, + 149, + 189, + 95, + 192, + 127, + 1, + 184, + 31, + 128, + 124, + 47, + 244, + 7, + 208, + 190, + 2, + 248, + 15, + 208, + 253, + 3, + 244, + 31, + 65, + 253, + 125, + 1, + 253, + 2, + 224, + 46, + 0, + 91, + 255, + 128, + 63, + 65, + 248, + 11, + 208, + 127, + 70, + 248, + 31, + 224, + 106, + 86, + 255, + 64, + 191, + 0, + 164, + 17, + 144, + 22, + 255, + 192, + 31, + 11, + 192, + 63, + 65, + 184, + 31, + 208, + 126, + 70, + 164, + 47, + 151, + 240, + 47, + 192, + 126, + 7, + 144, + 26, + 255, + 224, + 15, + 135, + 252, + 15, + 224, + 62, + 67, + 244, + 31, + 129, + 189, + 11, + 250, + 164, + 27, + 228, + 10, + 144, + 6, + 64, + 191, + 240, + 5, + 211, + 253, + 7, + 228, + 30, + 86, + 248, + 27, + 213, + 169, + 6, + 250, + 249, + 6, + 233, + 1, + 165, + 0, + 80, + 27, + 255, + 0, + 184, + 127, + 128, + 253, + 7, + 208, + 127, + 66, + 244, + 26, + 145, + 190, + 111, + 128, + 190, + 85, + 85, + 160, + 6, + 80, + 255, + 192, + 26, + 15, + 224, + 63, + 65, + 244, + 47, + 209, + 169, + 26, + 149, + 190, + 91, + 228, + 90, + 86, + 144, + 105, + 0, + 180, + 15, + 252, + 5, + 80, + 254, + 3, + 224, + 110, + 6, + 248, + 26, + 86, + 164, + 107, + 150, + 254, + 85, + 165, + 164, + 21, + 64, + 21, + 70, + 255, + 192, + 26, + 15, + 252, + 47, + 144, + 244, + 31, + 193, + 249, + 11, + 144, + 189, + 47, + 209, + 185, + 105, + 1, + 144, + 61, + 6, + 255, + 208, + 22, + 15, + 224, + 45, + 22, + 165, + 190, + 86, + 149, + 165, + 90, + 166, + 175, + 150, + 154, + 164, + 0, + 80, + 101, + 86, + 159, + 192, + 88, + 15, + 208, + 184, + 26, + 130, + 249, + 110, + 70, + 228, + 110, + 91, + 230, + 249, + 46, + 144, + 16, + 16, + 6, + 145, + 175, + 193, + 164, + 31, + 134, + 240, + 109, + 11, + 213, + 248, + 26, + 65, + 185, + 111, + 155, + 213, + 125, + 20, + 0, + 64, + 86, + 71, + 127, + 11, + 64, + 189, + 127, + 130, + 208, + 126, + 31, + 145, + 164, + 90, + 91, + 234, + 190, + 106, + 85, + 64, + 20, + 21, + 105, + 151, + 241, + 224, + 15, + 15, + 145, + 160, + 62, + 95, + 214, + 144, + 104, + 27, + 171, + 234, + 185, + 100, + 0, + 0, + 95, + 3, + 15, + 239, + 96, + 48, + 191, + 219, + 129, + 84, + 190, + 190, + 65, + 129, + 165, + 175, + 159, + 74, + 144, + 64, + 0, + 104, + 10, + 126, + 62, + 0, + 130, + 234, + 189, + 9, + 6, + 250, + 245, + 85, + 26, + 111, + 235, + 149, + 80, + 80, + 17, + 81, + 2, + 127, + 127, + 0, + 64, + 246, + 254, + 9, + 6, + 107, + 245, + 228, + 85, + 189, + 189, + 105, + 5, + 65, + 64, + 64, + 111, + 255, + 244, + 0, + 11, + 191, + 233, + 64, + 22, + 191, + 250, + 85, + 229, + 229, + 168, + 101, + 0, + 0, + 0, + 26, + 254, + 252, + 0, + 7, + 95, + 250, + 144, + 16, + 110, + 191, + 254, + 145, + 65, + 149, + 164, + 16, + 16, + 24, + 127, + 255, + 133, + 0, + 81, + 254, + 253, + 5, + 6, + 171, + 255, + 229, + 64, + 0, + 85, + 84, + 24, + 28, + 47, + 239, + 211, + 192, + 16, + 62, + 191, + 90, + 66, + 151, + 250, + 244, + 96, + 0, + 5, + 6, + 150, + 235, + 255, + 234, + 84, + 20, + 42, + 171, + 166, + 155, + 250, + 229, + 80, + 0, + 0, + 5, + 21, + 111, + 255, + 254, + 169, + 85, + 85, + 85, + 170, + 191, + 255, + 170, + 84, + 0, + 0, + 0, + 22, + 255, + 255, + 255, + 233, + 64, + 0, + 5, + 91, + 255, + 255, + 169, + 0, + 0, + 0, + 5, + 191, + 255, + 255, + 250, + 80, + 0, + 1, + 90, + 255, + 255, + 233, + 64, + 0, + 0, + 1, + 191, + 255, + 255, + 234, + 80, + 0, + 5, + 106, + 191, + 255, + 165, + 0, + 0, + 0, + 6, + 255, + 255, + 255, + 233, + 80, + 0, + 5, + 171, + 255, + 254, + 149, + 0, + 0, + 0, + 26, + 255, + 255, + 255, + 165, + 64, + 0, + 22, + 175, + 255, + 234, + 80, + 0, + 0, + 1, + 175, + 255, + 255, + 250, + 84, + 0, + 1, + 170, + 255, + 238, + 149, + 0, + 0, + 0, + 90, + 255, + 255, + 254, + 165, + 64, + 0, + 89, + 187, + 251, + 169, + 64, + 0, + 0, + 22, + 191, + 255, + 255, + 169, + 80, + 0, + 86, + 171, + 255, + 169, + 64, + 0, + 0, + 26, + 191, + 255, + 255, + 165, + 80, + 4, + 86, + 171, + 255, + 169, + 64, + 0, + 0, + 26, + 191, + 255, + 254, + 165, + 85, + 21, + 90, + 175, + 190, + 165, + 64, + 0, + 0, + 106, + 191, + 255, + 254, + 149, + 84, + 21, + 90, + 171, + 190, + 108, + 0, + 0, + 5, + 255, + 255, + 209, + 80, + 26, + 171, + 250, + 169, + 70, + 149, + 148, + 4, + 1, + 167, + 255, + 254, + 84, + 80, + 106, + 175, + 170, + 185, + 165, + 65, + 0, + 20, + 90, + 171, + 250, + 185, + 21, + 69, + 170, + 190, + 170, + 150, + 85, + 20, + 0, + 85, + 170, + 191, + 170, + 229, + 85, + 90, + 170, + 170, + 174, + 86, + 145, + 80, + 5, + 86, + 170, + 191, + 170, + 165, + 85, + 90, + 106, + 234, + 169, + 85, + 81, + 80, + 21, + 86, + 170, + 187, + 234, + 153, + 85, + 86, + 170, + 170, + 170, + 85, + 85, + 80, + 85, + 150, + 170, + 170, + 170, + 170, + 149, + 90, + 170, + 170, + 165, + 85, + 65, + 85, + 89, + 106, + 150, + 170, + 170, + 170, + 85, + 106, + 170, + 169, + 85, + 85, + 85, + 85, + 101, + 106, + 170, + 170, + 170, + 154, + 165, + 170, + 170, + 165, + 85, + 85, + 85, + 85, + 86, + 170, + 170, + 170, + 170, + 165, + 149, + 170, + 170, + 170, + 85, + 85, + 85, + 85, + 85, + 89, + 170, + 170, + 170, + 170, + 165, + 170, + 170, + 170, + 149, + 85, + 85, + 85, + 85, + 85, + 170, + 170, + 170, + 170, + 170, + 90, + 150, + 165, + 165, + 149, + 85, + 85, + 86, + 149, + 101, + 106, + 90, + 165, + 105, + 106, + 166, + 170, + 89, + 85, + 86, + 169, + 105, + 85, + 169, + 90, + 169, + 89, + 154, + 90, + 170, + 101, + 149, + 85, + 106, + 85, + 169, + 106, + 86, + 150, + 101, + 169, + 169, + 106, + 86, + 86, + 165, + 101, + 89, + 90, + 90, + 149, + 101, + 154, + 166, + 169, + 154, + 170, + 170, + 90, + 85, + 101, + 102, + 105, + 153, + 86, + 101, + 169, + 153, + 90, + 166, + 86, + 149, + 90, + 90, + 85, + 85, + 86, + 86, + 165, + 89, + 86, + 86, + 150, + 166, + 106, + 165, + 153, + 149, + 165, + 149, + 86, + 90, + 165, + 86, + 89, + 105, + 170, + 150, + 105, + 105, + 102, + 165, + 149, + 90, + 90, + 89, + 101, + 102, + 105, + 101, + 149, + 105, + 89, + 85, + 165, + 90, + 170, + 165, + 154, + 150, + 105, + 105, + 105, + 165, + 106, + 154, + 150, + 150, + 150, + 86, + 170, + 105, + 105, + 170, + 90, + 85, + 89, + 105, + 85, + 101, + 90, + 170, + 86, + 166, + 85, + 149, + 89, + 101, + 165, + 170, + 150, +}; +const uint8_t DPCM_zero_8000[] PROGMEM = { + 102, + 170, + 165, + 105, + 165, + 105, + 150, + 89, + 101, + 154, + 101, + 102, + 153, + 150, + 106, + 154, + 102, + 102, + 165, + 153, + 165, + 106, + 101, + 154, + 105, + 85, + 154, + 85, + 165, + 86, + 169, + 89, + 165, + 154, + 166, + 169, + 85, + 105, + 102, + 85, + 150, + 85, + 149, + 89, + 101, + 106, + 89, + 106, + 166, + 102, + 105, + 105, + 154, + 105, + 90, + 165, + 166, + 86, + 150, + 86, + 166, + 90, + 90, + 166, + 149, + 106, + 150, + 153, + 101, + 85, + 86, + 85, + 149, + 149, + 85, + 85, + 101, + 85, + 86, + 89, + 102, + 86, + 150, + 86, + 101, + 165, + 170, + 86, + 165, + 90, + 165, + 90, + 149, + 170, + 85, + 170, + 85, + 149, + 105, + 149, + 166, + 106, + 169, + 105, + 165, + 105, + 85, + 166, + 101, + 149, + 85, + 85, + 85, + 85, + 89, + 170, + 153, + 154, + 101, + 149, + 106, + 101, + 170, + 101, + 154, + 90, + 101, + 150, + 90, + 166, + 150, + 169, + 154, + 85, + 154, + 106, + 89, + 86, + 170, + 90, + 89, + 101, + 89, + 85, + 89, + 165, + 165, + 85, + 102, + 150, + 106, + 90, + 89, + 85, + 165, + 106, + 150, + 85, + 86, + 89, + 85, + 85, + 101, + 101, + 149, + 165, + 153, + 106, + 102, + 154, + 106, + 105, + 170, + 170, + 169, + 170, + 170, + 101, + 85, + 89, + 150, + 170, + 170, + 170, + 105, + 149, + 149, + 85, + 85, + 85, + 85, + 85, + 85, + 90, + 90, + 170, + 170, + 170, + 170, + 170, + 150, + 150, + 149, + 149, + 90, + 85, + 86, + 85, + 85, + 85, + 149, + 166, + 165, + 169, + 106, + 170, + 166, + 170, + 150, + 153, + 165, + 106, + 89, + 85, + 101, + 150, + 85, + 86, + 102, + 105, + 89, + 166, + 105, + 153, + 102, + 106, + 106, + 154, + 170, + 170, + 166, + 154, + 89, + 170, + 85, + 150, + 85, + 102, + 86, + 149, + 105, + 169, + 153, + 86, + 101, + 85, + 165, + 170, + 170, + 166, + 166, + 89, + 89, + 86, + 102, + 105, + 154, + 170, + 169, + 170, + 102, + 149, + 150, + 86, + 85, + 85, + 149, + 86, + 90, + 166, + 90, + 149, + 154, + 154, + 170, + 170, + 102, + 150, + 153, + 149, + 149, + 101, + 150, + 154, + 106, + 106, + 166, + 169, + 153, + 154, + 102, + 85, + 85, + 85, + 85, + 169, + 105, + 86, + 154, + 165, + 106, + 154, + 170, + 170, + 166, + 101, + 169, + 86, + 149, + 89, + 105, + 154, + 166, + 170, + 170, + 102, + 101, + 85, + 149, + 85, + 86, + 149, + 165, + 166, + 86, + 154, + 170, + 170, + 154, + 166, + 86, + 86, + 153, + 105, + 166, + 153, + 154, + 166, + 166, + 154, + 150, + 165, + 85, + 89, + 85, + 85, + 105, + 165, + 166, + 90, + 170, + 170, + 169, + 169, + 90, + 102, + 105, + 89, + 166, + 85, + 153, + 90, + 166, + 170, + 170, + 86, + 85, + 149, + 86, + 85, + 85, + 166, + 154, + 154, + 170, + 170, + 170, + 150, + 101, + 89, + 153, + 166, + 101, + 86, + 166, + 165, + 170, + 170, + 165, + 169, + 85, + 69, + 85, + 89, + 90, + 150, + 107, + 170, + 170, + 170, + 89, + 85, + 153, + 102, + 86, + 149, + 153, + 106, + 170, + 170, + 165, + 165, + 85, + 85, + 85, + 89, + 90, + 90, + 234, + 250, + 170, + 149, + 145, + 165, + 169, + 170, + 166, + 85, + 89, + 106, + 106, + 229, + 225, + 144, + 84, + 22, + 21, + 89, + 254, + 254, + 190, + 85, + 81, + 85, + 154, + 170, + 170, + 90, + 86, + 90, + 111, + 95, + 10, + 0, + 0, + 80, + 101, + 190, + 191, + 127, + 69, + 64, + 80, + 165, + 186, + 255, + 154, + 69, + 69, + 241, + 241, + 240, + 80, + 0, + 4, + 29, + 250, + 253, + 244, + 144, + 0, + 6, + 95, + 255, + 250, + 224, + 80, + 23, + 143, + 159, + 138, + 0, + 0, + 0, + 167, + 235, + 251, + 225, + 0, + 0, + 41, + 191, + 255, + 234, + 64, + 0, + 95, + 127, + 126, + 24, + 0, + 1, + 2, + 223, + 127, + 111, + 0, + 0, + 1, + 251, + 255, + 249, + 80, + 0, + 7, + 190, + 253, + 120, + 0, + 0, + 5, + 75, + 253, + 252, + 124, + 20, + 5, + 95, + 255, + 241, + 208, + 0, + 42, + 191, + 223, + 195, + 129, + 64, + 65, + 85, + 111, + 207, + 195, + 192, + 128, + 111, + 111, + 143, + 129, + 64, + 106, + 191, + 255, + 224, + 16, + 0, + 4, + 80, + 107, + 243, + 244, + 112, + 0, + 82, + 250, + 252, + 16, + 0, + 101, + 255, + 255, + 208, + 160, + 20, + 2, + 192, + 40, + 191, + 63, + 64, + 0, + 15, + 159, + 254, + 5, + 1, + 70, + 255, + 235, + 254, + 2, + 64, + 80, + 1, + 0, + 95, + 243, + 244, + 0, + 64, + 191, + 255, + 248, + 0, + 0, + 111, + 255, + 171, + 224, + 21, + 64, + 0, + 0, + 6, + 255, + 127, + 144, + 2, + 70, + 191, + 245, + 80, + 0, + 106, + 191, + 254, + 95, + 208, + 6, + 144, + 5, + 0, + 47, + 245, + 254, + 64, + 15, + 166, + 255, + 208, + 5, + 0, + 127, + 250, + 191, + 71, + 208, + 17, + 160, + 0, + 0, + 63, + 245, + 170, + 64, + 15, + 234, + 191, + 240, + 1, + 80, + 11, + 254, + 150, + 170, + 148, + 26, + 80, + 0, + 0, + 47, + 253, + 110, + 80, + 2, + 233, + 191, + 253, + 5, + 84, + 6, + 254, + 170, + 174, + 165, + 65, + 80, + 0, + 0, + 6, + 255, + 249, + 85, + 0, + 11, + 255, + 255, + 249, + 0, + 26, + 150, + 255, + 249, + 5, + 64, + 21, + 84, + 0, + 47, + 254, + 106, + 80, + 0, + 191, + 191, + 255, + 128, + 22, + 85, + 191, + 249, + 85, + 80, + 5, + 85, + 64, + 2, + 255, + 230, + 228, + 0, + 47, + 235, + 255, + 208, + 6, + 85, + 175, + 253, + 85, + 64, + 1, + 165, + 84, + 0, + 191, + 245, + 185, + 0, + 31, + 234, + 255, + 208, + 5, + 85, + 191, + 253, + 5, + 64, + 22, + 165, + 84, + 0, + 127, + 249, + 185, + 0, + 15, + 235, + 255, + 144, + 5, + 91, + 255, + 249, + 0, + 1, + 90, + 149, + 80, + 1, + 255, + 230, + 164, + 0, + 127, + 255, + 253, + 0, + 26, + 255, + 254, + 80, + 0, + 90, + 169, + 0, + 0, + 11, + 255, + 144, + 0, + 7, + 255, + 171, + 144, + 2, + 255, + 255, + 224, + 0, + 106, + 169, + 64, + 0, + 1, + 255, + 244, + 0, + 0, + 191, + 245, + 84, + 0, + 191, + 255, + 164, + 0, + 106, + 169, + 64, + 1, + 64, + 127, + 248, + 1, + 0, + 127, + 244, + 21, + 0, + 127, + 254, + 165, + 64, + 106, + 165, + 64, + 1, + 65, + 255, + 240, + 5, + 0, + 191, + 228, + 21, + 0, + 191, + 250, + 85, + 0, + 106, + 149, + 80, + 0, + 27, + 254, + 0, + 96, + 7, + 255, + 65, + 148, + 7, + 255, + 149, + 84, + 6, + 169, + 0, + 20, + 6, + 255, + 224, + 0, + 1, + 191, + 244, + 5, + 81, + 111, + 249, + 0, + 21, + 85, + 84, + 85, + 90, + 255, + 208, + 1, + 1, + 255, + 229, + 85, + 69, + 191, + 229, + 0, + 84, + 21, + 101, + 85, + 191, + 249, + 5, + 80, + 31, + 254, + 85, + 165, + 86, + 250, + 64, + 20, + 1, + 106, + 149, + 191, + 249, + 5, + 84, + 27, + 254, + 85, + 165, + 86, + 254, + 80, + 80, + 0, + 90, + 169, + 191, + 249, + 5, + 84, + 91, + 254, + 149, + 105, + 86, + 186, + 80, + 20, + 0, + 90, + 170, + 255, + 229, + 5, + 85, + 91, + 254, + 149, + 105, + 86, + 170, + 80, + 0, + 1, + 106, + 170, + 255, + 229, + 85, + 85, + 107, + 250, + 150, + 169, + 85, + 165, + 80, + 5, + 85, + 170, + 191, + 250, + 85, + 85, + 86, + 174, + 170, + 170, + 149, + 85, + 84, + 5, + 85, + 86, + 191, + 250, + 85, + 85, + 86, + 175, + 170, + 106, + 149, + 85, + 85, + 69, + 85, + 90, + 175, + 250, + 85, + 85, + 86, + 171, + 170, + 149, + 85, + 85, + 85, + 85, + 85, + 90, + 174, + 170, + 85, + 85, + 90, + 170, + 170, + 149, + 85, + 85, + 85, + 90, + 85, + 170, + 170, + 169, + 85, + 85, + 170, + 170, + 165, + 85, + 85, + 85, + 106, + 170, + 170, + 170, + 165, + 85, + 85, + 106, + 170, + 165, + 85, + 85, + 85, + 106, + 170, + 90, + 170, + 169, + 86, + 169, + 170, + 170, + 165, + 85, + 85, + 85, + 170, + 170, + 106, + 170, + 169, + 85, + 170, + 170, + 170, + 149, + 85, + 85, + 86, + 170, + 170, + 170, + 170, + 165, + 86, + 170, + 170, + 170, + 85, + 85, + 85, + 90, + 170, + 169, + 170, + 170, + 165, + 86, + 170, + 170, + 170, + 85, + 85, + 85, + 106, + 170, + 169, + 106, + 170, + 169, + 86, + 89, + 106, + 170, + 85, + 85, + 85, + 90, + 170, + 169, + 170, + 170, + 170, + 85, + 85, + 170, + 170, + 149, + 85, + 85, + 170, + 170, + 169, + 90, + 170, + 170, + 149, + 85, + 90, + 170, + 165, + 85, + 85, + 106, + 170, + 170, + 86, + 170, + 170, + 85, + 85, + 85, + 170, + 169, + 85, + 85, + 85, + 170, + 169, + 170, + 170, + 170, + 165, + 86, + 101, + 85, + 169, + 85, + 105, + 85, + 90, + 165, + 90, + 170, + 150, + 170, + 149, + 86, + 165, + 86, + 169, + 85, + 170, + 149, + 106, + 165, + 106, + 165, + 106, + 166, + 90, + 165, + 85, + 169, + 85, + 170, + 85, + 106, + 85, + 169, + 149, + 170, + 149, + 106, + 149, + 106, + 165, + 86, + 165, + 90, + 165, + 86, + 150, + 90, + 149, + 106, + 165, + 86, + 149, + 90, + 105, + 105, + 86, + 170, + 85, + 106, + 85, + 106, + 149, + 170, + 149, + 106, + 85, + 106, + 149, + 170, + 149, + 106, + 86, + 170, + 85, + 170, + 85, + 169, + 86, + 170, + 86, + 169, + 90, + 165, + 86, + 166, + 153, + 106, + 149, + 106, + 149, + 106, + 85, + 170, + 85, + 169, + 85, + 105, + 101, + 149, + 106, + 85, + 170, + 150, + 154, + 85, + 170, + 101, + 90, + 150, + 85, + 89, + 89, + 105, + 106, + 169, + 89, + 101, + 86, + 154, + 90, + 165, + 106, + 165, + 86, + 153, + 105, + 101, + 170, + 85, + 149, + 90, + 89, + 85, + 86, + 170, + 85, + 101, + 154, + 154, + 169, + 102, + 150, + 150, + 106, + 89, + 85, + 165, + 165, + 150, + 86, + 102, + 150, + 89, + 86, + 150, + 149, + 90, + 85, + 170, + 170, + 89, + 169, + 102, + 150, + 150, + 154, + 86, + 169, + 169, + 105, + 105, + 101, + 106, + 166, + 150, + 154, + 165, + 169, +}; +const uint8_t DPCM_point_8000[] PROGMEM = { + 102, + 170, + 165, + 101, + 166, + 105, + 150, + 89, + 101, + 154, + 101, + 102, + 153, + 150, + 102, + 154, + 102, + 102, + 165, + 153, + 165, + 90, + 101, + 154, + 89, + 85, + 154, + 85, + 165, + 86, + 169, + 89, + 166, + 150, + 149, + 169, + 86, + 105, + 86, + 85, + 86, + 85, + 149, + 89, + 85, + 106, + 89, + 106, + 102, + 102, + 105, + 105, + 153, + 105, + 90, + 165, + 166, + 102, + 150, + 86, + 170, + 90, + 90, + 166, + 153, + 106, + 150, + 153, + 101, + 85, + 86, + 85, + 149, + 85, + 85, + 89, + 101, + 85, + 86, + 105, + 150, + 90, + 101, + 102, + 150, + 154, + 166, + 149, + 165, + 154, + 150, + 150, + 169, + 154, + 90, + 106, + 150, + 153, + 105, + 105, + 85, + 89, + 90, + 101, + 85, + 165, + 153, + 106, + 89, + 90, + 154, + 105, + 153, + 165, + 153, + 166, + 90, + 85, + 105, + 101, + 165, + 101, + 149, + 105, + 105, + 106, + 153, + 165, + 154, + 165, + 150, + 150, + 106, + 86, + 85, + 89, + 150, + 89, + 86, + 102, + 86, + 89, + 105, + 169, + 166, + 165, + 170, + 90, + 106, + 149, + 149, + 90, + 102, + 85, + 153, + 101, + 105, + 86, + 153, + 166, + 165, + 153, + 105, + 90, + 102, + 90, + 149, + 105, + 86, + 150, + 149, + 153, + 101, + 101, + 149, + 165, + 106, + 169, + 169, + 106, + 86, + 154, + 165, + 85, + 102, + 149, + 85, + 89, + 85, + 150, + 166, + 153, + 101, + 106, + 89, + 170, + 149, + 153, + 153, + 105, + 90, + 105, + 102, + 153, + 102, + 90, + 89, + 101, + 102, + 105, + 105, + 90, + 90, + 154, + 105, + 166, + 90, + 86, + 101, + 153, + 85, + 86, + 85, + 169, + 90, + 105, + 165, + 101, + 150, + 154, + 101, + 101, + 90, + 149, + 153, + 154, + 89, + 85, + 86, + 86, + 101, + 149, + 106, + 153, + 153, + 166, + 154, + 101, + 170, + 150, + 86, + 86, + 101, + 153, + 150, + 101, + 106, + 149, + 150, + 90, + 102, + 150, + 153, + 101, + 85, + 90, + 149, + 85, + 165, + 101, + 150, + 89, + 105, + 150, + 154, + 85, + 166, + 169, + 169, + 101, + 153, + 102, + 165, + 154, + 165, + 150, + 153, + 90, + 86, + 150, + 89, + 101, + 169, + 166, + 89, + 154, + 102, + 102, + 90, + 153, + 85, + 86, + 89, + 85, + 89, + 85, + 101, + 166, + 85, + 102, + 169, + 169, + 86, + 153, + 165, + 169, + 86, + 150, + 102, + 89, + 150, + 153, + 169, + 105, + 86, + 150, + 170, + 105, + 166, + 153, + 166, + 86, + 170, + 85, + 150, + 105, + 150, + 105, + 150, + 90, + 90, + 150, + 86, + 153, + 154, + 101, + 154, + 86, + 165, + 149, + 165, + 90, + 85, + 153, + 149, + 101, + 165, + 85, + 86, + 149, + 150, + 101, + 169, + 149, + 165, + 169, + 165, + 154, + 86, + 150, + 169, + 165, + 102, + 150, + 149, + 105, + 106, + 149, + 90, + 101, + 149, + 154, + 85, + 89, + 101, + 101, + 101, + 149, + 150, + 165, + 149, + 150, + 89, + 165, + 165, + 169, + 105, + 153, + 101, + 105, + 89, + 105, + 105, + 90, + 85, + 101, + 149, + 165, + 153, + 154, + 150, + 150, + 150, + 105, + 153, + 105, + 86, + 154, + 86, + 86, + 150, + 149, + 153, + 169, + 153, + 102, + 154, + 154, + 102, + 150, + 86, + 89, + 90, + 85, + 85, + 149, + 101, + 85, + 85, + 150, + 90, + 149, + 105, + 101, + 105, + 166, + 169, + 170, + 106, + 150, + 154, + 154, + 102, + 105, + 165, + 90, + 106, + 86, + 154, + 169, + 154, + 169, + 166, + 106, + 105, + 169, + 169, + 166, + 170, + 90, + 90, + 105, + 169, + 153, + 165, + 102, + 105, + 85, + 89, + 102, + 85, + 85, + 85, + 85, + 85, + 85, + 85, + 85, + 85, + 85, + 85, + 85, + 85, + 85, + 85, + 85, + 85, + 85, + 85, + 149, + 89, + 106, + 102, + 102, + 102, + 106, + 169, + 153, + 153, + 153, + 155, + 230, + 116, + 25, + 87, + 208, + 190, + 129, + 101, + 85, + 149, + 90, + 153, + 85, + 85, + 106, + 154, + 166, + 164, + 106, + 102, + 154, + 165, + 102, + 149, + 170, + 165, + 86, + 150, + 149, + 170, + 154, + 105, + 85, + 106, + 90, + 149, + 101, + 90, + 149, + 90, + 86, + 170, + 149, + 106, + 165, + 170, + 165, + 101, + 85, + 85, + 109, + 85, + 85, + 85, + 89, + 175, + 254, + 165, + 85, + 86, + 170, + 170, + 85, + 85, + 170, + 170, + 149, + 85, + 85, + 85, + 85, + 85, + 90, + 101, + 127, + 255, + 229, + 0, + 6, + 191, + 234, + 85, + 85, + 106, + 170, + 85, + 170, + 170, + 149, + 84, + 1, + 85, + 21, + 23, + 255, + 255, + 0, + 0, + 127, + 254, + 149, + 0, + 107, + 255, + 149, + 0, + 26, + 255, + 249, + 0, + 0, + 22, + 148, + 6, + 255, + 254, + 64, + 1, + 191, + 249, + 0, + 22, + 190, + 250, + 149, + 65, + 86, + 175, + 254, + 249, + 128, + 1, + 4, + 4, + 0, + 191, + 255, + 208, + 0, + 15, + 255, + 148, + 5, + 110, + 186, + 165, + 81, + 85, + 170, + 255, + 165, + 1, + 127, + 253, + 144, + 0, + 1, + 68, + 31, + 255, + 244, + 0, + 23, + 255, + 208, + 1, + 175, + 250, + 149, + 69, + 21, + 106, + 190, + 165, + 0, + 106, + 254, + 190, + 244, + 64, + 65, + 0, + 0, + 27, + 255, + 244, + 0, + 11, + 255, + 244, + 0, + 107, + 255, + 249, + 64, + 1, + 111, + 254, + 164, + 0, + 90, + 254, + 149, + 105, + 165, + 151, + 235, + 69, + 4, + 21, + 100, + 1, + 255, + 244, + 0, + 7, + 255, + 148, + 1, + 110, + 190, + 189, + 64, + 6, + 255, + 229, + 85, + 86, + 170, + 170, + 84, + 90, + 191, + 160, + 6, + 254, + 84, + 20, + 85, + 170, + 64, + 23, + 255, + 192, + 2, + 239, + 171, + 164, + 1, + 111, + 253, + 0, + 21, + 106, + 254, + 80, + 26, + 169, + 170, + 149, + 86, + 187, + 229, + 65, + 250, + 245, + 145, + 0, + 91, + 254, + 64, + 22, + 127, + 252, + 0, + 110, + 191, + 248, + 1, + 189, + 127, + 228, + 6, + 190, + 174, + 148, + 26, + 170, + 110, + 84, + 106, + 175, + 128, + 26, + 110, + 30, + 104, + 10, + 169, + 88, + 5, + 255, + 209, + 1, + 3, + 250, + 194, + 128, + 187, + 235, + 224, + 65, + 150, + 249, + 85, + 81, + 250, + 169, + 144, + 105, + 171, + 224, + 164, + 27, + 224, + 244, + 2, + 208, + 244, + 5, + 231, + 240, + 240, + 3, + 244, + 244, + 16, + 82, + 248, + 184, + 4, + 160, + 253, + 121, + 85, + 168, + 189, + 89, + 85, + 107, + 225, + 224, + 105, + 244, + 180, + 20, + 85, + 164, + 85, + 23, + 242, + 240, + 116, + 47, + 226, + 240, + 176, + 126, + 166, + 208, + 160, + 185, + 186, + 149, + 81, + 165, + 185, + 165, + 87, + 211, + 224, + 224, + 188, + 45, + 10, + 7, + 66, + 146, + 98, + 242, + 240, + 240, + 45, + 187, + 210, + 145, + 213, + 245, + 169, + 85, + 71, + 167, + 230, + 149, + 85, + 106, + 154, + 91, + 139, + 146, + 155, + 149, + 133, + 68, + 133, + 20, + 42, + 62, + 61, + 28, + 10, + 78, + 242, + 224, + 176, + 181, + 186, + 89, + 6, + 74, + 155, + 230, + 165, + 101, + 105, + 169, + 89, + 185, + 245, + 164, + 181, + 165, + 85, + 5, + 65, + 70, + 159, + 111, + 13, + 0, + 82, + 246, + 241, + 164, + 165, + 106, + 154, + 86, + 86, + 86, + 170, + 165, + 101, + 85, + 90, + 170, + 150, + 95, + 110, + 89, + 101, + 165, + 165, + 80, + 69, + 86, + 127, + 127, + 105, + 80, + 85, + 85, + 85, + 170, + 170, + 170, + 149, + 85, + 85, + 86, + 90, + 170, + 170, + 170, + 169, + 85, + 85, + 85, + 85, + 170, + 170, + 170, + 170, + 170, + 169, + 85, + 85, + 85, + 85, + 85, + 85, + 90, + 106, + 186, + 170, + 169, + 85, + 85, + 85, + 106, + 170, + 170, + 170, + 149, + 85, + 85, + 85, + 106, + 170, + 170, + 170, + 165, + 85, + 85, + 85, + 90, + 170, + 170, + 169, + 149, + 85, + 85, + 105, + 170, + 170, + 150, + 85, + 101, + 165, + 150, + 154, + 154, + 89, + 101, + 150, + 154, + 105, + 170, + 170, + 90, + 85, + 85, + 86, + 154, + 154, + 170, + 170, + 149, + 86, + 89, + 89, + 101, + 166, + 150, + 105, + 105, + 86, + 165, + 86, + 154, + 169, + 102, + 150, + 150, + 85, + 101, + 166, + 150, + 89, + 85, + 102, + 86, + 154, + 89, + 149, + 153, + 153, + 153, + 153, + 85, + 102, + 102, + 102, + 102, + 106, + 195, + 102, + 195, + 56, + 170, + 194, + 195, + 96, + 60, + 95, + 70, + 156, + 179, + 15, + 84, + 201, + 58, + 31, + 209, + 240, + 120, + 31, + 11, + 225, + 244, + 121, + 11, + 135, + 149, + 184, + 105, + 86, + 150, + 229, + 105, + 94, + 86, + 165, + 165, + 106, + 90, + 150, + 165, + 105, + 106, + 150, + 149, + 165, + 106, + 90, + 149, + 165, + 106, + 90, + 150, + 165, + 105, + 90, + 86, + 165, + 169, + 90, + 86, + 150, + 169, + 105, + 90, + 149, + 165, + 169, + 90, + 150, + 165, + 169, + 105, + 86, + 149, + 169, + 106, + 90, + 150, + 165, + 105, + 90, + 150, + 165, + 105, + 90, + 150, + 165, + 165, + 106, + 90, + 149, + 165, + 102, + 85, + 153, + 165, + 153, + 102, + 86, + 101, + 165, + 169, + 106, + 154, + 165, + 170, + 106, + 166, + 106, + 169, + 170, + 169, + 149, + 105, + 106, + 150, + 149, + 165, + 106, + 90, + 149, + 149, + 165, + 106, + 90, + 85, + 85, + 165, + 169, + 90, + 86, + 150, + 165, + 101, + 89, + 90, + 150, + 165, + 85, + 170, + 170, + 86, + 86, + 150, + 169, + 105, + 89, + 90, + 150, + 165, + 105, + 90, + 90, + 150, + 165, + 170, + 170, + 149, + 85, + 90, + 170, + 101, + 85, + 90, + 85, + 101, + 150, + 154, + 169, + 166, + 150, + 150, + 106, + 89, + 101, + 165, + 165, + 150, + 86, + 102, + 150, + 89, + 86, + 150, + 149, + 90, + 85, + 106, + 170, + 89, + 169, + 166, + 150, + 150, + 154, + 86, + 169, + 169, + 105, + 105, + 101, + 106, + 166, + 150, + 154, + 166, + 165, + 85, + 150, + 165, + 86, + 85, + 170, + 165, + 106, + 101, + 89, + 85, + 150, + 106, +}; +const uint8_t DPCM_volts_8000[] PROGMEM = { + 102, + 170, + 165, + 105, + 149, + 105, + 150, + 89, + 101, + 154, + 101, + 102, + 153, + 150, + 106, + 154, + 102, + 101, + 165, + 153, + 165, + 106, + 101, + 154, + 90, + 89, + 154, + 85, + 165, + 86, + 169, + 89, + 166, + 154, + 165, + 165, + 85, + 105, + 102, + 85, + 86, + 85, + 85, + 89, + 101, + 106, + 89, + 105, + 166, + 102, + 89, + 105, + 153, + 105, + 90, + 165, + 166, + 86, + 154, + 86, + 166, + 90, + 90, + 166, + 149, + 106, + 86, + 153, + 102, + 85, + 86, + 85, + 149, + 85, + 85, + 89, + 101, + 89, + 85, + 153, + 102, + 90, + 154, + 105, + 170, + 169, + 170, + 102, + 90, + 165, + 169, + 105, + 149, + 149, + 105, + 105, + 101, + 149, + 166, + 90, + 154, + 86, + 89, + 90, + 86, + 149, + 101, + 89, + 90, + 101, + 165, + 170, + 85, + 150, + 170, + 86, + 149, + 153, + 106, + 102, + 169, + 149, + 165, + 165, + 102, + 150, + 166, + 166, + 105, + 149, + 105, + 89, + 149, + 86, + 165, + 165, + 101, + 85, + 150, + 166, + 149, + 149, + 101, + 154, + 150, + 102, + 149, + 170, + 90, + 102, + 169, + 154, + 101, + 169, + 106, + 105, + 89, + 106, + 150, + 166, + 169, + 150, + 149, + 106, + 86, + 154, + 150, + 150, + 86, + 86, + 86, + 89, + 89, + 105, + 85, + 165, + 86, + 89, + 150, + 85, + 169, + 90, + 105, + 169, + 90, + 90, + 89, + 153, + 106, + 102, + 101, + 169, + 85, + 149, + 89, + 105, + 106, + 154, + 102, + 169, + 169, + 165, + 106, + 101, + 105, + 85, + 85, + 85, + 85, + 85, + 85, + 85, + 86, + 170, + 170, + 170, + 170, + 170, + 170, + 170, + 170, + 149, + 85, + 85, + 85, + 85, + 85, + 85, + 150, + 170, + 170, + 170, + 170, + 170, + 149, + 85, + 86, + 170, + 170, + 170, + 170, + 169, + 85, + 85, + 85, + 85, + 85, + 86, + 106, + 170, + 166, + 170, + 154, + 170, + 90, + 169, + 101, + 85, + 101, + 85, + 86, + 89, + 105, + 105, + 106, + 169, + 170, + 170, + 170, + 170, + 149, + 85, + 85, + 85, + 85, + 85, + 85, + 170, + 170, + 170, + 170, + 170, + 170, + 170, + 106, + 105, + 85, + 85, + 85, + 85, + 86, + 90, + 170, + 106, + 170, + 170, + 170, + 170, + 170, + 169, + 165, + 85, + 85, + 85, + 85, + 85, + 85, + 154, + 170, + 170, + 170, + 170, + 170, + 170, + 165, + 165, + 101, + 85, + 85, + 85, + 153, + 102, + 165, + 166, + 106, + 106, + 166, + 170, + 154, + 169, + 153, + 224, + 102, + 86, + 149, + 85, + 101, + 153, + 149, + 166, + 106, + 166, + 170, + 105, + 165, + 165, + 106, + 89, + 105, + 100, + 169, + 89, + 170, + 90, + 150, + 102, + 154, + 85, + 165, + 169, + 105, + 38, + 70, + 145, + 169, + 86, + 169, + 107, + 170, + 154, + 169, + 101, + 105, + 169, + 90, + 166, + 106, + 106, + 149, + 86, + 175, + 250, + 69, + 85, + 0, + 85, + 100, + 1, + 107, + 255, + 249, + 0, + 1, + 171, + 255, + 229, + 0, + 21, + 170, + 254, + 165, + 0, + 127, + 253, + 0, + 0, + 1, + 111, + 148, + 1, + 255, + 248, + 0, + 21, + 170, + 255, + 248, + 0, + 26, + 255, + 255, + 229, + 0, + 7, + 255, + 240, + 0, + 0, + 91, + 254, + 64, + 31, + 255, + 128, + 2, + 174, + 111, + 255, + 128, + 1, + 255, + 250, + 170, + 64, + 2, + 191, + 255, + 224, + 0, + 26, + 234, + 149, + 64, + 15, + 255, + 208, + 0, + 111, + 186, + 255, + 208, + 0, + 191, + 254, + 165, + 64, + 1, + 255, + 255, + 248, + 0, + 7, + 254, + 64, + 1, + 2, + 255, + 252, + 0, + 27, + 255, + 255, + 232, + 0, + 31, + 255, + 208, + 0, + 0, + 127, + 255, + 149, + 84, + 0, + 106, + 148, + 0, + 85, + 75, + 255, + 224, + 0, + 127, + 254, + 174, + 144, + 0, + 127, + 254, + 0, + 0, + 6, + 255, + 253, + 65, + 85, + 69, + 105, + 64, + 1, + 85, + 111, + 255, + 192, + 0, + 255, + 254, + 170, + 128, + 0, + 191, + 253, + 0, + 0, + 22, + 255, + 255, + 64, + 1, + 191, + 229, + 0, + 0, + 43, + 255, + 248, + 0, + 7, + 255, + 255, + 148, + 0, + 11, + 255, + 248, + 0, + 1, + 111, + 255, + 249, + 0, + 1, + 255, + 164, + 0, + 1, + 111, + 255, + 208, + 0, + 31, + 255, + 254, + 144, + 0, + 31, + 255, + 228, + 0, + 1, + 175, + 255, + 253, + 0, + 2, + 191, + 164, + 0, + 1, + 111, + 255, + 208, + 0, + 47, + 255, + 255, + 144, + 0, + 11, + 255, + 249, + 0, + 0, + 91, + 255, + 255, + 0, + 1, + 191, + 229, + 0, + 1, + 111, + 255, + 224, + 0, + 11, + 255, + 255, + 228, + 0, + 6, + 255, + 254, + 64, + 0, + 22, + 255, + 255, + 192, + 0, + 26, + 255, + 249, + 0, + 2, + 255, + 253, + 0, + 1, + 107, + 255, + 249, + 0, + 27, + 255, + 240, + 0, + 42, + 212, + 0, + 47, + 255, + 128, + 0, + 255, + 253, + 0, + 4, + 22, + 255, + 249, + 0, + 27, + 255, + 249, + 0, + 6, + 253, + 64, + 7, + 255, + 244, + 0, + 15, + 255, + 208, + 4, + 64, + 27, + 255, + 208, + 0, + 127, + 255, + 208, + 0, + 107, + 168, + 0, + 7, + 255, + 248, + 0, + 31, + 255, + 212, + 1, + 0, + 27, + 255, + 224, + 0, + 47, + 255, + 149, + 0, + 17, + 149, + 80, + 0, + 31, + 255, + 224, + 0, + 127, + 255, + 80, + 5, + 17, + 91, + 255, + 208, + 0, + 127, + 255, + 144, + 21, + 165, + 64, + 1, + 4, + 22, + 255, + 253, + 0, + 7, + 255, + 245, + 0, + 85, + 85, + 191, + 254, + 0, + 2, + 255, + 254, + 80, + 5, + 174, + 164, + 0, + 1, + 90, + 191, + 255, + 208, + 0, + 47, + 255, + 144, + 1, + 89, + 106, + 255, + 228, + 0, + 27, + 255, + 165, + 90, + 165, + 86, + 186, + 144, + 0, + 6, + 170, + 171, + 255, + 228, + 0, + 47, + 255, + 148, + 86, + 85, + 22, + 191, + 245, + 0, + 26, + 254, + 169, + 170, + 170, + 169, + 85, + 170, + 148, + 0, + 21, + 102, + 170, + 191, + 254, + 64, + 2, + 110, + 186, + 170, + 165, + 64, + 26, + 190, + 169, + 85, + 85, + 85, + 106, + 170, + 165, + 170, + 85, + 85, + 170, + 165, + 69, + 85, + 85, + 106, + 170, + 171, + 238, + 85, + 85, + 85, + 150, + 170, + 170, + 101, + 150, + 89, + 101, + 166, + 106, + 105, + 150, + 90, + 169, + 170, + 102, + 154, + 101, + 150, + 89, + 150, + 101, + 153, + 102, + 150, + 85, + 153, + 166, + 154, + 105, + 165, + 101, + 154, + 166, + 170, + 166, + 153, + 101, + 89, + 102, + 154, + 89, + 166, + 169, + 166, + 89, + 166, + 89, + 166, + 105, + 166, + 89, + 154, + 102, + 149, + 101, + 89, + 170, + 170, + 166, + 85, + 85, + 90, + 170, + 169, + 102, + 170, + 149, + 85, + 85, + 170, + 89, + 153, + 85, + 170, + 169, + 90, + 170, + 170, + 165, + 90, + 165, + 105, + 85, + 101, + 89, + 90, + 106, + 153, + 85, + 86, + 85, + 85, + 169, + 165, + 166, + 149, + 150, + 166, + 106, + 85, + 85, + 106, + 170, + 105, + 149, + 154, + 106, + 170, + 166, + 153, + 90, + 106, + 170, + 169, + 165, + 86, + 101, + 101, + 89, + 101, + 85, + 85, + 89, + 101, + 85, + 85, + 89, + 85, + 85, + 85, + 85, + 86, + 102, + 102, + 89, + 89, + 153, + 153, + 153, + 153, + 154, + 170, + 103, + 25, + 155, + 10, + 150, + 149, + 165, + 105, + 105, + 166, + 90, + 101, + 101, + 166, + 154, + 89, + 105, + 149, + 153, + 89, + 89, + 166, + 102, + 105, + 105, + 86, + 154, + 153, + 106, + 105, + 90, + 89, + 105, + 102, + 102, + 153, + 153, + 150, + 102, + 153, + 105, + 153, + 153, + 105, + 165, + 101, + 154, + 102, + 101, + 154, + 153, + 153, + 102, + 101, + 166, + 102, + 102, + 89, + 153, + 102, + 102, + 153, + 153, + 101, + 102, + 102, + 101, + 153, + 153, + 153, + 102, + 106, + 166, + 102, + 105, + 153, + 153, + 153, + 102, + 102, + 153, + 150, + 89, + 153, + 102, + 105, + 153, + 102, + 102, + 102, + 89, + 153, + 153, + 154, + 102, + 105, + 166, + 153, + 166, + 102, + 86, + 166, + 102, + 89, + 153, + 154, + 101, + 153, + 153, + 154, + 102, + 102, + 102, + 105, + 153, + 166, + 105, + 153, + 153, + 101, + 154, + 102, + 105, + 166, + 102, + 106, + 89, + 153, + 153, + 153, + 102, + 102, + 102, + 105, + 153, + 153, + 150, + 105, + 102, + 101, + 153, + 102, + 102, + 105, + 153, + 154, + 166, + 102, + 101, + 153, + 153, + 150, + 102, + 89, + 150, + 102, + 153, + 153, + 154, + 102, + 89, + 154, + 102, + 105, + 154, + 102, + 166, + 102, + 89, + 153, + 153, + 154, + 90, + 102, + 102, + 101, + 166, + 105, + 154, + 101, + 150, + 102, + 153, + 153, + 153, + 102, + 89, + 166, + 102, + 102, + 149, + 169, + 153, + 149, + 153, + 153, + 102, + 102, + 89, + 150, + 98, + 105, + 153, + 153, + 153, + 153, + 102, + 102, + 150, + 102, + 89, + 153, + 150, + 102, + 150, + 89, + 150, + 89, + 153, + 101, + 166, + 118, + 102, + 153, + 153, + 153, + 154, + 102, + 102, + 53, + 153, + 153, + 86, + 153, + 166, + 90, + 149, + 169, + 102, + 153, + 153, + 153, + 150, + 102, + 102, + 102, + 89, + 153, + 153, + 153, + 166, + 90, + 102, + 166, + 105, + 102, + 102, + 153, + 153, + 153, + 150, + 102, + 166, + 105, + 89, + 153, + 153, + 149, + 166, + 102, + 102, + 105, + 149, + 153, + 153, + 102, + 102, + 105, + 165, + 153, + 153, + 102, + 102, + 101, + 102, + 101, + 153, + 154, + 102, + 106, + 150, + 101, + 169, + 102, + 165, + 153, + 90, + 89, + 169, + 106, + 102, + 102, + 90, + 102, + 101, + 149, + 169, + 154, + 154, + 102, + 85, + 169, + 106, + 102, + 153, + 90, + 150, + 165, + 105, + 89, + 102, + 149, + 102, + 105, + 153, + 106, + 86, + 153, + 150, + 149, + 153, + 102, + 101, + 149, + 102, + 153, + 170, + 89, + 149, + 166, + 166, + 106, + 165, + 101, + 170, + 166, + 85, + 85, + 170, + 170, + 85, + 101, + 102, + 166, + 85, + 90, + 170, + 170, + 165, + 85, + 85, + 170, + 149, + 85, + 106, + 170, + 165, + 85, + 170, + 170, + 86, + 170, + 154, + 170, + 149, + 85, + 101, + 170, + 150, + 169, + 169, + 86, + 89, + 86, + 170, + 101, + 166, + 85, + 90, + 86, + 150, + 89, + 85, + 154, + 150, + 86, + 102, + 90, + 165, + 86, + 154, + 169, + 165, + 154, + 169, + 169, + 165, + 101, + 89, + 101, + 90, + 85, + 154, + 154, + 149, + 86, + 89, + 154, + 102, + 102, + 150, + 153, + 165, + 101, + 166, + 165, + 85, + 153, + 90, + 86, + 149, + 85, + 89, + 166, + 165, + 153, + 105, + 149, + 170, + 85, + 105, + 169, + 102, + 105, + 101, + 153, + 101, + 166, + 150, + 102, + 150, + 149, + 154, + 105, + 166, + 165, + 101, + 89, + 85, + 166, + 90, + 165, + 85, + 86, + 165, + 149, + 149, + 89, + 165, + 86, + 89, + 169, + 170, + 150, + 105, + 105, + 102, + 165, + 150, + 90, + 90, + 89, + 101, + 102, + 169, + 101, + 149, + 105, + 89, + 85, + 165, + 90, + 170, + 165, + 154, + 150, + 105, + 105, + 105, + 165, + 106, + 154, + 150, + 150, + 150, + 86, + 170, + 105, + 105, + 170, + 90, + 85, + 89, + 106, + 85, + 101, + 90, + 170, + 86, +}; diff --git a/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/rich_speaking/begin.wav b/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/rich_speaking/begin.wav new file mode 100644 index 0000000000000000000000000000000000000000..bc52a0cd7310ba22fa3054b9e0e47b422e4032ad GIT binary patch literal 22764 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 literal 0 HcmV?d00001 diff --git a/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/rich_speaking/eight.wav b/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/rich_speaking/eight.wav new file mode 100644 index 0000000000000000000000000000000000000000..04163c5d69bb95149464647829e9787263e2aa0e GIT binary patch literal 17004 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 E58%e53IG5A literal 0 HcmV?d00001 diff --git a/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/rich_speaking/go.wav b/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/rich_speaking/go.wav new file mode 100644 index 0000000000000000000000000000000000000000..5626430a8bd8d143d311fc28770b18727eba3b3b GIT binary patch literal 24044 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 literal 0 HcmV?d00001 diff --git a/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/rich_speaking/hello_world.wav b/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/rich_speaking/hello_world.wav new file mode 100644 index 0000000000000000000000000000000000000000..12f5b7ce7f23c7de54d8335d69df3f1921aacc9f GIT binary patch literal 25964 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 literal 0 HcmV?d00001 diff --git a/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/rich_speaking/one.wav b/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/rich_speaking/one.wav new file mode 100644 index 0000000000000000000000000000000000000000..e8dae7e3d1e60277910e2f77ff45ff24e671c6c9 GIT binary patch literal 18924 zcmY+s2YeLO_dYy*wx{=mKnQ_AB(zX8h=3qH3ZgVYP^3yz5CK6{6h$clf}%kL1Zhfd zQUWL-H4qF00trb-NZo9&ieji>>h1CGk3WlNO0`O@T&vZbT0Mdj!LNA`l|ZB@MWZMI!AMyU zNs2`#uNMB*49XeX&JX(NlMQ(ET(p=jgJ4{mu7Nn1(OIp+y*vK~CGL?E2ixk@-mC`Nco zINX@>;9Tc3xl8ia&z*tmBxgcbQmS6Ij)g`JrHsO z*K%>?3eIx_kvu`JT>tMLc`FZZ=OWzK9wL%sF^;8yf080si~kD`aaJ0T8B!;mz8=(- z1k#$uqs|r58YR#c!mCEfBD8F5HF=JpU8gdk8sRsguZ~<@MhJol5{QHl$#r6NaqraI-wW69)aa07AOf{#PAQekRAqG=s%8FxHAXsolq8O;F z2nvV@9O%SAcM&S8h&}{@d6(u6{M$9VR)c8Q>H@J2X9Oi>2v4;qS_yb{Un@j-0KVPB zKjH7)z<&X_PSA5tE5MPY3vm6R_6V^E;i2{zJSXRm@OClok*meXvjle3Braf*3qUv~px1Z(Y0VI+v71CH;kQ2~pM2G3R?b3gDaKa(LE5u_Utt3Z+x<(tKTMlw;{1I*TKg~q! zudd06h1P%n_i19Obt_HY(W$Llzeeq+U)AlhZlwug36BYKbgiZ9A027BX47q|?oW^$ z8ucOJt8Swj?UF7_#1m??kwj+xr=f`@BpwMt4Z(>n2|BV#Swv%!di+mw>bkKj(ApIU z)ir0Mln}%>zN^cLE&(J>a!Cy2uge)p6ZGk2>l$CT!h}MNmQ?q7h=tef4QU18AmOHN zH;Kh02q1bz=do_h2tSFoBWJq3CCDKDVI!K!`veF7<9ws_)=Sg5ulpMW6ODoB?nZ9w zR*@V@(9cLNBoNur-_d;(qSXk#bg3d|x`dJZNV^)JC9+29L_%$#RYcB6dkKO`d-OE9 zrr*(NK&U{lo(CD!rIAQSqm=3X0+A)%cOYH@Ns;@F{sMWAr1f0L|HJ=BRh@Ram!j8# zw1w1<(3eOIX)kG2J^l$L2nGq#bi1u))^SDjAPK|*XCm}KApa!QCvc`;=|lCS z1|sUmENXNh45x-uBaj+PO~8K^?vkf_{r4upsGcj)qB;r*T6KM`>r3Ka=-earrO^hF zHZ^*rBu%)Y>keH@5Pe7j;R&JmC1|c3=&obhVQs&*568neI|7?-`b?)jIqKXZ z$R)_E4N#3xi+C}qsQ+-ZX&N=3T0vz~`>BgmK2=23pz9M!r_q`8AbK1pnLvrG)rk?GG&VCFK5nH9`NW*c*eImw)6a+nK<7X!!B%u!|^vx!;5EW>jnna&K$ z6wtfrg~-!~az=w=r?oj+Q|+QUM-5YRl(|ZZa#Nl!caR&TqtZ%gywpl^`)~SB`1ksM z_J84@?0?1I6=9%%h`*0N!=H}y5dSp)H~t@R|CHbEPnT9m|4Nbaa5-C6!@8&C#Zg9g_5dVkVnf; zrKM5}>2L5Y)PKS^-e>V0@s9V}ynlN>_B`)V-Dlhj++Ey~>z3=V>vPvIS2NdR=K<%p z&PC4eop+tBU29#@?myihc%Jii@V(++C~cB2DCH_k#nauG9;_8LNX1J7; zYElm=GnLMYB43cV$eZL{@Fiu%yLL-FiP15+@=7>yO|m$m7T(FXG__p+&HwelxxXP=TGuB z;SJ$8ffL^le-|Zju;FvV5yKtBW5WZ(Wy2oB$A$q0&Tw3uCB}-!gki#UzB|8>D`wlV z%b26I8z|qeS+(VAg1SRV2L~t0c4?s$D*fP(_V4m__5JC6-h15B#q*mx-2J(Wb}e#x z8s;^49LpWe9eMTZ>tCyntS_~nw(qoOBkr@8+UM7gbG+Hm+ZpR>;vV4n%{$y5Bkxe0 zY6i89&SFt(K@{H;_lO3=M+Td5Dnb+E5yLFQ0@QV|;gL8%JS@B{G)1rp+j$eeitEfN zYz{k)z0Me!&h%%{vMW&MIqE-3nsQ4140Y}&Cqk>-maa*5se?RQ-XY(FhUly;R*C{T z!msw%Ho>9{hg5Y2w=U8Ooe8~lh;cFrY#N(_&x74w>3(+H~lOD_Sb#KOLGTlex}JVH3EA+_!u? z;gayOcwd}qa2XaD9mXN1pG;3o8RqxRTg|7;f1CH3zc9aQHkkLC+L}H!9yi<-D};K! zmaAuj*&fU?x`diYc~G8T%~H20C33pFRQkuy_&fMUc|Y)c@4o6%ogvQThIWpQ_5JN5 z>Sotw*PN=BtHxG6sQj$*#Y%If^wj&bN#)eay_Ey2PE=2*y;kS3w{ui9Ty3^LH6>X}EDNo(ZF7Sr2VV%D8C)7P2rgk{&~2OBdd;%h{4Q!)1^)dg zioyi08#|fVMxUiFXvE!i!ANaoV z$4Gmn$#O5H2RPG@GSY|W#mpd3%g*}mMO%zN1P{2;iq#G*AA7uJofjj7pH6<7Ibg{}Nb+4j;^ zCG#I|ELMtEBGeSkEuQ?id+Bda3{SgOZK>I9R~w%5-1aY2m(eNQT_M!8)Y?CIdT2s; zmk2e2iHeK97kwjIi*iNQMubOv7k)Y{B{Vg-kL?djKeNG9Wq3;z`Atkdq##TkF3H1YvH*e7j3i6$%Y)Rgf3JQrPZF+u7rm5_BFL>H8ZMSdD^pL zKt+>swd`S8UTIdzzQ=PPr$6=;r4(&=)aKzI4@N!k-hci6Uj_3D9v3{m|MYgowZ5lds1CbVnzVe>P|YVz9TcazP@hm*u+{)85>^CH`Y zO$?r9{myuj&!=aq`=#5yPTm3T+=jXJr|WWRV`>-Itf}riqV*4GTO!`^P9tDG%G$;I`}z zxf@}K*%tS0lRM28wAj{aVC%xxiEY?6!`obF)4$EM)MhEqB&}>RFm7t}p75-osYXA$ zPi^JD;lASNQBzf(U6NHa`r+8ZvimRIYyI!~yuNwqc^C6?@@Cw=d283L5w~;lX5N`_ zXJg)o+gZ2!=Xvg2$^ZD?t@~L;6=gfBo^jN9uV|b&*7jrM!X|f>f?ElU+!+y5vZuzriB_;Dq`j#{;i7m+~=~?!E z`OT+ys={hgY7f*=juPi4&kEnOQi3u`i(*>vFB<+bt+Fh!Jqi9LEHiR=^op2@m{Tz$ zVwjku=#^**sSPX@s_4rlJ+N;r@WcksZDTNQd&ftVX2o|9!}ZNVrTP-P4nWPi8&uJDy%p- z!)h`9!o5PRk_DgQ+9t_J=!0bqZ=fxXqyEcVbV3o;AKn zjq`M=+x7JCC(FykvfoSVOXoakUHPJYisz>CEfXOq#^j*v@HWwFqZdVHg~`EPf;L+= z7-HE()#dNxqrKDJhnyW6zHuZrL^>xpYn-_*kNceWfxlW_tghEiQN{EU_6~0`6dISA zzqCdN=ZE%c}eon7X4F3rgUg=F}X5%XmWJ((MeOAl_mbz ze}U+(Ma^+#q<#@f`eamAL|)Na?BD)-|z3O5!w3l0<(6#w{SM%Bmm>Fzc1D#mDh z)7Bwmai}wFX2jQ#gCi@$rUuP5-4mv8hv-E0dH*vWtGl=RTesq}xaK+woeNz(+=}~U z&tZ?tJJo+gGAjGk#nc$)ckV^8#OSmn1!srO5APfKan#FE36Y+#Z-PbZ38Ttir%RNd z{88R)cRP2Odnj^f;`>ZWQ>Rhm7$@77KLS7W4*Y3}|5u0;4hmxp(~PUks;z5?5}F(} zEv~-F+9ajL$d=))9H~KVX0`r4wXD^!mP&GUQk!N=npDPJjd?k0Q+RqT-O;q1t^JyVw54{rX_b zkDFKj%>7#RyKw5o>w`+VcneIY!TCkS z`$hQ$JMP95%qon09Pu={ex&Csc^vbN*u&J?a?7?W_*C%0;3L6*1dX!2WIJH3G=+*$ z+$MUywomy;`q1liu`Zu8+qtsA(%^PHaFjIoU7J0Zyk<#JGN_46IRBhzG&VO!S>LnG z3i=_qYsl^3vY@-R0oIGAUE(mV0C;I3b@x5vneSTXT<4tcYVG;Zmn035o2xsuLsS91 z553NIj2(S8fi6IAXfnL#66zCpR`ty9Y&iEO_bsQ1m#jT)v}LAwtZ|*OQ_!u*uCZYW zX~|Ko?zMTljZzO|e-+pNv3*Uj;! z=R^-PMXQ!M-|U8o)tk%SE{eTB>)-U;FaH^GA?M7IlM{~g{^R{!?DoZ5c5P|C?UP^s z-u21>zsXGbzW6kO?}P0+Bo|kjxDZ_eKV9u%F2XroB6fEtKv^$8?mi0ins9x_&dAd_kQf7m~W!R$o}Cup<9DLw!LOaG5st$ z_%mEMn@ufNHv1CXZ5qC;yI6U$?D(V4?lsH1cD?>`*T0&c*>n8jVfVow4jnqYJ}OzI!LR`^1i)=*frv2<6_&qbN= z3DT-pJKFlvwC}kYhIkWY&NgS8+y;x$Z#rlB-1?q1+}hIG#a3pUVmU7?q&}0Dc(jJ^ z>|r(ADoZL?)R^m6IG^#x%M-L`n0L6X{GXum8(ac=8ht(yqaN3p`|P{?2jU^)P;-L0 z(74y|mG}+6jA6C6rBA(`JtIB6z2EybNIldNsy{o6-viI~2LBSrGDEd=WxVvMubsEv zv)Nnb`&%kdR%xB-1a>nwm~Y8{&3(yEU}n;r&_63ycdO;?S6Y z*-7WoZ*Xme1wt#47ZVNNT7~d8qPN6-m$)HmMT=3bBhrqfc4@Uf<%8w}nx0M=5!*X* zZn!otvklqmc6ayM?&VWTUn^^0(XD2z^CPJP9U3#SY>ji*h`tgC}Zhn%y%B2J^)_)j?7+b>qR%HMs`sUp5wwI6eDle1|vzf~M+ zoNHWa*eZ-(y_ezY>@O>?rgkOmmANx+?i%Ex)=O$ln_OMBDLboRS;?Bls(et9Z zM7A*^GQ^yIvh zA!$uIEK8q}{6^GV<3M?Zv!|V{+FiD+tWRZCZH&vPhHyuO9;T7j1D4&U^M+yEHKmC( zLzz$YW?lS?;&4NA^IBVS&^D8wiI&6M$@Sf9!>Zj+TUFAv_Zq5vX;hpr));1*Y`SUe zDb}*PsFkw8H`3e8-%sAB+UYKQSHlJKr?!u5oh_4%Qw1w~MN3px`|o?heVTurk_}Jz zZ)lo$W3}N6F@!fUYt#s7inp6*oaZgC6rCmNO;t)*rK@I z@nH!~6Gq2<8hs_g9?}UmX`OL^Ky&qsLMs?G3Z~~{RInE{O=YA(o{ZX9M=Vd^CG zW+tjz{pY;Dc;>o0dY+dyP%ZgW1`3pDZtiQoX-pOh(WBWa&GPfoVtI^ONF8I_2#g`q zIN2C&7{wRTS?X-*JKxvdmfl~y$^LcnDough?Z#-%IOZmmr=F6{(h&dm{$0{+rBqwQ zT;V1Oq2k}d0ltb|NbgkZq&lD3H`q7CUnj+=%PA*Q&ovQV74GskxW4RM`ntAKy`XG> z*-Y(4?L**UJ8slr-i3$dk{e*lkO_j!7hDX9Yb|7_9J&5+6^BMe8{ad9uY9u`l9^V=61?~lQ zBQt`YqxHh9!XRxv6J+?%IwIuTa4xbqJU47?XuWlfA)H&G9g)UL>B<__NoR;1OpDCl zTHm#OYuRpjKBP2!R`m9S;wD?->Y~4kN(rN_0}Ta~(=*4l&*gXh0AgSsa3uxvt)nobJ_*JUS=2T)MmZ&|^}pzkkao!9Fh019Uc$V_ zRB2Sjj%DdH}7!~hN@5C%qFM24IrgeaQ9igz8Q(&n`i`H-bWrbjtezIqX|D=%Y`;deif$X-H1R}pcbq-+g7KjAYkdpHj)pZ2 z(>-?O0=#gEJ8Kv(G-VHKRlfBu#r>VHpR`78$7P#83mqI;AMr{^ylE)&yxiLJbA8L& zc6A@s&vsV(S;oOX5HE}2Tn@Brg|FB%(mm57p^D2jZsXs=LuR)c2bu5Y`30lDVX&eHxSxbF;Tygsn?{v@gXg@9yxo1{ zrEHaAwsY-;PQqR8A#;J6t1gt^mOhj2$$hnM=;L)2mm0n@bQQhaNM@flSLq;M#<*^Z zI+|L>yvKddf5&rt1>2dKNR_HbF5 z4OQ<+7Ig)~aqsa%3~LNW4d;Wi;~q52N}1WRbz)@r)u5S{Q9>;DEIV9%A}?ab3zNi5 zlW1-u*y+*KV)!Qyy&=8?j1KhlUG;tL6}?BD-_*~nom(@l^0|sRWnY$EDeGP?SFEd? zU0GPkR_~~CRJ>JgE&cdW?)~}q9zQ%?`z-r+@Q&E)3Gs1{qo>8*jcjfEl^>^iJj1+{ zYU2JD=bA5>_Xrcv`~AS*%{{rn?6_RN(zQZ4$K5uZHq*9dL2udynLpzDYd!r_JYRdl zeWU!cj5RwLf!&0asYjJEe}Z=m#xmM@LS>2yhpreau7(H03w|aW60|{LFbfiK-pO_nD~A4r(%Qti|+W+&T>`<*SOmuth7uF~hQvyXhcq+V(wdLgB3 zF}$E0`WJ14@~UL>xAkw34k_hYEOVXR!+p<{vMZPZs)uG#dnuElXZwLW?bu`Nm+S@1 zD-ES`)#Zwe-ez-kH%6R2=&jDnlqv8K$X*pCST_KX35THms6X0@?ub;Y?SFFg71NpNX+nW^kRnX~Lx#oF>w zran6R^l$%dLvYxF=+7e$h3yXS8zBdEHoqubqwGo{Jxa(lo-|!F z#d1M%JMSv@h=$pY*^Z@-F)q7&oxLn>Fcz2+%=xDI#!&G`wgjW>l^EH}qT4YY;myub z--m~!Vg|LFC)c&ob=T{YuV@$Oacn($9fg=(+^GrL1Z@iDqbb_YEaA@Z?S)I+KFpMj zrpADth3XP*1a*NnvGds0>@j8ye5MBFA2~?AEk(=cC8-RCzHgVVcz1p3zw;Z@?vGA5+ePk z&SMO)Bxl5BVw&))p|xqbd1tU8!V*3;WNuK3^?>=VtuHt~tjAPf+O@^jd2 zlwVz@c2WOQw#cG10IL!1BHr-sbVs?W8oqRVRsWX#*}C&Jr8WQ5)Yin+Ewd-uo7>av zkLn)OeO@=Qu7AzM+Mk@PTE(q4K7ddBnYi6>#xOuI3NwWu(PB!qjR^iUD8i~5E4gu0 zGxcX#@;iN}{4dKtt5)VY?lLo!vZ2rNRQ-V3NN3Pr)2rA|_|L?LhAoB=;T*F;YoR2{ z1@g8DJ8tP-eUe`1Ew8?h4M1$sOE3q6?T=t{~&=Rqq?Rl}7A=~Zcx zR#&Ei`wCXD?8a)Ioz%1R9r{(~Bj!2g2K_Q!in-E#h|8(P)OG3^ zdI`OUUPX)a9L$if)Ou-I+G5OluEeY=i}e%p@l*`8Q|qG{wFWgFbLSHR_v*DUplm2g zqNoCtS%6ZQ28yzlZP|-IVs@N;bw7d*SUctmny~ z2I1WaKxZOwOV;s_^`b29rD3joCiMxzG?bNz^Atp~wkQj4Wa9ndc$=)(rzo;Ysy?u~ zi>xmW!rKBFXM^Ni#EPBrK%Rs$WK||vQIw8$QJCQ+>z_QZc4YOQm0rj;!XVDT zG+{nqc&38BMJH0H)B-ID&rgBO4pfWf963s1)MK!pJ+%26q488E7yA1i(~}v+bYh0H zm$)A}KbypEVAe8Q88@?mNoHnXbYg?hPTV1c@c*!O_BGA~4IRdf1t#9%u3(+TEp8}F z(fOFsUO`3C{V~E3M7RMeR#K;_p<0~UR*hEMt6|z??QQi9rL|Ho?~|`%9C5wx6>lhJ ze_MEWcw2d!c@AU5oOi{$7P=ld-*;9txEgl3-u52!mte+T_P^}+`a8%kDNWR$)gs_+ z1vQDe$iB>#vmY}r&@a%fm_9&iJ8lcxf?bX|;;*^GSlbcLI_NLyGPG4=64A1&;OLup znxJQ*_LV9rRZ4qxf%=2`wpyXQt30DLMeL3vt%NAUfbD_m4)qC2+^a5Czfcdti_X&4 zYdbNwA4AQda)6u8baV9GIXVG3|4zGTm9C||G|doxM1vdKQRZMg)t`Qg?v8akr-9^g zK*MnGuT(n(^iI^KK{t-U3J;4`sGd@9qQs{NPtqz`}rlWvjCwP*F=Qm-_o1l}Rw;U_SvVn*( z+HlBHhL)x!YC))nF%T>o3yp2mVzd;kLtq6;AJkOS;F#>hNCe&q zQVC`=aLfSqdm;2d=zzQWis{A`aGy|z=?I2qCNb~Peb9xyc>sQtM%y>6I&ZGA$+U}r1WY*&u!mOI1i^c70aDBq})sh^k|oLy*bc-BB0nivim z8jK&A7g*L=T3IU0UURf1+VZ;jw$Wxdf!ZVrV-Y*?`Rr=ud-?)&MT6Q~xhb9Vzu7*Wo z-&Ui|q)MsY;LdTniZ+19&ofh*gN(qAK#g(`cB9O$tjwH;E_#=F1(qNg@^l{@?nvjt z4=4rCdjY3*^)_-`tyus*&)$P@Mn{l!U!{-*Yp=GGMJI!hDF9rIQ5@8-LvmBvYiC1PjsLvg*>04bcw zH9!Wh!|u7&JBlAD_DK!W4ylRsrhk!do!8=h;JFN=INR&?uJR@LxB9F7aZ*lEn!h487aLlYFkZiujmu|Rs$KuCbKh()S3aJ7Ux zAv^W%rE**C10BLryQ!A+8_>`V%pXi!=2>`)o9Rx>ab_Vj zk`>l{J~ZA{x*a%>0S}9U-Mm0`1RV=tUDCAY)#J)-mUhw=ztHYF! zmAz^XWGf0jWVyDU8j0Lz(c!Qm@$jHH`Y=5MD?dMgr+J()vi-R~_^yIQC=?cnoZ+bP zm?_-+62hD2kIVxtJD`t$G?$tdVI(-!WHq%gzGx^Fdh+8i7w`o7=}meYbqu^2qQ0ig zk)M-B`Iq^&d0+9$o~fSe?iV04mz`fYIp@rVz72Vf4vt=qfsPU^U=MP9P%qgZ+2`3! z_Sftm+8y?Fj<=oJuIcVqu@>&2$LhQ6UoX#A$3SBjF&w{37$k~V?dB9;G<;@UWQsDk zw>%F^!I>|a%8k77WkZedGyf`d_e`wN-Oql*d`qvS7HeOCQl)add`Q}YmDQ)DucUs` z9e;Pf$5-#m@tORW{XOB8m&@-0QFlPkJHYNW)u%3mFZV1wC^xeX+UYbKhF*OFSHX4R zKj4Fefx>vuD_FcKY=DKb2v_;r{5}2;el`CFPh(|VF4hx2$Mi)Fa;kg-&ss;frL$j?3P1nWmQ(~kdAL4lV>2E zXOu^Z193CF%omiml(o3>K)Dqtx2rl;{RtlDS=9|&H55JIZLl@P@UgSdyI2O#aSZ-f zQdc0odFaDT!?pQ=72sq&I_Wut!P81bY9p*sKZJ>pwGQy&ETBO(`ser54XDXdc)mNJ z9nQjr?t-2m=L^&i5I#fs+fdsQ)Y+#-LS6*K9?&6^wJiwQ&}ljF#EkIwh|fnn$wbtS z_>?Ko)nwOP49@yMYQvzrYViC;^mlS`hwS(wy(TBF`q9tH$2sX$O@g^j`71lO?!2b&rrVAs4J_zH5X~Jw^vJb8p z;V<#RS>U7=I=v&;j$`4;>}GqQ$8#I<{uR8=@!*;b-o*gKNl5)g-=%F#D`qzOK5@`G zMEiE9r=u<$a5NM>wmf+L#P8S(E^3Mky61EB8vL;B_vK^I{P|cVK3$$5XUPT9dF(@| zfmOIE8KhYMVc)mDjXu?P%y+{3C;Z0W-FMth_XPJ47tsnWojzwjSG9A1a}QQdKkGc@ z`pezZv&Xa5E9i561Z#E^(rJM`8wiQ-z=pC$_!9SE z$EHF$RQP#&;8pd9H&uz=#|ZGd6j->9{yyn>WFSn0bz2s&ZyCVqdZ3H!ogzpc3T$tJ zB#nbVLV7&=;qf$u7H=N#$XcQ%Cd`{Q1!fY^HsZ0p0DBP|=o9fM>)PEG*%WQQ!-O;~{N5Lfo0#FZG;$_tDD`0-A5 zfC6MJV?Dw$$ow{>=Ro(|hLoN{U(gb$T@T1}I(lin&|}L$TnzniA>hgOK-);mh<+fu z0}er+Fzy1GD!^`@htNlJa5n`~ISrJ^hSxg|T7vB2qo6CUpjPGR8w|qx-5`(k@Hlc% z*W!TYBRluH1>R1D?B;_vWT#RJ${7SNl$1w$dKm%vCw;(7)MPH|Fb5uX4RYF#n1{CK zpv`jwR9uhVY!=XU9=Hp_D9tjoWCGgO0UVf*XGo893~1!XIPVybc3g+o zQi@ni)dzf+dbD&4O8W#_@DO^q*?6N5G!W@&R)SOeK*<$25^m&T-xQ%4q3?chavuU| zcQ?F|1SAwdcO`-{r0!(ICp|#X9@r70|6*WIh?czqzVAeSr2(AQgL;Ho1<1<}+USAk zx**h`0C!K~S}JIj33{JK3zy@H2kQ?asfWPNZoFNCr^|8mVn8SMLFpKC1s^^F$c1Lm{^y@0At?N z*RLLL==yEQjS`YyH4a$igXxq!Kx12%K-%{QEQSX!5!f*3A=HY8{p8D!1ZH+ zC-reQGOkAUi<4cuevAyJpe^Y*l6|9OWR4t3n`6)_A}xdqq@84pL%*g!MG!)Ema^bl zG5GK>P!qyI(ux}7-ndV+7`40(o{(L8dVO`o)ZnQa&_dTHgs=a1gpuef63LI`NOlnF z-yI>`Bi}S2H6=A9cgZz<|1Ghv`fhVFhRC9|`WQ^(PEfK>m(Z7RhKxCq{f}7zWRQ_c z(k9|h=p#FXG9;Z6ppQP{lY;wXe=^zOOG+ZRAk-m9=z+Wj1+)a&VVQ|s$yn$F;AIf* z6YMp9)r90lawpyd`RTid31!L7d%`1qXRb?=HS%2pZ(y%K*}F=<5m1M{{|>DI|J8y0 zlMbAD0^dAv;60b7;T@4OP$onX-$hUZ?~{F{b$HSl_!`1fVBjIXSx^@E5&Un;4!XOpfvJ@f(jhV@N_A@UO>KjK)z*gSNj(_E+1b-$Pb*8uN#mr8H20W^FLbZw2VLqy{n5v{OW`Z=mII6(ApN2Caj$$sk;q=^pij6mp|j{lB0lJ5?X zXH)Tw2_5ldm-zoUOm?smj*@&xxrFnH|8a%Xir}4msiOu_-J^aS9Q+n5NPJK^v4QTzp{rLYtOJ3Ce3508qp;HJ)A?Jc$h^LLpKvB0@~7{lCHyK3oRNQ`Rcd_s_$$k@yk9N2fZW zGocx&H}M}x?R9RH;@QSFk?Z6cJ?J!Ud`jOHP4sjjawdGehDcD63p5bRK>RUs)B{Nq RoDkbg&_X;AQWnwk{~t|gvPS>_ literal 0 HcmV?d00001 diff --git a/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/rich_speaking/point.wav b/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/rich_speaking/point.wav new file mode 100644 index 0000000000000000000000000000000000000000..1ae28bb522f6e94fe8d28fb6785faef5b03f7614 GIT binary patch literal 21484 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 literal 0 HcmV?d00001 diff --git a/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/rich_speaking/seven.wav b/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/rich_speaking/seven.wav new file mode 100644 index 0000000000000000000000000000000000000000..83fb005bdb97cb0350a9bd7b69d9e6416a6242f2 GIT binary patch literal 21804 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 literal 0 HcmV?d00001 diff --git a/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/rich_speaking/six.wav b/Make AVR Examples/Chapter18_Using-Flash-Program-Memory/talkingVoltmeter/rich_speaking/six.wav new file mode 100644 index 0000000000000000000000000000000000000000..9afc27c94c01d94effd49e33c360dd234d792d7c GIT binary patch literal 22124 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 )Rxl+j?f-hH_oC-qg!bEQl27m9~s z!t*ity4());yabqkmSE%ej-iTtsG%ivklo$W-{gnUolTHgVRp=3$tP^l`rLL=_A>M zQ~$cd-&L-Ua2C1HIDuaN^(xIN540PIUW&Eks)NQQP0yFDhoIsRxQvONWD}5zqiw<$9q?I~Iy!0pbjrm}` z#9XYG*zbCJB=1&!W*TEn#wXlQ{BJ@y_LJPyy=OS-cEJ5Z&ljHCyheBj_l^)L-D|C{c8qWe zJEnIlizR>OI@^6qbnWjocdL$6G%JfPo|nJmRpJZJ>?v8Tvc_f(e{OhM^yo^;v4`J0 ztpD)Wa@TY>O z1zshuD%RKTvH#$#a$@9L!_n7Os6RA28}Pt2b`;H zldWG`Ypof!E!Mtf_wveuCaa2_oUS(C*8UC@2qP@f7ib}=i;!l!Kc4G(ec94 z+nb(+zc`cYliMjb_I0abAL|#I(14>2zHM|k>buyHaeuY^qjkqNw_Eb@FPoRf4~+L} zJ~DPo!;Jw3w{qnNAf$_U#xkQKy5P^3fte4UwM!3ry7$SdwDQO6pS*b9=cSbYxI`*5 zR9vZ=Zkx^gV)))?W$?|gW#O3-LUdK^SIzR{r?z++KPEmu-mm5ImcH?aW2Z#Mg@ptq z`~Bg2*!QH*e9vyi^TJjjbR<>*cfxs_-Ib|K6$_28eX7&wvvjTXTa8xt9o~Xpu>V9q z#pgS(K^~Lce%D88Q+Qc^YX7aKQ)#!n#@QR6PE46|=jlJ?m#3fYbE3;J<@enEy$-xM zIOy2q^MBv2c``He5PYNn+?9-}Y`}-YRby?Fju=^+78+RStv0?is z?K-r*m2f}qV&s9K9;S=RgxV2RO)Jlq_bs~iYG!6l+Tn-a-5+#!=w0vo$CJB0nx1|$ z`+45*l4q6M%oA-_rGGVxJwk#?!z*K&#w~BIjpySFnin_sYCbD2ut|%UQ<2(m?|L8m zd6*XP9?tj7FUwz-JS)m9nqSBiOnCiK?xvTHS6}4cDLGL!$^H!!pcCA`_xT`jc<4Xj zpGOUAQm@6XHq$z0bY9qHYNvMXx3msxxvp8OCXVRQk@xCv4!Yuf!uWu%5iit=<&BEg z$L&-jS5>8b(z%TWY^;ze{UDr_PsVSt@(t3@q^>48)rrwsMpuG%$TQy z*K(yng@X(KF1k~=HE%%9fb`sylKaW`|9ZG9?c>brxuFF+id&V3R{vx%ImSpU*cUoC zFTbD`4Td)gh*=k{ZL~MMYyI!TZ1qDMZfUr-LF;;p{SBUaeGzlXG1OwJ*7L^Jf*E;PFAwBg&smY%B!6zn;mTgMzt|o*7Ktn5KUh|K(D;pKy5Go5IlkVp3ur#=aky-h4xIL!3D}q2acArvq>MHS|sQUhTEtqp2yz@Q236Ocx(n zhncn22dbJ>O{j8KyjM23@ZPI_*%8mZp4>_;cwoML>w3EMvMLB!24&=fHsV2rI-!vW(y)WWIXukhdk0ZLi ztgqD4`Mx9B7Hv6DHKt^EUf7GLS%b5?zi9pH(>EgvhZUEW6qJ2fdA52`?Kaz8@fWtI z?v(p=-*bVn!NI|cg8mJB5||Ktv0kJ4LIbY;j(VHHofEwKc(gRR8`BJ1jX%2Gamz4H zG_=uqYkuN`gaS>PA=N$Bd$R8?KdWDWf1>|!e=gw5fKLOL2Il)u_O15(z-_yxk@B(a zr|L_kdHFxT?3?l3<74*^{M+Gg>FkUXVaK)|iaC^ZWYeF+&qZE;`Ji`tRCYd&7rtIP z#nOyhY)+{0ZN^`b(IPkH&`NU?+nr>~ptkIkXV}i%{BpEZfEzYsEODq2^m5cTloXLCs zG9_!}^F`@?>C2yu&MeF+c-6UJcFBy2Sv5PYnNFS&`S4 z!Rq=4!z`hTLzC-$7?K${+OMV8L$|@Yi`=(3kLnL=+uB(*Om%qG2bGg6Mwg!}yI0n} zLaJI-d&3?i$8Z-lPxQ5J?|ZKC5&esTM}=Ju?;klhYF%_(OinZ#?c1n+L_vf3VNL1< z1Wyg<>bt^oyxV^53N}e>W;{^ zv#)qx`QpmBYk&QF?tV=A)nG>BK#RQ zy0-CiruR%T=?O_lNN52Bq$408QbeRm6Ql}=AiawSNEbo9L21$i=^dmO=|xIH3km6E zl1!4x^m5L7t?Xz1KL5|}hxf~!{hP_0w$I*ct-W?z*ILn*T~(Xy&)p}5Z=`nRPuedH z4UCtAmzs`;2@&n0x5l)Ly%5tb`hJ8d?1PY{K|OWX!DS&hDQ2ew%n-^1XbisUIY; z3%MM6C7h3J9%+e~6rqhc99}!(E3}eH5nqJA6FNG$iQ$OmcjXnCh4%`}eXBinT+QtX zRz<}Jr9s7G^S{rzlhrWuy^O+FdtdZR*FA0e&z6Ug58it)?qR3L+n$!C4}7&SYf6!} zvX$#^UmTw&t*@M`X&Kx<@=5%Ol(Ys*Q@1zV+@NXwvGt0R8z&B|RX^%=*s0)WhF98` zs#xhn-$q-0xxKhY;i7^i`A6~u^giFc-TqdZy*sBmPbi2iZe)H@e#+X?{k3>Z7NR<$ zIiZ_tPzDbQeJ8R}%(PmOaaSSV^<(SAEQyMYXl3#l9&64h-^#W~e&jj`e|dU2%vF6X zL1hokBhAgt8ndUQr8&IxZdr+?xU$5$-j?FH<6PvCV@}aV(M3H>dtY}!|BYdO&<^7d z!S3LL!TH7qL4}5Dy-oLlmRH}GFP6*@yZgWQj_~wxw{>lEJhH`CH?w9|an{b(O;(5X zO!W!dmyUVp84mh-37>;21NhgHE3#_EA(dZ!7CwDvY7c9#YHw+$XisTotB0z(D>o?8 z;Tby_-cb&4PX(ht$7}UW^1KEHoOI;B+ku6n$FdhqyAZRq7-yV$#Z4*m?hTmL3KBp<8#L9A*GHQzbTvB%LGW6;i? zM!ppPQsG0fAupBQl)qITR6kOCRlh68DW55Mb(Olk=CZoCI!5(aF%*{h(_~4~1Ke)N z`cK|4;2U$WrgYbHz`fWdbIozyaqe;*a8Gp)c3*OT=-muzuM*E-hV~Zo!p|_5D3Qj< zyMWriC}fImit~yh#URB^`60BrI+9hGA1&oS<8y%~T`hF?ukqR7@97Hcvrl?9c~*D| zz`uh)uH696WiSvfA(-Xmhx(s!QL=wzolxRZwCcms z{jj&sfVU?*Rv%ZvWBeEJA^s!goWBaagtM^8ZsP9$3f1^;K)js+kpC%8N?o z7ynt%yWpL?6S)hrg{(bqxa{M3M@ycRudu#xEXU~Op06+WzU*V=5zP_(n;<^;bf_un zcx-&FDYdF&e~)ewzAmIsuq9}_{33GO>ep69V+MuMkxR$xn ztSXIQ?$H(uwix3dgFrNJ;8&5`x`~W zd-?)xU+rJo)!H_i#;PK@N!p8Z`&;@(cs_S^ckF_U?z3L9rdMa!8rav`dfF!1?%Uei z_c>;`6dtX2x-U{_$Bma9ll`E$qcJz0H5m8=R<-B9*|2ZOgV zr^LXI5gQ82fDPFUpX5WmyFF@;!yV=6<<9MDCIA!NyspqMzcZ{5`oK`&L#6{`Z!&uF(TW$4k)H7Fk}3T`x=)&l^Ea^~Fh)#-H>0nFnL>&G7vBu;3QrwxG;n2e zukRpwC#tZTL8}_mB{OBS6dhE{;op6p`lYH&`31a(WuZOitIO3U%@WNv z?M>Z8eX;I!vEq+|G1;tF9O{HY0Ods|#^Nsrn~q0+KRjQR`Op}SGAk<4#Qil7pygg zhfEALg|!Jg651_vU`Qupp5ck!svV%}Ex*V=6=c3`o)Y&KSD8a&Pe-p%TKRe9)5@Eb z){4}MYD+06uhBK@%I*c^UL5fu_OG~&j9~lt9_bConF6LKVE-Mw_AHj zV^a@Of2um7_>XM4nV&IwJnWLja?da}sJFYvW?y;Ul z-eBKt-!p$JaRpYdq|zH0DNmBQ;4yBEqP}vE@~U!_GEMOV`ice6Uqj_fW#gnhBxCqz z+!wGuZXk9SzVu@ZhZPy6F9+!FI^I{FKRh?E{&L#e(zo7s&8LQr=`KWIcVY$Bk-GAW zux_?e(o*_Z+7A9UCIJ~RQ+7u7R`v#nfOfKD;QTL=Pk=|fjtCvwus1akt66uUv-(03 zzVYk*w|!fD2YqQ+%c=I|`zn2@&}7+I0ecE*Yb$;&-h>YO9UAO&Xrdj^U>3fSWHKag zCD3GbplvQ2^Fi}M^EGp9sj6JG zEUelFAN*17UEZ_)AF-oxLViqHt{$OXuN$v#9rU@eOK`tnX-Is?0<2Lz2om9?ez$hL zdYQ77yi(GX--?ykP~Rkv$^DZv-qFQgYU^(sR=vbJ(Avg2+Ir0TSM?JcOp+awUFGf! z?*Xjs^yJedh0><-A&QyGv8v%{UpqBtHP1DLnkHJc_PmDEG*Tz3%vco~AX7^(@~PZ^ zuov*sd&}d7E;`{-x|TY%&bN*mjt7o7=PKtJr`I{pHPGF`)6+ZBw+(BeC$R4Ml&_Y^ zF=p8ze+Th4&MIP+Ba};&3zQR-Da!MT=87ls8PHL^WV58(CHMK~Sl1pT{vo{a$NC5P zZhAX-i#-=TCp|x6y>OZ57|`G!de0$B%LT~I27fZ7W<6FLt=ulYC44P(g#34f9G1#r z(2ENAPY9KzvU;+6;9fo?$cFd~G5k90bBqyRLMHQoZVE>W806DK{%?Ap0{I$&HOR@n z{XV~MG@L28`SAzB6V&G}-OA^o{zb_MH_vNRcwKpjb zE0a|n&_}FN{i+(EQmOVRTPUm1dZQH^fw~QmbwvOAAO2_Vd+{rwz2ED7fSw`C6@eAH zLdVaJ5sqn&OOE%!iCwO_?(XO-YWX_)X9|}^E2ojP!RV3thdf0yCA{V+W0eyzmN_H) z0lmXXuB$i=>+nrH=Ui_fKXa-tSH(bsUM_D?-oJcMxyf?eVy&oEwa+@yw!-m?Yo=$S zuZ5uI?(jFH|B<&)9#V0d!P?%sZu=#-P#9%5ub=*^6;gJ=p~57RfHG?C%n<2!;Ms|8(C= zZ$s}okHYh}dyRV~(gF8lw}{d8CiF(Y5jlS3D>8|<{(W`y}8-re0+3x@?Rtq?#97!zt(FxK`(5Pid_oQnet0@?v z9fz*^2T^+-VEku;ev1$f30<+Gz6WdR&HP4xx$gxcmOS!h`=qGnXsnU@{2icaONFl3 zJxGS^l|Wk8!dGYmM3#Z)U5Q^3E^R4oFCB<9Oxh9sv>NY8g9LAc1a|{oN`sN$pIG5< zg;r9)-9j&s3N-q!;%CsUxhVYrw9Ex~^K{?W-esQV?$2FcI91Ny9k-C`Ie&5va*cMc z^VEX>*?)w+;+vY*e+i!LIw6Kj3Z&Si{0+MEFI8LhDva4VO?%BO%>vD6jZ(8-eO+Z& zwpOlGoRgmGwjvAY;O)?2pYtQomcBsiY~X9?o#c7$9_Kc>&8{rh9oK1>-!;MQa1VoN z;kOtIZN%)Lo}j{>$tLa#-T+Rlf!y)vv8v?F5l?9WbmlDhbxBd2#@hT}vc|GKkPSlr z&gNeM6?0DfP`nQ5dk*yc6W=UflFtIU+v;6}@!S}U>YjQV!5^?0UaW3GlO4r6_Y?7B z%n_RMtDt|nz-NF_+7GgKLs}sXLhkLLiCbVKc~&|_8jGE;9+E6*v{&56*wGmy3W!?u zDMpU3fKw&^7+==#}5ByAr0aVv0aGtrYP&};r84i)3Xx7b7bU08=v=qQX6>j@3=_=UBrG>0e0C$%z;X{XBZTR7i)$w}LAw?87y{X!$dgYcF=ZUc&0m4{RCv z$J`i;2g+0WNk=ntUl58Leb3v$!N8srRSaFbtiKU>)XDDxPd_ECB$1d4yq_xQN z1ai%&vEni#XF?`r;JM4#Rhx`^-vceYLIFy29kv?3qVB&6KVi0a1!XN2v|=aZv;$8h zV>j;@YTFwW)sTlQ2?w3BLHbN8k+lX#ze4&#))ldG;t`kZnDiUyfO4Qa2fw}}8alFT0hMl-Y!hDqH z576)oW}$Ua>s7F1xd{s?zqkZ^cpp*ImZEPwff?g_lE1M_{|Nq*$m{ADXu$9AKNxa$ z5hK1|u>-pbyNM;B>IaYr!oVLzUIO&yAHuuh8LYCXzXH;~*8LWpn}WA1Cv zZC*_afxqShT;Pm@~`JBF;f4cf^eRJhcBY^a6d*x{ENL_zrEv z0($)fn#@DFC&5yoA@4>1bOR{K?x4##$Wf@sWaA`uT30{zL=#Gn><_6Ok-aoo7E>&7hGcqDV>e5vAwq9c{O25esLk9#OWFnb z{T^*%9<)e*XvUssAs^PXxGjhrcO@+mbQJfK$IABp~dh}22!3SILqB&`wTCjzZH2AZWQ zQY*A^D&tV-hw+&G&<^_Sn$oO?gpuypTB9Y%8_i98$S)M(g~-a1&_!frO}KFK1G)@S ze-)Z91f2aG@_vpl#oTEkECH%lQ4XDZQCI=p-W_@P{CUtZdysbGa}s*xD&~WtKN2mH z<(4kE(AM7rZP(XmOAeCL8YAfsQ0wl{zwJN)!iDD7(C7qoDy5q>vKx+T6ychXxnm)Z zlx9LQe}kMJ1GSzZy~0}GbMzS((L&~9#M2AU5K@*rcRfNr*CCbHp_4D*`z8{dCAlL$ z5Wb7>tn`-dH9Z1hR|n!Z$vfG}laBzh^(1?3dM04;O)}1~gCUS{!U}e;=~IT)wA>Xa z;Q^%G+%~i(YEesSW)jqr$Ra-(ZzV5^gcl|2*c_DU9P|tMcsh!7u;%{>XoKrDRJkEu zMfw})isz6aLN^nxF%wt_vP4w@$4QpjCSXFMfQPGvUkQl!O{IDdc-D8hwp=UJupLrc zAYPNWP`q7_=g4|nL`?_{QVDZIhShY`;3&xIoN%aQp>2c&#lRvm5;=z=nedKy;7|y4 zLRR3x(DhzmNbSImRN%W3((ORM=t3S8FWfJ(Jjk*Y!$v%p43sUQ66&CwNi`HPfzB4- zI*L&mC+ym-pb8;F3XvzFcC%6Y>%f$}#jm%x@(d^w>ZK8ipayZmXhhzp?u+#METrfR z_)e{kbPV}|Vz&2Wl}sZ6@=ZvZj1u8Dm{ucw#Sj||l}We`W}!>8X12M60ii##*!~v> zLBA<7JSAoi9*_`1QINejCAy#N|H*clxJY#%BtQAIApgNsUaAA3{He_B9b^?xw!dT< zOnET-ZL&tCBl1&6R?(ziSltL$NwUQ-XyiqM>Pr5u$m25Al&pjaMMBtiienq_h*ck) zWxjm_R?cMA>;+egYxqDMDh5wVafa~i`M~Lr>=0gnPy;fQkkHA5GmZoD*aU8qOeW%+ zJ|ve3xNd;tC?S1>((&O9Zb%McnQg#AxFJ1NzyW2WR@q2-;C~rvMra^2-s`}9)|&EA zeD^%0H@J&XK@{t~9Oa}|#qKY`f3k76BUi#&SaF91PZ6q#kgCPFUVx`Ffj}z6Q`w+l z4$hR~K8kH$iDzBFO%b+*(9~MgFRZ2|5I?AvvHw%o2B6}5HE8fioTYxU9W03dix>Vc zUYHPO0lYBT@-wVA#gXm^E5~lISnq=GKCo4%GzMunH-sC+^~dKU+{5C;63V>!|Hug#3HzpB>^I@c38PQwazg*nyVw}@zxZiFsFQaM z`lkPZ-_$G7Ir1Px2zT-*!0;V}>SOpmcAhYPg#ROd!ZbFgL|UGnq45U$Mg3d=k4Shw zLOIZ##wNKqLDkpItp+J8d=&M+N!u$Zx zeSu#A943vksILiNYyOL$rtv0WrD*g*y;1-&mO{z(slAi zLpjk|I>Y?=1pHOd8InC(Zy_lpiA}DNMEXyyfXO_Qb~a)rDW@?D$uap1BY9`z7y3o> zQX0$9@7DPI`wabJ$S7)40sJ)e*irZdqc=C;I}BsmFqE4mJ;u96jE`B;pr(YUrWz40 zQUV+$c~)UaO!`IRUhx8W+)6rlRIQ;i<{*42?-jz&9Gp(g>;uV~hffIY)^KoB6&As_G#|0P#mEc38uTp4mLP(cmOjA`eN~uCA2-WRE2`X^5 zv}Vji&$DqaA@c}7O=BPne$)7d5}l`UCd~sFHk{>8Z=jxm`h$QZGG8r}AL|pzh#kWjKCP0B$LS_X&a^oNIL0=zM1wR$qf9avn&O!)jWuE z^hbBm)xaMe1#${J#k_bB=LucMFn0_kO6N$vNz!TbPA!1xL?-q0M)nRW5xXzodxbq2 zXhSRqdYXPQbRWa={d>1xuJjZg)Biv%0`F!sgFp?K470mfZCSgf(z3IR zQVfR}xJJ4Ei%cYX5if`vfy6WiJEH4!H%p9?jIQ*XmG6IFqo?Qz>M!U+-y|a>7nCpS z0Rkl=ss{cT?*eaS(!!o$y$Z<^JVze)C(46;^0GD-au%Q2um*;AB% zpbuj?2F}oRmM5(}vS-x*;bs!1^ zO3dg+^rH68C{8$ArZMO|A#DG>i|(T%(ie0WjV@{3l8zbe8RwX!5MStRjH?0q2eby0 zSe7H@N-`EG1(UpgpJejLYQUan^k$lf)tG9}=*Zd@Yk`a=jM_v`(iseK9%y-t&UB5a z$<8wE!hVx>Ve6uVOaIqX1bLofBS7+wO}!ZTDWczj^$40bu<;vxQzD;H)W6ZaflpwJ z$i{>;%Sf!j$)+NATHT;`P)^Jj74vsRt4DMt(EC#P80MHf@Gsd$^m{&iV!_ZuV`KqE76Y?0# z<`(q-KE_CXti6&4{*74oAzzK#v7$yk`M2Qz7M%T|##iVTtgr2_N#sSGuI~qe^AvEq zE5)6-Zzt{}%H!q*5coLkSCfVV z)k_gFDD}gY9*9=Zx#oKy?jHyQFkygai4#!fsWs&yug{y2AEAY5ZSsKBBp)hW!}av< z69x(&O1@C`l@{TA2-aTb!kcC+BD=NW^W|S6+N4~X!u=)rR5}HIChx;9?sfh(sG;LJ zBU1Hr?k|5cVX^owb~b=f=A`^Hp*?pUv2uQpEs&3sjg^M;eGmty9KIZH@^vL^`OT1y z7Tj>Lm+(xOF5UwMkK<_`>WAOWF9ik4FjYK`{k+>k6CqZRV@GkIZ~*)D(-2d~=l=?O zqLH{S3Uk?(@cK9lp1D^Dv9PaQEXIQxD}*NEYhep~4OhYfVK1nWEvT{LIR)z{b6VcgjBCM~*l`h{yc<9DJcG;C(htY=hO|3CP8d*mGIX6j7+{IPpB%#Y$X1$Ztmc zm9?P6b$Gu%$mekHz;o?B1gK%V?euhj;@^gj@b5!a#VyU4R-}{SC3t*+ghB zet@H1!ZcwyhavzdwRE=XWG;BsZjUWoHp2vHOgvbWU9>dbOK_N9VT=(caQN)Ap(Dd3CC-k*%z{ zw0dmy8|y=BuGLW8q581(k7`HtYFo11W}o3maQ^CyavgSEbMmZY8}m;a0Zm>+dq=#w0PC-J4yFJ-UfkCdY{=XB={4ULP9zZ<6qw+rDz-UgovjtuS;JUwK4NM{pb zrUz?-{|p*!h}Gw4o2cWJ3l(Xy1X+x94!;Y04~Bo|{lXRB*Pg|$p^nLp?XU~f+gesz zs%lklt=3evtjH{DQ+m|A(LC3zG<%EA7oIH~S5#Qsr=)lB)q>l3lk#sBO({#NTwxt+ zTk7yRLp;~KMt_n2dm#5miSP5fr3H#uO^m*|VX~o6zfm__b6K?r(U1+wBZ~Tpy7J4i z2w1$0mbI0(;-`rPzBKPn?@I4^Z>aAOP?LWD1K|g(_4dGO&{?rW;DqKvh}e=l%y*FX zlOg=F{3ZC=QnpfdS++^OS8+^vN7Y0#Nt>{73JN$Jn! z&8mjjavk5gtgaH*Q`ZOXTAuUX!LTsN5e4pqq@T>Bh*dpPU)I<)-899jwn{fVw6~S- zlXq5JPzZ`Ah=H?L7KdnG<0P-JlUj#Q;aZEUK-W{~4;FK;c!TsXN;`p@AU?;=)EaR( z>=xWW5qE%9Z6%`Yx+IitO6o|b%JwP-pffwB|0*amDBdtc*HmlQWNT0B^7N{p`9bN1 zK8D2xsiB+Ue9#v`^Yxo`S*nK0y2_i1GWk?lXW0>uhWHs)rQ~EIZ16D=7nBq*k%E$X{?RPn9<{w|{O(-r9U;Q9{|*l?!c$ z937mIKzBQx?|EYU*SID!mtu=*s%En8sNtw_Wrz?W4JirA)}Pd7s~@RGsvOFF%4Nz> znmlyFPeXHH`)8%THl<{X!mOD3*+;s=bc_&f3qTQp7~+bQAeV?gZr*) zl>4G*ivJ0BU$#>9Ogk-Tcu3>0B@y$Zrbeem=SCXCQ$v2!f2(e<=q7tCoh<7s|4`mf zmL&O7{K?nc^PX#-qs;b0^-@UTMeA1E2hMJuWdCNdF<-(zgiU-?eiR=i8463u&y;P| zYc=z=BX#fUAM3OAt@Ky5M$JUkZ^{(aa!n7ztdQ97=8^RyPlSIIY6`h-oNl~gEHFMb zmKs|HpA0sI)Haoy9-DqNRR+&9^wYFd#DD^`5DhFByQXh_*F9@pog8nhBP!~ZZ!i7c z%oXn{yqiBc_b(t3KY4TWwc_>qmy@4&N*nUj^tkpvPaoe-AC>uDVY=nG{gJyhtTOMp zqdnjIPH?N`vovu*i%d%*R51!5!(wU|BrJ8 zg^j$}&;zDNA-@M3jUx?$?xs#>*l)}>WrS~zdd+{Qs>DxO47tp{$Ae8?$2D;9ipv)wPD5evY65?W=~P4{K~hD zGuk}=?y2XW`;W{ITR(i~!7ukl+`W2t#KY!klFVI&s)|T^bJs^J5L_y@u$mbE0 z!!LyPHC+!`VOkfK61g_o6gxilS+`_%^JG~*^?>#Hs2c04ITHwCD>@V~1;t>V6bAHIY`SQ1CHy>r(%e zYv#=>f3Lp5-*Eli=HAh#O*56n%_|FRwH#V|ge}H?$n`+jtoS(SafA@Jx6Z11dmA)v zxT--$z40k86Qkm~MV16d>5^0{6>-XR)km6V>dlH1Txa*-svc%nzBIQ*&g5Ksez)Qy zrEe|UtGd|!acpoW`5FjcVuaI?dzb%OI#jt{*F2-X z@FCHzxGRZA>x`_UPFx$89z7-EVCayLg~pyiFAX0CeP@gfd1eX?TNZXbbZ>|(sHNt# zY=gMZyVKpv9qKvb8RPlNrLrHYG?k4idXw8I>*rVAv^$UahmO0`ZV$LQ^v2992Jgvu!wKzX~H>_Z?tdlxEXw#GnN8I&=vY`-%=EaQ<5ltNYTbxQh&~s&Euuq&J7QvVY+QJvHu*sE zzN7>3)1$|RH4N@-c&gj0JFGt$WDMyOdNM33d_EQij|HDIXtgS3Tj_GHJ9aNhxs&`I zZl&Mk>QyB*Z^$!ePJ6X3J?iP{M+5G!yZ!9Ott+oD z=%B8j!tFa@?OXDB?(NKi*S%hCeL3xwC!<^Tf`X&wU6zJbovaV6!>VKKvt3ETGkJz# zUBvph<%v6!W+$FV_%MD)-0ZkMapqc;wXVb&YWJu!pzhXs))Z-CaLjzu0R4~Z&8j^0 zR9$e8Hu!4rq~LDG0>ezbS~prVRW(|12jhvc@;S<%)Tx?kFt80xsf@F z?BQ8YU$0Bgcoci**tO*sAD{j4Wc;zHV`EQeUR(ThPTtIl?bUx(HZ1+J$WwC0x=*~P z?-4z*PN&otO?S3v(JG;(z1e|Ajq8p~=oqaCw}-9@9})FSbk~R>hQ@rl_5GsB+2L8M zvKqdPdHW`-*V|z^>+`!8Z7eP->QZ>TU`5g0vS#+PV!Eavv^vHR-!aY*^E~2F_%D%L zW9!sjTj$plbKQ6A&ucKGK~Y_A;>Osi;j=<4#(lw|rXHc|LrZC7$SZs9h$5~qF>hwxlakB!HnKa$@zHA&-qsmYucE=;)E13) zq>gI1y1px=Wt};-Z^TcHs~>wk{D$7gpK)Bb>?tiOb(L)>{iY~Cr$c7fjH?-QGCzL1 zF#AQ$`21bP6_%EcBmRN1-_>?qhT&Pz;o!z$>!ar-bWQGCw|3nF$s6l*P2QTa8p!y{ zq@xM*;=*d>#y*aj6SX8v72HstrMaq()o8WV+9tZT+I8w}${vb`^2rKbsZv(Tj{s8? zFKZ(!kc5dlTn(!hnr9TA$WP0AFE=;q_N$Md?Rb!SYyP#8OPw!HJ?}l=_)6Ei{hv$n zzAUL%l9{*c?TDPe%sK99>OtWP<9<$Rnmj$_RPx#6j5;4Dk4>JO@=;35l(^(illI1S z316(~B81uBROVD&v?Vw?RIe%kpB!Q%{THK!FRa5wmq{G{@n>Y%Exa<#mJ^f!za$B7!@KfWjKcO2WR63hFRGzY&1 zyp?C%PEUXQ&I9kA<+mRFz3aO1s{2ab%{otBXLczZRb9NJJDRFu6uagQ=uGD*0cW;V3IXh`}?NzbcOuTwHm*o4&Cqsm+G`H1SRPr#V+ne;) zYf;C$`KOBR7GEr`SF)hAdqv;sFlTG;X-=WK8q_3wK-B7}WfAMc7eyS3{WM9^@M@E$ zP4gN}u6Hr!x2 zJ17O4cmfd;`}uY5wzlpSH_i6KwfTo~yXRcY8j!K-`GF@r9!$LR?#+icI$p1LGyKt| zjHJSyB@6TAnJKTwzRfRf?sI8go0dh~58oL2G-O0r!Y3PY9Ayq_V{D`_mjn=+1x$)_GFB8wlk4)HFXMMdM4g7V-CJm@{FJgu1 z-QXd{A;u_UyP#_Qd2Khijoc@O`hN9%>>c5ki@k;Go_8E;ss@%HD0x!!Phn({v%s9! z^(~-b&!Qebd+2@e>jU$B>pkhCo6nzSH!a#!)H?5J*6eI&(Vw;+k{|Wz5M#(%LzM2k z{;RO{aodvru6sE7qr@rk`q;dPo1ycA+Z*O<)tZ*70rEudqN}Vj+Wco>>!QfgHRY|# z&zI~gXq2nT)fVKMmsLG=oOLhocJMb7`$#4#9%(ik_J({H-XnTX{Hf&0^-k4|OnxWv zK<)8$^z}*`9BN=pnV66i+b+r+F+EZqwJyRKdNQcK?y>rqvOxBoWFz;j(9mDtGkfi> zr?#10G_h;T8`Sj<^289Dkh81uk$#mUG1#6*D6wA7fck5mvFRbV1RkyxTb^a(^xSt#nkyhN`yKCDo_w3*008%_PGW zb2SqU;UU3clcTF^zngqJxmR+-g}m7Z#b>tKlSR@8J~DP!4j7ncPO@7^z!gJ zrlZDkeTpVlaZ}QU+uy1+*JJwZynKEyM^pT=cx&NbxhHZPm%Oo!;x}qa^d{Xo)sM;p+Jey0aWP2;k{;GJ z#wA4eiF_E57hwrsAG$8M*ic8iTb?F1@Jw|4$JWVqw%S&;ue^V8cz$l~T&rH@-YpD~%#{sM^i)66IfA!EeN#Iw`IkCZlZGWF)hSPITtB9i@&GM}7yZ2srF$L-SdGQIh;3%e9v&p(m>px9^q!`D;(uDYT6 zV`ZW8W9^-gjOc0cLlWMPe;HdH)itVD)NfIiNL56f>Bpdl+OL%{(r?5EzO|mMuATP& z)`gbY=G#RZiVBJcnR}J)GMATpS>nPd=!(_l_}(+dcT0%lb7b4J^+T^jzl_bU6;`Wb z+|RYWDY*@{rdBkVSZ`}ehve?b2`N)k{7EMg>eRXvuBKv_qdZoC?i6nnUqs@Bgj52G$c-Hf(Jua8cTw1nD?Gxg`y zD>1tt4)pqXUoF?Y>V=id$|sjql#MD+D*MA+R-9S1zBs0|ljUC3T3ecZiL=PvO6V$| zqkoJUOlVm9@Pf#nYu&6fq+ZwhcT$cepHDW_O{%A9P^*Ew?z>5C5`L@Yik=vGCDdgs z*11&6Wz)Is-kHuBwkK5|RQyynzW6|1|LjIt8E>wFa&`J|&)Pg~`Lx5cD{0%( zkH0vdaXmXZ@7Mgp1?5GrOIKOHbng^D!unI5RHj^~T^Gzptd7!0+aoVTPKv4%^DyT3 znCz&b5gkJ(1sj5jbv-m)l}BWGe1D;*C*2WY^H+sc&4%xev*jI1kCfbl&XklpE0$Fa zv3ja!yJiax=_sXC)fsCnEjLN=i?ZCQeP5 z9(NPS>3hMI`W~8DiXM`C{u!Rm&cW64iZ^CSkuy(`J3f2x+u}DduZ+*N>3^nq(`r4B zOCOZBF-`TN%bW5XZGoy_YT>>jQ`s47Ezh6AxBOhmkJ1jxZ0&X9j?mvC#zuS;X^(VA zb&T#BjivDE?40F;3D#{MzU9Y;uor{o!a}+fZey98>A4+*3Wl z`L}zn`?lNfzUNKn27pG>4LuC6_4k6d!FS`$SWkR#{MA~P*lD%C!|0$_{4!{X@!{t} z6vk)zIPFB$9oby&h<7VY7Aq^-m7g(xUu?|}%Q>7`JEQ2;%vZf$wRySe#p&l4pWl4> z&zpC$Tjz|)?UY|oXf@xi=xy^m|L_#}5aC`nP&HqhWY}mt7t%a5Dx8lv9FZD1H8MNm zScEF#C43aAf^Wgk$YR|h^)AH!fEG5V9lOV?1;H zL9)rJvFg*Rm8x!yT}XHKlS%xvKPR(Xc#y_K>VEGm|qD-u#wv;YY}G4yo^p=XZg?EL z&vf2&CFHs3X6P^Bcfz}cFAtp>(!)5!kf95PN02s(&!oxXBkvODR$F3qy{hq+QKg?3 zugyP|voU){cDL*UZ`Wpx&pMQ~@9p`V#(CEKRfPq`OG;;0&R0FP4Rbc|4EFoQy^_ZA zBvnUEKix>ffuK9aW5J_CibFb>;!G}#LmOi)Wq!~?LkE4OmebT%y^^29?utT^&wVLQ z@!R38vmARsKMCdj7=I_>7=Kx|QBfkVD}OF;qPnax8QL407n(8YcD!dhUsbQ-L|IF-vuJR^JNX0h{>dGmdo4$i`%Z4_ zyzuuq~WS3}^EM{}DcIkE_>gT(=t?9lT;;l^1;ZScpzLxXo2 zp9R$pT4^|}KdpPE9iq{yvz40_F<5VuNx#Pa$`Ns}7{gyiuXh{qEf0#Px%#rpiX4Sb zF<;(I(Nw)!tJ2Rh^fQdoSL@?~9tTN{2Mu?04YjY-YvChds$vmV%M!&T-%5-HhS}}b z+{(3<$z@~ApTM6?bfKwmR6&b^t@*C}*9E(vnFg0MD>apUS+1!}w>Gv{Is1Epuy^%4 zUnn&xvXz_E1GK|+jrB&uX+zy0&e+d*AV@GggJ*$>I(Q6(f6sxcmx>#5nY@i`ku+VB z2M?ESz6xGDp7S&L6iH*LRCYtYLs6hutJs9K^2M4_+7j(X-DzDU@|daj>XLK^HIvk8 z6^~iO8EG?#j!P1L@Sb8U-6_o0X@{Il2yg;6hA3?Qgomwv*>j3@sh92 z@0Z4u53(Gn7+kfb`m&vKC3xQPoe|D)Rg(3xCs@h&NzH5T!Fx>y{Uod^?K12zm<+4+ zk91Ol064;`sQFIbF*SKkeEG{A1YH- z57oi&Q`1wsMYC9QP;*-INK*p0Xp`YB;GuM+q&E+b#PAE_bk}vwaNM$e2_I6cDl07e z%7>KoEv+#BYF=!f`jwbsy;}wF9&#G_TY)m0FdhaL60Wzmw&m#Ggtn5|b=Q zHdOkfv*nYeTUY(M{7)GgkeJY8f2IpFpi2@+-N9 zVx)hIH`>$9)!XrpZCQ1+wO*B{;;uz%X)4^$r&a4xG3!_BhH4Gk##&z6M6+A{ z9aj1m!&~Gc;E+3_1S_Oxq$aGIwg(rYu!4GC-bW!*ex-b0sZ$kTA7z`mho+5Yj=Hb9 zR28KX(2kGD)?puFJ=aVu@;CAw@~m;^INx(TfR~X^tTU^wR6_q(oUx=>jFz^Rg_fI^ z!4+pKGAsV5d{`AQh=xe+g4?qc^HKIt^;ekDS7|A6}2uKTv)7IiPei)y2IKm%}q^#hS%QLtkj%Q7pr9IICW2TZS_&rZe=k%!PHmW zlH0I;K3r0lkLNavPlbN|C*IFI9o#PvQ8&V|)z+c9i*;DlpOp!f-&9ms&RAwxI$4HT z(k*K$aw>+vJ4U;z$yS-|p1p;$w=3P1<{s=F=5HcS;AZkZ-Xdu!E0k-MZslmza!}_- zbvMlx%~4GsjarijT1`^7RUcG^tD32jpbds9V}KN1uSi#9DDFdt4^#|SoWt7YHl#0< zGx7a9JYRgOyn`}7k#z$%E=Z)3U0kGC?*GI0gLj9gALMzrW1M}W?R9mp>i$++)v_vW z)rrc;ss&ZwRGF+xtv>6K>ZP{s_Ac13n&H~u{?&8D`>XGf-;F)zq1X|4DcOYmpl{`) z74Iw0W6yD~s0*0j}*MZ4;%ZKZuzYXNP))1*See^S4%zM~qhdWF{a z5+#2OSsyO@8gY#O;FohN;hANMe>`?(dVAWrKXFZSj&W?VTWt+&gR66`JFK0oMkJ+G zW}Szl#?|+#-?IhTx7gotL^{!dxEp!ec^mjjd{vlP_TavTrjlWAYbBx=OQEYKVGk%t zby`)WTBN?DzN&t#eud91wNIU=-mU&v{VpW&sA{chh^hp8MIBJS%ZiCu^_hg-!Blv_ zcprOcKk@sy%h)H25Zd{__O0~($Fs*>=K9{X$0>K7ag^J8+3VRQ_FJ|cw!dsoZRxf| z`!su|eYWG3W3cmubBC+DTaPHV+r2w{OZ@YMc0g^m<;(axlGV}_*?!q)@=Ez)aJ8*+ z5z-~)b7duxRONGes;k#d+*DwgO^&G1}Qf=~$^!I#9Bd ze+f&JA0VMdcx77Z+v5#_oc@j7$BBq}J^}k?XB?dz2@ab*$DU@FIo@$Bbfi1FJ2yCu zt~0IYons2;+cFIc2u)u_hr+8vMZ4;lExuI^AX8h;HjmOO+cpSb30JNYq09LD6|!} z0MCEj*WY*ByT)7MndqtO$#?H@4|9jPue)v`6}WO;kwB4eLdnK}dIP;q?+iqb-s$gx zUCblcqpQQ;O z(Ydnvvgbhjy^G!cy^@ZSGX5~|elq?h>^%~>pW#hD7kK05LMCwDCBARrBcr+R1$OF2 zftr89OUxhe%CXfm!}E#fGtaLuzv=Gn=l$7x+}qrD(HH68?$7l1#BS;=*dvVQ9s!g8 zDSFWLk_^zXr*xfkKK52Idxmao25s37+@rnGyYL?LDY#fiDwCc=jQc*48~g!&EcR?) z!oHzBkO|+w>cWn4&A=Y^1(d9w|AB8SYz$iY8u%i7Mcyag*WTOkx{!&T?>A6VQ5yuhWyrep%FNfcN&I|X}^h9dmcqhw=*E<&{M!hhVq z8E@?l4+Y8o5X8NY@$2wu2)|w3;SFpGu3qz-{YgSMJn@rIA|#6KP&*)kP?9D53-3Vg^8HUxhD?7Ny!4;N_cec&|8rcu2n45F2t#~< zZ}7}SH3TJGoPPRgCaKYNym zC<|Fkt%QZsaadd(M_!c5Vbu^1E>N@zirp}QTa4%p4NLHjB`71M2{mur2@X@l*nM~-VL!>5E2{=!$8aoU zPfxK%$V!polM<4TEa1qpG92%31By^&Q^Lu0hV{-6l#OBxQcP9)-vl%=p?u^&fUu_& zIg{+63BgBrQ?lYGyS3ve2i2LZ-=v@_#cCzw1=-ROof#s7?E1*^kElYnd=wLsN<;t2 zwvM4z$>xx(8(EZG9o|W3JcgN|D68do2U%s3%^g`vk|iU>u^=nPAiRn2+f-_1!N|@s zJ4Q8VOqO|6qu81!nEf8bt)_Ucgj=TP$S#m<0+|gnvza6tR@HO7}6PfGtriQlkFCI$cNYQEt1xk_J$pVtu zAqOn&nawh)0xppJ=hVEJ_)57_{BUNEN;GA)r}~lH1ZYN_BYykwezLKpx=?Kxew5;x zkgYCR^RlQn%np}XD3h#FndpdYYgu$yR(rB;Wx23iiLWGsf#>O%u2ZWZOe)C+QH1Uy zYfp+<$|Q=o!QMwyBe{>oHIsL%A?}U%E>4 zV*H`HGb|0Woei{$fOiH~d*Tb#h`t%ESUK5ofPVCBfJRKdC~tNqV4q9%WqN?5gUUjD zAp21N_+6252!y&~1ADxI#H1J3&yoGolRwHNBa+Sc&>u_%vFx8=Wf+Dp6h=lj?_^rpi zdfY`AB`P({yl}*GK9tA_Y!F4I4yk!I5>I3Ktp>jzfiouL1&49SgJQKQYfw=}oK>OL z&Ki7?9hf4*UAs{mKk(W<{PN(<6k$@pc?-}+gt4YOM3G`p2O|X`CnfHnGEz)wqDcte zN{MP31sV`d2x-MMJmIXVoQ%5EVu-TDDQXu)4U%E1-M`YpS{k)Rl6gvu&g{+r7fJsR z&fvdss7Vt48;6={0BWlwNz{%R3YsBNn69JNOo*Qvk;50YYSOsWE=it9wy0P7e;J3G z`q=-*pJtdAhMxH^ewyh#*3VMkMG{V$l#TYN_o8ueps!>jZ8lE8P55Iy7L9*M-~M}r zdewm5rQVQQ2KCkKn?^a*+fkxkpL#}yPNtCpwJ$cmV(pCKyx4d*10&vynsIMhjR%zb z_@;T&qndF!&77D=6vF&G`Tu;RkRKn024Yd@$qxZTO4B!?rYZOT;-?uN`u`3;T@Sr= z4EhZge>$cn{xspIbv5G_@(C1*KHN~#lWYIyo8nMY|IZ@Il7ATTCPaTC{HaiUTN+6a zZknRsvdGO0olJ44OCc?l_~ic&7jxm6g)q{@Px1*vK7ig}7L*PjL9g(iB2>S^Il7h$ zzO!$_O=sg%Sc9l$(WS|w5XG0KvjxCY6V92i^fY>5_-Pv3I8ZikO(G9QdhBKz?fe|G2 zHSAfMgU~O+-m^PdTVySpjZ@jUDbU)fccM1W5*xp=(JXNx&{o-Kis=Y8vZed!t$`<5 zuJjBW=LY_ho?v4%`cHa*#%iPmD6v@v`%maM9&1Sv3to|0&DrqUkT+&eI(OH^gr-c(o$3^Dm8txSpprgx)CKQF@Dh8 zf^mqBDKSp4vvglzj=;_n56J@pjr_^$0sSXFvt#CQgGQ@#mE94zMk@y7L641EsWjAb zC_nnptT+TKLm%M7e58?=kB;z;Kx;09^JL|vr^!bY<0P9I1=Xx5Q6A)NfqW{E&k%+; zrDO6I62O7d+6wdEKwi$67Y8P#Ogfp2uzrPVOm|V)XjO)uWzPiqkAPedjaZ_7g3Y~1 ze*X6#qdS$KB!>APARd#y3#JoDztc(yX?@m1FyCL~L5qBFUaRRt=o-cFX6q}&*8sms zB519LdE%oo(kjRc^e}g@qIdz{0smX%{f&B^`#_dbzm$VAG3lV16Aj3t7fBDvB8>`} zL{Zs^`b2k<4O*RGQpjdAG;bkF5xr^Ukltg%idB8AGLnzQAe4z#b|^A2dCj9$GX>Uu zC|BlNgLq;4pY}oTCb^~&Z4mAyuNuTX@@7VBh{P3=5sI2S8vltm6&^B$B; z2XBB&xIMs$9>-hgiAT71I6OI?6I2!EzTnPN{9dLs~iRs-f zP&*51T!p-+;~K|Zz$#P*Xht zpc(SCVD0-pj)wtBy8-?P6)1-d_Y|RK=9+hp1lBhSABqR;6c^ww4<_#$P>U`|CY;X_ zKR`_6zkz+F);tAi17bvGVHai%Hy0E$!}@|aeHr^7<+wHsWl6&^`G>gx^eb^CwuYzS zczZnXNsn;N1JBAWa6~*f4$qd$abHIqwFa$<#P*>03+xfJ<}M*objc&2 zcXx*jC1S_x3C;w83olSoq5(xd9*z7*qyBwRVv@}d@XpKdl05;upmk;s_K0V3Y4}Ax z=Jo>VOYJL1OaWgv5ctG!)h3i@1z(mn6v_Za)P`-0DxiDUjz*9kx z(`Mk9Sxgf11t&1ZMB(jtW*|!48oFw(s1ff8lfl~}PR~EY+h+mIJxHXsupGO9yHMU{ zsP#3xp)>9n4N8SWD%Sw-JqY^_h!oBB;Zykupb%lckDvt8QTrv3w>zlCY0)hFEck`y zVl_8}e+<5#!_{sm%_Eeo3V7f&%qT(T%e_5CwBwxnalSly3B$s_X1z3k2u9`Cw+^uWIz*46*ZFAcvBzLLCU}27l4ObgmFSOXi*;? z4AQs-d~2>VPa~?$;34%B}gx&<8QLt0cgg+73^4#ke2E+oKH!hT%Y0{P0~{|4o*p_LvHW+9)2IJ-uez@?&` zYf$0{$vE^L%^;Z{;fcqbMl8qqS!nI|gu!?dho?W_Zi5p=kT4y1umO_10J1v}waQ1$ zJ)qcTloEax1W*M%7>%41Jn83y!akHK9~uuM1W3^6npWE#lGy`KE&&HdqmIq_E}&=^ ziey0%5eT1jCfSRc&|47iTJ8D7gxF2Mk%KEo(7PY(vJ=+}o zrX%vG+#Wh-G@g@+vHU^QV;AWpXvY_L_8VcjI8JB*X&8e3DT^P5Hgs7qgFhkgb5V_N zGvxh|*hc(WSji`#4VQCgA$uz!7a`!oFv$N|(DNE}_ZpOc7I<)tHzExJCF(;e%TdNI zXcf&t<8ZXB9B}s_bdmzJ0Jq@1As;ksj`v>^IUaT9OcLsA`ydYXFOd6#q<_HqaOm