Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <tiny13a.h>
- #include <delay.h>
- #include <stdlib.h>
- #define RED 0
- #define GREEN 2
- #define BLUE 1
- #define SENSOR 3
- #define SIGNAL 4
- #define timer_mode_pwm 1
- #define timer_mode_count 0
- eeprom int seed;//значение для srand()
- unsigned int sensor_not_touched=0;//значение счётчика когда сенсор не притронут
- unsigned char wave_counter=0;//счётчик ШИМ цикла
- unsigned char red_bs=0;//яркость светодиода1 (0-255)
- unsigned char green_bs=0;//яркость светодиода2 (0-255)
- unsigned char blue_bs=0;//яркость светодиода3 (0-255)
- interrupt [TIM0_COMPA] void timer0_compa_isr(void)
- {
- PORTB.RED=(wave_counter<red_bs);
- PORTB.GREEN=(wave_counter/2<green_bs);
- PORTB.BLUE=(wave_counter<blue_bs);
- wave_counter++;
- }
- interrupt [WDT] void wdt_timeout_isr(void)
- {
- WDTCR|=0b01000000;
- }
- void SetTimerMode(unsigned char pwm)//
- {
- if(pwm){ //программный ШИМ
- // Mode: CTC
- TCCR0A|=0b10;
- // division factor: 256
- TCCR0B=4;
- }
- else{ //счётчик
- // Mode: normal
- TCCR0A=0;
- // division factor: 8
- TCCR0B=2;
- }
- }
- void sleep()
- {
- //понижаем частоту системы и таймера, получаем паузу около 2 с
- #pragma optsize-
- CLKPR=0x80;
- CLKPR=0b111;
- #ifdef _OPTIMIZE_SIZE_
- #pragma optsize+
- #endif
- TCCR0B=0b101;
- //засыпаем
- #asm("sleep");
- //восстанавливаем частоту системы
- #pragma optsize-
- CLKPR=0x80;
- CLKPR=0x00;
- #ifdef _OPTIMIZE_SIZE_
- #pragma optsize+
- #endif
- }
- void reset_sensor()
- {
- DDRB.SENSOR=PORT_OUT;
- PORTB.SENSOR=0;
- DDRB.SENSOR=PORT_IN;
- PORTB.SIGNAL=0;
- }
- unsigned char count_sensor()
- {
- unsigned char result;
- //что-бы не влиять на яркость дождемся момента, когда все будут погашены
- if(red_bs+green_bs+blue_bs)while(wave_counter<250);
- SetTimerMode(timer_mode_count);
- reset_sensor();
- PORTB.SIGNAL=1;
- TCNT0=0;
- while(!PINB.SENSOR);
- result=TCNT0;
- SetTimerMode(timer_mode_pwm);
- //так надо
- TCNT0=255;
- return result;
- }
- void calibrate_sensor()
- {
- unsigned char i;
- //весело мигаем красным, зелёным, синим 3 секунды
- for(i=1;i<8;i*=2){
- PORTB=i;
- delay_ms(1000);
- }
- //расчитываем среднее значение непритронутого сенсора
- for(i=1;i<=20;i++){
- //в этот момент быстро мигаем
- PORTB=255;
- if (sensor_not_touched){
- sensor_not_touched+=count_sensor();
- sensor_not_touched/=2;
- }
- else
- sensor_not_touched=count_sensor();
- delay_ms(100);
- PORTB=0;
- delay_ms(100);
- }
- //прикоснутый сенсор должен быть больше на 1/8
- sensor_not_touched+=sensor_not_touched/8;
- }
- unsigned char check_sensor(unsigned char times)
- {
- while(times>0){
- if(count_sensor()>sensor_not_touched)return 1;
- delay_ms(1);
- times--;
- }
- return 0;
- }
- void common_init()
- {
- // Crystal Oscillator division factor: 1
- #pragma optsize-
- CLKPR=0x80;
- CLKPR=0x00;
- #ifdef _OPTIMIZE_SIZE_
- #pragma optsize+
- #endif
- // Analog Comparator: Off
- ACSR=0x80;
- // And ADC off in power reduction
- PRR=1;
- // Watchdog Timer initialization
- // Watchdog Timer Prescaler: OSC/1024k
- // Watchdog Timer interrupt: On
- #pragma optsize-
- WDTCR=0b110001;
- WDTCR|=0b1000000;
- #ifdef _OPTIMIZE_SIZE_
- #pragma optsize+
- #endif
- //sleep enable,idle mode
- MCUCR|=0b00100000;
- //timer interrupt on compare match A
- TIMSK0=0b100;
- // Input/Output Ports initialization
- DDRB=0xff;
- }
- void change_color(unsigned char to_red,unsigned char to_green,unsigned char to_blue, unsigned char pause)
- {
- while(red_bs!=to_red||green_bs!=to_green||blue_bs!=to_blue){
- if(to_red!=red_bs)
- if(to_red>red_bs)red_bs++;
- else red_bs--;
- if(to_green!=green_bs)
- if(to_green>green_bs)green_bs++;
- else green_bs--;
- if(to_blue!=blue_bs)
- if(to_blue>blue_bs)blue_bs++;
- else blue_bs--;
- if(pause)delay_ms(pause);
- }
- }
- void main(void)
- {
- unsigned char i;//внутренний счётчик
- //общая инициализация
- common_init();
- //инициализация генератора случ. чисел
- seed++;
- srand(seed);
- seed=rand();
- //калибровка сенсора
- calibrate_sensor();
- //понеслась!
- #asm("sei")
- while (1){
- if(check_sensor(1)){
- change_color(rand(),rand(),rand(),20);
- while(check_sensor(40)){
- change_color(rand(),rand(),rand(),5);
- }
- change_color(0,0,0,25);
- }
- sleep();
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement