/*
 * 03_Interrupt.cpp
 * Created: 2025
 *
 * Pindescription Arduino Nano
 * No.	Func.	PIN-MC	Used as In/Out Res. Pindefinition
 * D0	RX		PD0		RX			In
 * D1	TX		PD1		TX			In
 * D2	INT0	PD2		US-Echo_L	In
 * D3	INT1	PD3		US-Echo_R	In
 * D4	Digit	PD4		US-Trigger_L Out
 * D5	OC0B	PD5		PWM-B		Out
 * D6	OC0A	PD6		PWM-A		Out
 * D7	Digit	PD7		US-Trigger_R Out	->	DDRD = 0b11110000
 * D8	Digit	PB0		Motor-B		Out
 * D9	Digit	PB1		Motor-A		Out
 *D10	Digit	PB2		LS_LED		Out
 *D11	Unused	PB3					Out
 *D12	Unused	PB4					Out
 *D13	LED		PB5		LED			Out	->	DDRB = 0b11111111
 *A0	Ana		PC0		Line-L3		In
 *A1	Ana		PC1		Line-L2		In
 *A2	Ana		PC2		Line-L1		In
 *A3	Ana		PC3		Line-L0		In
 *A4	Ana		PC4		Line-R0		In
 *A5	Ana		PC5		Line-R1		In	->	DDRC = 0b00000000
 *A6	Ana		ADC6	Line-R2		In
 *A7	Ana		ADC7	Line-R3		In
 */
#define F_CPU 16000000UL //16MHz required for delay
#include <avr/io.h> //Input/Output library
#include <util/delay.h> //Needed for using _delay_...
#include <avr/interrupt.h> //External and internal Interrupts

//Definitions

//Macros
#define	LED_ON				PORTB |= (1 << PORTB5) //Push PORTB pin 5 high (LED, pin D13 "Nano")
#define	LED_OFF				PORTB &= ~(1 << PORTB5) //~ Not Operator
#define	LED_TOGGLE			PINB |= (1<<PINB5) //Toggle Arduino Nano pin D13


//Variables
unsigned char z; //For tests
unsigned int T2ck; //Counter TMR2 overflow

//Funktions, declaration
void Init (void); //Initialize Microcontroller

void setup() {
  Init();
}

//Main routine
void loop() {
  Init(); //Initalize the MC
	sei(); //Enable all interrupts
	//cli(); //Clear all interrupts
	while (1) {
		//Nothing to do!!!
	}

}

/***************************************************************************/
//Interrupt service routines (ISR)
//TMR2 overflow Interrupt
ISR(TIMER2_OVF_vect) { //Prescaler TMR2 1:8 = Interrupt every 128 us
//Just toggeling the LED
	T2ck++; //Counter TMR2 OVF
	if(T2ck == 2000) { //Approx. every 250ms (2000*128us = 256ms)
		T2ck = 0; //Don´t forget!!
		LED_TOGGLE; //See above
	}
}


/***********************************************************************************************/
//Other functions

//Initialize the Microcontroller
void Init (void) {
	//Port settings (in brackets: pin of the arduino uno board, see above too)
	//0 = Input, 1 = Output
	DDRB = 0b11111111; //PortB Pin 5 to Output, LED on Arduino Nano board (D13)
	//Timer2 Time divider
	TCCR2A = 0b00000000; //0000Normal port operation,00unimpl.,00WGM2[1:0]
	TCCR2B = 0b00000010; //0WGM22,010Prescaler 1:8
	TIMSK2 = 0b00000001; //Interrupt at TMR2-OVFL, 128us, 1s = 1000000us, 16MHz -> 16oscillations per us -> prescaler 1:8 -> 2 increments of TCNT2 per us -> overflow after 128us
}


/*Aufgabe: LED im 500ms-Tackt blinken lassen.
 *Dazu müsst ihr nur ein wenig rechnen...*/