2024-03-03 19:04:23 +00:00
# define F_CPU 8000000UL
# include <util/delay.h>
# include <avr/io.h>
# define PATTERN_COUNT 4
typedef struct
{
unsigned char r ;
unsigned char g ;
unsigned char b ;
int time_hold ;
} rgbval ;
int main ( void ) { // (2)
2024-03-04 21:20:45 +00:00
rgbval pattern [ 6 ] [ PATTERN_COUNT ] = { { { 0 , 0 , 0 , 0 } , { 0 , 0 , 0 , 0 } , { 0 , 0 , 0 , 0 } , { 0 , 0 , 0 , 0 } } ,
{ { 1 , 1 , 1 , 1 } , { 1 , 1 , 153 , 2 } , { 200 , 50 , 39 , 1 } , { 204 , 255 , 153 , 2 } } ,
/*rgbval pattern2[PATTERN_COUNT]=*/ { { 1 , 1 , 1 , 1 } , { 10 , 255 , 0 , 1 } , { 1 , 1 , 255 , 2 } , { 1 , 200 , 1 , 2 } } ,
/*rgbval pattern3[PATTERN_COUNT]=*/ { { 1 , 1 , 5 , 1 } , { 1 , 1 , 255 , 1 } , { 1 , 1 , 5 , 1 } , { 1 , 1 , 255 , 1 } } ,
{ { 252 , 102 , 3 , 1 } , { 161 , 67 , 47 , 1 } , { 118 , 120 , 74 , 1 } , { 83 , 120 , 74 , 2 } } ,
{ { 87 , 119 , 122 , 1 } , { 95 , 87 , 122 , 1 } , { 52 , 69 , 56 , 1 } , { 83 , 84 , 72 , 1 } } } ;
2024-03-03 19:04:23 +00:00
//rgbval *pattern=pattern1[0];
int i = 0 , i2 = 0 , i3 ;
int r , g , b = 0 ;
int set = 0 ;
int input = 0 ;
2024-03-04 21:20:45 +00:00
//system_clock prescaler
2024-03-03 19:04:23 +00:00
//#######OC0A auf ausgang
DDRB = ( 1 < < PB0 ) | ( 1 < < PB1 ) | ( 1 < < PB4 ) ;
2024-03-05 11:28:11 +00:00
//#######Timer0-setup##### |Phase correct pwm
TCCR0A = ( 1 < < COM0A1 ) | ( 1 < < COM0B1 ) | ( 1 < < WGM00 ) ; //mode
2024-03-04 21:20:45 +00:00
TCCR0B = ( 1 < < CS01 ) ; //|(1<<CS02); //frequency /8
// PLLCSR |= (1 << PLLE) | (1 << PCKE);
2024-03-03 19:04:23 +00:00
//######Timer1-setup
2024-03-05 08:25:08 +00:00
TCCR1 = ( 1 < < COM0A0 ) | ( 1 < < COM0A1 ) | ( 1 < < COM0B0 ) | ( 1 < < COM0B1 ) | ( 1 < < CTC1 ) | ( 1 < < CS12 ) | ( 1 < < CS10 ) ; //|(1<<CS11)|(1<<CS13); //frequencyi //iinverting PWM because 0 dtc not possible
2024-03-05 11:28:11 +00:00
GTCCR = ( 1 < < PWM1B ) | ( 1 < < COM1B0 ) ; //mode + overrun clear, Set on compare match
2024-03-03 19:04:23 +00:00
OCR1C = 255 ; // clear timer at 255
//######PWM_VALUE$
//timer 0
2024-03-05 11:28:11 +00:00
OCR0A = 1 ;
2024-03-03 19:04:23 +00:00
OCR0B = 1 ;
//timer 1
OCR1B = 1 ;
//######Configure Pullups
PORTB | = ( 1 < < PB2 ) ;
while ( 1 )
{
for ( i = 0 ; i < PATTERN_COUNT ; i + + )
{
r = pattern [ i2 ] [ i ] . r ;
g = pattern [ i2 ] [ i ] . g ;
b = pattern [ i2 ] [ i ] . b ;
if ( i = = ( PATTERN_COUNT - 1 ) ) { i = - 1 ; }
while ( 1 )
{
input = PINB ;
if ( ( ( input & ( 1 < < PB2 ) ) = = 0 & & set = = 0 ) )
{
2024-03-04 21:20:45 +00:00
set = 1 ;
i = 0 ;
i2 + + ;
if ( i2 = = 6 )
{
i2 = 0 ;
}
//cycle through and stop pwm at value 0
2024-03-05 08:25:08 +00:00
2024-03-04 21:20:45 +00:00
//Visual feedback "mode change"
2024-03-05 08:25:08 +00:00
for ( i3 = 0 ; i3 < i2 ; i3 + + )
{
OCR0A = 1 ; OCR0B = 1 ; OCR1B = 1 ;
_delay_ms ( 30 ) ;
OCR0A = 255 ; OCR0B = 255 ; OCR1B = 255 ;
_delay_ms ( 30 ) ;
2024-03-04 21:20:45 +00:00
}
2024-03-03 19:04:23 +00:00
}
2024-03-05 08:25:08 +00:00
else if ( ( ( input & ( 1 < < PB2 ) ) ! = 0 ) )
2024-03-03 19:04:23 +00:00
{
2024-03-05 08:25:08 +00:00
set = 0 ;
2024-03-03 19:04:23 +00:00
}
if ( r < pattern [ i2 ] [ i + 1 ] . r ) { r + + ; }
if ( r > pattern [ i2 ] [ i + 1 ] . r ) { r - - ; }
if ( g < pattern [ i2 ] [ i + 1 ] . g ) { g + + ; }
if ( g > pattern [ i2 ] [ i + 1 ] . g ) { g - - ; }
if ( b < pattern [ i2 ] [ i + 1 ] . b ) { b + + ; }
if ( b > pattern [ i2 ] [ i + 1 ] . b ) { b - - ; }
OCR0A = g ; //green
OCR0B = r ; //red
OCR1B = b ; //blue
_delay_ms ( 10 ) ;
2024-03-04 21:20:45 +00:00
if ( r = = pattern [ i2 ] [ i + 1 ] . r & & g = = pattern [ i2 ] [ i + 1 ] . g & & b = = pattern [ i2 ] [ i + 1 ] . b ) break ;
2024-03-03 19:04:23 +00:00
}
}
}
return 0 ;
}