Marderschreck_selfmade.c


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
}