1 | /*
|
2 | * Marderschreck_selfmade.c
|
3 | *
|
4 | * Created: 26.05.2014 14:34:29
|
5 | * Author: Test1
|
6 | */
|
7 | #include <avr/io.h>
|
8 | #include <avr/interrupt.h>
|
9 | #include <util/delay.h>
|
10 | #include <util/delay.h>
|
11 |
|
12 |
|
13 | #ifndef F_CPU
|
14 | //prevent compiler error by supplying a default
|
15 | # warning "F_CPU not defined for <util/delay.h>"
|
16 | # define F_CPU 1000000UL
|
17 | #endif
|
18 | static int maxpwm = 170;
|
19 | static int dutypwm = 80;
|
20 | static uint8_t time= 0;
|
21 | #define UP 0
|
22 | #define DOWN 1
|
23 |
|
24 | void Timer0_setup (){
|
25 |
|
26 | TCCR0B |=(1<<CS01);
|
27 | TCNT0 |=(1<<OCR0A);
|
28 |
|
29 | TIMSK |=(1<<TOIE0);
|
30 |
|
31 |
|
32 | }
|
33 |
|
34 | void Timer1(){
|
35 |
|
36 | TCCR1 |=(1<<PWM1A)|(1<<COM1A1)|(1<<COM1A0)|(1<<CS12);
|
37 |
|
38 | OCR1C = maxpwm;
|
39 | OCR1A = dutypwm;
|
40 | TCNT1 |=(OCR1A);
|
41 | //OCR1A=80; //Impulsbreite ändern
|
42 |
|
43 | TIFR |=(1<<TOV1);
|
44 | TIMSK |=(1<<OCIE1A);
|
45 |
|
46 | }
|
47 |
|
48 | ISR(TIMER0_COMPA_vect){
|
49 |
|
50 | time++;
|
51 |
|
52 | if( time == 600 ) // oder was auch immer den 60 Sekunden entspricht
|
53 | time = 0;
|
54 |
|
55 |
|
56 | }
|
57 | ISR (TIMER1_COMPA_vect)
|
58 | {
|
59 | static uint8_t sweepDirection = UP;
|
60 | static uint16_t pulseCount = 0;
|
61 |
|
62 | pulseCount++;
|
63 | if( pulseCount == 1000 )
|
64 | {
|
65 | pulseCount = 0;
|
66 |
|
67 | if( sweepDirection == UP )
|
68 | {
|
69 | maxpwm += 10;
|
70 | if( maxpwm > 190 )
|
71 | sweepDirection = DOWN;
|
72 | }
|
73 | else
|
74 | {
|
75 | maxpwm -= 10;
|
76 | if( maxpwm < 80 )
|
77 | sweepDirection = UP;
|
78 | }
|
79 |
|
80 | OCR1C = maxpwm;
|
81 | }
|
82 |
|
83 | }
|
84 | int main(void)
|
85 | {
|
86 | DDRB=0x07;
|
87 | //Timer0_setup();
|
88 | Timer1();
|
89 | PORTB |=(1<<PB3);
|
90 |
|
91 | while(1)
|
92 | {
|
93 | // erst mal brauchen wir eine Variable die bis 600 zählt.
|
94 | // 600 deshalb, weil wir 30 Sekunden Ruhe haben wollen und 30 Sekunden
|
95 | // gepiepse. D.h. nach 60 Sekunden (30 + 30), oder eben 600 mal
|
96 | // 100 Millisekunden wiederholt sich alles wieder.
|
97 |
|
98 | time++;
|
99 | if( time == 600 )
|
100 | time = 0;
|
101 |
|
102 | // nachdem das jetzt klar ist, ist auch klar, dass der Sender
|
103 | // eingeschaltet sein soll, wenn
|
104 | // a) die time Variable kleiner als 300 ist, denn dann befinden
|
105 | // wir uns in den ersten 30 Sekunden dieses 60 Sekunden Zykluses
|
106 | // b) der externe Schalter so steht, dass vom Benutzer aus die
|
107 | // Freigabe für das Gequietsche gegeben wurde
|
108 | //
|
109 | // wenn keins der beiden der Fall ist, dann soll sich auch nichts tun
|
110 |
|
111 | if( PINB & (1<<PB3) ) // grundsätzlich ist eingeschaltet
|
112 | {
|
113 | //PORTB |= (1<<PB2); // --> daher erst mal: LED an
|
114 |
|
115 | if( time < 300 ) // ob tatsächlich gedudelt wird, entscheidet die Zeit
|
116 | TCCR1 |= (1<<CS12); // erste 30 Sekunden: ein
|
117 | else
|
118 | TCCR1 &= ~(1<<CS12); // zweite 30 Sekunden (eigentlich: die restliche Zeit): aus
|
119 | }
|
120 | else
|
121 | { // Nope. Da ist nichts eingeschaltet
|
122 | //PORTB &= ~(1<<PB2);
|
123 | TCCR1 &= ~(1<<CS12);
|
124 | }
|
125 | }
|
126 | }
|