1 | #include <xc.h>
|
2 | #include "avr/interrupt.h"
|
3 | #include "avr/wdt.h"
|
4 | #include "avr/sleep.h"
|
5 | #include "myTool.h"
|
6 | #include "avr/cpufunc.h"
|
7 | #include <stdbool.h>
|
8 |
|
9 | #define ADenStartConversion ADCSRA |= 0b11000000
|
10 | #define ADCfinished ((ADCSRA & 0b01000000) == 0)
|
11 | #define ADCsetMuxToUGen (ADMUX = (ADMUX & 0b11000000) | 0b00000000) // ADC0
|
12 | #define ADCsetMuxToBatt2 (ADMUX = (ADMUX & 0b11000000) | 0b00000011) // ADC3
|
13 | #define ADCsetMuxToTheta (ADMUX = (ADMUX & 0b11000000) | 0b00000111) // ADC7
|
14 | #define FEToff PORTA &= 0b11111101
|
15 | #define FETon PORTA |= 0b00000010
|
16 | #define UsenseTetasenseCircuitOff PORTA &= 0b11111011 // PA2
|
17 | #define UsenseTetasenseCircuitOn PORTA |= 0b00000100 // PA2
|
18 | #define FanOff PORTB &= 0b11111011 // PB2
|
19 | #define FanOn PORTB |= 0b00000100 // PB2
|
20 | #define AllPullupsDisable (MCUCR |= 0b01000000)
|
21 | #define AllPullupsEnable (MCUCR &= 0b10111111)
|
22 |
|
23 | #define SwitchOnVoltage 220 // AD-Wert bei 13.8V: (13.8*10000)/(22000+10000)/5*255 ADC-Wert bei 13.8V und 22K/10K Spannungsteiler
|
24 | #define SwitchOffVoltage 204 // AD-Wert bei 12.8V
|
25 | #define ADCONST_60Deg 135
|
26 | #define ADCONST_70Deg 112
|
27 | #define ADCONST_80Deg 90
|
28 | #define HVcntr_max 16 // ca4 s bis Pon
|
29 | #define HVcntr_switch_off 4
|
30 | #define HVcntr_switch_on 16
|
31 |
|
32 | int HVintegral = 0;
|
33 | int LVintegral = 0;
|
34 | #define HVvalidTime 5 // nachdem das HV-Integral 4 erreicht hat -> Wechsel von Off -> On
|
35 | #define LVvalidTime 300 // nachdem das LV-Integral 300 erreicht hat -> Wechsel von On -> Off
|
36 |
|
37 | unsigned int FanYetActive = 0;
|
38 |
|
39 | enum OnOffState {off, on} RelayState = off;
|
40 | enum mode_t {automatic = 3, forceon = 2, forceoff = 1}; // low active
|
41 |
|
42 |
|
43 |
|
44 | void init(void)
|
45 | {
|
46 | _NOP();
|
47 | _NOP();
|
48 | _NOP();
|
49 | cli(); // eigentlich unnötig nach Power-on-Reset....
|
50 | // WDT init; Global IE-Flag disabled => Atomic OP zw. WDCE und WDE=0 gewährleistet
|
51 | // Nach der Sequenz wird nur mit WDIE der WDT angehalten (WDIE = 0) bzw. laufen gelassen (WDIE = 1)
|
52 | wdt_reset();
|
53 | /* Clear WDRF in MCUSR */
|
54 | MCUSR = 0x00;
|
55 | /* Write logical one to WDCE and WDE */
|
56 | WDTCSR |= (1<<WDCE) | (1<<WDE);
|
57 | //WDTCSR |= 0b00011000;
|
58 | /* WDEnable = 0 und WDIE = 0 => Watchdog angehalten*/
|
59 | WDTCSR = 0x07;
|
60 |
|
61 | // Global Interrupt enable
|
62 | sei();
|
63 | _NOP();
|
64 | _NOP();
|
65 | _NOP();
|
66 |
|
67 | }
|
68 |
|
69 |
|
70 | void sleep(void)
|
71 | {
|
72 | wdt_reset();
|
73 | WDTCSR = 0b01000111; // WDIE = 1 => WDT läuft; Overflow nach 2s
|
74 |
|
75 | set_sleep_mode(0b00010000); // SM1:SM0 = 10 => Power down mode
|
76 | sleep_mode(); // setzt SE-Bit, ruft sleep-Befehl auf und setzt danach das SE-Bit zurück (siehe AVR-LIBC
|
77 | _NOP();
|
78 | _NOP();
|
79 | _NOP();
|
80 |
|
81 | }
|
82 |
|
83 | ISR(WDT_vect) // Watchdog ISR
|
84 | {
|
85 | WDTCSR &= 0b10111111; // WDIE = 0 => WDT steht
|
86 | _NOP();
|
87 | _NOP();
|
88 | _NOP();
|
89 | }
|
90 |
|
91 |
|
92 | int main(void)
|
93 | {
|
94 | unsigned char ADUbatt, ADTheta;
|
95 | _NOP();
|
96 | _NOP();
|
97 | init();
|
98 | _NOP();
|
99 | _NOP();
|
100 |
|
101 | while(1)
|
102 | { //AllPullupsEnable;
|
103 | //senseUbattandTheta(&ADUbatt,&ADTheta);
|
104 | //reactOnUbattAndTheta(ADUbatt,ADTheta, readMode());
|
105 | //AllPullupsDisable;
|
106 | _NOP();
|
107 | _NOP();
|
108 | _NOP();
|
109 | // sleep();
|
110 | _NOP();
|
111 | _NOP();
|
112 | _NOP();
|
113 | // Timebase für Kühlung
|
114 | if (FanYetActive)
|
115 | {
|
116 | --FanYetActive;
|
117 | }
|
118 | }
|
119 | }
|