第4步编程
/* -----------------------------------------------------------------------
* Title: flick led
* Author: Alexander Weber <alexander.weber.0 at gmail.com>
* Date: 21.02.2007
* Hardware: ATtiny13v
* Software: WinAVR 20060421
*/
// define as -D switch
//#define F_CPU 1200000 // Taktfrequenz: 1.2MHz, internal oscillator
#include <avr/io.h>
#include <util/delay.h>
#define TRUE 1
#define FALSE 0
#define ON 1
#define OFF 0
// use PB2 for led, pin 7
#define LED_BIT 2
// use PB3 to enable ldr, pin 2
#define ADC_ENA_BIT 3
// pause
#define PAUSE 25
// select ADC2, PB4, pin 3
#define CHANNEL 2
// values over threshold are recorded as "on"
#define THRESHOLD 800
// storage for recorded values
#define MAX 400
static uint8_t values[MAX / 8];
/*
* get_adc
* Return the 10bit value of the selected adc channel.
*/
uint16_t get_adc(uint8_t channel) {
// enable voltage for adc
PORTB |= (1 << ADC_ENA_BIT);
// ADC setup
ADCSRA =
(1 << ADEN) | // enable ADC
(1 << ADPS1) | (1 << ADPS0); // set prescaler to 8
// select channel
ADMUX = channel;
// select reference voltage
// ADMUX |= (1 << REFS0); // use internal reference
// warm up the ADC, discard the first conversion
ADCSRA |= (1 << ADSC);
while (ADCSRA & (1 << ADSC));
ADCSRA |= (1 << ADSC); // start single conversion
while (ADCSRA & (1 << ADSC)); // wait until conversion is done
PORTB &= ~(1 << ADC_ENA_BIT); // disable voltage for adc
return ADCW;
}
int main(void) {
uint16_t i = 0;
uint16_t count = 0;
uint8_t light = OFF;
uint8_t last_light = OFF;
uint16_t last_time = 0;
uint8_t programming = TRUE;
// define LED and ADC enable as outputs
DDRB |= (1 << LED_BIT) |
(1 <<ADC_ENA_BIT);
// intro
for (i = 0; i < 5; i++) {
PORTB |= (1 << LED_BIT);
_delay_ms(200);
PORTB &= ~(1 << LED_BIT);
_delay_ms(200);
}
for (i = 0; i < 5; i++) {
_delay_ms(100);
}
while (1) {
if (programming) {
// signal that we are ready to program
for (i = 0; i < 5; i++) {
PORTB |= (1 << LED_BIT);
_delay_ms(40);
PORTB &= ~(1 << LED_BIT);
_delay_ms(40);
}
// now read the ldr and store it
for (i = 0; i < MAX; i++) {
if (get_adc(CHANNEL) > THRESHOLD) {
values[i / 8] |= (1 << (i % 8));
PORTB |= (1 << LED_BIT);
}
else {
values[i / 8] &= ~(1 << (i % 8));
PORTB &= ~(1 << LED_BIT);
}
_delay_ms(PAUSE);
}
// signal that we are finished with programming
for (i = 0; i < 5; i++) {
PORTB |= (1 << LED_BIT);
_delay_ms(40);
PORTB &= ~(1 << LED_BIT);
_delay_ms(40);
}
// switch to playback
programming = FALSE;
count = 0;
}
else {
// have we detected a change?
light = (get_adc(CHANNEL) > THRESHOLD) ? ON : OFF;
if (light != last_light) {
// when was the last change?
if ((count - last_time) == 10) {
programming = TRUE; // switch to programming mode
}
else {
last_time = count;
}
}
last_light = light;
// replay recorded lights
if (values[count / 8] & (1 << (count % 8))) {
PORTB |= (1 << LED_BIT);
}
else {
PORTB &= ~(1 << LED_BIT);
}
_delay_ms(PAUSE);
count++;
if (count == MAX) {
count = 0;
}
}
}
return 0;
}:100000000CC026C025C024C023C022C021C020C0EF
:100010001FC01EC01DC01CC01BC011241FBECFE5C9
:10002000D2E0DEBFCDBF10E0A0E6B0E0E4E8F2E051
:1000300003C0C89531960D92A036B107D1F710E0F4
:10004000A0E6B0E001C01D92A239B107E1F710C0EF
:10005000D7CF982FC39A83E886B997B9369A36993D
:10006000FECF369A3699FECFC39884B195B10895E4
:10007000CFE5D2E0DEBFCDBF40E050E0FF24C42E8C
:10008000D52E61E087B38C6087BBE0E6FAEE24E012
:1000900030E0C29ACE2FDF2F2197F1F7C298AE2F12
:1000A000BF2F1197F1F72150304037FFF2CF80E397
:1000B00095E7F92FE82F3197F1F7D92FC82F21971E
:1000C000F1F7B92FA82F1197F1F7F92FE82F3197F2
:1000D000F1F70197F1F772E0E72E3CE4832E3DE162
:1000E000932EA12CB12C662309F468C0A0EEBEE2C9
:1000F000C0E0D0E024E030E0C29ADB2FCA2F219785
:10010000F1F7C2988A2F9B2F0197F1F721503040C9
:1001100037FFF2CF40E050E012E003E861E070E02A
:10012000ACE4BDE1C0E0D0E0C39A06B917B9369A95
:100130003699FECF369A3699FECFC398E4B1F5B121
:10014000E152F34008F47EC0D52FC42FD695C79551
:10015000D695C795D695C795C05ADF4F952F842F52
:1001600087709070262F372F02C0220F331F8A9579
:10017000E2F7A880A22AA882C29A8A2F9B2F019711
:10018000F1F74F5F5F4F31E04039530768F2A0EE5F
:10019000BEE2C0E0D0E024E030E0C29AFB2FEA2FBC
:1001A0003197F1F7C298DB2FCA2F2197F1F7215031
:1001B000304037FFF2CF60E040E050E0262FC39A96
:1001C00003E806B9E7B8369A3699FECF369A3699DB
:1001D000FECFC398A4B1B5B1A152B34008F021E05D
:1001E0002F1549F0952F842F8C199D090A9709F432
:1001F00047C0C42ED52EF22ED52FC42FD695C79525
:10020000D695C795D695C795C05ADF4F888199274F
:10021000242F352F2770307002C0959587952A9529
:10022000E2F780FF2BC0C29AF92DE82D3197F1F744
:100230004F5F5F4F81E04039580709F054CF40E0ED
:1002400050E051CFF52FE42FF695E795F695E79519
:10025000F695E795E05AFF4F952F842F87709070A1
:10026000262F372F02C0220F331F8A95E2F7922FD5
:100270009095B080B922B082C2987FCFC298D4CF77
:0402800061E0B9CFB1
:00000001FF
评 论
选择昵称后请轻按空格键
请勿进行人身攻击,谩骂以及任何违法国家相关法律法规的言论。