1 | /*
|
2 | * Marderschreck_selfmade.c
|
3 | *
|
4 | * Created: 26.05.2014 14:34:29
|
5 | * Author: Test1
|
6 | */
|
7 |
|
8 | /***********************************************************************************************************************
|
9 | Includes
|
10 | ***********************************************************************************************************************/
|
11 | #include <avr/io.h>
|
12 | #include <avr/interrupt.h>
|
13 | #include <util/delay.h>
|
14 | #include <util/delay.h>
|
15 |
|
16 | /***********************************************************************************************************************
|
17 | CPU define
|
18 | ***********************************************************************************************************************/
|
19 | #ifndef F_CPU
|
20 | //prevent compiler error by supplying a default
|
21 | # warning "F_CPU not defined for <util/delay.h>"
|
22 | # define F_CPU 1000000UL
|
23 | #endif
|
24 |
|
25 | /***********************************************************************************************************************
|
26 | Variablen deklaration
|
27 | ***********************************************************************************************************************/
|
28 | static uint8_t time= 0;
|
29 | static int maxpwm = 190;
|
30 | static int dutypwm = 80;
|
31 |
|
32 | #define UP 0
|
33 | #define DOWN 1
|
34 | /***********************************************************************************************************************
|
35 | TIMER0_SETUP
|
36 | ***********************************************************************************************************************/
|
37 | void Timer0_setup (){
|
38 | GTCCR |=(1<<TSM); // Timer 0 starten
|
39 |
|
40 | TCCR0B |=(1<<CS01); // Vorteiler von Timer0 auf 8 festlegen
|
41 | TCNT0|=(1<<OCR0A); // Output compare Register A mit dem Zählerwert vergleichen
|
42 |
|
43 | TIMSK |=(1<<OCIE0A); // Timer0 Vergleichregister A aktiviert
|
44 | TIFR|=(1<<OCF0A); // führt Timer Compare interrupt aus
|
45 |
|
46 | }
|
47 | /***********************************************************************************************************************
|
48 | TIMER1_SETUP
|
49 | ***********************************************************************************************************************/
|
50 | void Timer1(){
|
51 |
|
52 | TCCR1 |=(1<<PWM1A)|(1<<COM1A1)|(1<<COM1A0)|(1<<CS12); // Timer 1 initialisierung
|
53 |
|
54 | OCR1C = maxpwm; // hightest value register
|
55 | OCR1A = dutypwm; // lowest value register
|
56 | TCNT1 |=(OCR1A);
|
57 | //OCR1A=80; //Impulsbreite ändern
|
58 |
|
59 | TIFR |=(1<<OCF1A); // vergleicht Timer1 und dem Wert OCR1A
|
60 | TIMSK |=(1<<OCIE1A); // bei interrupt compare match wird ein interrupt freigegeben
|
61 |
|
62 | }
|
63 |
|
64 | /***********************************************************************************************************************
|
65 | TIMER0_SETUP routine
|
66 | ***********************************************************************************************************************/
|
67 | ISR(TIMER0_COMPA_vect){
|
68 |
|
69 | time++;
|
70 |
|
71 | if( time == 60 ) // oder was auch immer den 60 Sekunden entspricht
|
72 | time = 0;
|
73 |
|
74 |
|
75 | }
|
76 | /***********************************************************************************************************************
|
77 | TIMER0_SETUP routine
|
78 | ***********************************************************************************************************************/
|
79 | ISR (TIMER1_COMPA_vect)
|
80 | {
|
81 | static uint8_t sweepDirection = UP;
|
82 | static uint16_t pulseCount = 0;
|
83 |
|
84 | pulseCount++;
|
85 | if( pulseCount == 1000 )
|
86 | {
|
87 | pulseCount = 0;
|
88 |
|
89 | if( sweepDirection == UP )
|
90 | {
|
91 | maxpwm += 10;
|
92 | if( maxpwm > 190 )
|
93 | sweepDirection = DOWN;
|
94 | }
|
95 | else
|
96 | {
|
97 | maxpwm -= 10;
|
98 | if( maxpwm < 100 )
|
99 | sweepDirection = UP;
|
100 | }
|
101 |
|
102 | OCR1C = maxpwm;
|
103 | }
|
104 |
|
105 | }
|
106 |
|
107 | int main(void)
|
108 | {
|
109 |
|
110 | DDRB=0x07; // PB3 = Eingang // PB1 = Ausgang
|
111 | Timer0_setup(); // lade Timer Setup 0
|
112 | Timer1(); // lade Timer Setup 1
|
113 | PORTB |=(1<<PB3); // Schalter high
|
114 | sei(); // Interrupt freigeben
|
115 |
|
116 | while(1)
|
117 | {
|
118 | /***********************************************************************
|
119 | Hilfestellung
|
120 | **********************************************************************/
|
121 |
|
122 | // erst mal brauchen wir eine Variable die bis 600 zählt.
|
123 | // 600 deshalb, weil wir 30 Sekunden Ruhe haben wollen und 30 Sekunden
|
124 | // gepiepse. D.h. nach 60 Sekunden (30 + 30), oder eben 600 mal
|
125 | // 100 Millisekunden wiederholt sich alles wieder.
|
126 |
|
127 | //time++;
|
128 | //if( time == 60 )
|
129 | //time = 0;
|
130 |
|
131 | // nachdem das jetzt klar ist, ist auch klar, dass der Sender
|
132 | // eingeschaltet sein soll, wenn
|
133 | // a) die time Variable kleiner als 300 ist, denn dann befinden
|
134 | // wir uns in den ersten 30 Sekunden dieses 60 Sekunden Zykluses
|
135 | // b) der externe Schalter so steht, dass vom Benutzer aus die
|
136 | // Freigabe für das Gequietsche gegeben wurde
|
137 | //
|
138 | // wenn keins der beiden der Fall ist, dann soll sich auch nichts tun
|
139 |
|
140 | /********************************************************************/
|
141 |
|
142 | // Bedingungen
|
143 | if( PINB & (1<<PB3) ) // grundsätzlich ist eingeschaltet
|
144 | {
|
145 | //PORTB |= (1<<PB2); // --> daher erst mal: LED an
|
146 |
|
147 | if( time < 30 ) // ob tatsächlich gedudelt wird, entscheidet die Zeit
|
148 | TCCR1 |= (1<<CS12); // erste 30 Sekunden: ein
|
149 |
|
150 | if (time == 0)
|
151 | {
|
152 | TCCR1 &= ~(1<<CS12); // zweite 30 Sekunden (eigentlich: die restliche Zeit): aus
|
153 | _delay_ms(1000); // warte
|
154 | }
|
155 |
|
156 | }
|
157 | else
|
158 |
|
159 | TCCR1 &= ~(1<<CS12); // zweite 30 Sekunden (eigentlich: die restliche Zeit): aus
|
160 | _delay_ms(1000);
|
161 |
|
162 |
|
163 |
|
164 | }
|
165 | GTCCR &=~(1<<TSM); //Timer null anhalten
|
166 | TCCR1 &= ~(1<<CS12); // Timer 1 anhalten
|
167 | _delay_ms(1000);
|
168 | }
|