1 | #include <avr/io.h>
|
2 | #include <avr/interrupt.h>
|
3 |
|
4 | typedef unsigned char BYTE;
|
5 | typedef unsigned short WORD;
|
6 |
|
7 | #define channels 4 // number used Channels
|
8 | #define F_CPU 20000000 // CPU Clock
|
9 | #define SCHRITTE 255 // PWM Auflösung 8-bit
|
10 |
|
11 | BYTE data[channels]; // Data-Array
|
12 |
|
13 | void reset(void)
|
14 | {
|
15 | cli();
|
16 | DDRD &= ~(1<<PD0)|(1<<PD2); // PD0, PD2 als Eingang
|
17 | DDRD |= (1<<PD3)|(1<<PD4)|(1<<PD5)|(1<<PD6);
|
18 | DDRB = 0xff; // PB0-7 als Eingang
|
19 | PORTB = 0x00; // aktiv low
|
20 |
|
21 | //PORTD |= (1<<PD3)|(1<<PD4)|(1<<PD5)|(1<<PD6);
|
22 |
|
23 | data[0] = 255;
|
24 | data[1] = 170;
|
25 | data[2] = 100;
|
26 | data[3] = 50;
|
27 |
|
28 |
|
29 | TIFR = (1 << TOV0); // Timer0 Interuptflag löschen
|
30 | TCCR0B |= (1<<CS00); // Timer0 ohne Vorteiler
|
31 | TIMSK |= (1<<TOIE0); // Timer0 Overflow-int enable
|
32 |
|
33 | }
|
34 |
|
35 |
|
36 | // TIMER OVERFLOW INTERUPT
|
37 | ISR(TIMER0_OVF_vect)
|
38 | {
|
39 |
|
40 | char savesreg = SREG;
|
41 |
|
42 | static unsigned char neuer_wert=0; // fuer allerersten Aufruf
|
43 | static unsigned char summe[channels];
|
44 |
|
45 | PORTD = (PORTD & 0xf0) | (neuer_wert & 0x0f); // letztes Ergebnis verzoegert ausgeben
|
46 | if((summe[3]+= data[3]) >= SCHRITTE) { // bis Endwert ueberschritten wird
|
47 | summe[3] -= SCHRITTE; // dann Summe korrigieren
|
48 | neuer_wert |= 1; // und Bit setzen (Ueberlauf)
|
49 | }
|
50 | neuer_wert += neuer_wert; // schieben fuer naechstes Bit
|
51 | if((summe[2]+= data[2]) >= SCHRITTE) { // bis Endwert ueberschritten wird
|
52 | summe[2] -= SCHRITTE; // dann Summe korrigieren
|
53 | neuer_wert |= 1; // und Bit setzen (Ueberlauf)
|
54 | }
|
55 | neuer_wert += neuer_wert; // schieben fuer naechstes Bit
|
56 | if((summe[1]+= data[1]) >= SCHRITTE) { // bis Endwert ueberschritten wird
|
57 | summe[1] -= SCHRITTE; // dann Summe korrigieren
|
58 | neuer_wert |= 1; // und Bit setzen (Ueberlauf)
|
59 | }
|
60 | neuer_wert += neuer_wert; // schieben fuer naechstes Bit
|
61 | if((summe[0]+= data[0]) >= SCHRITTE) { // bis Endwert ueberschritten wird
|
62 | summe[0] -= SCHRITTE; // dann Summe korrigieren
|
63 | neuer_wert |= 1; // und Bit setzen (Ueberlauf)
|
64 | }
|
65 |
|
66 | SREG = savesreg;
|
67 | }
|
68 |
|
69 | // MAIN
|
70 | int main(void)
|
71 | {
|
72 | reset();
|
73 | sei(); //enable global interrupts
|
74 | for (;;) ;
|
75 | return (0);
|
76 |
|
77 | }
|