Hallo,
habe hier ein kleines Programm für den Tiny geschrieben
und bemerke dass der Interrupt bzw die aufgerufene Funktion
10 anstatt 5 Sekunden dauert.
Also alarm() dauert 10 Sekundenm, ABER die funktion
blink() läuft so, wie sie soll.
Auch mit cli(); code sei(); in der if- Schleife ändert sich das
Verhalten nicht.
1 | #define F_CPU 128000UL
|
2 |
|
3 |
|
4 | #include <avr/io.h>
|
5 | #include <util/delay.h>
|
6 | #include <avr/sleep.h>
|
7 | #include <avr/interrupt.h>
|
8 |
|
9 |
|
10 | volatile uint8_t s;
|
11 |
|
12 | int alarm(void);
|
13 | int blink(void);
|
14 |
|
15 | ISR(INT0_vect) // ISR - Put "switch" to 1
|
16 | {
|
17 | s=1;
|
18 | }
|
19 |
|
20 |
|
21 | int main(void)
|
22 | {
|
23 | DDRB = (1 << PB3);
|
24 | MCUCR = (1 << SE) | (1 << SM1) | (0 << SM0) | (0 << ISC00) | (0 << ISC01); // Sleep enabled - PwrDwn // LowLvlInt
|
25 | GIMSK = (1 << PCIE); // PCI Enable
|
26 | PCMSK = (1 << PCINT4); // PCI PB4
|
27 |
|
28 | int s = 0;
|
29 |
|
30 | sei();
|
31 |
|
32 | while(1)
|
33 | {
|
34 |
|
35 | if(s=1)
|
36 | { cli();
|
37 | s=0;
|
38 | alarm();
|
39 | sei();
|
40 | }
|
41 |
|
42 | blink();
|
43 | sleep_mode();
|
44 |
|
45 | }
|
46 | }
|
47 |
|
48 | int alarm(void)
|
49 | {
|
50 |
|
51 | s=0;
|
52 | PORTB =(0 << PB3);
|
53 | _delay_ms(5000);
|
54 | PORTB = (1 << PB3);
|
55 |
|
56 |
|
57 | return 0;
|
58 |
|
59 |
|
60 | }
|
61 |
|
62 | int blink (void)
|
63 | {
|
64 | for(uint8_t i=0; i<3; i++) //LED Signal, everything okay
|
65 | {
|
66 | PORTB = (0 << PB3);
|
67 | _delay_ms(1000);
|
68 | PORTB = (1 << PB3);
|
69 | _delay_ms(1000);
|
70 | }
|
71 |
|
72 | return 0;
|
73 | }
|