Advertisement
Guest User

Untitled

a guest
Mar 7th, 2012
5,551
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.33 KB | None | 0 0
  1. #include <tiny13a.h>
  2. #include <delay.h>
  3. #include <stdlib.h>
  4.  
  5. #define RED 0
  6. #define GREEN 2
  7. #define BLUE 1
  8. #define SENSOR 3
  9. #define SIGNAL 4
  10. #define timer_mode_pwm 1
  11. #define timer_mode_count 0
  12.  
  13. eeprom int seed;//значение для srand()
  14. unsigned int sensor_not_touched=0;//значение счётчика когда сенсор не притронут
  15.  
  16. unsigned char wave_counter=0;//счётчик ШИМ цикла
  17.  
  18. unsigned char red_bs=0;//яркость светодиода1 (0-255)
  19. unsigned char green_bs=0;//яркость светодиода2 (0-255)
  20. unsigned char blue_bs=0;//яркость светодиода3 (0-255)
  21.  
  22. interrupt [TIM0_COMPA] void timer0_compa_isr(void)
  23. {
  24.     PORTB.RED=(wave_counter<red_bs);
  25.     PORTB.GREEN=(wave_counter/2<green_bs);
  26.     PORTB.BLUE=(wave_counter<blue_bs);
  27.     wave_counter++;
  28. }
  29.  
  30. interrupt [WDT] void wdt_timeout_isr(void)
  31. {
  32.     WDTCR|=0b01000000;
  33. }
  34.  
  35. void SetTimerMode(unsigned char pwm)//
  36. {
  37.     if(pwm){            //программный ШИМ
  38.         // Mode: CTC
  39.         TCCR0A|=0b10;
  40.         // division factor: 256
  41.         TCCR0B=4;
  42.         }
  43.     else{           //счётчик
  44.         // Mode: normal
  45.         TCCR0A=0;              
  46.         // division factor: 8
  47.         TCCR0B=2;            
  48.         }
  49. }
  50.  
  51. void sleep()
  52. {
  53.     //понижаем частоту системы и таймера, получаем паузу около 2 с
  54.     #pragma optsize-
  55.     CLKPR=0x80;
  56.     CLKPR=0b111;
  57.     #ifdef _OPTIMIZE_SIZE_
  58.     #pragma optsize+
  59.     #endif    
  60.     TCCR0B=0b101;
  61.     //засыпаем
  62.     #asm("sleep");
  63.     //восстанавливаем частоту системы
  64.     #pragma optsize-
  65.     CLKPR=0x80;
  66.     CLKPR=0x00;
  67.     #ifdef _OPTIMIZE_SIZE_
  68.     #pragma optsize+
  69.     #endif
  70. }
  71.  
  72. void reset_sensor()
  73. {
  74.     DDRB.SENSOR=PORT_OUT;
  75.     PORTB.SENSOR=0;
  76.     DDRB.SENSOR=PORT_IN;
  77.     PORTB.SIGNAL=0;
  78. }
  79.  
  80. unsigned char count_sensor()
  81. {
  82.     unsigned char result;
  83.     //что-бы не влиять на яркость дождемся момента, когда все будут погашены
  84.     if(red_bs+green_bs+blue_bs)while(wave_counter<250);
  85.     SetTimerMode(timer_mode_count);
  86.     reset_sensor();
  87.     PORTB.SIGNAL=1;
  88.     TCNT0=0;
  89.     while(!PINB.SENSOR);
  90.     result=TCNT0;
  91.     SetTimerMode(timer_mode_pwm);
  92.     //так надо
  93.     TCNT0=255;    
  94.     return result;      
  95. }
  96.  
  97. void calibrate_sensor()
  98. {
  99.     unsigned char i;
  100.     //весело мигаем красным, зелёным, синим 3 секунды
  101.     for(i=1;i<8;i*=2){
  102.         PORTB=i;
  103.         delay_ms(1000);
  104.         }
  105.     //расчитываем среднее значение непритронутого сенсора
  106.     for(i=1;i<=20;i++){
  107.         //в этот момент быстро мигаем
  108.         PORTB=255;
  109.         if (sensor_not_touched){
  110.             sensor_not_touched+=count_sensor();
  111.             sensor_not_touched/=2;
  112.             }
  113.         else
  114.             sensor_not_touched=count_sensor();
  115.         delay_ms(100);
  116.         PORTB=0;      
  117.         delay_ms(100);
  118.         }
  119.     //прикоснутый сенсор должен быть больше на 1/8
  120.     sensor_not_touched+=sensor_not_touched/8;
  121. }
  122.  
  123. unsigned char check_sensor(unsigned char times)
  124. {
  125.     while(times>0){
  126.         if(count_sensor()>sensor_not_touched)return 1;
  127.         delay_ms(1);
  128.         times--;
  129.         }  
  130.     return 0;
  131. }
  132.  
  133. void common_init()
  134. {
  135.     // Crystal Oscillator division factor: 1
  136.     #pragma optsize-
  137.     CLKPR=0x80;
  138.     CLKPR=0x00;
  139.     #ifdef _OPTIMIZE_SIZE_
  140.     #pragma optsize+
  141.     #endif
  142.     // Analog Comparator: Off
  143.     ACSR=0x80;
  144.     // And ADC off in power reduction
  145.     PRR=1;  
  146.     // Watchdog Timer initialization
  147.     // Watchdog Timer Prescaler: OSC/1024k
  148.     // Watchdog Timer interrupt: On
  149.     #pragma optsize-
  150.     WDTCR=0b110001;
  151.     WDTCR|=0b1000000;
  152.     #ifdef _OPTIMIZE_SIZE_
  153.     #pragma optsize+
  154.     #endif      
  155.     //sleep enable,idle mode    
  156.     MCUCR|=0b00100000;
  157.     //timer interrupt on compare match A
  158.     TIMSK0=0b100;
  159.     // Input/Output Ports initialization
  160.     DDRB=0xff;
  161. }
  162.  
  163. void change_color(unsigned char to_red,unsigned char to_green,unsigned char to_blue, unsigned char pause)
  164. {
  165.    
  166.     while(red_bs!=to_red||green_bs!=to_green||blue_bs!=to_blue){
  167.         if(to_red!=red_bs)
  168.             if(to_red>red_bs)red_bs++;
  169.             else red_bs--;
  170.         if(to_green!=green_bs)
  171.             if(to_green>green_bs)green_bs++;
  172.             else green_bs--;
  173.         if(to_blue!=blue_bs)
  174.             if(to_blue>blue_bs)blue_bs++;
  175.             else blue_bs--;
  176.         if(pause)delay_ms(pause);
  177.     }
  178.    
  179. }
  180.  
  181. void main(void)
  182. {
  183.     unsigned char i;//внутренний счётчик
  184.     //общая инициализация
  185.     common_init();              
  186.     //инициализация генератора случ. чисел
  187.     seed++;
  188.     srand(seed);
  189.     seed=rand();
  190.     //калибровка сенсора
  191.     calibrate_sensor();
  192.     //понеслась!
  193.     #asm("sei")      
  194.     while (1){
  195.         if(check_sensor(1)){
  196.             change_color(rand(),rand(),rand(),20);
  197.             while(check_sensor(40)){
  198.                 change_color(rand(),rand(),rand(),5);
  199.                 }
  200.             change_color(0,0,0,25);
  201.             }
  202.         sleep();
  203.         }
  204. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement