Rev 1307 | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
1144 | - | 1 | // Martin Thomas 4/2008 |
2 | |||
3 | #include <avr/io.h> |
||
4 | #include <avr/interrupt.h> |
||
5 | #include <avr/wdt.h> |
||
6 | #include <util/delay.h> |
||
7 | |||
8 | #define LED_PORT PORTB |
||
9 | #define LED_DDR DDRB |
||
10 | #define LED_BIT PB2 |
||
11 | |||
12 | #define BT_PORT PORTC |
||
13 | #define BT_DDR DDRC |
||
14 | #define BT_PIN PINC |
||
15 | #define BT_BIT PC7 |
||
16 | |||
17 | static inline void my_wdt_off(void) |
||
18 | { |
||
19 | cli(); |
||
20 | wdt_reset(); |
||
21 | /* Clear WDRF in MCUSR */ |
||
22 | MCUSR &= ~(1<<WDRF); |
||
23 | /* Write logical one to WDCE and WDE */ |
||
24 | /* Keep old prescaler setting to prevent unintentional time-out */ |
||
25 | WDTCSR |= (1<<WDCE) | (1<<WDE); |
||
26 | /* Turn off WDT */ |
||
27 | WDTCSR = 0x00; |
||
28 | } |
||
29 | |||
30 | static void my_delay( void ) |
||
31 | { |
||
32 | int i; |
||
33 | for ( i=0; i<500; i++ ) { |
||
34 | _delay_ms(1); |
||
35 | } |
||
36 | } |
||
37 | |||
38 | int main( void ) |
||
39 | { |
||
40 | my_wdt_off(); |
||
41 | |||
42 | LED_PORT |= ( 1<<LED_BIT ); |
||
43 | LED_DDR |= ( 1<<LED_BIT ); |
||
44 | |||
45 | BT_DDR &= ~( 1<<BT_BIT ); |
||
46 | BT_PORT |= ( 1<<BT_BIT ); |
||
47 | |||
48 | while ( 1 ) { |
||
49 | LED_PORT &= ~( 1<<LED_BIT ); |
||
50 | my_delay(); |
||
51 | LED_PORT |= ( 1<<LED_BIT ); |
||
52 | my_delay(); |
||
53 | |||
54 | if ( !( BT_PIN & ( 1<<BT_BIT ) ) ) { |
||
55 | /* start bootloader */ |
||
56 | wdt_enable( WDTO_250MS ); |
||
57 | while (1) { ; } |
||
58 | } |
||
59 | } |
||
60 | |||
61 | return 0; /* never reached */ |
||
62 | } |