summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDennis Brentjes <d.brentjes@gmail.com>2020-03-28 20:30:24 +0100
committerDennis Brentjes <d.brentjes@gmail.com>2020-03-28 20:30:24 +0100
commit89be54a9feb65bfbad237b79969bf3446c90eebd (patch)
tree39213238c9c6efcbda287efe4613129fe28571a4
parent456fe72cc5b026f9168af91767af6932f6e70866 (diff)
downloadPiCl-89be54a9feb65bfbad237b79969bf3446c90eebd.tar.gz
PiCl-89be54a9feb65bfbad237b79969bf3446c90eebd.tar.bz2
PiCl-89be54a9feb65bfbad237b79969bf3446c90eebd.zip
Adds initial version of the Attiny24 firmware
-rw-r--r--PiCl/PiCl-rescue.dcm3
-rw-r--r--PiCl/PiCl-rescue.lib428
-rw-r--r--PiCl/sym-lib-table1
-rw-r--r--picl-firmware/.vscode/c_cpp_properties.json15
-rw-r--r--picl-firmware/.vscode/tasks.json26
-rw-r--r--picl-firmware/fan_control.c86
-rw-r--r--picl-firmware/picl-firmware.code-workspace8
7 files changed, 567 insertions, 0 deletions
diff --git a/PiCl/PiCl-rescue.dcm b/PiCl/PiCl-rescue.dcm
new file mode 100644
index 0000000..5f3ed79
--- /dev/null
+++ b/PiCl/PiCl-rescue.dcm
@@ -0,0 +1,3 @@
+EESchema-DOCLIB Version 2.0
+#
+#End Doc Library
diff --git a/PiCl/PiCl-rescue.lib b/PiCl/PiCl-rescue.lib
new file mode 100644
index 0000000..08f29b6
--- /dev/null
+++ b/PiCl/PiCl-rescue.lib
@@ -0,0 +1,428 @@
+EESchema-LIBRARY Version 2.4
+#encoding utf-8
+#
+# ATtiny24-20SSU-MCU_Microchip_ATtiny
+#
+DEF ATtiny24-20SSU-MCU_Microchip_ATtiny U 0 20 Y Y 1 F N
+F0 "U" -500 850 50 H V L BNN
+F1 "ATtiny24-20SSU-MCU_Microchip_ATtiny" 100 -850 50 H V L TNN
+F2 "Package_SO:SOIC-14_3.9x8.7mm_P1.27mm" 0 0 50 H I C CIN
+F3 "" 0 0 50 H I C CNN
+$FPLIST
+ SOIC*3.9x8.7mm*P1.27mm*
+$ENDFPLIST
+DRAW
+S -500 -800 500 800 0 1 10 f
+X VCC 1 0 900 100 D 50 50 1 1 W
+X PA3 10 600 300 100 L 50 50 1 1 B
+X PA2 11 600 400 100 L 50 50 1 1 B
+X PA1 12 600 500 100 L 50 50 1 1 B
+X AREF/PA0 13 600 600 100 L 50 50 1 1 B
+X GND 14 0 -900 100 U 50 50 1 1 W
+X XTAL1/PB0 2 600 -300 100 L 50 50 1 1 B
+X XTAL2/PB1 3 600 -400 100 L 50 50 1 1 B
+X ~RESET~/PB3 4 600 -600 100 L 50 50 1 1 B
+X PB2 5 600 -500 100 L 50 50 1 1 B
+X PA7 6 600 -100 100 L 50 50 1 1 B
+X PA6 7 600 0 100 L 50 50 1 1 B
+X PA5 8 600 100 100 L 50 50 1 1 B
+X PA4 9 600 200 100 L 50 50 1 1 B
+ENDDRAW
+ENDDEF
+#
+# AVR-ISP-6-Connector
+#
+DEF AVR-ISP-6-Connector J 0 40 Y Y 1 F N
+F0 "J" -250 450 50 H V L CNN
+F1 "AVR-ISP-6-Connector" 0 450 50 H V L CNN
+F2 "" -250 50 50 V I C CNN
+F3 "" -1275 -550 50 H I C CNN
+$FPLIST
+ IDC?Header*2x03*
+ Pin?Header*2x03*
+$ENDFPLIST
+DRAW
+S -105 -270 -95 -300 0 1 0 N
+S -105 400 -95 370 0 1 0 N
+S 300 -95 270 -105 0 1 0 N
+S 300 5 270 -5 0 1 0 N
+S 300 105 270 95 0 1 0 N
+S 300 205 270 195 0 1 0 N
+S 300 400 -300 -300 0 1 10 f
+X MISO 1 400 200 100 L 50 50 1 1 P
+X VCC 2 -100 500 100 D 50 50 1 1 P
+X SCK 3 400 0 100 L 50 50 1 1 P
+X MOSI 4 400 100 100 L 50 50 1 1 P
+X ~RST 5 400 -100 100 L 50 50 1 1 P
+X GND 6 -100 -400 100 U 50 50 1 1 P
+ENDDRAW
+ENDDEF
+#
+# C-Device
+#
+DEF C-Device C 0 10 N Y 1 F N
+F0 "C" 25 100 50 H V L CNN
+F1 "C-Device" 25 -100 50 H V L CNN
+F2 "" 38 -150 50 H I C CNN
+F3 "" 0 0 50 H I C CNN
+$FPLIST
+ C_*
+$ENDFPLIST
+DRAW
+P 2 0 1 20 -80 -30 80 -30 N
+P 2 0 1 20 -80 30 80 30 N
+X ~ 1 0 150 110 D 50 50 1 1 P
+X ~ 2 0 -150 110 U 50 50 1 1 P
+ENDDRAW
+ENDDEF
+#
+# Conn_01x02_Male-Connector
+#
+DEF Conn_01x02_Male-Connector J 0 40 Y N 1 F N
+F0 "J" 0 100 50 H V C CNN
+F1 "Conn_01x02_Male-Connector" 0 -200 50 H V C CNN
+F2 "" 0 0 50 H I C CNN
+F3 "" 0 0 50 H I C CNN
+$FPLIST
+ Connector*:*_1x??_*
+$ENDFPLIST
+DRAW
+S 34 -95 0 -105 1 1 6 F
+S 34 5 0 -5 1 1 6 F
+P 2 1 1 6 50 -100 34 -100 N
+P 2 1 1 6 50 0 34 0 N
+X Pin_1 1 200 0 150 L 50 50 1 1 P
+X Pin_2 2 200 -100 150 L 50 50 1 1 P
+ENDDRAW
+ENDDEF
+#
+# Conn_01x03_Male-Connector
+#
+DEF Conn_01x03_Male-Connector J 0 40 Y N 1 F N
+F0 "J" 0 200 50 H V C CNN
+F1 "Conn_01x03_Male-Connector" 0 -200 50 H V C CNN
+F2 "" 0 0 50 H I C CNN
+F3 "" 0 0 50 H I C CNN
+$FPLIST
+ Connector*:*_1x??_*
+$ENDFPLIST
+DRAW
+S 34 -95 0 -105 1 1 6 F
+S 34 5 0 -5 1 1 6 F
+S 34 105 0 95 1 1 6 F
+P 2 1 1 6 50 -100 34 -100 N
+P 2 1 1 6 50 0 34 0 N
+P 2 1 1 6 50 100 34 100 N
+X Pin_1 1 200 100 150 L 50 50 1 1 P
+X Pin_2 2 200 0 150 L 50 50 1 1 P
+X Pin_3 3 200 -100 150 L 50 50 1 1 P
+ENDDRAW
+ENDDEF
+#
+# Conn_01x04_Male-Connector
+#
+DEF Conn_01x04_Male-Connector J 0 40 Y N 1 F N
+F0 "J" 0 200 50 H V C CNN
+F1 "Conn_01x04_Male-Connector" 0 -300 50 H V C CNN
+F2 "" 0 0 50 H I C CNN
+F3 "" 0 0 50 H I C CNN
+$FPLIST
+ Connector*:*_1x??_*
+$ENDFPLIST
+DRAW
+S 34 -195 0 -205 1 1 6 F
+S 34 -95 0 -105 1 1 6 F
+S 34 5 0 -5 1 1 6 F
+S 34 105 0 95 1 1 6 F
+P 2 1 1 6 50 -200 34 -200 N
+P 2 1 1 6 50 -100 34 -100 N
+P 2 1 1 6 50 0 34 0 N
+P 2 1 1 6 50 100 34 100 N
+X Pin_1 1 200 100 150 L 50 50 1 1 P
+X Pin_2 2 200 0 150 L 50 50 1 1 P
+X Pin_3 3 200 -100 150 L 50 50 1 1 P
+X Pin_4 4 200 -200 150 L 50 50 1 1 P
+ENDDRAW
+ENDDEF
+#
+# D-Device
+#
+DEF D-Device D 0 40 N N 1 F N
+F0 "D" 0 100 50 H V C CNN
+F1 "D-Device" 0 -100 50 H V C CNN
+F2 "" 0 0 50 H I C CNN
+F3 "" 0 0 50 H I C CNN
+$FPLIST
+ TO-???*
+ *_Diode_*
+ *SingleDiode*
+ D_*
+$ENDFPLIST
+DRAW
+P 2 0 1 8 -50 50 -50 -50 N
+P 2 0 1 0 50 0 -50 0 N
+P 4 0 1 8 50 50 50 -50 -50 0 50 50 N
+X K 1 -150 0 100 R 50 50 1 1 P
+X A 2 150 0 100 L 50 50 1 1 P
+ENDDRAW
+ENDDEF
+#
+# Fan_4pin-Motor
+#
+DEF Fan_4pin-Motor M 0 0 Y Y 1 F N
+F0 "M" 100 200 50 H V L CNN
+F1 "Fan_4pin-Motor" 100 -100 50 H V L TNN
+F2 "" 0 10 50 H I C CNN
+F3 "" 0 10 50 H I C CNN
+$FPLIST
+ FanPinHeader*P2.54mm*Vertical*
+ PinHeader*P2.54mm*Vertical*
+ TerminalBlock*
+$ENDFPLIST
+DRAW
+A -200 60 20 1800 900 0 0 0 N -220 60 -200 80
+A -200 60 20 -1799 -1 0 0 0 N -220 60 -180 60
+A -98 94 113 297 -910 0 1 0 N 0 150 -100 -20
+A 0 -70 112 1534 266 0 1 0 N -100 -20 100 -20
+A 103 95 115 -915 1519 0 1 0 N 100 -20 0 150
+C 0 40 128 0 1 10 N
+P 2 0 0 0 -200 80 -210 85 N
+P 2 0 0 0 -200 80 -205 70 N
+P 3 0 0 0 -160 100 -160 40 -130 40 N
+P 2 0 1 0 -160 100 -200 100 N
+P 2 0 1 0 0 -200 0 -180 N
+P 2 0 1 0 0 -88 0 -104 N
+P 2 0 1 0 0 168 0 182 N
+P 2 0 1 0 0 180 0 200 N
+P 4 0 1 0 -100 -40 -160 -40 -160 -100 -200 -100 N
+P 10 0 1 0 -210 -130 -200 -130 -200 -120 -190 -120 -190 -130 -170 -130 -170 -120 -160 -120 -160 -130 -140 -130 N
+X - 1 0 -200 100 U 50 50 1 1 P
+X + 2 0 300 100 D 50 50 1 1 P
+X Tacho 3 -300 100 100 R 50 50 1 1 P
+X PWM 4 -300 -100 100 R 50 50 1 1 I
+ENDDRAW
+ENDDEF
+#
+# Fuse-Device
+#
+DEF Fuse-Device F 0 0 N Y 1 F N
+F0 "F" 80 0 50 V V C CNN
+F1 "Fuse-Device" -75 0 50 V V C CNN
+F2 "" -70 0 50 V I C CNN
+F3 "" 0 0 50 H I C CNN
+$FPLIST
+ *Fuse*
+$ENDFPLIST
+DRAW
+S -30 -100 30 100 0 1 10 N
+P 2 0 1 0 0 100 0 -100 N
+X ~ 1 0 150 50 D 50 50 1 1 P
+X ~ 2 0 -150 50 U 50 50 1 1 P
+ENDDRAW
+ENDDEF
+#
+# G5Q-1A-Relay
+#
+DEF G5Q-1A-Relay K 0 20 Y Y 1 F N
+F0 "K" 350 150 50 H V L CNN
+F1 "G5Q-1A-Relay" 350 50 50 H V L CNN
+F2 "Relay_THT:Relay_SPST_Omron-G5Q-1A" 350 -50 50 H I L CNN
+F3 "" 0 0 50 H I C CNN
+$FPLIST
+ Relay*SPST*Omron*G5Q*
+$ENDFPLIST
+DRAW
+S -400 200 300 -200 0 1 10 f
+S -325 75 -75 -75 0 1 10 N
+P 4 0 0 0 200 200 200 100 175 125 200 150 N
+P 2 0 1 10 -300 -75 -100 75 N
+P 2 0 1 0 -200 -200 -200 -75 N
+P 2 0 1 0 -200 200 -200 75 N
+P 2 0 1 10 -75 0 -50 0 N
+P 2 0 1 10 -25 0 0 0 N
+P 2 0 1 10 25 0 50 0 N
+P 2 0 1 10 75 0 100 0 N
+P 2 0 1 10 125 0 150 0 N
+P 2 0 1 20 200 -100 125 150 N
+P 2 0 1 0 200 -100 200 -200 N
+X ~ 1 -200 -300 100 U 50 50 1 1 P
+X ~ 2 200 -300 100 U 50 50 1 1 P
+X ~ 3 200 300 100 D 50 50 1 1 P
+X ~ 5 -200 300 100 D 50 50 1 1 P
+ENDDRAW
+ENDDEF
+#
+# GND-power
+#
+DEF GND-power #PWR 0 0 Y Y 1 F P
+F0 "#PWR" 0 -250 50 H I C CNN
+F1 "GND-power" 0 -150 50 H V C CNN
+F2 "" 0 0 50 H I C CNN
+F3 "" 0 0 50 H I C CNN
+DRAW
+P 6 0 1 0 0 0 0 -50 50 -50 0 -100 -50 -50 0 -50 N
+X GND 1 0 0 0 D 50 50 1 1 W N
+ENDDRAW
+ENDDEF
+#
+# GNDPWR-power
+#
+DEF GNDPWR-power #PWR 0 0 Y Y 1 F P
+F0 "#PWR" 0 -200 50 H I C CNN
+F1 "GNDPWR-power" 0 -130 50 H V C CNN
+F2 "" 0 -50 50 H I C CNN
+F3 "" 0 -50 50 H I C CNN
+DRAW
+P 2 0 1 0 0 -50 0 0 N
+P 3 0 1 8 -40 -50 -50 -80 -50 -80 N
+P 3 0 1 8 -20 -50 -30 -80 -30 -80 N
+P 3 0 1 8 0 -50 -10 -80 -10 -80 N
+P 3 0 1 8 20 -50 10 -80 10 -80 N
+P 3 0 1 8 40 -50 -40 -50 -40 -50 N
+P 4 0 1 8 40 -50 30 -80 30 -80 30 -80 N
+X GNDPWR 1 0 0 0 D 50 50 1 1 W N
+ENDDRAW
+ENDDEF
+#
+# LED-Device
+#
+DEF LED-Device D 0 40 N N 1 F N
+F0 "D" 0 100 50 H V C CNN
+F1 "LED-Device" 0 -100 50 H V C CNN
+F2 "" 0 0 50 H I C CNN
+F3 "" 0 0 50 H I C CNN
+$FPLIST
+ LED*
+ LED_SMD:*
+ LED_THT:*
+$ENDFPLIST
+DRAW
+P 2 0 1 8 -50 -50 -50 50 N
+P 2 0 1 0 -50 0 50 0 N
+P 4 0 1 8 50 -50 50 50 -50 0 50 -50 N
+P 5 0 1 0 -120 -30 -180 -90 -150 -90 -180 -90 -180 -60 N
+P 5 0 1 0 -70 -30 -130 -90 -100 -90 -130 -90 -130 -60 N
+X K 1 -150 0 100 R 50 50 1 1 P
+X A 2 150 0 100 L 50 50 1 1 P
+ENDDRAW
+ENDDEF
+#
+# PCF8574-Interface_Expansion
+#
+DEF PCF8574-Interface_Expansion U 0 40 Y Y 1 F N
+F0 "U" -350 600 50 H V L CNN
+F1 "PCF8574-Interface_Expansion" 100 600 50 H V L CNN
+F2 "" 0 0 50 H I C CNN
+F3 "" 0 0 50 H I C CNN
+$FPLIST
+ DIP*
+ PDIP*
+ SO*
+ SOIC*
+$ENDFPLIST
+DRAW
+S -350 -550 350 550 0 1 10 f
+X A0 1 -500 100 150 R 50 50 1 1 I
+X P5 10 500 -100 150 L 50 50 1 1 B
+X P6 11 500 -200 150 L 50 50 1 1 B
+X P7 12 500 -300 150 L 50 50 1 1 B
+X ~INT~ 13 -500 -400 150 R 50 50 1 1 C V
+X SCL 14 -500 400 150 R 50 50 1 1 I
+X SDA 15 -500 300 150 R 50 50 1 1 B
+X VDD 16 0 700 150 D 50 50 1 1 W
+X A1 2 -500 0 150 R 50 50 1 1 I
+X A2 3 -500 -100 150 R 50 50 1 1 I
+X P0 4 500 400 150 L 50 50 1 1 B
+X P1 5 500 300 150 L 50 50 1 1 B
+X P2 6 500 200 150 L 50 50 1 1 B
+X P3 7 500 100 150 L 50 50 1 1 B
+X VSS 8 0 -700 150 U 50 50 1 1 W
+X P4 9 500 0 150 L 50 50 1 1 B
+ENDDRAW
+ENDDEF
+#
+# PWR_FLAG-power
+#
+DEF PWR_FLAG-power #FLG 0 0 N N 1 F P
+F0 "#FLG" 0 75 50 H I C CNN
+F1 "PWR_FLAG-power" 0 150 50 H V C CNN
+F2 "" 0 0 50 H I C CNN
+F3 "" 0 0 50 H I C CNN
+DRAW
+P 6 0 1 0 0 0 0 50 -40 75 0 100 40 75 0 50 N
+X pwr 1 0 0 0 U 50 50 0 0 w
+ENDDRAW
+ENDDEF
+#
+# Q_NPN_CBE-Device
+#
+DEF Q_NPN_CBE-Device Q 0 0 Y N 1 F N
+F0 "Q" 200 50 50 H V L CNN
+F1 "Q_NPN_CBE-Device" 200 -50 50 H V L CNN
+F2 "" 200 100 50 H I C CNN
+F3 "" 0 0 50 H I C CNN
+DRAW
+C 50 0 111 0 1 10 N
+P 2 0 1 0 25 25 100 100 N
+P 3 0 1 0 25 -25 100 -100 100 -100 N
+P 3 0 1 20 25 75 25 -75 25 -75 N
+P 5 0 1 0 50 -70 70 -50 90 -90 50 -70 50 -70 F
+X C 1 100 200 100 D 50 50 1 1 P
+X B 2 -200 0 225 R 50 50 1 1 I
+X E 3 100 -200 100 U 50 50 1 1 P
+ENDDRAW
+ENDDEF
+#
+# R-Device
+#
+DEF R-Device R 0 0 N Y 1 F N
+F0 "R" 80 0 50 V V C CNN
+F1 "R-Device" 0 0 50 V V C CNN
+F2 "" -70 0 50 V I C CNN
+F3 "" 0 0 50 H I C CNN
+$FPLIST
+ R_*
+$ENDFPLIST
+DRAW
+S -40 -100 40 100 0 1 10 N
+X ~ 1 0 150 50 D 50 50 1 1 P
+X ~ 2 0 -150 50 U 50 50 1 1 P
+ENDDRAW
+ENDDEF
+#
+# SW_DIP_x04-Switch
+#
+DEF SW_DIP_x04-Switch SW 0 0 Y N 1 F N
+F0 "SW" 0 350 50 H V C CNN
+F1 "SW_DIP_x04-Switch" 0 -250 50 H V C CNN
+F2 "" 0 0 50 H I C CNN
+F3 "" 0 0 50 H I C CNN
+$FPLIST
+ SW?DIP?x4*
+$ENDFPLIST
+DRAW
+C -80 -100 20 0 0 0 N
+C -80 0 20 0 0 0 N
+C -80 100 20 0 0 0 N
+C -80 200 20 0 0 0 N
+C 80 -100 20 0 0 0 N
+C 80 0 20 0 0 0 N
+C 80 100 20 0 0 0 N
+C 80 200 20 0 0 0 N
+S -150 300 150 -200 0 1 10 f
+P 2 0 0 0 -60 -94 93 -53 N
+P 2 0 0 0 -60 5 93 46 N
+P 2 0 0 0 -60 105 93 146 N
+P 2 0 0 0 -60 205 93 246 N
+X ~ 1 -300 200 200 R 50 50 1 1 P
+X ~ 2 -300 100 200 R 50 50 1 1 P
+X ~ 3 -300 0 200 R 50 50 1 1 P
+X ~ 4 -300 -100 200 R 50 50 1 1 P
+X ~ 5 300 -100 200 L 50 50 1 1 P
+X ~ 6 300 0 200 L 50 50 1 1 P
+X ~ 7 300 100 200 L 50 50 1 1 P
+X ~ 8 300 200 200 L 50 50 1 1 P
+ENDDRAW
+ENDDEF
+#
+#End Library
diff --git a/PiCl/sym-lib-table b/PiCl/sym-lib-table
index fa2ef0c..7d9df5f 100644
--- a/PiCl/sym-lib-table
+++ b/PiCl/sym-lib-table
@@ -6,4 +6,5 @@
(lib (name MIC5225)(type Legacy)(uri ${KIPRJMOD}/MIC5225/2020-03-17_16-24-30.lib)(options "")(descr ""))
(lib (name NX3L4051PW,118)(type Legacy)(uri ${KIPRJMOD}/NX3L4051PW_118/NX3L4051PW_118.lib)(options "")(descr ""))
(lib (name AD5222)(type Legacy)(uri ${KIPRJMOD}/AD5222/2020-03-21_09-14-09.lib)(options "")(descr ""))
+ (lib (name PiCl-rescue)(type Legacy)(uri ${KIPRJMOD}/PiCl-rescue.lib)(options "")(descr ""))
)
diff --git a/picl-firmware/.vscode/c_cpp_properties.json b/picl-firmware/.vscode/c_cpp_properties.json
new file mode 100644
index 0000000..add3b91
--- /dev/null
+++ b/picl-firmware/.vscode/c_cpp_properties.json
@@ -0,0 +1,15 @@
+{
+ "configurations": [
+ {
+ "name": "AVR",
+ "includePath": [
+ "${workspaceFolder}/**",
+ "/usr/avr/include/**"
+ ],
+ "defines": ["__AVR_ATtiny24__"],
+ "compilerPath": "/usr/bin/avr-gcc",
+ "intelliSenseMode": "clang-x64"
+ }
+ ],
+ "version": 4
+} \ No newline at end of file
diff --git a/picl-firmware/.vscode/tasks.json b/picl-firmware/.vscode/tasks.json
new file mode 100644
index 0000000..069c853
--- /dev/null
+++ b/picl-firmware/.vscode/tasks.json
@@ -0,0 +1,26 @@
+{
+ // See https://go.microsoft.com/fwlink/?LinkId=733558
+ // for the documentation about the tasks.json format
+ "version": "2.0.0",
+ "tasks": [
+ {
+ "type": "shell",
+ "label": "avr-gcc build active file",
+ "command": "/bin/avr-gcc",
+ "args": [
+ "-mmcu=attiny24",
+ "-g",
+ "${file}",
+ "-o",
+ "${fileDirname}/${fileBasenameNoExtension}"
+ ],
+ "options": {
+ "cwd": "/bin"
+ },
+ "problemMatcher": [
+ "$gcc"
+ ],
+ "group": "build"
+ }
+ ]
+} \ No newline at end of file
diff --git a/picl-firmware/fan_control.c b/picl-firmware/fan_control.c
new file mode 100644
index 0000000..9e87963
--- /dev/null
+++ b/picl-firmware/fan_control.c
@@ -0,0 +1,86 @@
+#include <avr/io.h>
+#include <avr/interrupt.h>
+#include <avr/sleep.h>
+
+void setup_adc() {
+ //enable interrupts
+ sei();
+ // setup external reference voltage.
+ ADMUX &= ~(3UL << REFS0);
+ ADMUX |= (1UL << REFS0);
+ // set left adjusted ADC result so we can easily only use the upper 8 bits of the result
+ ADCSRB |= (1UL << ADLAR);
+ // enable ADC interrupt
+ ADCSRA |= (1UL << ADIE);
+}
+
+void setup_timers() {
+ //use system clock for timers, no prescaler.
+ TCCR0B &= ~(7UL << CS00);
+ TCCR0B |= (1UL << CS00);
+
+ //set mode 5 (PWM, phase correct, top defined by OCRA)
+ TCCR0A &= ~(3UL << WGM00);
+ TCCR0B &- ~(1UL << WGM02);
+ TCCR0A |= (1UL << WGM00);
+ TCCR0B |= (1UL << WGM02);
+}
+
+void enable_ADC() {
+ PRR &= ~(1UL << PRADC);
+ ADCSRA |= (1UL << ADEN);
+}
+
+void disable_ADC() {
+ ADCSRA &= ~(1UL << ADEN);
+ PRR |= (1UL << PRADC);
+}
+
+void select_ADC_channel(int channel) {
+ ADMUX &= ~(7UL << MUX0);
+ ADMUX |= (channel << MUX0);
+}
+
+uint8_t get_ADC_result() {
+ uint8_t result = ADCL;
+ //conversion would be blocked if we don't also read ADCH although we won't use the upper 2 bits.
+ uint8_t unblock = ADCH;
+ return result;
+}
+
+void start_ADC() {
+ ADCSRA |= (1UL << ADSC);
+}
+
+volatile uint8_t fan1;
+volatile uint8_t fan2;
+
+void start_polling_fans() {
+ PRR &= ~(1UL << PRADC);
+ enable_ADC();
+ select_ADC_channel(ADC1D);
+ start_ADC();
+}
+
+ISR(ADC_vect) {
+ if(ADMUX & (7UL << MUX0) == ADC1D) {
+ fan1 = get_ADC_result();
+ select_ADC_channel(ADC2D);
+ start_ADC();
+ return;
+ }
+
+ if(ADMUX & (7UL << MUX0) == ADC2D) {
+ fan2 = get_ADC_result();
+ disable_ADC();
+ return;
+ }
+}
+
+int main() {
+ set_sleep_mode(0);
+ setup_adc();
+ setup_timers();
+
+ while(1);
+}
diff --git a/picl-firmware/picl-firmware.code-workspace b/picl-firmware/picl-firmware.code-workspace
new file mode 100644
index 0000000..876a149
--- /dev/null
+++ b/picl-firmware/picl-firmware.code-workspace
@@ -0,0 +1,8 @@
+{
+ "folders": [
+ {
+ "path": "."
+ }
+ ],
+ "settings": {}
+} \ No newline at end of file