aboutsummaryrefslogtreecommitdiff
path: root/FanController/fan_controller/hw/io.c
diff options
context:
space:
mode:
Diffstat (limited to 'FanController/fan_controller/hw/io.c')
-rw-r--r--FanController/fan_controller/hw/io.c428
1 files changed, 428 insertions, 0 deletions
diff --git a/FanController/fan_controller/hw/io.c b/FanController/fan_controller/hw/io.c
new file mode 100644
index 0000000..3246f78
--- /dev/null
+++ b/FanController/fan_controller/hw/io.c
@@ -0,0 +1,428 @@
+/* Autor: Ján Sučan <jan@jansucan.sk>
+ *
+ * Zdrojove kody, ich casti a subory z nich vzniknute priamo alebo nepriamo
+ * (objektove subory, Intel Hex, ...) prosim nepouzivajte komercne, ani ako
+ * sucast komercnych diel. Vsetky ostatne pripady pouzitia su dovolene.
+ *
+ * Please don't use the source codes, their parts and files created from them
+ * directly or indirectly, (object files, Intel Hex files, ...) for commercial
+ * purposes, not even as a part of commercial products. All other use cases
+ * are allowed.
+ */
+
+#include <fan_controller/hw/io.h>
+#include <fan_controller/utils.h>
+
+#include <avr/io.h>
+
+static void io_init_button(void);
+static void io_init_fan_pwm(void);
+static void io_init_fan_tachometer(void);
+static void io_init_red_led(void);
+static void io_init_green_led_0(void);
+static void io_init_green_led_1(void);
+static void io_init_green_led_2(void);
+static void io_init_green_led_3(void);
+static void io_init_green_led_4(void);
+static void io_init_green_led_5(void);
+static void io_init_green_led_6(void);
+static void io_init_green_led_7(void);
+static void io_init_green_led_8(void);
+
+/**
+ * @brief Inicializacia vstupov a vystupov mikrokontroleru.
+ */
+void
+io_init(void)
+{
+ io_init_button();
+ io_init_fan_pwm();
+ io_init_fan_tachometer();
+ io_init_red_led();
+ io_init_green_led_0();
+ io_init_green_led_1();
+ io_init_green_led_2();
+ io_init_green_led_3();
+ io_init_green_led_4();
+ io_init_green_led_5();
+ io_init_green_led_6();
+ io_init_green_led_7();
+ io_init_green_led_8();
+}
+
+/**
+ * @brief Nastavenie vstupu pre tlacitko.
+ */
+void
+io_init_button(void)
+{
+ // Aktivacia pull-up rezistoru, to je treba, aby vstup "neplaval"
+ UTILS_SET_BIT(PORTA, PORTA2);
+}
+
+/**
+ * @brief Zistenie, ci je tlacitko stlacene, alebo nie.
+ *
+ * @retval true Tlacitko je stlacene.
+ * @retval false Tlacitko nie je stlacene.
+ */
+bool
+io_is_button_pressed(void)
+{
+ return UTILS_IS_BIT_SET(PINA, PINA2);
+}
+
+/**
+ * @brief Nastavenie vystupu pre PWM signal pre ovladanie otacok ventilatora.
+ */
+void
+io_init_fan_pwm(void)
+{
+ // Nastavenie vystupu pre PWM (Timer0 a OutputCompare0)
+ UTILS_SET_BIT(DDRB, PORTB3); // OC0 ako vystup
+ UTILS_CLR_BIT(PORTB, PORTB3);
+}
+
+/**
+ * @brief Odpojenie vystupu pre PWM signal pre ovladanie otacok ventilatora.
+ */
+void
+io_disable_fan_pwm(void)
+{
+ // Deaktivacia vystupu pre PWM (Timer0 a OutputCompare0)
+ UTILS_CLR_BIT(PORTB, PORTB3); // Vypnutie pull-up rezistoru
+ UTILS_CLR_BIT(DDRB, PORTB3); // OC0 ako vstup v tretom stave
+
+}
+
+/**
+ * @brief Nastavenie vstupu pre signal od tachometra ventilatora.
+ */
+void
+io_init_fan_tachometer(void)
+{
+ // Aktivacia pull-up rezistoru, to je treba, inak je na vstupe "rusenie"
+ UTILS_SET_BIT(PORTB, PORTB2);
+}
+
+/**
+ * @brief Zistenie, ci je signal z tachometra v log. 1, alebo nie.
+ *
+ * @retval true Signal je v log. 1.
+ * @retval false Signal nie je v log. 1.
+ */
+bool
+io_is_fan_tachometer_set(void)
+{
+ return UTILS_IS_BIT_SET(PINB, PINB2);
+}
+
+/**
+ * @brief Inicializacia cervenej LED.
+ */
+void
+io_init_red_led(void)
+{
+ UTILS_SET_BIT(DDRA, PORTA3);
+ io_off_red_led();
+}
+
+/**
+ * @brief Zasvietenie cervenej LED.
+ */
+void
+io_on_red_led(void)
+{
+ UTILS_CLR_BIT(PORTA, PORTA3);
+}
+
+/**
+ * @brief Zhasnutie cervenej LED.
+ */
+void
+io_off_red_led(void)
+{
+ UTILS_SET_BIT(PORTA, PORTA3);
+}
+
+/**
+ * @brief Inicializacia zelenej LED najviac vlavo.
+ *
+ * Ta bude ovladana PWM od Casovaca 2, aby sa dal regulovat jej jas.
+ * Casovac 2 je zarovej pouziti implementaciu cakania v delay.c.
+ */
+void
+io_init_green_led_0(void)
+{
+ UTILS_SET_BIT(DDRD, PORTD7);
+
+ // LED 0 bude ovladana PWM casovaca 2
+ // 62,5 Hz perioda
+ TCNT2 = 0;
+ // Fast PWM mode
+ TCCR2 |= (1 << WGM21) | (1 << WGM20);
+ // Inverted PWM
+ TCCR2 |= ((1 << COM21) | (1 << COM20));
+ // Prescale by 1024 = Zapnutie casovaca
+ TCCR2 |= ((1 << CS22) | (1 << CS21) | (1 << CS20));
+
+ io_off_green_led_0();
+}
+
+/**
+ * @brief Nastavenie maximalneho jasu zelenej LED najviac vlavo.
+ *
+ * Zasvietenie LED.
+ */
+void
+io_on_green_led_0(void)
+{
+ // LED 0 je ovladana PWM casovaca 2
+ io_set_green_led_0(UINT8_MAX);
+}
+
+/**
+ * @brief Nastavenie jasu zelenej LED najviac vlavo.
+ *
+ * @param light Jas zelenej LED z rozsahu 0 az 255.
+ */
+void
+io_set_green_led_0(uint8_t light)
+{
+ OCR2 = light;
+}
+
+/**
+ * @brief Nastavenie minimalneho jasu zelenej LED najviac vlavo.
+ *
+ * Zhasnutie LED.
+ */
+void
+io_off_green_led_0(void)
+{
+ io_set_green_led_0(0);
+}
+
+/**
+ * @brief Inizializacia zelej LED 1.
+ */
+void
+io_init_green_led_1(void)
+{
+ UTILS_SET_BIT(DDRC, PORTC0);
+ io_off_green_led_1();
+}
+
+/**
+ * @brief Zasvietenie zelej LED 1.
+ */
+void
+io_on_green_led_1(void)
+{
+ UTILS_CLR_BIT(PORTC, PORTC0);
+}
+
+/**
+ * @brief Zhasnutie zelej LED 1.
+ */
+void
+io_off_green_led_1(void)
+{
+ UTILS_SET_BIT(PORTC, PORTC0);
+}
+
+/**
+ * @brief Inizializacia zelej LED 2.
+ */
+void
+io_init_green_led_2(void)
+{
+ UTILS_SET_BIT(DDRC, PORTC1);
+ io_off_green_led_2();
+}
+
+/**
+ * @brief Zasvietenie zelej LED 2.
+ */
+void
+io_on_green_led_2(void)
+{
+ UTILS_CLR_BIT(PORTC, PORTC1);
+}
+
+/**
+ * @brief Zhasnutie zelej LED 2.
+ */
+void
+io_off_green_led_2(void)
+{
+ UTILS_SET_BIT(PORTC, PORTC1);
+}
+
+/**
+ * @brief Inizializacia zelej LED 3.
+ */
+void
+io_init_green_led_3(void)
+{
+ UTILS_SET_BIT(DDRC, PORTC3);
+ io_off_green_led_3();
+}
+
+/**
+ * @brief Zasvietenie zelej LED 3.
+ */
+void
+io_on_green_led_3(void)
+{
+ UTILS_CLR_BIT(PORTC, PORTC3);
+}
+
+/**
+ * @brief Zhasnutie zelej LED 3.
+ */
+void
+io_off_green_led_3(void)
+{
+ UTILS_SET_BIT(PORTC, PORTC3);
+}
+
+/**
+ * @brief Inizializacia zelej LED 4.
+ */
+void
+io_init_green_led_4(void)
+{
+ UTILS_SET_BIT(DDRC, PORTC5);
+ io_off_green_led_4();
+}
+
+/**
+ * @brief Zasvietenie zelej LED 4.
+ */
+void
+io_on_green_led_4(void)
+{
+ UTILS_CLR_BIT(PORTC, PORTC5);
+}
+
+/**
+ * @brief Zhasnutie zelej LED 4.
+ */
+void
+io_off_green_led_4(void)
+{
+ UTILS_SET_BIT(PORTC, PORTC5);
+}
+
+/**
+ * @brief Inizializacia zelej LED 5.
+ */
+void
+io_init_green_led_5(void)
+{
+ UTILS_SET_BIT(DDRC, PORTC6);
+ io_off_green_led_5();
+}
+
+/**
+ * @brief Zasvietenie zelej LED 5.
+ */
+void
+io_on_green_led_5(void)
+{
+ UTILS_CLR_BIT(PORTC, PORTC6);
+}
+
+/**
+ * @brief Zhasnutie zelej LED 5.
+ */
+void
+io_off_green_led_5(void)
+{
+ UTILS_SET_BIT(PORTC, PORTC6);
+}
+
+/**
+ * @brief Inizializacia zelej LED 6.
+ */
+void
+io_init_green_led_6(void)
+{
+ UTILS_SET_BIT(DDRC, PORTC7);
+ io_off_green_led_6();
+}
+
+/**
+ * @brief Zasvietenie zelej LED 6.
+ */
+void
+io_on_green_led_6(void)
+{
+ UTILS_CLR_BIT(PORTC, PORTC7);
+}
+
+/**
+ * @brief Zhasnutie zelej LED 6.
+ */
+void
+io_off_green_led_6(void)
+{
+ UTILS_SET_BIT(PORTC, PORTC7);
+}
+
+/**
+ * @brief Inizializacia zelej LED 7.
+ */
+void
+io_init_green_led_7(void)
+{
+ UTILS_SET_BIT(DDRA, PORTA7);
+ io_off_green_led_7();
+}
+
+/**
+ * @brief Zasvietenie zelej LED 7.
+ */
+void
+io_on_green_led_7(void)
+{
+ UTILS_CLR_BIT(PORTA, PORTA7);
+}
+
+/**
+ * @brief Zhasnutie zelej LED 8.
+ */
+void
+io_off_green_led_7(void)
+{
+ UTILS_SET_BIT(PORTA, PORTA7);
+}
+
+/**
+ * @brief Inizializacia zelej LED 8.
+ */
+void
+io_init_green_led_8(void)
+{
+ UTILS_SET_BIT(DDRA, PORTA5);
+ io_off_green_led_8();
+}
+
+/**
+ * @brief Zasvietenie zelej LED 8.
+ */
+void
+io_on_green_led_8(void)
+{
+ UTILS_CLR_BIT(PORTA, PORTA5);
+}
+
+/**
+ * @brief Zhasnutie zelej LED 8.
+ */
+void
+io_off_green_led_8(void)
+{
+ UTILS_SET_BIT(PORTA, PORTA5);
+} \ No newline at end of file