1 | /*
|
2 | Main
|
3 | Hauptprogramm für die Funktionen der selbst Entwickelten Platine beim SMG*/
|
4 |
|
5 | //Einbinden der Bibliotheken
|
6 | #include <stdio.h> //Standardbibliothek
|
7 | #include "config.h" //Grundkonfiguration
|
8 | #include <stdint.h> //Eingabe Bib
|
9 | #include <avr/io.h>
|
10 | #include <avr/interrupt.h> //Interruptbibliothek
|
11 | #include <util/delay.h> //Bibliothek für delay-Befehl
|
12 |
|
13 | //CPU Clcok auf 6 MHz definieren
|
14 | #ifndef F_CPU
|
15 | #define F_CPU 6000000 // processor clock frequency
|
16 | #endif
|
17 |
|
18 |
|
19 | //Zuweisen der Pins am Mikrocontroller zu den LED-Farben und Definition
|
20 | //der Befehle zu Beschaltungen
|
21 | #define LED_RED_ON PORTB |= (1<<3) //3
|
22 | #define LED_RED_OFF PORTB &=~ (1<<3) //3
|
23 | #define LED_RED_TOG PORTB ^= (1<<3) //3
|
24 |
|
25 | #define LED_GRN_ON PORTB |= (1<<2) //2
|
26 | #define LED_GRN_OFF PORTB &=~ (1<<2) //2
|
27 | #define LED_GRN_TOG PORTB ^= (1<<2) //2
|
28 |
|
29 | #define LED_BLU_ON PORTB |= (1<<1) //1
|
30 | #define LED_BLU_OFF PORTB &=~ (1<<1) //1
|
31 | #define LED_BLU_TOG PORTB ^= (1<<1) //1
|
32 |
|
33 | //Prototypen
|
34 | void timer1_init(void);
|
35 |
|
36 | //Entprellfunktion (nicht von mir, unverändert und funktioniert)
|
37 | #define debounce( port, pin ) \
|
38 | ({ \
|
39 | static uint8_t flag = 0; /* new variable on every macro usage */ \
|
40 | uint8_t i = 0; \
|
41 | \
|
42 | if( flag ){ /* check for key release: */ \
|
43 | for(;;){ /* loop ... */ \
|
44 | if( !(port & 1<<pin) ){ /* ... until key pressed or ... */ \
|
45 | i = 0; /* 0 = bounce */ \
|
46 | break; \
|
47 | } \
|
48 | _delay_us( 98 ); /* * 256 = 25ms */ \
|
49 | if( --i == 0 ){ /* ... until key >25ms released */ \
|
50 | flag = 0; /* clear press flag */ \
|
51 | i = 0; /* 0 = key release debounced */ \
|
52 | break; \
|
53 | } \
|
54 | } \
|
55 | }else{ /* else check for key press: */ \
|
56 | for(;;){ /* loop ... */ \
|
57 | if( (port & 1<<pin) ){ /* ... until key released or ... */ \
|
58 | i = 0; /* 0 = bounce */ \
|
59 | break; \
|
60 | } \
|
61 | _delay_us( 98 ); /* * 256 = 25ms */ \
|
62 | if( --i == 0 ){ /* ... until key >25ms pressed */ \
|
63 | flag = 1; /* set press flag */ \
|
64 | i = 1; /* 1 = key press debounced */ \
|
65 | break; \
|
66 | } \
|
67 | } \
|
68 | } \
|
69 | i; /* return value of Macro */ \
|
70 | })
|
71 |
|
72 | // ISR fuer OCR1A (Bei 20 ms Soll port C high gesetzt werden)
|
73 | ISR (TIMER1_COMPA_vect)
|
74 | {
|
75 | PORTC = 1;
|
76 | LED_BLU_ON;
|
77 | }
|
78 |
|
79 | //ISR Für OCR1B (Nach der Impulsdauer soll Port C wieder low werden)
|
80 | ISR (TIMER1_COMPB_vect)
|
81 | {
|
82 | PORTC = 0;
|
83 | LED_BLU_OFF;
|
84 | }
|
85 |
|
86 | //Hauptfunktion mit wesentlichen Definitionen und Programmaufrufen
|
87 | int main(int ac, char *av[])
|
88 | {
|
89 | // Definiere Port B 1-3 als Ausgang, für die LEDs als Feedback
|
90 | DDRB |= (1<<1);
|
91 | DDRB |= (1<<2);
|
92 | DDRB |= (1<<3);
|
93 |
|
94 | // Definiere Port C 0, 1, 2 als Ausgang
|
95 | DDRB |= (1<<0);
|
96 | DDRB |= (1<<1);
|
97 | DDRB |= (1<<2);
|
98 |
|
99 | // Ports für Schalter als Eingang definieren
|
100 | DDRD &= ~ (1<< 2);
|
101 | DDRD &= ~ (1<< 3);
|
102 |
|
103 | // Möglichkeit, Farben zu beginn leuchten zu lassen
|
104 | LED_RED_OFF;
|
105 | LED_GRN_OFF;
|
106 | LED_BLU_OFF;
|
107 |
|
108 |
|
109 | //Timer auflösung von 0 bis 20 ms (750 000 Hz (Presclaer 8)) (15000 Takte)
|
110 | OCR1A = 14999;
|
111 |
|
112 | //Initialisierung des Timers (1)
|
113 | timer1_init();
|
114 |
|
115 | //Interupts aktiviren
|
116 | sei();
|
117 |
|
118 | //Startposition (sollte 1,5ms sein)
|
119 | OCR1B = 1125;
|
120 |
|
121 | //Endlos Schleife (for)
|
122 | for(;;)
|
123 | {
|
124 | if( debounce( PIND, PD2 ) )
|
125 | {
|
126 | OCR1B=750; // entspricht 1 ms Impulsbreite
|
127 | LED_RED_ON;
|
128 | LED_GRN_OFF;
|
129 | }
|
130 | if( debounce( PIND, PD3 ) )
|
131 | {
|
132 | OCR1B=1500; //entspricht 2 ms Impulsbreite
|
133 | LED_RED_OFF;
|
134 | LED_GRN_ON;
|
135 | }
|
136 | }
|
137 | }
|
138 |
|
139 |
|
140 | //Funktion zu Einstellung von Timer1
|
141 | void timer1_init(void)
|
142 | {
|
143 | //Timer1 aktivieren und für Compare Mode einstellen:
|
144 | TCCR1B |= (0<<CS10);
|
145 | TCCR1B |= (1<<CS11);
|
146 | TCCR1B |= (0<<CS12); //Prescaler 8 Daraus ergitb sich ein Timer-Takt von 750000Hz
|
147 | TCCR1B |= (0<<WGM13);
|
148 | TCCR1B |= (1<<WGM12); // Beide Zeilen: CTC Modus 4 (Top OCR1A)
|
149 | TIMSK |= (1<<OCIE1A); // Outpunt A Match (TOP Value)
|
150 | TIMSK |= (1<<OCIE1B); // Outpunt B Match (TOP Value)
|
151 | }
|