1 | #ifndef F_CPU
|
2 | #define F_CPU 16000000
|
3 | #endif
|
4 | /*******************************************************************************************************/
|
5 | // Einbindung von Standardbibliotheken...
|
6 | #include <stdint.h> // Datentypen (standardisiert)
|
7 | #include <avr/io.h> // Registernamen
|
8 | #include <avr/interrupt.h>
|
9 | #include <stdio.h> // Rechenoperationen, etc.
|
10 | #include <math.h>
|
11 | //#include <string.h> // Zeichenketten-Funktionen
|
12 | // ... und externen Dateien
|
13 | #include "buttons.h"
|
14 | /*******************************************************************************************************/
|
15 | #define RELAIS_ON PIND7
|
16 | #define RELAIS_OFF PINB0
|
17 | /*******************************************************************************************************/
|
18 | volatile uint8_t sreg_local;
|
19 | // zum Deaktivieren der ISRs(Interrupt Service Routine) auf globaler Ebene
|
20 | void ISR_0() // ISRs deaktivieren
|
21 | {
|
22 | sreg_local = SREG; // Erstellung einer lokalen Sicherungskopie von SREG
|
23 | cli();
|
24 | }
|
25 | // zum Aktivieren der ISRs auf globaler Ebene
|
26 | // (Es werden ausschließlich die ISRs aktiviert, die auch vor dem Abschalten schon in Benutzung waren!)
|
27 | void ISR_1() // ISRs aktivieren
|
28 | {
|
29 | SREG = sreg_local; // Sicherungskopie von SREG laden
|
30 | }
|
31 | /*******************************************************************************************************/
|
32 | // Steuerung der ISR(Interrupt Service Routine)
|
33 |
|
34 | uint16_t iCount = 0;
|
35 | uint16_t nVal = 960;
|
36 | ISR(TIMER1_OVF_vect)
|
37 | {
|
38 |
|
39 |
|
40 |
|
41 |
|
42 | /*iCount++;
|
43 | if(iCount>=nVal)
|
44 | {
|
45 | OCR1A = 5;
|
46 | if(iCount>=(nVal*2))
|
47 | {
|
48 | OCR1A = 50;
|
49 | iCount=0;
|
50 | }
|
51 | }*/
|
52 | }
|
53 | /*******************************************************************************************************/
|
54 | int main (void)
|
55 | {
|
56 | // Konfiguration der I/Os
|
57 | // Taster an Pin23:
|
58 | DDRC &= ~(1<<PC0); // Pin PC0 als Eingang
|
59 | PORTC |= (1<<PC0); // Aktivierung des internen Pull-Up an PC0
|
60 |
|
61 | DDRB = 0xFF;
|
62 | DDRD = 0xFF;
|
63 | /***************************************************************************************************/
|
64 | // Konfiguration des Timers
|
65 | // Mode:Fast PWM;TOP:OCR1A;Update:BOTTOM;TOV1:TOP;Prescaler:1(FRQ@16MHz = 16MHz)
|
66 | TCCR1A = (1<<COM1A1)|(1<<WGM11);
|
67 | TCCR1B = (1<<WGM13)|(1<<WGM12)|(1<<CS10);
|
68 | OCR1A = 0; // PWM-Wert
|
69 | ICR1 = 1023; // TOP-Wert des Zählers
|
70 | TIMSK1 |= 1<<TOIE1; // Aktivierung des Interrupts(Timer1 Overflow Interrupt Enable)
|
71 |
|
72 | TCCR0B = (1<<CS02)|(1<<CS00); // divide by 1024
|
73 | TIMSK0 |= 1<<TOIE0; // enable timer interrupt
|
74 | sei();
|
75 | /***************************************************************************************************/
|
76 | int16_t nSavedPWM = 0;
|
77 | int16_t nCount = 0;
|
78 | int16_t bON = 0;
|
79 |
|
80 | while(1)
|
81 | {
|
82 |
|
83 | if(get_key_short(1<<KEY1))
|
84 | {
|
85 | if(bON == 0)
|
86 | {
|
87 | OCR1A = nSavedPWM;
|
88 | bON = 1;
|
89 | }
|
90 | else
|
91 | {
|
92 | nSavedPWM = OCR1A;
|
93 | OCR1A = 0;
|
94 | bON = 0;
|
95 | }
|
96 |
|
97 | }
|
98 |
|
99 | if(get_key_long_r(1<<KEY1) || get_key_rpt_l(1<<KEY1))
|
100 | {
|
101 | if(nCount > 1)
|
102 | {
|
103 | OCR1A += 50;
|
104 | if(OCR1A >= 1023)
|
105 | OCR1A = 0;
|
106 | nSavedPWM = OCR1A;
|
107 | }
|
108 |
|
109 | bON = 0;
|
110 | nCount++;
|
111 | }
|
112 | if(PINC & (1<<PINC0))
|
113 | nCount=0;
|
114 |
|
115 |
|
116 |
|
117 | }
|
118 | return 0;
|
119 | }
|