99 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			99 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #include <stdint.h>
 | |
| #include <stddef.h>
 | |
| #include <avr/io.h>
 | |
| #define F_CPU 20000000UL
 | |
| #include <util/delay.h>
 | |
| #include <stdbool.h>
 | |
| //~ #define BAUD 9600
 | |
| //~ #include <util/setbaud.h>
 | |
| #include <avr/interrupt.h>
 | |
| 
 | |
| #define HUE_MAX 610
 | |
| #define HUE_MIN 350
 | |
| #define STEPS 8
 | |
| //~ const uint32_t colorSteps = (HUE_MAX - HUE_MIN) / STEPS;
 | |
| const uint32_t colorSteps = 5;
 | |
| 
 | |
| uint8_t volatile status = 0;
 | |
| uint32_t volatile time = 0;
 | |
| uint32_t volatile T_half = 0;
 | |
| uint32_t volatile oldColor = 0;
 | |
| uint32_t volatile oldTime = 0;
 | |
| 
 | |
| //~ ISR(INT0_vect) {
 | |
| 	//~ status = 1;
 | |
| 	//~ T_half = time + TCNT1;
 | |
| 	//~ TCNT1 = 0;		// Reset Timer/Counter1
 | |
| 	//~ time = 0;
 | |
| 	//~ PORTC += 1;
 | |
| 	//~ PORTC ^= 0x04;
 | |
| 	
 | |
| //~ }
 | |
| 
 | |
| ISR(INT1_vect) {
 | |
| 	status = 1;
 | |
| 	T_half = time + TCNT1;
 | |
| 	TCNT1 = 0;		// Reset Timer/Counter1
 | |
| 	time = 0;
 | |
| 	oldColor = 0;
 | |
| 	oldTime = 0;
 | |
| 	PORTC ^= 1;
 | |
| 	PORTC &= 0x01;
 | |
| 	//~ PORTC ^= 0x04;
 | |
| 	
 | |
| }
 | |
| 
 | |
| ISR(TIMER1_OVF_vect) {
 | |
| 	time += 0x00010000;
 | |
| 	//~ PORTC += 1;
 | |
| 	//~ PORTC ^= 0x04;
 | |
| }
 | |
| 
 | |
| int main(){
 | |
| 
 | |
|     //~ PORTD |= (1 << PORTD2);    // turn On the Pull-up
 | |
|     // PD2 is now an input with pull-up enabled
 | |
|     
 | |
| 
 | |
| 	EIMSK |= 0x02;	// External Interrupt Mask Register
 | |
| 					// Enable INT1 (PIN5) for interrupt
 | |
| 	EICRA |= 0x0c;	// External Interrupt Control Register
 | |
| 					// INT1 on rising edge
 | |
| 	
 | |
| 	TIMSK1 |= 0x01;	// Timer/Counter1 Interrupt Mask Register
 | |
| 					// Enable overflow interrupt
 | |
| 	TCCR1B |= 0x01;	// Timer/Counter1 Control Register B
 | |
| 					// Prescale Factor 1
 | |
| 	
 | |
| 	SREG |= 0x80;	// Status Register
 | |
| 					// Enable global interrupts
 | |
| 			
 | |
| 	//~ PCICR |= 0x04;	// Pin Change Interrupt Control Register
 | |
| 					//~ // Enabled PCINT[23;16] -> Pin 13,12,11,6,5,4,3,2
 | |
| 	//~ PCIFR |= 0x04;	// Pin Change Interrupt Flag Register
 | |
| 	
 | |
| 	//~ PCMSK2 = 0xff;	// Pin Change Mask Register 2
 | |
| 					//~ // Enabled PCINT[23;16] (Single Pins)
 | |
| 	DDRC = 0x3f;
 | |
| 	PORTC = 0x00;
 | |
| 	
 | |
| 	
 | |
| 	
 | |
| 	while(1) {
 | |
| 		uint32_t T_step = T_half / colorSteps;
 | |
| 		//~ uint32_t colorStep = (time + TCNT1) / T_step;
 | |
| 				
 | |
| 		//~ if (colorStep > oldColor) {
 | |
| 			//~ // TODO next color
 | |
| 			//~ PORTC += 0x02;
 | |
| 			//~ oldColor = colorStep;
 | |
| 		//~ }
 | |
| 		
 | |
| 		if(time + TCNT1 > oldTime + T_step){
 | |
| 			oldTime += T_step;
 | |
| 			PORTC += 0x02;
 | |
| 		}
 | |
| 	}
 | |
| 	return 0;
 | |
| }
 |