d43405f6b575ff2dd93f341a3d69f526ac020235
Stefan Schuermans CCCamp2015: alternative fir...

Stefan Schuermans authored 9 years ago

1) /* bulb - BlinkenArea ultimate logo board
2)    version 1.0 date 2015-08-15
3)    Copyright (C) 2015 Martin Müllenhaupt <mm+bulb@netlair.de>
4)    Copyleft: GNU public license - http://www.gnu.org/copyleft/gpl.html
5) */
6) 
7) 
8) #include <avr/io.h>
9) #include <avr/interrupt.h>
10) 
11) #define F_CPU 8000000UL // 8 MHz
12) #include <util/delay.h>
13) #include <stdlib.h>
14) 
15) #define NUM_ZEILEN 6
16) #define NUM_SPALTEN 7
17) #define NUM_LEDS (NUM_ZEILEN * NUM_SPALTEN)
18) #define MAX_TIME 32
19) 
20) #define LED(index) frame[updateBufferIndex][index/NUM_SPALTEN][index%NUM_SPALTEN]
21) #define LED_INDEX_FROM_MANUAL(index) frame[updateBufferIndex][(index-1)/NUM_SPALTEN][(index-1)%NUM_SPALTEN]
22) 
23) /* 0 = off; 255 = max brightness */
24) uint8_t frame[2][NUM_ZEILEN][NUM_SPALTEN] = {0};
25) 
26) uint8_t displayBufferIndex = 0;
27) uint8_t updateBufferIndex = 1;
28) 
29) ISR(TIMER1_COMPA_vect)
30) {
31)   static uint8_t zeile = 0;
32)   static uint8_t time = 0;
33) 
34)   ++time;
35) 
36)   if (time == MAX_TIME)
37)   {
38)     ++zeile;
39)     zeile %= NUM_ZEILEN;
40)     PORTB = 0;
41)     PORTD = ~(1 << zeile);
42)     time = 0;
43)   }
44) 
45)   uint8_t row_data = 0;
46)   for(uint8_t spalte = 0; spalte < NUM_SPALTEN; ++spalte)
47)   {
48)     if (frame[displayBufferIndex][zeile][spalte] > time)
49)     {
50)       row_data |= (1 << spalte);
51)     }
52)   }
53)   PORTB = row_data;
54) }
55) 
56) void swapBuffers()
57) {
58)   updateBufferIndex = ( updateBufferIndex + 1 ) % 2;
59)   displayBufferIndex = ( displayBufferIndex + 1 ) % 2;
60) }
61) 
Stefan Schuermans some fixes for alternative...

Stefan Schuermans authored 9 years ago

62) void wurm(int8_t length, uint8_t reverse)
Stefan Schuermans CCCamp2015: alternative fir...

Stefan Schuermans authored 9 years ago

63) {
64)   for (int8_t frontPosition = reverse ? NUM_LEDS : 0;
65)        reverse ? frontPosition >= - length - 1 : frontPosition < NUM_LEDS + length;
66)        reverse ? --frontPosition : ++frontPosition)
67)   {
Stefan Schuermans some fixes for alternative...

Stefan Schuermans authored 9 years ago

68)     for(int8_t pos = 0; pos < NUM_LEDS; ++pos)
Stefan Schuermans CCCamp2015: alternative fir...

Stefan Schuermans authored 9 years ago

69)     {
70)       uint8_t value = 0;
Stefan Schuermans some fixes for alternative...

Stefan Schuermans authored 9 years ago

71)       if (!reverse)
Stefan Schuermans CCCamp2015: alternative fir...

Stefan Schuermans authored 9 years ago

72)       {
Stefan Schuermans some fixes for alternative...

Stefan Schuermans authored 9 years ago

73)         if (pos <= frontPosition)
74)         {
75)           int8_t dist = frontPosition - pos;
76)           if (dist < length)
77)           {
78)             value = MAX_TIME / (1 + 4 * dist);
79)           }
80)         }
81)       }
82)       else
83)       {
84)         if (pos >= frontPosition)
85)         {
86)           int8_t dist = pos - frontPosition;
87)           if (dist < length)
88)           {
89)             value = MAX_TIME / (1 + 4 * dist);
90)           }
91)         }