sketch_jun10a.ino


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
}