Main.c


1
//#define F_CPU 16000000UL
2
#include <avr/io.h>
3
#include <avr/interrupt.h>
4
#include <util/delay.h>
5
#include <math.h>
6
7
volatile uint8_t Leds[16][8] =
8
{
9
  {2,2,2,2,2,2,2,2},
10
  {2,20,20,20,20,20,20,2},
11
  {2,20,27,27,27,27,20,2},
12
  {2,20,27,34,32,27,20,2},
13
  {2,20,27,32,34,27,20,2},
14
  {2,20,27,34,32,27,20,2},
15
  {2,20,27,32,34,27,20,2},
16
  {2,20,27,34,32,27,20,2},
17
  {2,20,27,32,34,27,20,2},
18
  {2,20,27,34,32,27,20,2},
19
  {2,20,27,32,34,27,20,2},
20
  {2,20,27,34,32,27,20,2},
21
  {2,20,27,32,34,27,20,2},
22
  {2,20,27,27,27,27,20,2},
23
  {2,20,20,20,20,20,20,2},
24
  {2,2,2,2,2,2,2,2}
25
};
26
27
uint8_t FrameCount;
28
29
ISR( TIMER0_OVF_vect ) //Overflow
30
{
31
32
  FrameCount++;
33
34
35
  // Komplette Matrix einmal ausgeben, wobei nur die LED eingeschaltet
36
  // werden, deren Helligkeitswert kleiner/gleich dem 'FrameCount' sind
37
  for(int y = 0; y < 16; y++ )
38
  {
39
  int value = 0;
40
    for(int x = 0; x < 8; x++ )
41
    {
42
      if( (Leds[y][x]) < FrameCount )
43
    {
44
        switch(x)
45
        {
46
          case 0: value = value + 1; break;
47
          case 1: value = value + 2; break;
48
          case 2: value = value + 4; break;
49
          case 3: value = value + 8; break;
50
          case 4: value = value + 16; break;
51
          case 5: value = value + 32; break;
52
          case 6: value = value + 64; break;
53
          case 7: value = value + 128; break;
54
          default: value = value + 0; break;
55
        }
56
    }
57
58
    }
59
  SPDR = value; // Schreibe Daten...
60
  while(!(SPSR & 0b10000000)); //...bis fertig.
61
  }
62
  PORTB = 0b00000100; // Schreibe Daten...
63
  PORTB = 0b00000000; // ...raus.
64
  if(FrameCount == 35)
65
  {
66
    FrameCount = 0;
67
  }
68
69
}
70
71
int main()
72
{
73
74
    DDRB = 0xFF;       // B-Pins als Ausgang definieren (Shift)
75
    SPCR = 0b01010000;   // Interrupt des SPI freigegeben (Shift)
76
77
    TIMSK = 0b00000001;   // Loese Interrupt aus (PWM)
78
    TCCR0 = 0b00000001;  // Vorteiler auf 1 setzten (PWM)
79
    sei();        // Schalte Interrupts ein (PWM)
80
81
    while(1)
82
    {
83
    };
84
}