1 | // ----------------------------------------------------------------
|
2 | // CPU Takt des verbauten Quarz vorgeben
|
3 | // ----------------------------------------------------------------
|
4 |
|
5 | #define F_CPU 3686400u
|
6 |
|
7 | // ----------------------------------------------------------------
|
8 | // UART Bautrate w?hlen
|
9 | // ----------------------------------------------------------------
|
10 | #define BAUD 9600UL
|
11 |
|
12 | // ?berpr?fung der gew?hlten UART Bautrate im Verh?ltnis zum CPU Takt
|
13 | #define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1) // Runden
|
14 | #define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1))) // Reale Baudrate
|
15 | #define BAUD_ERROR ((BAUD_REAL*1000)/BAUD) // Fehler in Promille, 1000 = kein Fehler.
|
16 |
|
17 | #if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
|
18 | // Build Fehler ausgeben, wenn die gew?hlte Baudrate nicht zur CPU Frequenz passt
|
19 | #error "Falsche Baudrate zum CPU Takt gew?hlt (Fehler >1%)!"
|
20 | #endif
|
21 |
|
22 | #include <avr/io.h>
|
23 | #include <util/delay.h>
|
24 |
|
25 |
|
26 | // ----------------------------------------------------------------
|
27 | // Funktion - Initialisierung des ADC (Analog Digital Converter)
|
28 | // ----------------------------------------------------------------
|
29 | void initAdc()
|
30 | {
|
31 | // --- Konfiguration des ADC "Multiplexer Selection Register" ---
|
32 | // Referenzspannung AREF = AVcc einstellen
|
33 | ADMUX = (1<<REFS0);
|
34 |
|
35 | // --- Konfiguration des ADC "Control and Status Register A" ---
|
36 | // ADC aktivieren und prescaler auf 32 (3686400/32 = 115200) einstellen
|
37 | ADCSRA = (1<<ADEN)|(1<<ADPS2)|(1<<ADPS0);
|
38 | }
|
39 |
|
40 |
|
41 | // ----------------------------------------------------------------
|
42 | // Funktion - Auslesen des ADC Messwert
|
43 | // ----------------------------------------------------------------
|
44 | uint16_t readAdc(uint8_t kanal)
|
45 | {
|
46 | // Sicherstellen, das der Kanalwert maximal 7 wird
|
47 | kanal &= 0b00000111;
|
48 |
|
49 | // vor der Kanalwahl die ersten 3 bits in ADMUX zurücksetzen
|
50 | // und durch verodern mit Kanal auswählen
|
51 | ADMUX = (ADMUX & 0b11111000)|kanal;
|
52 |
|
53 | // "single convertion" starten
|
54 | ADCSRA |= (1<<ADSC);
|
55 |
|
56 | // warten bis die Wandlung abgeschlossen wurde (ADSC = 0) und...
|
57 | while(ADCSRA & (1<<ADSC));
|
58 |
|
59 | // ...den ermittelten Messwert zurückgeben (0-1023 / 2^10)
|
60 | return (ADC);
|
61 | }
|
62 |
|
63 |
|
64 |
|
65 |
|
66 |
|
67 | // ----------------------------------------------------------------
|
68 | // Funktion - Initialisierung des UART (Universal Asynchronous
|
69 | // Receiver Transmtter)
|
70 | // ----------------------------------------------------------------
|
71 | void initUart()
|
72 | {
|
73 | UBRRH = UBRR_VAL >> 8;
|
74 | UBRRL = UBRR_VAL & 0xFF;
|
75 |
|
76 | UCSRB |= (1<<TXEN); // UART TX (senden) einschalten
|
77 | UCSRC = (1<<URSEL)|(1 << UCSZ1)|(1 << UCSZ0); // Asynchron 8N1
|
78 |
|
79 | }
|
80 |
|
81 | // Hier wird die jeweils aufgerufene Sendefunktion bearbeitet.
|
82 | // Es wird jedes Zeichen einzeln an das Hyperterminal ?bergeben.
|
83 | void sende ( char zeichen[]) // ?bergebene Variable ist ein Feld mit max. 256 Zeichen
|
84 | { // Dieses enth?lt die auszugebenden Zeichen (als char)
|
85 | for (int x=0; zeichen[x] != 0; x++) // solange 'kein Satzende' als aktuelles Zeichen
|
86 | {
|
87 |
|
88 | while ( bit_is_clear(UCSRA,5)) // solange Zeichen noch nicht gesendet (dann Bit 5 = 0)
|
89 | { // UCSRA ist das Unterregister in USART
|
90 | ; // warten bis vorheriges Zeichen fertig gesendet
|
91 | }
|
92 |
|
93 | UDR = zeichen[x]; // aktuelles (x-tes) Zeichen senden
|
94 | }
|
95 | }
|
96 |
|
97 |
|
98 |
|
99 | int main ( void )
|
100 | {
|
101 |
|
102 | // Definitionen
|
103 |
|
104 | DDRB = 0b00000000; // Port B0 und B1 als Eingang definieren
|
105 | PORTB = 0b00000011; // Pull-Up's an Port B0 und B1 setzen
|
106 | PORTC = 0b00000000;
|
107 |
|
108 | int messwertuebertragung;
|
109 | uint16_t adc_result0;
|
110 | char int_buffer[10];
|
111 |
|
112 | // Initialisierung
|
113 | initUart();
|
114 | initAdc();
|
115 |
|
116 |
|
117 |
|
118 | while ( 1 )
|
119 | {
|
120 | if( bit_is_clear(PINB,0 ))
|
121 | {
|
122 | _delay_ms(50); // Prellen abwarten
|
123 | messwertuebertragung = 1;
|
124 | }
|
125 |
|
126 | if( bit_is_clear(PINB,1))
|
127 | {
|
128 | _delay_ms(50); // Prellen abwarten
|
129 | messwertuebertragung =0;
|
130 | }
|
131 |
|
132 | if( messwertuebertragung == 1 )
|
133 |
|
134 | {
|
135 | /////////// Uebertragung an sich
|
136 |
|
137 | // ADC Werte einlesen
|
138 | adc_result0 = readAdc(0); // at PC0
|
139 |
|
140 | _delay_ms(500); //normal 5000
|
141 |
|
142 | itoa(adc_result0, int_buffer, 10);
|
143 | sende(int_buffer);
|
144 |
|
145 | sende ("\r\n") ; // ENDE der ?bertragung
|
146 | _delay_ms(50);
|
147 | if ( bit_is_set(UCSRA,7))
|
148 | {
|
149 | PORTC = 0b00000100;
|
150 | }
|
151 | }
|
152 | }
|
153 | }
|