Files
42_EXT_03_42chips/module01/ex01/main.c
2025-03-05 17:57:36 +01:00

80 lines
2.7 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#include <avr/io.h>
// #define FIRST_LETTER_IMPL(x) #x[0]
// #define FIRST_LETTER(x) FIRST_LETTER_IMPL(x)
// #define PORT_LETTER(PIN) FIRST_LETTER(PIN)
// global registers
#define SET(register, bit) register |= 1 << bit
#define CLEAR(register, bit) register &= ~(1 << bit)
#define TEST(register, bit) register & 1 << bit
#define TOGGLE(register, bit) register ^= 1 << bit
// actions on ports
#define TEST_PIN(port, bit) TEST(PIN ## port, bit)
#define TOGGLE_PIN(port, bit) SET(PIN ## port, bit)
#define MODE_INPUT(port, bit) CLEAR(DDR ## port, bit)
#define MODE_OUTPUT(port, bit) SET(DDR ## port, bit)
#define IS_PIN_SET(port, bit) (TEST_PIN(port, bit)) == 0
#define IS_PIN_CLEAR(port, bit) (TEST_PIN(port, bit)) == 1
#define TURN_ON(_PORT, BIT) SET(PORT ## _PORT, BIT)
#define TURN_OFF(_PORT, BIT) CLEAR(PORT ## _PORT, BIT)
// LEDs
#define TURN_ON_LED(bit) SET(PORTB, bit)
#define TURN_OFF_LED(bit) CLEAR(PORTB, bit)
#define TOGGLE_LED(led) TOGGLE_PIN(B, led)
// ELEMENTS
#define D1 0
#define D2 1
#define D3 2
#define D4 4
#define SW1 2
#define SW2 4
// TIME
#define PRESCALE_VALUE 1024
#if (PRESCALE_VALUE == 1)
#define PRESCALE_SET (1 << CS10)
#elif (PRESCALE_VALUE == 8)
#define PRESCALE_SET (1 << CS11)
#elif (PRESCALE_VALUE == 64)
#define PRESCALE_SET (1 << CS10) | (1 << CS11)
#elif (PRESCALE_VALUE == 256)
#define PRESCALE_SET (1 << CS12)
#elif (PRESCALE_VALUE == 1024)
#define PRESCALE_SET (1 << CS10) | (1 << CS12)
#endif
#define TIME_MS(ms) (((F_CPU / PRESCALE_VALUE) * ms) / 1000)
int main() {
MODE_OUTPUT(B, D2);
TCCR1B |= (1 << WGM12); // set timer in CTC (Clear Time on Compare) mode
// -> use bit WGM12 to set mode ctc : Table 16-4. Waveform Generation Mode Bit Description
// -> bit WGM12 is located in register TCCR1B : 16.11.2 TCCR1B Timer/Counter1 Control Register B
OCR1A = TIME_MS(500); // set CTC compare value
// -> the value to reset the timer is the Output Compare Registers OCR1A : Table 16-4. Waveform Generation Mode Bit Description
TCCR1B |= (PRESCALE_SET);
while(1) {
if (TIFR1 & (1 << OCF1A)) { // when comparison has occured, bit OCF1A is set
// -> "The compare match event will also set the Compare Match Flag (OCF1A/B) which can be used to generate an Output Compare interrupt request" : 16.2.1 Register
// -> bit OCF1A is in register TIFR1 : 16.11.9 TIFR1 Timer/Counter1 Interrupt Flag Register
TOGGLE_LED(D2); // toggle using PINx register
TIFR1 = (1 << OCF1A); // clear the CTC flag
// -> "OCF1A can be cleared by writing a logic one to its bit location" : 16.11.9 TIFR1 Timer/Counter1 Interrupt Flag Register
}
}
}