1 | #define __AVR_ATmega2560__
|
2 | //#include <avr/io.h>
|
3 | #include <avr/iomxx0_1.h>
|
4 | #include <stdio.h>
|
5 | #include <stdlib.h>
|
6 | #include <stdint.h> //definiert den Datentyp uint8_t
|
7 |
|
8 | #include <avr/wdt.h>
|
9 |
|
10 |
|
11 | ///////////////////////////////////////////////////////////////
|
12 | //
|
13 | // Sonstige Variablen
|
14 | //
|
15 |
|
16 |
|
17 | #ifndef TRUE
|
18 | #define TRUE 1
|
19 | #define FALSE 0
|
20 | #endif
|
21 |
|
22 |
|
23 |
|
24 | double FREQ = 20000;
|
25 | int LEVEL = 50; // 0 - 100 %
|
26 |
|
27 |
|
28 |
|
29 |
|
30 |
|
31 |
|
32 | ///////////////////////////////////////////////////////////////
|
33 | //
|
34 | // UART Variablen
|
35 | //
|
36 |
|
37 | #ifndef TRUE
|
38 | #define F_CPU 16000000UL
|
39 | #endif
|
40 | #define BAUD 115200UL
|
41 |
|
42 | ///////////////////////////////////////////////////////////////
|
43 | //
|
44 | // UART Funktionen
|
45 | //
|
46 |
|
47 |
|
48 | void initUART_RxTx(void)
|
49 | {
|
50 | UCSR0A = 0x00;
|
51 | UCSR0B |= ( (1 << RXEN0) | (1 << RXCIE0) | (1 << TXEN0) ); // TX, RX Interrupt einschalten
|
52 | UCSR0C |= ( (1 << UCSZ01) | (1 << UCSZ00) ); // 8N1 in Asynchron
|
53 | UBRR0H = 0;
|
54 | //UBRR0L = 207; //Baud 4800 bei 16 Mhz
|
55 | //UBRR0L = 25; //Baud 38400 bei 16 Mhz
|
56 | //UBRR0L = 12; //Baud 76800 bei 16 Mhz
|
57 | UBRR0L = 8; //Baud 115200 bei 16 Mhz
|
58 | }
|
59 |
|
60 |
|
61 | void uartPutC( char c ) //Ausgabe eines einzelnen Zeichens
|
62 | {
|
63 | while ( ! (UCSR0A & ( 1 << UDRIE0) ) ); //Abwarten bis Zeichen geschrieben wurde
|
64 | UDR0 = c;
|
65 | }
|
66 |
|
67 | void uartPutI(uint16_t integer) //Ausgabe einer 16 Bit Integerzahl
|
68 | {
|
69 | char putImessage[255];
|
70 | uartPutS(itoa(integer, putImessage, 10));
|
71 | }
|
72 |
|
73 | void uartPutS( const char* str ) //Ausgabe eines Strings
|
74 | {
|
75 | while ( *str )
|
76 | {
|
77 | uartPutC( *str );
|
78 | str++;
|
79 | }
|
80 | }
|
81 |
|
82 |
|
83 |
|
84 | ///////////////////////////////////////////////////////////////
|
85 | //
|
86 | // Timer Funktionen
|
87 | //
|
88 |
|
89 | void initPorts(void)
|
90 | {
|
91 | DDRB |= ( (1<<DDB6) | (1<<DDB5) | (1<<DDB7) );
|
92 | DDRE |= ( (1<<DDE3) | (1<<DDE4) | (1<<DDE5) );
|
93 | DDRF &= ~( (1<<DDF0) | (1<<DDF1) | (1<<DDF2) | (1<<DDF3) | (1<<DDF4) | (1<<DDF5) | (1<<DDF6) | (1<<DDF7) ); //ADC als Eingang
|
94 | DDRH |= ( (1<<DDH3) | (1<<DDH4) | (1<<DDH5) );
|
95 | }
|
96 |
|
97 | void initTIMER0_PWM(void)
|
98 | {
|
99 | GTCCR |= ( (1 << TSM) | (1 << PSRASY) ); //Timer stoppen und Prescaler zurücksetzen
|
100 |
|
101 | TCCR0A |= ( (1<<WGM01) | (1<<WGM00) );
|
102 | TCCR0A |= ( (1<<COM0A1) | (1<<WGM00) );
|
103 | TCCR0B |= ( (0 << CS02) | (1 << CS01) | (0 << CS00) );
|
104 | //TCCR0B |= ( (1 << CS01) );
|
105 |
|
106 | OCR0A = 127;
|
107 | //OCR0A = 4; // Grenze bei 976,5 Hz, instabil
|
108 | //OCR0A = 249; // Grenze bei 976,5 Hz, instabil
|
109 | //OCR0A = 4; // Grenze bei 7812,5 Hz
|
110 | //OCR0A = 249; // Grenze bei 7812,5 Hz
|
111 | GTCCR &= ~(1 << TSM); //Timer wieder starten
|
112 | }
|
113 |
|
114 | void initTimer1_PWM(void)
|
115 | {
|
116 | GTCCR |= ( (1 << TSM) | (1 << PSRASY) ); //Timer stoppen und Prescaler zurücksetzen'
|
117 |
|
118 | TCCR1A=0;
|
119 | TCCR1B=0;
|
120 |
|
121 | TCCR1B |= (1<<CS11); //Prescaler auf 8
|
122 | TCCR1B |= (1<<WGM13) | (1<<WGM12) ;
|
123 | TCCR1A |= (1<<WGM11); //Modus 14
|
124 | TCCR1A |= (1<<COM1B1);//Nicht-Invertiert
|
125 |
|
126 | //Obergrenze Festlegen:
|
127 | ICR1=16000000/(8*FREQ);
|
128 |
|
129 | //Pegel einstellen:
|
130 | OCR1B=LEVEL*(ICR1/100);
|
131 |
|
132 | TIMSK1 = (1<<TOIE1);
|
133 |
|
134 | GTCCR &= ~(1 << TSM); //Timer wieder starten
|
135 |
|
136 | }
|
137 |
|
138 |
|
139 |
|
140 | int main(void)
|
141 | {
|
142 | return 0;
|
143 | }
|