Guten Morgen alle miteinander :)
Ich habe ein kleines Projekt vor mir. Das Ziel ist es ein Mini Tetris 
Spiel über meinen ATMega16 auf zwei LED Matrizen laufen zu lassen.
Da ich noch recht neu in der uC Programmierung bin stoße ich leider auf 
ein paar Probleme (trotz Lesen des AVR Tutorials).
Zunächst probiere ich nur komplette Reihen auf einer der beiden 
Matritzen "runterfallen" zu lassen, am Besten im Sekundentakt. Jedoch 
bekomme ich nur einen binären Zähler hin, also die Reihen der Matrix 
stellen die gezählte Zahl dar. Ich habe schon überlegt mit if 
Bedingungen zu arbeiten, jedoch wird das dann nicht mit einem 
Sekundentakt funktionieren und wäre auch auf keinen Fall eine schöne 
Lösung, wie ich annehme :)
Hier also mein bisheriger Code (ohne den Versuch der if Bedingungen):
1  | #define F_CPU 16000000
  | 
2  | #include <avr/io.h>
  | 
3  | #include <avr/interrupt.h>
  | 
4  | 
  | 
5  | //2D Array für spätere zweite Dot-Matrix
  | 
6  | // uint8_t LookUpLED[5][2]={ 
 | 
7  | //               {1,0}, 
 | 
8  | //               {0,0}, 
 | 
9  | //               {0,0}, 
 | 
10  | //               {0,0}, 
 | 
11  | //               {0,1}, 
 | 
12  | //             };
  | 
13  |             
  | 
14  | uint8_t Test[5]={1,0,0,0,0};
 | 
15  | 
  | 
16  | int var;
  | 
17  | int x=0;
  | 
18  | 
  | 
19  | void Init();                    
  | 
20  | void InitPorts();
  | 
21  | void InitTimer();
  | 
22  | void LEDAusgabe();
  | 
23  | 
  | 
24  | int main(void)
  | 
25  | {
 | 
26  |   Init();
  | 
27  |   
  | 
28  |     while (1) 
  | 
29  |     {   
 | 
30  |   }
  | 
31  | }
  | 
32  | 
  | 
33  | void Init()
  | 
34  | {
 | 
35  |   InitPorts();
  | 
36  |   InitTimer();
  | 
37  | }
  | 
38  | 
  | 
39  | void InitPorts()
  | 
40  | {
 | 
41  |   DDRA= 0xFF;
  | 
42  |    DDRB= 0xFF;
  | 
43  |   DDRC= 0xFF;
  | 
44  |   DDRD= 0xFF; 
  | 
45  | }
  | 
46  | 
  | 
47  | void InitTimer()
  | 
48  | {
 | 
49  |   //Timer 0
  | 
50  |   TCCR0 |= (1<<CS00) | (1<<CS01);
  | 
51  |   TIMSK |= (1<<TOIE0);
  | 
52  |   
  | 
53  |   //Timer1
  | 
54  |   TCCR1B |= (1<<CS10) | (1<<CS11);
  | 
55  |   TIMSK |= (1<<TOIE1); 
  | 
56  |   
  | 
57  |   sei();
  | 
58  | }
  | 
59  | 
  | 
60  | void LEDAusgabe()
  | 
61  | {
 | 
62  |   Test[0]=x;
  | 
63  |   PORTA = Test[0];  
  | 
64  | }
  | 
65  | 
  | 
66  | ISR(TIMER1_OVF_vect)
  | 
67  | {
 | 
68  |   //Hochzählen der Reihen
  | 
69  |   x++;
  | 
70  |   LEDAusgabe();
  | 
71  |   
  | 
72  |   //Debug LED
  | 
73  |   PORTA |= (1<<PA7);
  | 
74  | }
  | 
75  | 
  | 
76  | ISR(TIMER0_OVF_vect)
  | 
77  | {
 | 
78  |   //Multiplexen der Transistoren
  | 
79  |   for (int i=0; i<5; i++)
  | 
80  |   {
 | 
81  |     PORTB |= ~0xFF;
  | 
82  |     
  | 
83  |     //Debug LED
  | 
84  |     PORTC |= (1<<PC7);
  | 
85  |   }
  | 
86  | };
  | 
Ich vermute, dass ich den Timer wahrscheinlich nicht richtig verwende, 
jedoch entzieht es sich meiner Kenntniss, wie ich mein Problem lösen 
kann.
Vielen Dank schonmal!
Tomato