1 | #include <avr/io.h>
|
2 | #include <inttypes.h>
|
3 | #include <avr/interrupt.h>
|
4 | #include <avr/sleep.h>
|
5 | #include <util/delay.h>
|
6 |
|
7 | #undef F_CPU
|
8 | #define F_CPU 8000000
|
9 | // Berechnungen
|
10 | #define BAUD 9600
|
11 |
|
12 | // --------------------------------------------------------
|
13 | // Timer0 ist 8 Bit
|
14 | // Wir berechnen den optimalen Prescale-Faktor
|
15 | // --------------------------------------------------------
|
16 |
|
17 | #define T0_MAX_COUNTER 256UL
|
18 |
|
19 | // --------------------------------------------------------
|
20 | // 8-Bit Timer - Timer0
|
21 | // --------------------------------------------------------
|
22 | #define _T0_PRESCALE_0 (0)
|
23 | #define _T0_PRESCALE_1 (1<<CS00)
|
24 | #define _T0_PRESCALE_8 (1<<CS01)
|
25 | #define _T0_PRESCALE_64 (1<<CS01 | 1<<CS00)
|
26 | #define _T0_PRESCALE_256 (1<<CS02)
|
27 | #define _T0_PRESCALE_1024 (1<<CS02 | 1<<CS00)
|
28 |
|
29 | // --------------------------------------------------------
|
30 | // Timer0 Vorteiler für Baudrate berechnen
|
31 | // --------------------------------------------------------
|
32 | #if (F_CPU / BAUD ) < T0_MAX_COUNTER
|
33 | # define T0_PRESCALE 1UL // prescaler :1
|
34 | # define T0_PRESCALE_VALUE _T0_PRESCALE_1
|
35 |
|
36 | #elif (F_CPU / (BAUD * 8UL )) < T0_MAX_COUNTER
|
37 | # define T0_PRESCALE 8UL // prescaler :8
|
38 | # define T0_PRESCALE_VALUE _T0_PRESCALE_8
|
39 |
|
40 | #elif (F_CPU / (BAUD * 64UL )) < T0_MAX_COUNTER
|
41 | # define T0_PRESCALE 64UL // prescaler :64
|
42 | # define T0_PRESCALE_VALUE _T0_PRESCALE_64
|
43 |
|
44 | #elif (F_CPU / (BAUD * 256UL )) < T0_MAX_COUNTER
|
45 | # define T0_PRESCALE 256UL // prescaler :256
|
46 | # define T0_PRESCALE_VALUE _T0_PRESCALE_256
|
47 |
|
48 | #elif (F_CPU / (BAUD * 1024UL)) < T0_MAX_COUNTER
|
49 | # define T0_PRESCALE 1024UL // prescaler :1024
|
50 | # define T0_PRESCALE_VALUE _T0_PRESCALE_1024
|
51 |
|
52 | #else
|
53 | # error "T0_FREQUENCE"
|
54 | #endif
|
55 |
|
56 | #define T0_COUNTER (uint16_t) ((1.0 * F_CPU / (( T0_PRESCALE * BAUD ) + 0.5)))
|
57 | // in T0_PRESCALE_VALUE stehen dann Bit-Werte für den Prescaler.
|
58 | //#define TEST1 ( T0_COUNTER / 2 )
|
59 |
|
60 | // Berechnungen
|
61 | #define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1) // clever runden
|
62 | #define BIT_TIME UBRR_VAL * 2
|
63 | #define BIT_TIME_ALT (int) (1000000.0/((float) BAUD)+0.5)
|
64 | #define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1))) // Reale Baudrate
|
65 | #define BAUD_REAL_ALT (F_CPU/(16*(UBRR_VAL+1))) // Reale Baudrate
|
66 | #define BAUD_REAL_NEW (F_CPU/(T0_PRESCALE * (( T0_COUNTER / 2 )+1))) // Reale Baudrate
|
67 |
|
68 | #define BAUD_ERROR ((BAUD_REAL*1000)/BAUD) // Fehler in Promille, 1000 = kein Fehler.
|
69 | #define BAUD_ERROR_ALT ((BAUD_REAL*1000)/BAUD) // Fehler in Promille, 1000 = kein Fehler.
|
70 |
|
71 | #define BAUD_ERROR_NEW ((BAUD_REAL_NEW*1000)/BAUD)
|
72 |
|
73 | #if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
|
74 | #error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch!
|
75 | #endif
|
76 | #if 1
|
77 | #if ((BAUD_ERROR_NEW <990) || (BAUD_ERROR_NEW >1010))
|
78 | #error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch!
|
79 | #endif
|
80 | #endif
|
81 | int main() { //Wayne ?
|
82 | }
|