1 | // CPU-Takt:____________________________________________________________________________________________________________________
|
2 | #define F_CPU 1000000 // CPU-Geschwindigkeit definieren
|
3 |
|
4 | // Library:_____________________________________________________________________________________________________________________
|
5 | #include <avr/io.h> // IO des yC definieren
|
6 | #include <avr/sleep.h> // Sleep des yC definieren
|
7 | #include <util/delay.h> // Delay-Funktionen des yC definieren
|
8 | #include <avr/interrupt.h> // Interrupt-Funktionen des yC definieren
|
9 |
|
10 | // Makros: _____________________________________________________________________________________________________________________
|
11 | #define BitSetzen(Byte,Bit) ((Byte) |= ( 1 << (Bit))) // Makro für Bit setzen
|
12 | #define BitLoeschen(Byte,Bit) ((Byte) &= ~( 1 << (Bit))) // Makro für Bit löschen
|
13 | #define BitToggeln(Byte,Bit) ((Byte) ^= ( 1 << (Bit))) // Makro für Bit toggeln
|
14 |
|
15 | #define AusgangDefinieren(Byte,Bit) ((Byte) |= ( 1 << (Bit))) // Gleich wie Bit setzen, aber für die Lesbarkeit des Prog.
|
16 | #define EingangDefinieren(Byte,Bit) ((Byte) &= ~( 1 << (Bit))) // Gleich wie Bit löschen, aber für die Lesbarkeit des Prog.
|
17 |
|
18 | #define PullUpEinschalten(PORT,Bit) ((PORT) |= ( 1 << (Bit))) // Gleich wie Bit setzen, aber für die Lesbarkeit des Prog.
|
19 | #define PullUpAusschalten(PORT,Bit) ((PORT) &= ~( 1 << (Bit))) // Gleich wie Bit löschen, aber für die Lesbarkeit des Prog.
|
20 |
|
21 | // Datenbereiche / Hilfsvariablen: _____________________________________________________________________________________________
|
22 | #define Antiprell 50 // Entprellung für bsp. Taster o.ä. (50ms)
|
23 |
|
24 | /* _____________________________________________________________________________________________________________________________
|
25 | * Eingänge der Taster definieren
|
26 | * TasterPlus zum Erhöhen der Einschaltzeit in der PWM
|
27 | * TasterMinus zum Reduzieren der Einschaltzeit in der PWM
|
28 | */
|
29 | #define TasterPlusDDR DDRA
|
30 | #define TasterPlusPORT PORTA
|
31 | #define TasterPlusANS PA0
|
32 | #define TasterPlusPIN PINA
|
33 |
|
34 | #define TasterMinusDDR DDRA
|
35 | #define TasterMinusPORT PORTA
|
36 | #define TasterMinusANS PA1
|
37 | #define TasterMinusPIN PINA
|
38 |
|
39 | // TasterPlus als Eingang definieren: __________________________________________________________________________________________
|
40 | EingangDefinieren(TasterPlusDDR,TasterPlusANS);
|
41 |
|
42 | // TasterMinus als Eingang definieren: _________________________________________________________________________________________
|
43 | EingangDefinieren(TasterMinusDDR,TasterMinusANS);
|
44 |
|
45 | // TasterPlus PullUp deaktivieren: _____________________________________________________________________________________________
|
46 | PullUpAusschalten(TasterPlusPORT,TasterPlusANS);
|
47 |
|
48 | // TasterMinus PullUp deaktivieren: ____________________________________________________________________________________________
|
49 | PullUpAusschalten(TasterMinusPORT,TasterMinusANS);
|
50 |
|
51 |
|
52 |
|
53 |
|
54 | int main(void)
|
55 | {
|
56 | /*
|
57 | * Aus der "Waveform Genration Mode Bit Description" ergibt sich folgende Bitfolge:
|
58 | * Es wird "Mode 1" augewählt (PWM, Phase Correct, 8-bit)
|
59 | * Register: TCCR1A == WGM10 (PWM10) = 1 / WGM11 (PWM11) = 0 / TCCR1B == WGM12 (CTC1) = 0 / WGM13 = 0
|
60 | * Prescaler im TCCR1B: CS10 = 1 / CS11 = 0 / CS12 = 1 daraus ergibt sich ein Prescale von 1024 zur CPU-Frequenz
|
61 | * 1000000 / 1024 = 976,5625 Zähltakte pro Sekunde
|
62 | */
|
63 |
|
64 | // PWM Mode 1:
|
65 | BitLoeschen(TCCR1A,WGM10); //
|
66 | BitLoeschen(TCCR1A,WGM11); //Alle Bits für den PWM Mode auf 0 schreiben
|
67 | BitLoeschen(TCCR1B,WGM12); //
|
68 | BitLoeschen(TCCR1B,WGM13); //
|
69 |
|
70 | BitSetzen(TCCR1A,WGM10); //
|
71 | BitLoeschen(TCCR1A,WGM11); //Mode 1 (PWM,Phase Correct, 8-bit) einstellen
|
72 | BitLoeschen(TCCR1B,WGM12); //
|
73 | BitLoeschen(TCCR1B,WGM13); //
|
74 |
|
75 | // Prescaler einstellen:
|
76 | BitLoeschen(TCCR1B,CS10); //
|
77 | BitLoeschen(TCCR1B,CS11); //Alle Bits für den Prescaler auf 0 schreiben
|
78 | BitLoeschen(TCCR1B,CS12); //
|
79 |
|
80 | BitSetzen(TCCR1B,CS10); //
|
81 | BitLoeschen(TCCR1B,CS11); //Prescaler mit dem Wert 1024 einstellen
|
82 | BitSetzen(TCCR1B,CS12); //
|
83 |
|
84 | // Compare Mode einstellen:
|
85 | BitLoeschen(TCCR1A,COM1B0); //
|
86 | BitLoeschen(TCCR1A,COM1B1); //Alle Bits für den "Compare Mode" auf 0 schreiben
|
87 | BitLoeschen(TCCR1A,COM1A0); //
|
88 | BitLoeschen(TCCR1A,COM1A1); //
|
89 |
|
90 | BitLoeschen(TCCR1A,COM1B0); //
|
91 | BitLoeschen(TCCR1A,COM1B1); //Den Compare Mode auf "Clear on compare match" einstellen
|
92 | BitLoeschen(TCCR1A,COM1A0); //Frage für den Unterricht!!!! Wie wird das nochmal deklariert bez. COM1B1 etc.????????????
|
93 | BitSetzen(TCCR1A,COM1A1); //
|
94 |
|
95 | // Ausgang für den PWM-Mode setzen. Dieser ist nach dem Datenblatt vorgegeben:
|
96 | // DDRB + PB3
|
97 |
|
98 | AusgangDefinieren(DDRB,PB3); // Frage für den Unterricht!!!! Wo finde ich das im Datenblatt????????????
|
99 |
|
100 | // Ende der PWM Einstellung _________________________________________________________________________________________________________
|
101 |
|
102 |
|
103 | /* Merke: OCR1A ist für die PWM-Pulsbreite zuständig. Es gilt bei einem 8-bit Timer folgende Formel:
|
104 | * 255 = 100% // 2,55 = 1%
|
105 | * 255 / 100 x prozentualer Sollwert
|
106 | * Dieser Wert muss in den OCR1A geschrieben werden!
|
107 | * Bsp.: 25% = 63,75 demnach gilt: OCR1A = 63 (ca. Ganzzahl)
|
108 | * D.h. 25% eingeschaltet und 75% ausgeschaltet
|
109 | */
|
110 |
|
111 |
|
112 | /* Aufgabenstellung: Bei Betätigung des Tasters wird die Leistung am Motor erhöht. (Beispiel anhand einer LED)
|
113 | * Um eine Ganzzahl zu erhalten nehme ich nicht den Wert 255 als Berechnungsgrundlage, sondern 250.
|
114 | * Bei 250 erhalte ich in der Formel, bei 10% Schritten, immer Ganzzahlen.
|
115 | */
|
116 |
|
117 | // Variablen:
|
118 | volatile uint8_t Sollwert = 0;
|
119 |
|
120 | volatile uint8_t Prozent = 0;
|
121 |
|
122 | volatile uint8_t TasterPlus_gedrueckt = 0;
|
123 |
|
124 | volatile uint8_t TasterMinus_gedrueckt = 0;
|
125 |
|
126 |
|
127 |
|
128 | while (1)
|
129 | {
|
130 | //TasterPlus entprellen!!!
|
131 | if ( 1 == (TasterPlusPIN & (1 << TasterPlusANS)))
|
132 | {
|
133 | _delay_ms(Antiprell);
|
134 | TasterPlus_gedrueckt = 1;
|
135 | }
|
136 | else
|
137 | {
|
138 | TasterPlus_gedrueckt = 0;
|
139 | }
|
140 |
|
141 | //TasterMinus entprellen!!!
|
142 | if ( 1 == (TasterMinusPIN & (1 << TasterMinusANS)))
|
143 | {
|
144 | _delay_ms(Antiprell);
|
145 | TasterMinus_gedrueckt = 1;
|
146 | }
|
147 | else
|
148 | {
|
149 | TasterMinus_gedrueckt = 0;
|
150 | }
|
151 |
|
152 | //+10% wenn der TasterPlus gedrückt wurde!!!
|
153 | if ( 1 == ( TasterPlus_gedrueckt & (Prozent <= 100) ))
|
154 | {
|
155 | Prozent + 10;
|
156 | Sollwert = 250 / 100 * Prozent;
|
157 | }
|
158 |
|
159 | //-10% wenn der TasterMinus gedrückt wurde!!!
|
160 | if ( 1 == ( TasterMinus_gedrueckt & (Prozent >= 0) ))
|
161 | {
|
162 | Prozent - 10;
|
163 | Sollwert = 250 / 100 * Prozent;
|
164 | }
|
165 |
|
166 | //In das OCR1A Register schreiben!!!
|
167 | OCR1A = Sollwert;
|
168 | }
|
169 |
|
170 | }
|