main.c


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
}