1 | #include "main.h"
|
2 |
|
3 | //--------------------------InterruptServiceRoutines-----------------------------------//
|
4 | ISR(TIMER2_COMP_vect)
|
5 | {
|
6 | if(pwm_cnt == next_pwm_cnt) //Leds aktualidsieren wenn so weit
|
7 | pwm_update = true;
|
8 | pwm_cnt++;
|
9 | }
|
10 |
|
11 | ISR(TIMER1_COMPA_vect) {
|
12 | TCCR1B = 0; // Entprelltimer ausschalten
|
13 | GIFR &= ~(1<<INTF0); // InterruptrequestFlag löschen
|
14 | GICR |= (1<<INT0); // Extinterrupt (Taster) aktivieren
|
15 | }
|
16 |
|
17 |
|
18 |
|
19 | ISR(INT0_vect)
|
20 | {
|
21 | program++; //Programm wechseln
|
22 | if (program>8)
|
23 | program=0;
|
24 | prog_init=true; // Programm initialisieren
|
25 |
|
26 |
|
27 | TCCR1B=(1<<WGM12)|(1<<CS12)|(1<<CS10); // EntprellungsTimer AN clkI/O/1024 (From prescaler) +CTC
|
28 | OCR1A=760; // Entprellzeit ca 0.1s
|
29 | GICR &= ~(1 << INT0); // Extinterrupt (Taster) deaktivieren
|
30 | }
|
31 | }
|
32 |
|
33 | //--------------------------Externe Funktionen-----------------------------------//
|
34 | void pwmUpdate(){
|
35 |
|
36 | uint8_t tmpB =0xff;
|
37 | uint8_t tmpC =0xff;
|
38 | uint8_t tmpD =0xff;
|
39 |
|
40 | //RED
|
41 | if (pwm_setting[0][0] <= pwm_cnt) tmpC &= ~(1 << 2);
|
42 | if (pwm_setting[1][0] <= pwm_cnt) tmpD &= ~(1 << 0);
|
43 | if (pwm_setting[2][0] <= pwm_cnt) tmpD &= ~(1 << 3);
|
44 | if (pwm_setting[3][0] <= pwm_cnt) tmpB &= ~(1 << 7);
|
45 | if (pwm_setting[4][0] <= pwm_cnt) tmpD &= ~(1 << 7);
|
46 | //GREEN
|
47 | if (pwm_setting[0][1] <= pwm_cnt) tmpC &= ~(1 << 3);
|
48 | if (pwm_setting[1][1] <= pwm_cnt) tmpC &= ~(1 << 0);
|
49 | if (pwm_setting[2][1] <= pwm_cnt) tmpD &= ~(1 << 1);
|
50 | if (pwm_setting[3][1] <= pwm_cnt) tmpB &= ~(1 << 6);
|
51 | if (pwm_setting[4][1] <= pwm_cnt) tmpD &= ~(1 << 6);
|
52 | //BLUE
|
53 | if (pwm_setting[0][2] <= pwm_cnt) tmpC &= ~(1 << 4);
|
54 | if (pwm_setting[1][2] <= pwm_cnt) tmpC &= ~(1 << 1);
|
55 | if (pwm_setting[2][2] <= pwm_cnt) tmpC &= ~(1 << 5);
|
56 | if (pwm_setting[3][2] <= pwm_cnt) tmpD &= ~(1 << 4);
|
57 | if (pwm_setting[4][2] <= pwm_cnt) tmpD &= ~(1 << 5);
|
58 |
|
59 | PORTB = tmpB;
|
60 | PORTC = tmpC;
|
61 | PORTD = tmpD;
|
62 |
|
63 | //Berechne nächsten PWM-Ämderungszeitpunkt
|
64 | next_pwm_cnt = (PWM_RES*2);
|
65 | for(int i=0; i<5; i++){
|
66 | for(int k=0; k<3; k++){
|
67 | if((pwm_setting[i][k] > pwm_cnt) && (pwm_setting[i][k] < next_pwm_cnt))
|
68 | next_pwm_cnt = pwm_setting[i][k];
|
69 | }
|
70 | }
|
71 | if(next_pwm_cnt == (PWM_RES*2))
|
72 | next_pwm_cnt=0;
|
73 | }
|
74 |
|
75 |
|
76 | int main (){
|
77 |
|
78 | // Ports als Ausgang setzen
|
79 | DDRB = (1 << DDB6) | (1 << DDB7);
|
80 | DDRC = (1 << DDC0) | (1 << DDC1) | (1 << DDC2) | (1 << DDC3) | (1 << DDC4) | (1 << DDC5);
|
81 | DDRD = (1 << DDD0) | (1 << DDD1) | (0 << DDD2) | (1 << DDD3) | (1 << DDD4) | (1 << DDD5) | (1 << DDD6) | (1 << DDD7);
|
82 |
|
83 |
|
84 | //FREQUENZGENERATOR
|
85 | TCCR2 = (1 << CS20)|(1 << WGM21); //Enable Timer2 (Prescale 1) and CTC mode !! NOETIG FUER SOFT-PWM
|
86 | OCR2=255; // Output Compare Register - OCR2 AKA PWMFREQUENZ
|
87 |
|
88 | // OCIE2: Timer/Counter2 Output Compare Match Interrupt Enable | Tim0 Overflow Enable |OCIE1A: Timer/Counter1, Output Compare A Match Interrupt Enable
|
89 | TIMSK |= (1<<OCIE2) | (1 << TOIE0) | (1 << OCIE1A);
|
90 |
|
91 | //TASTER
|
92 | MCUCR |= (1<<ISC01); //MCU Control Register MCUCR
|
93 | GICR |= (1<<INT0); //General Interrupt Control Register – GICR
|
94 | PORTD|=(1<<PB2); //PullUp fuer Ext Interrupt
|
95 |
|
96 | sei(); // Interrupt freischalten
|
97 |
|
98 | while(1){
|
99 | //Wenn an der Zeit führe Nächsten Programmschritt aus
|
100 | if(prog_cnt==prog_delay){
|
101 | runProgStep(program);
|
102 | prog_cnt=0;
|
103 | }
|
104 | //Führe Init aus wenn nötig
|
105 | if(prog_init==true){
|
106 | initializeProgramm(program);
|
107 | }
|
108 | // Führe PWMUpdate aus
|
109 | if(pwm_update == true){
|
110 | pwmUpdate();
|
111 | pwm_update = false;
|
112 | }
|
113 | prog_cnt++;
|
114 | }
|
115 | return 0;
|
116 | }
|
117 |
|
118 | //----------------------------Programmwahl-----------------------------------------------//
|
119 | void runProgStep(int k){
|
120 | switch(k){
|
121 | case 0: allesWeiss();
|
122 | break;
|
123 | case 1: allesRot();
|
124 | break;
|
125 | case 2: allesGruen();
|
126 | break;
|
127 | case 3: allesBlau();
|
128 | break;
|
129 | case 4: allesLila();
|
130 | break;
|
131 | case 5: allesGelb();
|
132 | break;
|
133 | case 6: allesTuerkis();
|
134 | break;
|
135 | case 7: allesOrange();
|
136 | break;
|
137 | case 8: durchlauf();
|
138 | break;
|
139 | }
|
140 | }
|
141 | void initializeProgramm(int k){
|
142 |
|
143 | switch(k){
|
144 | case 8: allesRot();
|
145 | fade=1;
|
146 | up=1;
|
147 | down=0;
|
148 | break;
|
149 | //default:
|
150 | }
|
151 | }
|
152 |
|
153 | //----------------------------Funktionen------------------------------------------
|
154 | void allesWeiss(){
|
155 | for(int i=0; i <5; i++) {
|
156 | pwm_setting[i][0] = PWM_RES;
|
157 | pwm_setting[i][1] = PWM_RES;
|
158 | pwm_setting[i][2] = PWM_RES;
|
159 | }
|
160 | }
|
161 | void allesRot(){
|
162 | for(int i=0; i <5; i++) {
|
163 | pwm_setting[i][0] = PWM_RES;
|
164 | pwm_setting[i][1] = 0;
|
165 | pwm_setting[i][2] = 0;
|
166 | }
|
167 | }
|
168 | void allesBlau(){
|
169 | for(int i=0; i <5; i++) {
|
170 | pwm_setting[i][0] = 0;
|
171 | pwm_setting[i][1] = 0;
|
172 | pwm_setting[i][2] = PWM_RES;
|
173 | }
|
174 | }
|
175 | void allesGruen(){
|
176 | for(int i=0; i <5; i++) {
|
177 | pwm_setting[i][0] = 0;
|
178 | pwm_setting[i][1] = PWM_RES;
|
179 | pwm_setting[i][2] = 0;
|
180 | }
|
181 | }
|
182 | void allesAus(){
|
183 | for(int i=0; i <5; i++) {
|
184 | pwm_setting[i][0] = 0;
|
185 | pwm_setting[i][1] = 0;
|
186 | pwm_setting[i][2] = 0;
|
187 | }
|
188 | }
|
189 | void allesLila(){
|
190 | for(int i=0; i <5; i++) {
|
191 | pwm_setting[i][0] = PWM_RES;
|
192 | pwm_setting[i][1] = 0;
|
193 | pwm_setting[i][2] = PWM_RES;
|
194 | }
|
195 | }
|
196 | void allesGelb(){
|
197 | for(int i=0; i <5; i++) {
|
198 | pwm_setting[i][0] = PWM_RES;
|
199 | pwm_setting[i][1] = PWM_RES;
|
200 | pwm_setting[i][2] = 0;
|
201 | }
|
202 | }
|
203 | void allesTuerkis(){
|
204 | for(int i=0; i <5; i++) {
|
205 | pwm_setting[i][0] = 0;
|
206 | pwm_setting[i][1] = PWM_RES;
|
207 | pwm_setting[i][2] = PWM_RES;
|
208 | }
|
209 | }
|
210 | void allesOrange(){
|
211 | for(int i=0; i <5; i++) {
|
212 | pwm_setting[i][0] = PWM_RES;
|
213 | pwm_setting[i][1] = 70;
|
214 | pwm_setting[i][2] = 0;
|
215 | }
|
216 | }
|
217 | void durchlauf(){
|
218 | for(int i=0; i <5; i++) {
|
219 | if(fade==1){
|
220 | pwm_setting[i][up]++;
|
221 | if(pwm_setting[i][up]==PWM_RES){
|
222 | up+=1;
|
223 | fade=2;
|
224 | }
|
225 | }
|
226 | else{
|
227 | pwm_setting[i][down]--;
|
228 | if(pwm_setting[i][down]==0){
|
229 | down+=1;
|
230 | fade=1;
|
231 | }
|
232 | }
|
233 | }
|
234 | if(up>2) up=0;
|
235 | if(down>2) down=0;
|
236 | }
|