main.c


1
/*
2
 * christmas_lights3.c
3
 *
4
 * Created: 12.12.2020 20:52:29
5
 * Author : joachim
6
 */ 
7
8
#include <avr/io.h>
9
#include<util/delay.h>
10
11
#define TIME0 1
12
#define TIME1 3
13
#define TIME2 15
14
#define LOOPTIME 7
15
#define WAITTIME 500
16
17
#define LED_COUNT 20
18
#define DDR_BYTE 0
19
#define PORT_BYTE 1
20
21
uint8_t l;
22
23
// Achtung! Hoer andere Reihenfolge als bei Christmas-Lights!
24
25
uint8_t matrix[LED_COUNT][2] = {
26
  //  DDR_BYTE   PORT_BYTE
27
  //     ABCD        ABCD
28
  { 0b00000011, 0b00000001 }, // AB  0
29
  { 0b00000011, 0b00000010 }, // BA  1
30
  { 0b00000110, 0b00000010 }, // BC  2
31
  { 0b00000110, 0b00000100 }, // CB  3
32
  { 0b00000101, 0b00000001 }, // AC  4
33
  { 0b00000101, 0b00000100 }, // CA  5
34
  { 0b00001001, 0b00000001 }, // AD  6
35
  { 0b00001001, 0b00001000 }, // DA  7
36
  { 0b00001010, 0b00000010 }, // BD  8
37
  { 0b00001010, 0b00001000 }, // DB  9
38
  { 0b00001100, 0b00000100 }, // CD 10
39
  { 0b00001100, 0b00001000 },  // DC 11
40
  { 0b00010001, 0b00000001 },  // AE 12
41
  { 0b00010001, 0b00010000 },  // EA 13
42
  { 0b00010010, 0b00000010 },  // BE 14
43
  { 0b00010010, 0b00010000 },  // EB 15
44
  { 0b00010100, 0b00000100 },  // CE 16
45
  { 0b00010100, 0b00010000 },  // EC 17
46
  { 0b00011000, 0b00001000 },  // DE 18
47
  { 0b00011000, 0b00010000 }  // ED 19
48
};
49
50
void turnOn(uint8_t led ) {
51
  DDRB = matrix[led][DDR_BYTE];
52
  PORTB = matrix[led][PORT_BYTE];
53
}
54
55
void turnOff(void)
56
{
57
  DDRB = 0b00000000;
58
  PORTB = 0b00000000;
59
}
60
61
void load(int8_t led1, uint8_t led2, uint8_t led3)
62
{
63
  for(l = 1; l < LOOPTIME;l++)
64
  {
65
    turnOn(led1);
66
    _delay_ms(TIME0);
67
    if(led2 < 19 )
68
    {
69
      turnOn(led2);
70
      _delay_ms(TIME1);
71
    }
72
    if(led2 == 19)
73
    {
74
      turnOn(led2);
75
      _delay_ms(TIME2);
76
    }
77
    if(led3 < 20)
78
    {
79
      turnOn(led3);
80
      _delay_ms(TIME2);
81
    }
82
  }
83
}
84
85
void fadeout(void)
86
{
87
  uint8_t counter = LOOPTIME * 4;
88
  
89
  while(counter > LOOPTIME *3)
90
  {
91
    turnOn(19);
92
    _delay_ms(3*TIME1);
93
    turnOff();
94
    _delay_ms(TIME1);
95
    counter--;
96
  }
97
  
98
  while(counter > LOOPTIME * 2)
99
  {
100
    turnOn(19);
101
    _delay_ms(2*TIME1);
102
    turnOff();
103
    _delay_ms(2*TIME1);
104
    counter--;
105
  }
106
  
107
  while (counter > LOOPTIME)
108
  {
109
    turnOn(19);
110
    _delay_ms(TIME1);
111
    turnOff();
112
    _delay_ms(3*TIME1);
113
    counter--;
114
  }
115
  
116
  while(counter > 0)
117
  {
118
    turnOn(19);
119
    _delay_ms(TIME1/2);
120
    turnOff();
121
    _delay_ms(4*TIME1);
122
    counter--;
123
  }
124
}
125
126
127
int main(void)
128
{
129
  
130
  while(1)
131
  {
132
    _delay_ms(TIME2);
133
    load(0,1,2);
134
    load(1,2,3);
135
    load(2,3,4);
136
    load(3,4,5);
137
    load(4,5,6);
138
    load(5,6,7);
139
    load(6,7,8);
140
    load(7,8,9);
141
    load(8,9,10);
142
    load(9,10,11);
143
    load(10,11,12);
144
    load(11,12,13);
145
    load(12,13,14);
146
    load(13,14,15);
147
    load(14,15,16);
148
    load(15,16,17);
149
    load(16,17,18);
150
    load(17,18,19);
151
    load(18,19,20);
152
    
153
    
154
    fadeout();
155
  }
156
}