1 | #define F_CPU 16000000UL
|
2 |
|
3 | #include <avr/io.h>
|
4 | #include <util/delay.h>
|
5 | #include <avr/interrupt.h>
|
6 | #include <stdlib.h>
|
7 | #include <stdio.h>
|
8 | #include <stdint.h>
|
9 |
|
10 | #define Baud 9600UL
|
11 | #define UBBR_VALUE ((F_CPU/(16*Baud))-1)
|
12 |
|
13 |
|
14 | char UART_INPUT [255];
|
15 | char UART_OUTPUT [255];
|
16 | volatile unsigned char eingabe,counter,complete=0;
|
17 | volatile unsigned short timer=0,ctn=1,timer0=0,messung_start=0,messung_ende=0;
|
18 | volatile float entfernung;
|
19 |
|
20 | void uart_init() /*Inizialiserung von UART*/
|
21 | {
|
22 | UBRRH = (UBBR_VALUE>>8); /*Baudrate ins UBBR Register schreiben*/
|
23 | UBRRL = (UBBR_VALUE);
|
24 |
|
25 | UCSRB = (1<<TXEN) | (1<<RXEN)|(1<<RXCIE); /* RX und TX Aktivieren , RX Interrupt aktiv*/
|
26 | UCSRC = (1<<URSEL) | (1<<UCSZ1) | (1<<UCSZ0); /* Sendemodus: Synchron; 8 Bit;1 Stoppbit */
|
27 | }
|
28 |
|
29 | void timer0_init()
|
30 | {
|
31 | TCCR0 |= (1<<WGM01)| (1<<CS01) | (1<<CS00); /* CTC Aktiv + Prescaller 1:64 */
|
32 | /* TCNT Register nicht aktiv */
|
33 | OCR0 = 71;
|
34 | /* alle 288 us ein interrup */
|
35 | TIMSK |=(1<<OCIE0); /* Owerflow Interrups erlauben*/
|
36 |
|
37 | void uart_output(char * vektor) /* Zeichen aus Array lesen und an Uart_senden weiterleiten */
|
38 | {
|
39 | for (int a=0; a<255;a++) /* Vektor Array um 1 erhöhen und senden*/
|
40 | {
|
41 | if(vektor[a] !=0)
|
42 | {
|
43 | uart_senden(vektor[a]); /*Senden eines zeichen aus Vektor*/
|
44 | }
|
45 | else
|
46 | {
|
47 | break; /*verlassen der for schleife*/
|
48 | }
|
49 | }
|
50 |
|
51 |
|
52 | }
|
53 |
|
54 | char uart_empfang() /*abholung neuner daten vom BUS*/
|
55 | {
|
56 | while(!(UCSRA & (1<<RXC)))
|
57 | ;
|
58 | return UDR;
|
59 | }
|
60 |
|
61 | void uart_speichern(char *pointer) /* Speichert Zeichen in einem String*/
|
62 | {
|
63 | eingabe = uart_empfang();
|
64 |
|
65 | if (complete == 0) /*Solange String nicht komplett oder zwischengespeichert*/
|
66 | {
|
67 |
|
68 | if (eingabe == 13)/* 13 = new line*/
|
69 | {
|
70 |
|
71 | pointer[counter] = 0; /* wenn newline variable von vorne beginnen*/
|
72 | counter = 0;
|
73 | complete = 1;
|
74 | /*unterbricht die while schleife*/
|
75 | }
|
76 |
|
77 | else
|
78 | {
|
79 |
|
80 | pointer[counter] = eingabe; /*sonst nächstes zeichen scheiben*/
|
81 | counter++;
|
82 | complete = 0;
|
83 |
|
84 | }
|
85 | }
|
86 | }
|
87 |
|
88 | ISR(USART_RXC_vect) /* Interrupt wenn RX zeichen empfängt*/
|
89 | {
|
90 | uart_speichern(UART_INPUT); /* Zeichen in UART_INPUT speichern*/
|
91 | }
|
92 |
|
93 | ISR (TIMER0_COMP_vect)
|
94 | {
|
95 | timer++;
|
96 | }
|
97 |
|
98 |
|
99 | int main(void) /*HAUPTPROGRAMM*/
|
100 | {
|
101 | uart_init(); /* Uart_Init ausführen*/
|
102 |
|
103 | int0_init();
|
104 | timer0_init();
|
105 | sei(); /* Globale Interrups Aktivieren*/
|
106 |
|
107 | while (1)
|
108 | {
|
109 | if (complete == 1)
|
110 | {
|
111 | entfernung = (0.03434 * (messung_ende - messung_start) * 288.000)/2.000; /* Entfernung in cm */
|
112 |
|
113 | dtostrf(entfernung , 0 , 2 ,UART_OUTPUT); /*float to array*/
|
114 | uart_output(UART_OUTPUT);
|
115 | uart_output(" cm");
|
116 | uart_output("\r\n");
|
117 | utoa (messung_ende-messung_start,UART_OUTPUT,10);
|
118 | uart_output(UART_OUTPUT);
|
119 | uart_output("\r\n");
|
120 | utoa (timer,UART_OUTPUT,10);
|
121 | uart_output(UART_OUTPUT);
|
122 | uart_output("\r\n");
|
123 |
|
124 | complete = 0;
|
125 | }
|
126 |
|
127 | }
|
128 | }
|