1 | //-----------------------------------------------------------------------------
|
---|
2 |
|
---|
3 | #include "application.h"
|
---|
4 | #include <avr/wdt.h>
|
---|
5 |
|
---|
6 |
|
---|
7 | //-----------------------------------------------------------------------------
|
---|
8 |
|
---|
9 | volatile U08 app_reset_source;
|
---|
10 | //-----------------------------------------------------------------------------
|
---|
11 |
|
---|
12 | void app_init(void)
|
---|
13 | {
|
---|
14 | app_reset_source = MCUSR; // Save last reset source
|
---|
15 | MCUSR = 0x00; // Clear reset source for next reset cycle
|
---|
16 |
|
---|
17 |
|
---|
18 | // Dangerous here: I still do not know much about the watchdog.
|
---|
19 | // This code is still from Udo Juerss.
|
---|
20 |
|
---|
21 | // The watchdog timer is disabled by default ("startup.asm")
|
---|
22 | #ifdef USE_WATCHDOG
|
---|
23 | WDTCSR = WDTOE | (1 << WDE); // Enable watchdog reset (~16ms)
|
---|
24 | #endif
|
---|
25 |
|
---|
26 | // define PORTS
|
---|
27 | // USART
|
---|
28 | DDRD &= ~(1<<PD0); // PD0 = RXD is input
|
---|
29 | DDRD |= 1<<PD1; // PD1 = TXD is output
|
---|
30 |
|
---|
31 |
|
---|
32 | // SPARE OUT/-INPUTS
|
---|
33 | DDRB |= (1<<PB2) | (1<<PB3); // set Out1_spare & out2_spare as outputs
|
---|
34 | DDRA &= ~(1<<PA7); // set In1_spare as input
|
---|
35 | DDRC &= ~(1<<PC7); // set In2_spare as input
|
---|
36 | PORTA |= (1<<PA7); // swtich on pullup on In1_spare
|
---|
37 | PORTC |= (1<<PC7); // swtich on pullup on In2_spare
|
---|
38 |
|
---|
39 | // ATmega internal ADC input
|
---|
40 | DDRA &= ~(1<<PA6);
|
---|
41 |
|
---|
42 | // MUXER ADDRESS OUTs
|
---|
43 | DDRA |= 0x3F; // SA-pins -> output
|
---|
44 | DDRC |= 0x7F; // SB-pins -> output
|
---|
45 |
|
---|
46 | // SPI
|
---|
47 | // set all CS's: output
|
---|
48 | DDRB |= (1 << SPI_E_CS);
|
---|
49 | DDRD |= (1 << SPI_AD_CS) |(1 << SPI_M_CS) |(1 << SPI_A_CS);
|
---|
50 |
|
---|
51 | // set all Chips selects HIGH
|
---|
52 | PORTB |= (1 << SPI_E_CS);
|
---|
53 | PORTD |= (1 << SPI_AD_CS) |(1 << SPI_M_CS) |(1 << SPI_A_CS);
|
---|
54 |
|
---|
55 | // set MOSI and SCK: output & // set MISO: input
|
---|
56 | SPI_DDR |= (1 << SPI_MOSI);
|
---|
57 | SPI_DDR |= (1 << SPI_SCLK);
|
---|
58 | SPI_DDR &= ~(1 << SPI_MISO);
|
---|
59 |
|
---|
60 | // set MOSI, SCK: HIGH. MISO leave alone.
|
---|
61 | SPI_PRT |= (1 << SPI_MOSI);
|
---|
62 | SPI_PRT |= (1 << SPI_SCLK);
|
---|
63 | SPI_PRT |= (1 << SPI_MISO);
|
---|
64 |
|
---|
65 | // ADC
|
---|
66 | DDRD &= ~(1<<PD6); // PD6 is AD_READY input
|
---|
67 | DDRD |= 1<<PD7; // PD7 is AD_RESET output
|
---|
68 |
|
---|
69 | // ACCELEROMETER
|
---|
70 | DDRD &= ~(1<<PD2); // PD2 is ACC_READY input
|
---|
71 |
|
---|
72 | //MAX6662 <--- not assembled anymore
|
---|
73 | // DDRB &= ~(1<<PB0); // PB0 is over temperature alert input
|
---|
74 | // DDRB &= ~(1<<PB1); // PB1 is general temperature altert input
|
---|
75 |
|
---|
76 |
|
---|
77 | }
|
---|
78 |
|
---|
79 |
|
---|
80 |
|
---|
81 | //-----------------------------------------------------------------------------
|
---|
82 |
|
---|
83 | void app_set_watchdog_prescaler(tWDT_PRESCALE wdt_prescale) // Set watchdog prescale
|
---|
84 | {
|
---|
85 | U08 sreg_backup = SREG; // Copy status register to variable
|
---|
86 | U08 wdtcsr_value = WDE + wdt_prescale; // Set new prescale value to variable
|
---|
87 |
|
---|
88 | cli(); // Disable interrups
|
---|
89 | wdt_reset(); // Reset watchdog
|
---|
90 |
|
---|
91 | WDTCR |= (1 << WDTOE) | (1 << WDE); // Unlock register access, 4 cycles to store new value
|
---|
92 | WDTCR = wdtcsr_value; // Set new watchdog prescaler
|
---|
93 | SREG = sreg_backup; // Restore status register
|
---|
94 | }
|
---|