1 | /*
|
2 | * LED_Fading_ATtiny13A.c
|
3 | *
|
4 | * Created: 22.11.2016 23:25:19
|
5 | * Author : e0909
|
6 | * http://www.mikrocontroller.net/topic/241330
|
7 | */
|
8 |
|
9 | #include <avr/io.h>
|
10 | #include <avr/interrupt.h>
|
11 | #include <avr/power.h>
|
12 | #include <avr/sleep.h>
|
13 |
|
14 | #include <stdlib.h>
|
15 |
|
16 | int main() {
|
17 | ACSR = (1 << ACD);
|
18 | ADCSRA = 0;
|
19 |
|
20 | clock_prescale_set(clock_div_4);
|
21 |
|
22 | // Bevor was geht, muss man zuerst die Pins auf Ausgang setzen.
|
23 | DDRB = (1 << PB1) | (1 << PB0);
|
24 |
|
25 | // Am Anfang gehen wir mal von einer Pulsweite von 50 % aus.
|
26 | OCR0A = 128;
|
27 | OCR0B = 128;
|
28 |
|
29 | // Wir brauchen den Timer0-Overflow-Interrupt, weil wir da jeweils die Pulsweite ändern.
|
30 | TIMSK0 = (1 << TOIE0);
|
31 |
|
32 | sleep_enable();
|
33 | sei();
|
34 |
|
35 | // Hier wird die PWM konfiguriert.
|
36 | TCCR0A = (1 << COM0A1) | (1 << COM0B1) | (1 << WGM01) | (1 << WGM00);
|
37 | TCCR0B = (0 << WGM02) | (1 << CS01) | (1 << CS00);
|
38 |
|
39 | while (1) {
|
40 | sleep_cpu();
|
41 | }
|
42 | }
|
43 |
|
44 |
|
45 | // Wir ändern bei jedem Timer Overflow die PWM-Zahl ab...
|
46 | ISR(TIM0_OVF_vect) {
|
47 | int zufallszahl = rand();
|
48 |
|
49 | // Maximale Änderung pro Durchlauf um 14 Einheiten.
|
50 | uint8_t addz = zufallszahl % 50; //originalwert war 15 und nicht 50
|
51 |
|
52 | // Nur wenn die Zufallszahl ungerade ist und OCR0B kleiner als 200 bleibt.
|
53 | if (zufallszahl % 2 && (OCR0B + addz < 200)) {
|
54 | OCR0B += addz;
|
55 | } else if (OCR0B - addz > 60) { // Nur wenn OCR0B größer als 60 bleibt.
|
56 | OCR0B -= addz;
|
57 | }
|
58 |
|
59 | // dasselbe machen wir nochmal für den OCR0A...
|
60 | zufallszahl = rand();
|
61 | addz = zufallszahl % 50; //originalwert war 15 und nicht 50
|
62 |
|
63 | if (zufallszahl % 2 && (OCR0A + addz < 200)) {
|
64 | OCR0A += addz;
|
65 | } else if (OCR0A - addz > 60) { // Nur wenn OCR0A größer als 60 bleibt.
|
66 | OCR0A -= addz;
|
67 | }
|
68 | }
|