Advertisement
xorkrus

GccApp1

Jan 10th, 2016
45
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.05 KB | None | 0 0
  1. #include <avr/io.h>
  2. #include <avr/interrupt.h>
  3. #define F_CPU 9600000UL
  4. #include <util/delay.h>
  5. #include <stdlib.h>
  6.  
  7. void abc(unsigned char a,unsigned char b,unsigned char c,unsigned char status);
  8.  
  9. unsigned char tonight=0;
  10. volatile unsigned char pwm[3]={0,0,0};//здесь храним значения яркости светодиодов
  11. unsigned char to[3]={0,255,0};//здесь храним цвет, к которому будем стремиться.
  12.  
  13. int main(void)
  14. {
  15.     //порты PB0-2 как выходы, выключены
  16.     DDRB |= (1<<0|1<<1|1<<2);
  17.     PORTB&= ~(1<<0|1<<1|1<<2);
  18.     //Инициализация таймера
  19.     TCCR0A = 0x00;
  20.     TCCR0B = 0x01;//No Prescaling
  21.     TIMSK0 = 1<<TOIE0;//Прерывание по переполнению
  22.     sei();//Глобальное разрешение прерываний
  23.  
  24.     while(1){
  25.         if (pwm[0]<to[0]) pwm[0]++;
  26.         if (pwm[0]>to[0]) pwm[0]--;
  27.         if (pwm[1]<to[1]) pwm[1]++;
  28.         if (pwm[1]>to[1]) pwm[1]--;
  29.         if (pwm[2]<to[2]) pwm[2]++;
  30.         if (pwm[2]>to[2]) pwm[2]--;
  31.         if(pwm[0]<=0&&pwm[1]<=0&&pwm[2]<=0) {//to red from black
  32.             to[0]=0; //blue
  33.             to[1]=255; //red
  34.             to[2]=0; //green
  35.         };
  36.         if(pwm[0]<=0&&pwm[1]>=255&&pwm[2]<=0) {//to green+blue
  37.             to[0]=255; //blue
  38.             to[1]=255; //red
  39.             to[2]=255; //green
  40.         };
  41.        
  42.         if(pwm[0]>=255&&pwm[1]>=255&&pwm[2]>=255) {tonight=1;}
  43.            
  44.         if(pwm[0]>=255&&pwm[1]>=255&&pwm[2]>=255&&tonight==1) {//from green+blue
  45.             to[0]=0; //blue
  46.             to[1]=255; //red
  47.             to[2]=0; //green
  48.         };
  49.         if(pwm[0]<=0&&pwm[1]>=255&&pwm[2]<=0&&tonight==1) {//from red to black
  50.             to[0]=0; //blue
  51.             to[1]=0; //red
  52.             to[2]=0; //green
  53.             };
  54.            
  55.         if(pwm[0]<=0&&pwm[1]<=0&&pwm[2]<=0) {tonight=0;}
  56.            
  57.         _delay_ms(50);
  58.     }
  59. }
  60.  
  61. ISR(TIM0_OVF_vect)
  62. {
  63.     static unsigned char e = 0;
  64.     if( e == 255)
  65.     {
  66.         e=0;
  67.         PORTB |= (1<<0)|(1<<1)|(1<<2);
  68.     }
  69.     abc(pwm[0],pwm[1],pwm[2],e);
  70.     ++e;
  71. }
  72.  
  73. void abc(unsigned char a,unsigned char b,unsigned char c,unsigned char status) {
  74.     if((status==a)) PORTB&= ~(1<<0);
  75.     if((status==b)) PORTB&= ~(1<<1);
  76.     if((status==c)) PORTB&= ~(1<<2);
  77. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement